{"record":{"id":"44248264a35a817c","repo":"kubernetes/kops","slug":"cloud-provider-v-does-not-support-the-terraform-t","errorCode":null,"errorMessage":"cloud provider %v does not support the terraform target","messagePattern":"cloud provider (.+?) does not support the terraform target","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/apply_cluster.go","lineNumber":166,"sourceCode":"}\n\n// ApplyResults holds information about an ApplyClusterCmd operation.\ntype ApplyResults struct {\n\t// AssetBuilder holds the initialized AssetBuilder, listing all the image and file assets.\n\tAssetBuilder *assets.AssetBuilder\n}\n\nfunc (c *ApplyClusterCmd) Run(ctx context.Context) (*ApplyResults, error) {\n\tif c.TargetName == TargetTerraform {\n\t\tfound := false\n\t\tfor _, cp := range TerraformCloudProviders {\n\t\t\tif c.Cloud.ProviderID() == cp {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\treturn nil, fmt.Errorf(\"cloud provider %v does not support the terraform target\", c.Cloud.ProviderID())\n\t\t}\n\t\tif c.Cloud.ProviderID() == kops.CloudProviderAzure && !featureflag.AzureTerraform.Enabled() {\n\t\t\treturn nil, fmt.Errorf(\"cloud provider Azure requires the AzureTerraform feature flag to enable the terraform target\")\n\t\t}\n\t\tif c.Cloud.ProviderID() == kops.CloudProviderDO && !featureflag.DOTerraform.Enabled() {\n\t\t\treturn nil, fmt.Errorf(\"cloud provider DigitalOcean requires the DOTerraform feature flag to enable the terraform target\")\n\t\t}\n\t}\n\tif c.InstanceGroups == nil {\n\t\tlist, err := c.Clientset.InstanceGroupsFor(c.Cluster).List(ctx, metav1.ListOptions{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvar instanceGroups []*kops.InstanceGroup\n\t\tfor i := range list.Items {\n\t\t\tinstanceGroups = append(instanceGroups, &list.Items[i])\n\t\t}\n\t\tc.InstanceGroups = instanceGroups","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/apply_cluster.go#L148-L184","documentation":"ApplyClusterCmd.Run validates that the selected --target=terraform is supported by the cluster's cloud provider. Only providers in TerraformCloudProviders (AWS, Azure, GCE, Hetzner, etc.) implement the terraform target; otherwise Run returns 'cloud provider %v does not support the terraform target'.","triggerScenarios":"Running `kops update cluster --target=terraform` on a cluster whose cloudProvider is not in TerraformCloudProviders — e.g. DigitalOcean (without its flag it still fails only at the next check; unsupported ones like OpenStack, Metal, or Alibaba hit this error directly).","commonSituations":"Switching a cluster definition to a provider lacking terraform support while CI pipelines still run with --target=terraform; older kOps versions where the provider was not yet added to TerraformCloudProviders; typo'd/unsupported cloudProvider in the cluster spec.","solutions":["Use --target=direct (default) or --target=dry-run for unsupported providers","Check `grep TerraformCloudProviders` in your kOps version to confirm support; upgrade kOps if the provider recently gained terraform support","For DigitalOcean, enable the DOTerraform feature flag: `export KOPS_FEATURE_FLAGS=DOTerraform`","For Azure, enable the AzureTerraform feature flag (see next error) — this error precedes that check only for truly unsupported providers"],"exampleFix":"// before\nkops update cluster mycluster --target=terraform --yes\n// after (unsupported provider: use direct target)\nkops update cluster mycluster --target=direct --yes\n# or with kOps version that supports DO terraform:\nexport KOPS_FEATURE_FLAGS=DOTerraform && kops update cluster mycluster --target=terraform","handlingStrategy":"validation","validationCode":"// check provider support before invoking update\nsupported := map[kops.CloudProviderID]bool{\n\tkops.CloudProviderAWS: true, kops.CloudProviderGCE: true,\n\tkops.CloudProviderAzure: true, kops.CloudProviderHetzner: true,\n}\nif target == \"terraform\" && !supported[providerID] {\n\treturn fmt.Errorf(\"provider %s has no terraform target; use --target=direct\", providerID)\n}","typeGuard":"func terraformSupported(id kops.CloudProviderID) bool {\n\tfor _, cp := range cloudup.TerraformCloudProviders {\n\t\tif cp == id { return true }\n\t}\n\treturn false\n}","tryCatchPattern":"out, err := run(\"kops\", \"update\", \"cluster\", \"--target=terraform\", \"--yes\")\nif err != nil && strings.Contains(err.Error(), \"does not support the terraform target\") {\n\treturn run(\"kops\", \"update\", \"cluster\", \"--target=direct\", \"--yes\")\n}","preventionTips":["Consult TerraformCloudProviders for your kOps version before choosing --target=terraform","Default to --target=direct for providers without terraform support","Upgrade kOps if your provider recently gained terraform support","Pin the target in CI to match the cluster's cloudProvider"],"tags":["terraform","cloud-provider","cli","unsupported-target"],"backgroundTag":"terraform-target-unsupported-provider","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}