{"record":{"id":"f1c0083748133d8d","repo":"kubernetes/kops","slug":"identifier-for-cloud-q-not-implemented","errorCode":null,"errorMessage":"identifier for cloud %q not implemented","messagePattern":"identifier for cloud %q not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/kops-controller/main.go","lineNumber":380,"sourceCode":"\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\n}\n\n// Reconciler is the interface for a standard Reconciler.\ntype Reconciler interface {\n\tSetupWithManager(mgr manager.Manager) error\n}\n","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/cmd/kops-controller/main.go#L362-L398","documentation":"addNodeController's cloud switch falls through to default when opt.Cloud holds a value that is not one of the implemented providers (aws, gce, openstack, digitalocean, hetzner, azure, scaleway, metal, linode), returning fmt.Errorf(\"identifier for cloud %q not implemented\", opt.Cloud). This guards against typos or unsupported clouds at startup.","triggerScenarios":"Running kops-controller with --cloud set to an unsupported or misspelled value, e.g. --cloud=AWS (case mismatch), --cloud=vmware, --cloud=openstack-nova, or a provider added in a newer kOps than the deployed binary.","commonSituations":"Typo or wrong casing in the cloud flag; using a cloud provider not yet supported by kops-controller; running an older kOps binary that lacks a newly added provider (e.g. scaleway, metal, linode).","solutions":["Check the exact value passed via --cloud/CLOUD and correct spelling/case to one of: aws, gce, openstack, digitalocean, hetzner, azure, scaleway, metal, linode","Confirm your kOps version supports the cloud; upgrade kops-controller if the provider was added later","Match the cloud value to the one used at cluster creation (kops get cluster output)"],"exampleFix":"// before\n--cloud=AWS\n// after\n--cloud=aws","handlingStrategy":"validation","validationCode":"// validate the cloud value against supported providers before launch\nvar supported = map[string]bool{\n\t\"aws\": true, \"gce\": true, \"openstack\": true, \"digitalocean\": true,\n\t\"hetzner\": true, \"azure\": true, \"scaleway\": true, \"metal\": true, \"linode\": true,\n}\nif !supported[opt.Cloud] {\n\tlog.Error(nil, \"unsupported cloud\", \"cloud\", opt.Cloud)\n\tos.Exit(2)\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":["Match --cloud exactly (lowercase) to a supported provider: aws, gce, openstack, digitalocean, hetzner, azure, scaleway, metal, linode","Derive the flag from cluster spec instead of hand-typing it","Upgrade kops-controller in lockstep when adopting a newly supported provider"],"tags":["configuration","unsupported-cloud","kops-controller","startup"],"backgroundTag":"unsupported-cloud-provider","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"}