{"record":{"id":"13eb729f8b47eab6","repo":"kubernetes/kops","slug":"unknown-cloudprovider-q-13eb72","errorCode":null,"errorMessage":"unknown CloudProvider %q","messagePattern":"unknown CloudProvider %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/apply_cluster.go","lineNumber":513,"sourceCode":"\t\t\t\treturn nil, fmt.Errorf(\"exactly one 'admin' SSH public key can be specified when running with Scaleway; please delete a key using `kops delete secret`\")\n\t\t\t}\n\n\t\t\tscwCloud := cloud.(scaleway.ScwCloud)\n\t\t\tscwZone = scwCloud.Zone()\n\t\t}\n\n\tcase kops.CloudProviderLinode:\n\t\t{\n\t\t\tif !featureflag.Linode.Enabled() {\n\t\t\t\treturn nil, fmt.Errorf(\"Akamai (Linode) support is currently alpha, and is feature-gated. Please export KOPS_FEATURE_FLAGS=Linode\")\n\t\t\t}\n\t\t}\n\n\tcase kops.CloudProviderMetal:\n\t\t// Metal is a special case, we don't need to do anything here (yet)\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown CloudProvider %q\", cluster.GetCloudProvider())\n\t}\n\n\tmodelContext.SSHPublicKeys = sshPublicKeys\n\tmodelContext.Region = cloud.Region()\n\n\tif cluster.PublishesDNSRecords() {\n\t\terr = validateDNS(cluster, cloud)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\taddonRenderer := &addonTemplateRenderer{\n\t\tmodelContext: modelContext,\n\t\tcloud:        cloud,\n\t\tsecretStore:  secretStore,\n\t}\n","sourceCodeStart":495,"sourceCodeEnd":531,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/apply_cluster.go#L495-L531","documentation":"apply_cluster.go Run switches on the cluster's CloudProvider to run provider-specific validation; an unrecognized value falls through to default and returns 'unknown CloudProvider'. This means cluster.Spec.CloudProvider contains a string that this kOps build does not know.","triggerScenarios":"`kops update cluster` on a cluster whose spec.cloudProvider is misspelled, empty after validation gaps, or from a newer kOps version than the installed binary.","commonSituations":"Hand-edited cluster manifests with e.g. cloudProvider: openstackcloud instead of openstack; using an old kOps binary against a cluster spec written by a newer kOps that added a provider; YAML case typos.","solutions":["Check the value: `kops get cluster <name> -o yaml | grep cloudProvider` and fix typos (valid: aws, gce, openstack, do, hetzner, scaleway, linode, metal, azure, spot-ocean etc. per your version)","Upgrade kOps to a version that supports the provider in the spec","Re-create/repair the cluster spec if it was hand-edited incorrectly"],"exampleFix":"// cluster.yaml before\nspec:\n  cloudProvider: openstackcloud\n// after\nspec:\n  cloudProvider: openstack","handlingStrategy":"validation","validationCode":"case \"$(yq '.spec.cloudProvider' cluster.yaml)\" in aws|gce|openstack|do|hetzner|scaleway|linode|metal|azure) echo ok;; *) echo unsupported;; esac","typeGuard":"func knownCloudProvider(s string) bool { switch kops.CloudProviderID(s) { case kops.CloudProviderAWS, kops.CloudProviderGCE, kops.CloudProviderOpenstack, kops.CloudProviderScaleway, kops.CloudProviderLinode, kops.CloudProviderMetal: return true } return false }","tryCatchPattern":"if err := Run(ctx); err != nil { var ucpErr bool; if strings.HasPrefix(err.Error(), \"unknown CloudProvider\") { log.Errorf(\"fix spec.cloudProvider: %v\", err); ucpErr = true } return err }","preventionTips":["Never hand-edit cloudProvider; use `kops edit cluster` and supported values only","Keep kOps binary version in sync with the version that wrote the cluster spec","Lint cluster manifests against the kOps API version in CI"],"tags":["cloudprovider","configuration","validation"],"backgroundTag":"unknown-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"}