{"record":{"id":"6d5f8dd15ebf9e38","repo":"kubernetes/kops","slug":"providerid-was-not-set-for-node-s-6d5f8d","errorCode":null,"errorMessage":"providerID was not set for node %s","messagePattern":"providerID was not set for node (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodeidentity/openstack/identify.go","lineNumber":98,"sourceCode":"\t\tType:   \"compute\",\n\t\tRegion: region,\n\t})\n\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 {","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodeidentity/openstack/identify.go#L80-L116","documentation":"IdentifyNode requires node.Spec.ProviderID to be set, since the Linode... the OpenStack identifier derives the instance ID from it. This error is thrown when the Node object has an empty ProviderID, so no OpenStack server can be looked up.","triggerScenarios":"IdentifyNode is called for a Node whose Spec.ProviderID is \"\" — kubelet or the OpenStack cloud-controller-manager never populated it (e.g. --cloud-provider not configured, external CCM missing).","commonSituations":"Clusters where kubelet runs without a cloud provider so providerID is never set, newly-joined nodes processed before the CCM assigns providerIDs, or nodes registered manually.","solutions":["Ensure the OpenStack cloud-controller-manager is running and configured to set providerIDs on Nodes","Configure kubelet with the proper cloud-provider/cloud-config so ProviderID is populated at registration","Wait for/restart the CCM so the existing Node objects get their providerID backfilled"],"exampleFix":"// before\n# node has spec.providerID: \"\"\n// after\n# openstack CCM sets: spec.providerID: \"openstack://<instance-uuid>\"","handlingStrategy":"validation","validationCode":"if node.Spec.ProviderID == \"\" {\n    return fmt.Errorf(\"skip IdentifyNode: node %s has empty providerID\", node.Name)\n}","typeGuard":"func hasProviderID(n *corev1.Node) bool {\n    return n != nil && n.Spec.ProviderID != \"\"\n}","tryCatchPattern":"info, err := identifier.IdentifyNode(ctx, node)\nif err != nil && strings.Contains(err.Error(), \"providerID was not set\") {\n    // defer identification until the CCM assigns a providerID\n    return requeueAfter(ctx, node, time.Minute)\n}","preventionTips":["Deploy the OpenStack cloud-controller-manager so providerIDs are set at registration","Gate identification workflows on providerID presence (requeue instead of erroring)","Alert on nodes that remain providerID-less beyond a grace period"],"tags":["openstack","node-identity","providerid"],"backgroundTag":"missing-providerid","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"}