{"record":{"id":"c5c0fec84ccc5bdb","repo":"kubernetes/kops","slug":"no-decernable-storage-availability-zone-could-be-m","errorCode":null,"errorMessage":"no decernable storage availability zone could be mapped to compute availability zone %s","messagePattern":"no decernable storage availability zone could be mapped to compute availability zone (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/availability_zone.go","lineNumber":75,"sourceCode":"}\n\nfunc getStorageAZFromCompute(c OpenstackCloud, computeAZ string) (*az.AvailabilityZone, error) {\n\t// TODO: This is less than desirable, but openstack differs here\n\t// Check to see if the availability zone exists.\n\tazList, err := c.ListAvailabilityZones(c.BlockStorageClient())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Volume.RenderOpenstack: %v\", err)\n\t}\n\tfor _, az := range azList {\n\t\tif az.ZoneName == computeAZ {\n\t\t\treturn &az, nil\n\t\t}\n\t}\n\t// Determine if there is a meaningful storage AZ here\n\tif len(azList) == 1 {\n\t\treturn &azList[0], nil\n\t}\n\treturn nil, fmt.Errorf(\"no decernable storage availability zone could be mapped to compute availability zone %s\", computeAZ)\n}\n","sourceCodeStart":57,"sourceCodeEnd":77,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/availability_zone.go#L57-L77","documentation":"getStorageAZFromCompute (upup/pkg/fi/cloudup/openstack/availability_zone.go:75) tries to match a compute AZ name to a storage AZ of the same name; failing that, it falls back to the single storage AZ if exactly one exists. If the compute AZ name matches no Cinder AZ and the AZ list is empty or has more than one entry, it returns this error because the mapping is ambiguous.","triggerScenarios":"GetStorageAZFromCompute called with a computeAZ string that (a) matches no ZoneName in the Cinder AZ list and (b) the list length != 1 — e.g. compute AZ 'zone-b' exists only in Nova, while Cinder exposes 'zone-b-storage' and 'zone-c', or the list is empty.","commonSituations":"Clouds where Nova and Cinder AZ names diverge (common with Ceph backends that use their own AZ naming); multi-AZ deployments with several storage zones; a zone deleted from Cinder but still present in Nova; typo in the cluster spec's zone name.","solutions":["Align Cinder availability zone names with Nova zone names (configure the storage backend's AZ to match), so the exact-match branch succeeds","Ensure only one storage AZ exists if you rely on the single-AZ fallback","Use matching zone names in the kops cluster spec and the OpenStack deployment; remove stale zones from Cinder","Patch/redeploy with a deployment where compute and storage AZs are explicitly mapped"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"computeAZs := novaClientZones() // e.g. from az.List(compute)\nstorageAZs, err := c.ListAvailabilityZones(c.BlockStorageClient())\nif err != nil {\n    return err\n}\nnames := map[string]bool{}\nfor _, z := range storageAZs {\n    names[z.ZoneName] = true\n}\nif len(names) != 1 && !names[computeAZ] {\n    return fmt.Errorf(\"storage AZ for compute AZ %q unresolvable; storage AZs: %v\", computeAZ, names)\n}\nreturn nil","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep Nova and Cinder availability zone names identical in the deployment","Avoid running more than one storage AZ unless names align with compute zones","Remove stale/deleted zones from Cinder","Cross-check zone names in the kops cluster spec against `openstack availability zone list` outputs"],"tags":["openstack","availability-zone","nova","cinder","mapping"],"backgroundTag":"availability-zone-mapping-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}