diff --git a/cmd/kops/update_cluster.go b/cmd/kops/update_cluster.go index 6f4f1cd074..322364a546 100644 --- a/cmd/kops/update_cluster.go +++ b/cmd/kops/update_cluster.go @@ -37,7 +37,6 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup" "k8s.io/kops/upup/pkg/fi/utils" - "k8s.io/kops/upup/pkg/kutil" "k8s.io/kubectl/pkg/util/i18n" "k8s.io/kubectl/pkg/util/templates" ) @@ -313,12 +312,12 @@ func RunUpdateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Up firstRun := false if !isDryrun && c.CreateKubecfg { - hasKubecfg, err := hasKubecfg(cluster.ObjectMeta.Name) + hasKubeconfig, err := clusterIsInKubeConfig(cluster.ObjectMeta.Name) if err != nil { - klog.Warningf("error reading kubecfg: %v", err) - hasKubecfg = true + klog.Warningf("error reading kubeconfig: %v", err) + hasKubeconfig = true } - firstRun = !hasKubecfg + firstRun = !hasKubeconfig klog.Infof("Exporting kubeconfig for cluster") @@ -439,19 +438,21 @@ func findBastionPublicName(c *kops.Cluster) string { return bastion.PublicName } -func hasKubecfg(contextName string) (bool, error) { - kubectl := &kutil.Kubectl{} - - config, err := kubectl.GetConfig(false) +// clusterIsInKubeConfig checks if we have a context with the specified name (cluster name) in ~/.kube/config. +// It is used as a check to see if this is (likely) a new cluster. +func clusterIsInKubeConfig(contextName string) (bool, error) { + configAccess := clientcmd.NewDefaultPathOptions() + config, err := configAccess.GetStartingConfig() if err != nil { - return false, fmt.Errorf("error getting config from kubectl: %v", err) + return false, fmt.Errorf("error reading kubeconfig: %w", err) } - for _, context := range config.Contexts { - if context.Name == contextName { + for k := range config.Contexts { + if k == contextName { return true, nil } } + return false, nil } diff --git a/upup/pkg/kutil/kubectl.go b/upup/pkg/kutil/kubectl.go deleted file mode 100644 index ae940b26a1..0000000000 --- a/upup/pkg/kutil/kubectl.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kutil - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "os/exec" - "strings" - - "k8s.io/klog/v2" - "k8s.io/kops/pkg/kubeconfig" -) - -type Kubectl struct { - KubectlPath string -} - -func (k *Kubectl) GetConfig(minify bool) (*kubeconfig.KubectlConfig, error) { - output := "json" - // TODO: --context doesn't seem to work - args := []string{"config", "view"} - - if minify { - args = append(args, "--minify") - } - - if output != "" { - args = append(args, "--output", output) - } - - configString, _, err := k.execKubectl(args...) - if err != nil { - return nil, err - } - configString = strings.TrimSpace(configString) - - klog.V(8).Infof("config = %q", configString) - - config := &kubeconfig.KubectlConfig{} - err = json.Unmarshal([]byte(configString), config) - if err != nil { - return nil, fmt.Errorf("cannot parse current config from kubectl: %v", err) - } - - return config, nil -} - -func (k *Kubectl) execKubectl(args ...string) (string, string, error) { - kubectlPath := k.KubectlPath - if kubectlPath == "" { - kubectlPath = "kubectl" // Assume in PATH - } - cmd := exec.Command(kubectlPath, args...) - env := os.Environ() - cmd.Env = env - var stdout bytes.Buffer - cmd.Stdout = &stdout - - var stderr bytes.Buffer - cmd.Stderr = &stderr - - human := strings.Join(cmd.Args, " ") - klog.V(2).Infof("Running command: %s", human) - err := cmd.Run() - if err != nil { - klog.Infof("error running %s", human) - klog.Info(stdout.String()) - klog.Info(stderr.String()) - return stdout.String(), stderr.String(), fmt.Errorf("error running kubectl: %v", err) - } - - return stdout.String(), stderr.String(), err -}