in plugins/gce_pd.go [332:370]
func (g *gcePersistentDiskCSITranslator) RepairVolumeHandle(volumeHandle, nodeID string) (string, error) {
var err error
tok := strings.Split(volumeHandle, "/")
if len(tok) < volIDTotalElements {
return "", fmt.Errorf("volume handle has wrong number of elements; got %v, wanted %v or more", len(tok), volIDTotalElements)
}
if tok[volIDProjectValue] != UnspecifiedValue {
return volumeHandle, nil
}
nodeTok := strings.Split(nodeID, "/")
if len(nodeTok) < volIDTotalElements {
return "", fmt.Errorf("node handle has wrong number of elements; got %v, wanted %v or more", len(nodeTok), volIDTotalElements)
}
switch tok[volIDRegionalityValue] {
case "zones":
zone := ""
if tok[volIDZoneValue] == UnspecifiedValue {
zone = nodeTok[volIDZoneValue]
} else {
zone = tok[volIDZoneValue]
}
return fmt.Sprintf(volIDZonalFmt, nodeTok[volIDProjectValue], zone, tok[volIDDiskNameValue]), nil
case "regions":
region := ""
if tok[volIDZoneValue] == UnspecifiedValue {
region, err = gceGetRegionFromZones([]string{nodeTok[volIDZoneValue]})
if err != nil {
return "", fmt.Errorf("failed to get region from zone %s: %v", nodeTok[volIDZoneValue], err)
}
} else {
region = tok[volIDZoneValue]
}
return fmt.Sprintf(volIDRegionalFmt, nodeTok[volIDProjectValue], region, tok[volIDDiskNameValue]), nil
default:
return "", fmt.Errorf("expected volume handle to have zones or regions regionality value, got: %s", tok[volIDRegionalityValue])
}
}