{"record":{"id":"179e120f26a1f31b","repo":"kubernetes/kops","slug":"error-building-nova-client-w","errorCode":null,"errorMessage":"error building nova client: %w","messagePattern":"error building nova client: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/cloud.go","lineNumber":402,"sourceCode":"\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\n\tnovaClient.Microversion = \"2.47\"\n\n\tglanceClient, err := openstack.NewImageV2(provider, gophercloud.EndpointOpts{\n\t\tType:   \"image\",\n\t\tRegion: region,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building glance client: %w\", err)\n\t}\n\n\tvar dnsClient *gophercloud.ServiceClient\n\tif hasDNS {\n\t\tdnsClient, err = openstack.NewDNSV2(provider, gophercloud.EndpointOpts{\n\t\t\tType:   \"dns\",\n\t\t\tRegion: region,\n\t\t})","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/cloud.go#L384-L420","documentation":"buildClients (upup/pkg/fi/cloudup/openstack/cloud.go:402) builds the Nova compute v2 client with openstack.NewComputeV2 and EndpointOpts{Type: \"compute\", Region: region}; on success it pins Microversion 2.47 because the compute API /servers/detail only returns flavor names from that microversion on. Failure means no compute endpoint for the type+region could be resolved from the Keystone catalog. Wrapped with %w so the gophercloud root error is preserved.","triggerScenarios":"The catalog lacks a 'compute' endpoint in the region; Nova not deployed there; region string mismatch; the resolved compute endpoint's supported microversions are below 2.47 in downstream checks (the error here specifically is endpoint resolution).","commonSituations":"Regions without Nova (storage-only regions); typo'd OS_REGION_NAME; custom catalogs where the compute service is registered with an unexpected type; clouds behind restricted catalogs exposing only a subset of services to the project.","solutions":["Confirm with `openstack endpoint list --service compute --region <region>` that a compute endpoint exists","Fix OS_REGION_NAME to match a region with Nova deployed","If the endpoint exists but is filtered, check the project's service catalog permissions/interface (public vs internal)","Verify Nova supports microversion >= 2.47 for the flavor-name feature kops relies on"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"endpoints, err := catalogEndpoints(token, \"compute\")\nif err != nil || len(endpoints) == 0 {\n    return fmt.Errorf(\"no compute endpoint for region %q\", region)\n}\nreturn nil","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify `openstack endpoint list --service compute --region <region>` before kops","Ensure Nova supports microversion >= 2.47 (needed for flavor names in /servers/detail)","Use exact region names from `openstack region list`","Confirm the project can see the compute service in its catalog"],"tags":["openstack","nova","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"}