diff --git a/cmd/kubeadm/app/cmd/reset.go b/cmd/kubeadm/app/cmd/reset.go index 407603d1def..6ee9d02794f 100644 --- a/cmd/kubeadm/app/cmd/reset.go +++ b/cmd/kubeadm/app/cmd/reset.go @@ -95,7 +95,7 @@ func newResetOptions() *resetOptions { func newResetData(cmd *cobra.Command, options *resetOptions, in io.Reader, out io.Writer) (*resetData, error) { var cfg *kubeadmapi.InitConfiguration - client, err := getClientset(options.kubeconfigPath, false) + client, err := cmdutil.GetClientset(options.kubeconfigPath, false) if err == nil { klog.V(1).Infof("[reset] Loaded client set from kubeconfig file: %s", options.kubeconfigPath) cfg, err = configutil.FetchInitConfigurationFromCluster(client, nil, "reset", false, false) diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index 85e81eae6a3..30e47ab519d 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -20,7 +20,6 @@ import ( "context" "fmt" "io" - "os" "strings" "text/tabwriter" "time" @@ -49,9 +48,7 @@ import ( cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" - "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" - kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" "k8s.io/kubernetes/cmd/kubeadm/app/util/output" ) @@ -130,7 +127,7 @@ func newCmdToken(out io.Writer, errW io.Writer) *cobra.Command { klog.V(1).Infoln("[token] getting Clientsets from kubeconfig file") kubeConfigFile = cmdutil.GetKubeConfigPath(kubeConfigFile) - client, err := getClientset(kubeConfigFile, dryRun) + client, err := cmdutil.GetClientset(kubeConfigFile, dryRun) if err != nil { return err } @@ -162,7 +159,7 @@ func newCmdToken(out io.Writer, errW io.Writer) *cobra.Command { `), RunE: func(tokenCmd *cobra.Command, args []string) error { kubeConfigFile = cmdutil.GetKubeConfigPath(kubeConfigFile) - client, err := getClientset(kubeConfigFile, dryRun) + client, err := cmdutil.GetClientset(kubeConfigFile, dryRun) if err != nil { return err } @@ -196,7 +193,7 @@ func newCmdToken(out io.Writer, errW io.Writer) *cobra.Command { return errors.Errorf("missing subcommand; 'token delete' is missing token of form %q", bootstrapapi.BootstrapTokenIDPattern) } kubeConfigFile = cmdutil.GetKubeConfigPath(kubeConfigFile) - client, err := getClientset(kubeConfigFile, dryRun) + client, err := cmdutil.GetClientset(kubeConfigFile, dryRun) if err != nil { return err } @@ -433,14 +430,3 @@ func RunDeleteTokens(out io.Writer, client clientset.Interface, tokenIDsOrTokens } return nil } - -func getClientset(file string, dryRun bool) (clientset.Interface, error) { - if dryRun { - dryRunGetter, err := apiclient.NewClientBackedDryRunGetterFromKubeconfig(file) - if err != nil { - return nil, err - } - return apiclient.NewDryRunClient(dryRunGetter, os.Stdout), nil - } - return kubeconfigutil.ClientSetFromFile(file) -} diff --git a/cmd/kubeadm/app/cmd/token_test.go b/cmd/kubeadm/app/cmd/token_test.go index 84f1ddccfa0..c7a2cab5879 100644 --- a/cmd/kubeadm/app/cmd/token_test.go +++ b/cmd/kubeadm/app/cmd/token_test.go @@ -35,6 +35,7 @@ import ( kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3" outputapischeme "k8s.io/kubernetes/cmd/kubeadm/app/apis/output/scheme" outputapiv1alpha2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/output/v1alpha2" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/util/output" ) @@ -275,12 +276,12 @@ func TestGetClientset(t *testing.T) { fullPath := filepath.Join(tmpDir, testConfigTokenFile) // test dryRun = false on a non-exisiting file - if _, err = getClientset(fullPath, false); err == nil { + if _, err = cmdutil.GetClientset(fullPath, false); err == nil { t.Errorf("getClientset(); dry-run: false; did no fail for test file %q: %v", fullPath, err) } // test dryRun = true on a non-exisiting file - if _, err = getClientset(fullPath, true); err == nil { + if _, err = cmdutil.GetClientset(fullPath, true); err == nil { t.Errorf("getClientset(); dry-run: true; did no fail for test file %q: %v", fullPath, err) } @@ -295,7 +296,7 @@ func TestGetClientset(t *testing.T) { } // test dryRun = true on an exisiting file - if _, err = getClientset(fullPath, true); err != nil { + if _, err = cmdutil.GetClientset(fullPath, true); err != nil { t.Errorf("getClientset(); dry-run: true; failed for test file %q: %v", fullPath, err) } } @@ -320,7 +321,7 @@ func TestRunDeleteTokens(t *testing.T) { t.Errorf("Unable to write test file %q: %v", fullPath, err) } - client, err := getClientset(fullPath, true) + client, err := cmdutil.GetClientset(fullPath, true) if err != nil { t.Errorf("Unable to run getClientset() for test file %q: %v", fullPath, err) } diff --git a/cmd/kubeadm/app/cmd/util/cmdutil.go b/cmd/kubeadm/app/cmd/util/cmdutil.go index 45e28eeea72..26c2f55be72 100644 --- a/cmd/kubeadm/app/cmd/util/cmdutil.go +++ b/cmd/kubeadm/app/cmd/util/cmdutil.go @@ -20,18 +20,22 @@ import ( "bufio" "fmt" "io" + "os" "strings" "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" + clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/klog/v2" kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" + kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" ) // SubCmdRunE returns a function that handles a case where a subcommand must be specified @@ -121,3 +125,15 @@ func InteractivelyConfirmAction(action, question string, r io.Reader) error { return errors.New("won't proceed; the user didn't answer (Y|y) in order to continue") } + +// GetClientSet gets a real or fake client depending on whether the user is dry-running or not +func GetClientset(file string, dryRun bool) (clientset.Interface, error) { + if dryRun { + dryRunGetter, err := apiclient.NewClientBackedDryRunGetterFromKubeconfig(file) + if err != nil { + return nil, err + } + return apiclient.NewDryRunClient(dryRunGetter, os.Stdout), nil + } + return kubeconfigutil.ClientSetFromFile(file) +}