{"record":{"id":"adfcf15e82f8f3cc","repo":"kubernetes/kops","slug":"providerid-q-not-recognized-for-node-s-adfcf1","errorCode":null,"errorMessage":"providerID %q not recognized for node %s","messagePattern":"providerID %q not recognized for node (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodeidentity/openstack/identify.go","lineNumber":101,"sourceCode":"\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building nova client: %v\", err)\n\t}\n\n\treturn &nodeIdentifier{\n\t\tnovaClient:   novaClient,\n\t\tcache:        expirationcache.NewTTLStore(stringKeyFunc, cacheTTL),\n\t\tcacheEnabled: cacheNodeidentityInfo,\n\t}, nil\n}\n\n// IdentifyNode queries OpenStack for the node identity information\nfunc (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {\n\tproviderID := node.Spec.ProviderID\n\tif providerID == \"\" {\n\t\treturn nil, fmt.Errorf(\"providerID was not set for node %s\", node.Name)\n\t}\n\tif !strings.HasPrefix(providerID, \"openstack://\") {\n\t\treturn nil, fmt.Errorf(\"providerID %q not recognized for node %s\", providerID, node.Name)\n\t}\n\n\tinstanceID := strings.TrimPrefix(providerID, \"openstack://\")\n\t// instanceid looks like its openstack:/// but no idea is that really correct like that?\n\t// this supports now both openstack:// and openstack:/// format\n\n\tinstanceID = strings.TrimPrefix(instanceID, \"/\")\n\n\t// If caching is enabled try pulling nodeidentity.Info from cache before doing a Hetzner Cloud API call.\n\tif i.cacheEnabled {\n\t\tobj, exists, err := i.cache.GetByKey(instanceID)\n\t\tif err != nil {\n\t\t\tklog.Warningf(\"Nodeidentity info cache lookup failure: %v\", err)\n\t\t}\n\t\tif exists {\n\t\t\treturn obj.(*nodeidentity.Info), nil\n\t\t}\n\t}","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodeidentity/openstack/identify.go#L83-L119","documentation":"IdentifyNode only recognizes providerIDs with the 'openstack://' prefix, since the instance ID/UUID is taken from the remainder of that string. This error is thrown when a node has a providerID but it does not use the expected OpenStack scheme.","triggerScenarios":"node.Spec.ProviderID is non-empty but lacks the 'openstack://' prefix — e.g. 'openstack:///' is fine, but 'aws:///i-abc', 'openstack-123', or a bare UUID will fail strings.HasPrefix and throw.","commonSituations":"Nodes provisioned by a different cloud than the identifier being used, providerIDs written in a nonstandard format by custom tooling, or copy-pasted/templated providerIDs missing the scheme.","solutions":["Verify the node's providerID starts with 'openstack://' (kubectl get node <name> -o jsonpath='{.spec.providerID}')","Ensure the node actually belongs to the OpenStack cluster and isn't foreign/foreign-prefixed","Fix the component writing the providerID so it emits the canonical 'openstack://<instance-id>' format"],"exampleFix":"// before\nspec.providerID: \"openstack-abc-123\"\n// after\nspec.providerID: \"openstack://abc-123\"","handlingStrategy":"validation","validationCode":"if !strings.HasPrefix(node.Spec.ProviderID, \"openstack://\") {\n    return fmt.Errorf(\"node %s providerID %q is not an openstack providerID\", node.Name, node.Spec.ProviderID)\n}","typeGuard":"func isOpenStackProviderID(pid string) bool {\n    return strings.HasPrefix(pid, \"openstack://\") && len(strings.TrimPrefix(pid, \"openstack://\")) > 0\n}","tryCatchPattern":"info, err := identifier.IdentifyNode(ctx, node)\nif err != nil && strings.Contains(err.Error(), \"not recognized\") {\n    return routeToCorrectIdentifier(ctx, node) // dispatch by actual provider prefix\n}","preventionTips":["Dispatch node identification by providerID prefix before calling a provider-specific identifier","Enforce the canonical 'openstack://<id>' format wherever providerIDs are written","Audit Node objects for foreign-scheme providerIDs in mixed clusters"],"tags":["openstack","node-identity","providerid"],"backgroundTag":"invalid-providerid-format","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}