diff --git a/cmd/kops/create_cluster.go b/cmd/kops/create_cluster.go index 29dc9627b4..0963282b6a 100644 --- a/cmd/kops/create_cluster.go +++ b/cmd/kops/create_cluster.go @@ -207,7 +207,7 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command { cmd.Flags().BoolVarP(&options.Yes, "yes", "y", options.Yes, "Specify --yes to immediately create the cluster") cmd.Flags().StringVar(&options.Target, "target", options.Target, fmt.Sprintf("Valid targets: %s, %s, %s. Set this flag to %s if you want kOps to generate terraform", cloudup.TargetDirect, cloudup.TargetTerraform, cloudup.TargetCloudformation, cloudup.TargetTerraform)) - cmd.RegisterFlagCompletionFunc("target", completeTarget) + cmd.RegisterFlagCompletionFunc("target", completeCreateClusterTarget(options)) // Configuration / state location if featureflag.EnableSeparateConfigBase.Enabled() { @@ -937,6 +937,24 @@ func completeNetworking(options *CreateClusterOptions) func(cmd *cobra.Command, } } +func completeCreateClusterTarget(options *CreateClusterOptions) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + completions := []string{ + cloudup.TargetDirect, + cloudup.TargetDryRun, + } + for _, cp := range cloudup.TerraformCloudProviders { + if options.CloudProvider == string(cp) { + completions = append(completions, cloudup.TargetTerraform) + } + } + if options.CloudProvider == string(api.CloudProviderAWS) { + completions = append(completions, cloudup.TargetCloudformation) + } + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + func completeDNSZone(options *CreateClusterOptions) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { commandutils.ConfigureKlogForCompletion() diff --git a/cmd/kops/update_cluster.go b/cmd/kops/update_cluster.go index a8810b1650..b35cc3f61a 100644 --- a/cmd/kops/update_cluster.go +++ b/cmd/kops/update_cluster.go @@ -115,7 +115,7 @@ func NewCmdUpdateCluster(f *util.Factory, out io.Writer) *cobra.Command { cmd.Flags().BoolVarP(&options.Yes, "yes", "y", options.Yes, "Create cloud resources, without --yes update is in dry run mode") cmd.Flags().StringVar(&options.Target, "target", options.Target, "Target - direct, terraform, cloudformation") - cmd.RegisterFlagCompletionFunc("target", completeTarget) + cmd.RegisterFlagCompletionFunc("target", completeUpdateClusterTarget(options)) cmd.Flags().StringVar(&options.SSHPublicKey, "ssh-public-key", options.SSHPublicKey, "SSH public key to use (deprecated: use kops create secret instead)") cmd.Flags().StringVar(&options.OutDir, "out", options.OutDir, "Path to write any local output") cmd.MarkFlagDirname("out") @@ -468,8 +468,36 @@ func hasKubecfg(contextName string) (bool, error) { return false, nil } -func completeTarget(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{cloudup.TargetDirect, cloudup.TargetDryRun, cloudup.TargetTerraform, cloudup.TargetCloudformation}, cobra.ShellCompDirectiveNoFileComp +func completeUpdateClusterTarget(options *UpdateClusterOptions) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + + commandutils.ConfigureKlogForCompletion() + ctx := context.TODO() + + cluster, _, _, directive := GetClusterForCompletion(ctx, &rootCommand, nil) + if cluster == nil { + return []string{ + cloudup.TargetDirect, + cloudup.TargetDryRun, + cloudup.TargetCloudformation, + cloudup.TargetTerraform, + }, directive + } + + completions := []string{ + cloudup.TargetDirect, + cloudup.TargetDryRun, + } + for _, cp := range cloudup.TerraformCloudProviders { + if cluster.Spec.CloudProvider == string(cp) { + completions = append(completions, cloudup.TargetTerraform) + } + } + if cluster.Spec.CloudProvider == string(kops.CloudProviderAWS) { + completions = append(completions, cloudup.TargetCloudformation) + } + return completions, cobra.ShellCompDirectiveNoFileComp + } } func completeLifecycleOverrides(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index 682a6d4015..9ad599531d 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -83,6 +83,9 @@ const ( OldestSupportedKubernetesVersion = "1.17.0" // OldestRecommendedKubernetesVersion is the oldest kubernetes version that is not deprecated in kOps. OldestRecommendedKubernetesVersion = "1.19.0" +) + +var ( // TerraformCloudProviders is the list of cloud providers with terraform target support TerraformCloudProviders = []kops.CloudProviderID{kops.CloudProviderAWS, kops.CloudProviderGCE, kops.CloudProviderALI} )