diff --git a/cmd/kubeadm/app/cmd/config.go b/cmd/kubeadm/app/cmd/config.go index b515a690421..bc645afb84b 100644 --- a/cmd/kubeadm/app/cmd/config.go +++ b/cmd/kubeadm/app/cmd/config.go @@ -21,7 +21,6 @@ import ( "fmt" "io" "io/ioutil" - "path/filepath" "strings" "github.com/golang/glog" @@ -35,11 +34,11 @@ import ( kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmapiv1alpha2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha2" kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" phaseutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/componentconfigs" "k8s.io/kubernetes/cmd/kubeadm/app/constants" - kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/images" "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" @@ -62,8 +61,8 @@ var ( // NewCmdConfig returns cobra.Command for "kubeadm config" command func NewCmdConfig(out io.Writer) *cobra.Command { + kubeConfigFile := constants.GetAdminKubeConfigPath() - var kubeConfigFile string cmd := &cobra.Command{ Use: "config", Short: "Manage configuration for a kubeadm cluster persisted in a ConfigMap in the cluster.", @@ -81,8 +80,9 @@ func NewCmdConfig(out io.Writer) *cobra.Command { RunE: cmdutil.SubCmdRunE("config"), } - cmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster.") + options.AddKubeConfigFlag(cmd.PersistentFlags(), &kubeConfigFile) + kubeConfigFile = cmdutil.FindExistingKubeConfig(kubeConfigFile) cmd.AddCommand(NewCmdConfigPrintDefault(out)) cmd.AddCommand(NewCmdConfigMigrate(out)) cmd.AddCommand(NewCmdConfigUpload(out, &kubeConfigFile)) diff --git a/cmd/kubeadm/app/cmd/options/generic.go b/cmd/kubeadm/app/cmd/options/generic.go index 7aa8d82f98c..77bee3333bc 100644 --- a/cmd/kubeadm/app/cmd/options/generic.go +++ b/cmd/kubeadm/app/cmd/options/generic.go @@ -20,7 +20,7 @@ import "github.com/spf13/pflag" // AddKubeConfigFlag adds the --kubeconfig flag to the given flagset func AddKubeConfigFlag(fs *pflag.FlagSet, kubeConfigFile *string) { - fs.StringVar(kubeConfigFile, "kubeconfig", *kubeConfigFile, "The KubeConfig file to use when talking to the cluster") + fs.StringVar(kubeConfigFile, "kubeconfig", *kubeConfigFile, "The KubeConfig file to use when talking to the cluster. If the flag is not set, a set of standard locations are searched for an existing KubeConfig file.") } // AddConfigFlag adds the --config flag to the given flagset diff --git a/cmd/kubeadm/app/cmd/phases/addons.go b/cmd/kubeadm/app/cmd/phases/addons.go index 252538e6318..3ef7ad4555b 100644 --- a/cmd/kubeadm/app/cmd/phases/addons.go +++ b/cmd/kubeadm/app/cmd/phases/addons.go @@ -17,7 +17,6 @@ limitations under the License. package phases import ( - "path/filepath" "strings" "github.com/golang/glog" @@ -28,6 +27,7 @@ import ( kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" @@ -100,8 +100,9 @@ func getAddonsSubCommands() []*cobra.Command { // Default values for the cobra help text kubeadmscheme.Scheme.Default(cfg) - var cfgPath, kubeConfigFile, featureGatesString string + var cfgPath, featureGatesString string var subCmds []*cobra.Command + kubeConfigFile := kubeadmconstants.GetAdminKubeConfigPath() subCmdProperties := []struct { use string @@ -138,11 +139,11 @@ func getAddonsSubCommands() []*cobra.Command { Short: properties.short, Long: properties.long, Example: properties.examples, - Run: runAddonsCmdFunc(properties.cmdFunc, cfg, &kubeConfigFile, &cfgPath, &featureGatesString), + Run: runAddonsCmdFunc(properties.cmdFunc, cfg, kubeConfigFile, &cfgPath, &featureGatesString), } // Add flags to the command - cmd.Flags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster") + options.AddKubeConfigFlag(cmd.Flags(), &kubeConfigFile) cmd.Flags().StringVar(&cfgPath, "config", cfgPath, "Path to a kubeadm config file. WARNING: Usage of a configuration file is experimental") cmd.Flags().StringVar(&cfg.KubernetesVersion, "kubernetes-version", cfg.KubernetesVersion, `Choose a specific Kubernetes version for the control plane`) cmd.Flags().StringVar(&cfg.ImageRepository, "image-repository", cfg.ImageRepository, `Choose a container registry to pull control plane images from`) @@ -166,7 +167,7 @@ func getAddonsSubCommands() []*cobra.Command { } // runAddonsCmdFunc creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters) -func runAddonsCmdFunc(cmdFunc func(cfg *kubeadmapi.InitConfiguration, client clientset.Interface) error, cfg *kubeadmapiv1alpha3.InitConfiguration, kubeConfigFile *string, cfgPath *string, featureGatesString *string) func(cmd *cobra.Command, args []string) { +func runAddonsCmdFunc(cmdFunc func(cfg *kubeadmapi.InitConfiguration, client clientset.Interface) error, cfg *kubeadmapiv1alpha3.InitConfiguration, kubeConfigFile string, cfgPath *string, featureGatesString *string) func(cmd *cobra.Command, args []string) { // the following statement build a clousure that wraps a call to a cmdFunc, binding // the function itself with the specific parameters of each sub command. @@ -185,7 +186,8 @@ func runAddonsCmdFunc(cmdFunc func(cfg *kubeadmapi.InitConfiguration, client cli internalcfg := &kubeadmapi.InitConfiguration{} kubeadmscheme.Scheme.Convert(cfg, internalcfg, nil) - client, err := kubeconfigutil.ClientSetFromFile(*kubeConfigFile) + kubeConfigFile = cmdutil.FindExistingKubeConfig(kubeConfigFile) + client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) kubeadmutil.CheckErr(err) internalcfg, err = configutil.ConfigFileAndDefaultsToInternalConfig(*cfgPath, cfg) kubeadmutil.CheckErr(err) diff --git a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go index 23293095db2..6e49b4c7088 100644 --- a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go +++ b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go @@ -18,7 +18,6 @@ package phases import ( "fmt" - "path/filepath" "github.com/golang/glog" "github.com/spf13/cobra" @@ -32,7 +31,7 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" - kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + kubeadmconstants"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo" "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" @@ -88,7 +87,8 @@ var ( // NewCmdBootstrapToken returns the Cobra command for running the mark-master phase func NewCmdBootstrapToken() *cobra.Command { - var kubeConfigFile string + kubeConfigFile := kubeadmconstants.GetAdminKubeConfigPath() + cmd := &cobra.Command{ Use: "bootstrap-token", Short: "Manage kubeadm-specific bootstrap token functions", @@ -96,7 +96,7 @@ func NewCmdBootstrapToken() *cobra.Command { Aliases: []string{"bootstraptoken"}, } - cmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster") + options.AddKubeConfigFlag(cmd.PersistentFlags(), &kubeConfigFile) // Add subcommands cmd.AddCommand(NewSubCmdBootstrapTokenAll(&kubeConfigFile)) diff --git a/cmd/kubeadm/app/cmd/phases/markmaster.go b/cmd/kubeadm/app/cmd/phases/markmaster.go index a1dec564d9b..42a2fcf3b00 100644 --- a/cmd/kubeadm/app/cmd/phases/markmaster.go +++ b/cmd/kubeadm/app/cmd/phases/markmaster.go @@ -17,13 +17,12 @@ limitations under the License. package phases import ( - "path/filepath" - "github.com/spf13/cobra" kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" markmasterphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster" @@ -54,7 +53,9 @@ func NewCmdMarkMaster() *cobra.Command { // Default values for the cobra help text kubeadmscheme.Scheme.Default(cfg) - var cfgPath, kubeConfigFile string + var cfgPath string + kubeConfigFile := kubeadmconstants.GetAdminKubeConfigPath() + cmd := &cobra.Command{ Use: "mark-master", Short: "Mark a node as master", @@ -66,6 +67,7 @@ func NewCmdMarkMaster() *cobra.Command { kubeadmutil.CheckErr(err) } + kubeConfigFile = cmdutil.FindExistingKubeConfig(kubeConfigFile) client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) kubeadmutil.CheckErr(err) @@ -83,7 +85,7 @@ func NewCmdMarkMaster() *cobra.Command { }, } - cmd.Flags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster") + options.AddKubeConfigFlag(cmd.Flags(), &kubeConfigFile) cmd.Flags().StringVar(&cfgPath, "config", cfgPath, "Path to kubeadm config file. WARNING: Usage of a configuration file is experimental") cmd.Flags().StringVar(&cfg.NodeRegistration.Name, "node-name", cfg.NodeRegistration.Name, `The node name to which label and taints should apply`) diff --git a/cmd/kubeadm/app/cmd/phases/selfhosting.go b/cmd/kubeadm/app/cmd/phases/selfhosting.go index 0a0d9b38eca..96f146b3a1d 100644 --- a/cmd/kubeadm/app/cmd/phases/selfhosting.go +++ b/cmd/kubeadm/app/cmd/phases/selfhosting.go @@ -18,7 +18,6 @@ package phases import ( "os" - "path/filepath" "strings" "time" @@ -27,9 +26,9 @@ import ( kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/constants" - kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/phases/selfhosting" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" @@ -76,7 +75,8 @@ func getSelfhostingSubCommand() *cobra.Command { // Default values for the cobra help text kubeadmscheme.Scheme.Default(cfg) - var cfgPath, kubeConfigFile, featureGatesString string + var cfgPath, featureGatesString string + kubeConfigFile := constants.GetAdminKubeConfigPath() // Creates the UX Command cmd := &cobra.Command{ @@ -96,6 +96,7 @@ func getSelfhostingSubCommand() *cobra.Command { } // Gets the kubernetes client + kubeConfigFile = cmdutil.FindExistingKubeConfig(kubeConfigFile) client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) kubeadmutil.CheckErr(err) @@ -124,7 +125,7 @@ func getSelfhostingSubCommand() *cobra.Command { // flags that are not bound to the configuration object // Note: All flags that are not bound to the cfg object should be whitelisted in cmd/kubeadm/app/apis/kubeadm/validation/validation.go - cmd.Flags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster") + options.AddKubeConfigFlag(cmd.Flags(), &kubeConfigFile) return cmd } diff --git a/cmd/kubeadm/app/cmd/phases/uploadconfig.go b/cmd/kubeadm/app/cmd/phases/uploadconfig.go index 4ff0bf2b4a2..d2f1bc90418 100644 --- a/cmd/kubeadm/app/cmd/phases/uploadconfig.go +++ b/cmd/kubeadm/app/cmd/phases/uploadconfig.go @@ -18,12 +18,12 @@ package phases import ( "fmt" - "path/filepath" "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeadmapiv1alpha3 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha3" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" @@ -50,7 +50,8 @@ var ( // NewCmdUploadConfig returns the Cobra command for running the uploadconfig phase func NewCmdUploadConfig() *cobra.Command { cfg := &kubeadmapiv1alpha3.InitConfiguration{} - var cfgPath, kubeConfigFile string + kubeConfigFile := kubeadmconstants.GetAdminKubeConfigPath() + var cfgPath string cmd := &cobra.Command{ Use: "upload-config", @@ -62,6 +63,8 @@ func NewCmdUploadConfig() *cobra.Command { if len(cfgPath) == 0 { kubeadmutil.CheckErr(fmt.Errorf("the --config flag is mandatory")) } + + kubeConfigFile = cmdutil.FindExistingKubeConfig(kubeConfigFile) client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) kubeadmutil.CheckErr(err) @@ -78,7 +81,7 @@ func NewCmdUploadConfig() *cobra.Command { }, } - cmd.Flags().StringVar(&kubeConfigFile, "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster") + options.AddKubeConfigFlag(cmd.Flags(), &kubeConfigFile) cmd.Flags().StringVar(&cfgPath, "config", "", "Path to a kubeadm config file. WARNING: Usage of a configuration file is experimental") return cmd diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index b35c5cb17e8..b10b90aee4d 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -20,7 +20,6 @@ import ( "fmt" "io" "os" - "path/filepath" "strings" "text/tabwriter" "time" @@ -52,7 +51,7 @@ import ( // NewCmdToken returns cobra.Command for token management func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { - var kubeConfigFile string + kubeConfigFile := kubeadmconstants.GetAdminKubeConfigPath() var dryRun bool tokenCmd := &cobra.Command{ Use: "token", @@ -84,8 +83,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { RunE: cmdutil.SubCmdRunE("token"), } - tokenCmd.PersistentFlags().StringVar(&kubeConfigFile, - "kubeconfig", filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "The KubeConfig file to use when talking to the cluster. If the flag is not set a set of standard locations are searched for an existing KubeConfig file") + options.AddKubeConfigFlag(tokenCmd.PersistentFlags(), &kubeConfigFile) tokenCmd.PersistentFlags().BoolVar(&dryRun, "dry-run", dryRun, "Whether to enable dry-run mode or not") diff --git a/cmd/kubeadm/app/cmd/util/cmdutil.go b/cmd/kubeadm/app/cmd/util/cmdutil.go index cf9042f4ae8..ad63ba0d5fc 100644 --- a/cmd/kubeadm/app/cmd/util/cmdutil.go +++ b/cmd/kubeadm/app/cmd/util/cmdutil.go @@ -69,7 +69,7 @@ func FindExistingKubeConfig(file string) string { return file } // The user did not provide a --kubeconfig flag. Find a config in the standard - // locations using DefaultClientConfigLoadingRules, but also consider `defaultKubeConfig`. + // locations using DefaultClientConfigLoadingRules, but also consider the default config path. rules := clientcmd.NewDefaultClientConfigLoadingRules() rules.Precedence = append(rules.Precedence, filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName)) return rules.GetDefaultFilename()