{"record":{"id":"245cbc037536aceb","repo":"kubernetes/kops","slug":"error-building-linode-node-identifier-w","errorCode":null,"errorMessage":"error building linode node identifier: %w","messagePattern":"error building linode node identifier: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/kops-controller/main.go","lineNumber":373,"sourceCode":"\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\n\t}\n\tif err := nodeController.SetupWithManager(mgr); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil","sourceCodeStart":355,"sourceCodeEnd":391,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/cmd/kops-controller/main.go#L355-L391","documentation":"In addNodeController's cloud switch, the \"linode\" case calls nodeidentitylinode.New(opt.CacheNodeidentityInfo); on failure the error is wrapped with the cloud-specific message \"error building linode node identifier: %w\". Startup aborts since the node reconciler requires a Linode identifier.","triggerScenarios":"Running kops-controller with --cloud=linode when nodeidentitylinode.New fails — typically Linode credentials/config unavailable or the nodeidentity info cache cannot be initialized when CacheNodeidentityInfo is enabled.","commonSituations":"Missing LINODE_* environment variables/token in the controller pod, wrong region/config, or an unwritable cache directory with --cache-nodeidentity-info.","solutions":["Check controller logs for the underlying wrapped error","Verify Linode API token/credentials are available to the kops-controller pod","If --cache-nodeidentity-info is set, ensure the cache directory exists and is writable","Correct configuration and restart the controller"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// before launching kops-controller with --cloud=linode\nif os.Getenv(\"LINODE_TOKEN\") == \"\" {\n\treturn fmt.Errorf(\"linode token missing from environment\")\n}","typeGuard":null,"tryCatchPattern":"if err := addNodeController(context, opt); err != nil {\n\tlog.Error(err, \"failed to add node controller\")\n\tos.Exit(1)\n}","preventionTips":["Provide LINODE_TOKEN (or equivalent credentials) to the controller pod","Validate Linode API access with linode-cli in the same environment","Ensure cache directory writability when --cache-nodeidentity-info is set"],"tags":["linode","kops-controller","startup","node-identity","cloud-credentials"],"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"}