{"record":{"id":"6777f8d1913b568e","repo":"kubernetes/kops","slug":"error-building-cinder-client-w","errorCode":null,"errorMessage":"error building cinder client: %w","messagePattern":"error building cinder client: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/cloud.go","lineNumber":386,"sourceCode":"\n\tif cluster != nil {\n\t\thasDNS := cluster.PublishesDNSRecords()\n\t\ttags := map[string]string{\n\t\t\tTagClusterName: cluster.Name,\n\t\t}\n\t\treturn buildClients(provider, tags, cluster.Spec.CloudProvider.Openstack, config, region, hasDNS)\n\t}\n\t// used when no cluster is available\n\treturn buildClients(provider, nil, nil, config, region, false)\n}\n\nfunc buildClients(provider *gophercloud.ProviderClient, tags map[string]string, spec *kops.OpenstackSpec, config vfs.OpenstackConfig, region string, hasDNS bool) (OpenstackCloud, error) {\n\tcinderClient, err := openstack.NewBlockStorageV3(provider, gophercloud.EndpointOpts{\n\t\tType:   \"volumev3\",\n\t\tRegion: region,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building cinder client: %w\", err)\n\t}\n\n\tneutronClient, err := openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{\n\t\tType:   \"network\",\n\t\tRegion: region,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building neutron client: %w\", err)\n\t}\n\n\tnovaClient, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{\n\t\tType:   \"compute\",\n\t\tRegion: region,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building nova client: %w\", err)\n\t}\n\t// 2.47 is the minimum version where the compute API /server/details returns flavor names","sourceCodeStart":368,"sourceCodeEnd":404,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/cloud.go#L368-L404","documentation":"buildClients (upup/pkg/fi/cloudup/openstack/cloud.go:386) constructs the Cinder block-storage v3 service client with openstack.NewBlockStorageV3, using EndpointOpts{Type: \"volumev3\", Region: region}. Failure here means gophercloud could not resolve a suitable volumev3 endpoint in the authenticated service catalog for that region. This wraps with %w so the underlying gophercloud ErrEndpointNotFound or similar is preserved for errors.Is/As checks.","triggerScenarios":"The Keystone service catalog has no volumev3 endpoint in the target region; the region passed to EndpointOpts does not match any endpoint's region attribute; Cinder v3 is not deployed (only v2/v1 present); catalog entries have a type other than 'volumev3'.","commonSituations":"Old OpenStack releases exposing only volumev2; region name case mismatch (OS_REGION_NAME 'regionone' vs catalog 'RegionOne'); broken service catalog after a cloud upgrade; kops pointed at a region with no block storage service.","solutions":["Check the catalog: `openstack endpoint list --service volumev3 --region <region>`; ensure a matching endpoint exists","Fix OS_REGION_NAME so it exactly matches a region that has a volumev3 endpoint","If the cloud only offers v2, register a volumev3 endpoint or upgrade Cinder; kops requires BlockStorageV3","Verify the catalog endpoint interface (public/admin/internal) is reachable from the client"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"endpoints, err := catalogEndpoints(token, \"volumev3\")\nif err != nil || len(endpoints) == 0 {\n    return fmt.Errorf(\"no volumev3 endpoint for region %q\", region)\n}\nreturn nil","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify `openstack endpoint list --service volumev3` before provisioning","Match OS_REGION_NAME exactly (case-sensitive) to a region with Cinder v3","Upgrade clouds that only expose volumev2, since kops requires v3","Check endpoint interface (public/internal) reachability from the client network"],"tags":["openstack","cinder","endpoint","service-catalog","gophercloud"],"backgroundTag":"endpoint-not-found","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"}