{"record":{"id":"be352f95a6042822","repo":"kubernetes/kops","slug":"error-building-metal-node-identifier-w","errorCode":null,"errorMessage":"error building metal node identifier: %w","messagePattern":"error building metal node identifier: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/kops-controller/main.go","lineNumber":367,"sourceCode":"\t\t\treturn fmt.Errorf(\"error building node identifier: %w\", err)\n\t\t}\n\n\tcase \"azure\":\n\t\tidentifier, err = nodeidentityazure.New(opt.CacheNodeidentityInfo)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error building node identifier: %w\", err)\n\t\t}\n\n\tcase \"scaleway\":\n\t\tidentifier, err = nodeidentityscw.New(opt.CacheNodeidentityInfo)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error building node identifier: %w\", err)\n\t\t}\n\n\tcase \"metal\":\n\t\tidentifier, err = nodeidentitymetal.New()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error building metal node identifier: %w\", err)\n\t\t}\n\n\tcase \"linode\":\n\t\tidentifier, err = nodeidentitylinode.New(opt.CacheNodeidentityInfo)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error building linode node identifier: %w\", err)\n\t\t}\n\n\tcase \"\":\n\t\treturn fmt.Errorf(\"must specify cloud\")\n\n\tdefault:\n\t\treturn fmt.Errorf(\"identifier for cloud %q not implemented\", opt.Cloud)\n\t}\n\n\tnodeController, err := controllers.NewNodeReconciler(mgr, identifier)\n\tif err != nil {\n\t\treturn err","sourceCodeStart":349,"sourceCodeEnd":385,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/cmd/kops-controller/main.go#L349-L385","documentation":"In addNodeController's cloud switch, the \"metal\" case calls nodeidentitymetal.New(); on failure the error is wrapped with the cloud-specific message \"error building metal node identifier: %w\". The controller exits because the node reconciler requires a metal identifier.","triggerScenarios":"Running kops-controller with --cloud=metal when nodeidentitymetal.New fails — e.g. failure to build the metal (bare-metal) identity provider from its environment/configuration.","commonSituations":"Bare-metal deployments where required node metadata (e.g. from the metal environment or CAPI metal provider) is unavailable, or a provider initialization bug after a kOps version change.","solutions":["Read the underlying wrapped error in controller logs to identify the metal init failure","Verify the bare-metal/CAPI metal environment provides the node identity data the provider expects","Confirm you are on a kOps version where the metal node identity provider is supported","Fix the environment and restart the controller"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// verify metal node identity prerequisites before start\nif opt.Cloud == \"metal\" {\n\t// ensure node metadata source (e.g. CAPI metal provider) is reachable\n}\nif err := addNodeController(context, opt); err != nil {\n\tlog.Error(err, \"failed to add node controller\")\n\tos.Exit(1)\n}","typeGuard":null,"tryCatchPattern":"if err := addNodeController(context, opt); err != nil {\n\tlog.Error(err, \"failed to add node controller\", \"cloud\", \"metal\")\n\tos.Exit(1)\n}","preventionTips":["Confirm the bare-metal environment exposes required node metadata","Pin the kops-controller image version to the cluster's kOps version","Watch controller startup logs on first deploy to catch init failures early"],"tags":["metal","bare-metal","kops-controller","startup","node-identity"],"backgroundTag":"node-identifier-init-failed","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"}