{"record":{"id":"5ba518084ac236c7","repo":"kubernetes/kops","slug":"volume-renderopenstack-v","errorCode":null,"errorMessage":"Volume.RenderOpenstack: %v","messagePattern":"Volume\\.RenderOpenstack: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/availability_zone.go","lineNumber":64,"sourceCode":"\n\t\tif err == nil {\n\t\t\terr = wait.ErrWaitTimeout\n\t\t}\n\t\treturn azList, err\n\t}\n\treturn azList, nil\n}\n\nfunc (c *openstackCloud) GetStorageAZFromCompute(computeAZ string) (*az.AvailabilityZone, error) {\n\treturn getStorageAZFromCompute(c, computeAZ)\n}\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":46,"sourceCodeEnd":77,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/availability_zone.go#L46-L77","documentation":"getStorageAZFromCompute (upup/pkg/fi/cloudup/openstack/availability_zone.go:64) maps a Nova compute availability zone to a Cinder storage availability zone by listing block-storage AZs. When the underlying ListAvailabilityZones call fails for any reason (list or extract failure, auth, endpoint, timeout), the error is re-wrapped with the prefix 'Volume.RenderOpenstack:'. The prefix is historical/misleading — the failure occurs while resolving storage AZs, not during volume rendering itself.","triggerScenarios":"GetStorageAZFromCompute is invoked during OpenstackVolume rendering; the wrapped error surfaces when c.ListAvailabilityZones(c.BlockStorageClient()) returns an error — i.e. the inner 'failed to list storage availability zones' or 'failed to extract storage availability zones' errors, auth token rejection, or a missing/broken volumev3 endpoint.","commonSituations":"Cinder service not deployed in the region; wrong OS_* environment credentials so the token lacks block-storage access; the volumev3 endpoint missing from the service catalog; Keystone outage; any transient API error that exhausts the read backoff retries.","solutions":["Inspect the wrapped inner error after 'Volume.RenderOpenstack:' — it names the real cause (list vs extract vs auth)","Verify the Cinder volumev3 endpoint exists for the region: openstack endpoint list --service volumev3","Re-check credentials/scopes (OS_USERNAME, OS_PROJECT_NAME, OS_REGION_NAME); ensure the project can list availability zones","Retry cluster creation if the inner error indicates a transient Keystone/Cinder failure"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// pre-check: block storage client resolvable and AZ list obtainable\nazList, err := c.ListAvailabilityZones(c.BlockStorageClient())\nif err != nil {\n    return fmt.Errorf(\"pre-check storage AZ failed: %w\", err)\n}\nif len(azList) == 0 {\n    return fmt.Errorf(\"no storage AZs visible to this project\")\n}\nreturn nil","typeGuard":null,"tryCatchPattern":"az, err := c.GetStorageAZFromCompute(computeAZ)\nif err != nil {\n    var gerr gophercloud.ErrDefaultResponse\n    if errors.As(err, &gerr) && gerr.Actual.StatusCode == 401 {\n        return fmt.Errorf(\"re-authenticate: %w\", err)\n    }\n    return fmt.Errorf(\"storage AZ resolution failed: %w\", err)\n}","preventionTips":["Verify Cinder access (`openstack availability zone list --volume`) before running kops","Confirm the volumev3 endpoint exists for the target region","Check token scope grants visibility of block storage AZs","Watch for transient Keystone outages during cluster operations"],"tags":["openstack","cinder","availability-zone","error-wrapping"],"backgroundTag":"nested-error-wrapping","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"}