From 304753ffcce767ebd39ab8aa0268a4d5e47fea3d Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Sun, 29 Dec 2019 21:51:25 +0100 Subject: [PATCH] chore: remove output when no kubeconfig-content is found in environment and a few renamed vars --- pkg/kubectl/kubectl.go | 36 ++++++++++++----------- pkg/kubectl/kubectl_test.go | 57 ++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/pkg/kubectl/kubectl.go b/pkg/kubectl/kubectl.go index 70faa992..8f9fd7df 100644 --- a/pkg/kubectl/kubectl.go +++ b/pkg/kubectl/kubectl.go @@ -45,7 +45,7 @@ func New(environment *config.Environment, out, eout io.Writer) Kubectl { } func argsFromEnvironment(e *config.Environment, tempDir string, out, eout io.Writer) map[string]string { - kubeConfigArg := "kubeconfig" + kubeconfigArg := "kubeconfig" args := make(map[string]string) if len(e.Context) > 0 { args["context"] = e.Context @@ -54,22 +54,22 @@ func argsFromEnvironment(e *config.Environment, tempDir string, out, eout io.Wri args["namespace"] = e.Namespace } - if file, err := getKubeconfigFileFromEnvs(tempDir, out); err != nil { + if file, exists, err := getKubeconfigFileFromEnvs(tempDir, out); err != nil { _, _ = fmt.Fprintln(eout, err.Error()) - } else { - args[kubeConfigArg] = file + } else if exists { + args[kubeconfigArg] = file } if len(e.Kubeconfig) > 0 { - args[kubeConfigArg] = e.Kubeconfig + args[kubeconfigArg] = e.Kubeconfig } - if _, exists := args[kubeConfigArg]; exists { - _, _ = fmt.Fprintln(out, tml.Sprintf("Using kubeconfig: '%s'", args[kubeConfigArg])) + if _, exists := args[kubeconfigArg]; exists { + _, _ = fmt.Fprintln(out, tml.Sprintf("Using kubeconfig: '%s'", args[kubeconfigArg])) } return args } -func writeKubeConfigFile(tempDir string, content []byte) (string, error) { +func writeKubeconfigFile(tempDir string, content []byte) (string, error) { kubeconfigFile := filepath.Join(tempDir, "kubeconfig") err := ioutil.WriteFile(kubeconfigFile, content, 0777) return kubeconfigFile, err @@ -175,22 +175,24 @@ func (k kubectl) extractEvents(output string) string { var _ Kubectl = &kubectl{} -const envKubeConfigContent = "KUBECONFIG_CONTENT" -const envKubeConfigContentBase64 = "KUBECONFIG_CONTENT_BASE64" +const envKubeconfigContent = "KUBECONFIG_CONTENT" +const envKubeconfigContentBase64 = "KUBECONFIG_CONTENT_BASE64" -func getKubeconfigFileFromEnvs(tempDir string, out io.Writer) (string, error) { - if content, exists := getEnv(envKubeConfigContentBase64, out); exists { +func getKubeconfigFileFromEnvs(tempDir string, out io.Writer) (string, bool, error) { + if content, exists := getEnv(envKubeconfigContentBase64, out); exists { if decoded, err := base64.StdEncoding.DecodeString(content); err != nil { - return "", errors.Wrap(err, "Failed to decode content") + return "", true, errors.Wrap(err, "Failed to decode content") } else { - return writeKubeConfigFile(tempDir, decoded) + file, err := writeKubeconfigFile(tempDir, decoded) + return file, true, err } } - if content, exists := getEnv(envKubeConfigContent, out); exists { - return writeKubeConfigFile(tempDir, []byte(content)) + if content, exists := getEnv(envKubeconfigContent, out); exists { + file, err := writeKubeconfigFile(tempDir, []byte(content)) + return file, true, err } - return "", errors.New("failed to get kubeconfig from environment") + return "", false, nil } func getEnv(env string, out io.Writer) (string, bool) { diff --git a/pkg/kubectl/kubectl_test.go b/pkg/kubectl/kubectl_test.go index 669f9034..61ce77f6 100644 --- a/pkg/kubectl/kubectl_test.go +++ b/pkg/kubectl/kubectl_test.go @@ -26,7 +26,7 @@ func TestNew(t *testing.T) { assert.Equal(t, "missing", k.(*kubectl).args["context"]) assert.Equal(t, "dev", k.(*kubectl).args["namespace"]) assert.Equal(t, "", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestNew_NoNamespace(t *testing.T) { @@ -100,7 +100,7 @@ func TestKubectl_Environment(t *testing.T) { assert.Equal(t, "", k.(*kubectl).args["namespace"]) assert.Equal(t, "", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_DeploymentExistsTrue(t *testing.T) { @@ -117,7 +117,7 @@ func TestKubectl_DeploymentExistsTrue(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"get", "deployment", "image", "--context", "missing", "--namespace", "default"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default get deployment image\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_DeploymentExistsFalse(t *testing.T) { @@ -135,7 +135,7 @@ func TestKubectl_DeploymentExistsFalse(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"get", "deployment", "image", "--context", "missing", "--namespace", "default"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default get deployment image\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_RolloutStatusSuccess(t *testing.T) { @@ -152,7 +152,7 @@ func TestKubectl_RolloutStatusSuccess(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"rollout", "status", "deployment", "image", "--context", "missing", "--namespace", "default", "--timeout", "2m0s"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default rollout status deployment --timeout=2m image\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_RolloutStatusFailure(t *testing.T) { @@ -170,7 +170,7 @@ func TestKubectl_RolloutStatusFailure(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"rollout", "status", "deployment", "image", "--context", "missing", "--namespace", "default", "--timeout", "2m0s"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default rollout status deployment --timeout=2m image\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_RolloutStatusFatal(t *testing.T) { @@ -191,7 +191,7 @@ func TestKubectl_RolloutStatusFatal(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"rollout", "status", "deployment", "image", "--context", "missing", "--namespace", "default", "--timeout", "3m0s"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default rollout status deployment --timeout=3m image\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_KubeconfigSet(t *testing.T) { @@ -202,14 +202,25 @@ func TestKubectl_KubeconfigSet(t *testing.T) { cluster: k8s.prod user: user@example.org ` - defer pkg.SetEnv(envKubeConfigContent, yaml)() + defer pkg.SetEnv(envKubeconfigContent, yaml)() k := New(&config.Environment{}, out, eout) - kubeConfigFile := filepath.Join(k.(*kubectl).tempDir, "kubeconfig") - fileContent, err := ioutil.ReadFile(kubeConfigFile) + kubeconfigFile := filepath.Join(k.(*kubectl).tempDir, "kubeconfig") + fileContent, err := ioutil.ReadFile(kubeconfigFile) assert.NoError(t, err) assert.Equal(t, "contexts:\n- context:\n cluster: k8s.prod\n user: user@example.org\n", string(fileContent)) - assert.Equal(t, kubeConfigFile, k.(*kubectl).args["kubeconfig"]) + assert.Equal(t, kubeconfigFile, k.(*kubectl).args["kubeconfig"]) + k.Cleanup() +} + +func TestKubectl_KubeconfigSetToEmptyValue(t *testing.T) { + out := &bytes.Buffer{} + eout := &bytes.Buffer{} + yaml := `` + defer pkg.SetEnv(envKubeconfigContent, yaml)() + k := New(&config.Environment{}, out, eout) + + assert.Equal(t, "", k.(*kubectl).args["kubeconfig"]) k.Cleanup() } @@ -221,21 +232,21 @@ func TestKubectl_KubeconfigBase64Set(t *testing.T) { cluster: k8s.prod user: user@example.org ` - defer pkg.SetEnv(envKubeConfigContentBase64, base64.StdEncoding.EncodeToString([]byte(yaml)))() + defer pkg.SetEnv(envKubeconfigContentBase64, base64.StdEncoding.EncodeToString([]byte(yaml)))() k := New(&config.Environment{}, out, eout) - kubeConfigFile := filepath.Join(k.(*kubectl).tempDir, "kubeconfig") - fileContent, err := ioutil.ReadFile(kubeConfigFile) + kubeconfigFile := filepath.Join(k.(*kubectl).tempDir, "kubeconfig") + fileContent, err := ioutil.ReadFile(kubeconfigFile) assert.NoError(t, err) assert.Equal(t, "contexts:\n- context:\n cluster: k8s.prod\n user: user@example.org\n", string(fileContent)) - assert.Equal(t, kubeConfigFile, k.(*kubectl).args["kubeconfig"]) + assert.Equal(t, kubeconfigFile, k.(*kubectl).args["kubeconfig"]) k.Cleanup() } func TestKubectl_KubeconfigInvalidBase64Set(t *testing.T) { out := &bytes.Buffer{} eout := &bytes.Buffer{} - defer pkg.SetEnv(envKubeConfigContentBase64, "äö")() + defer pkg.SetEnv(envKubeconfigContentBase64, "äö")() k := New(&config.Environment{}, out, eout) assert.Equal(t, "Failed to decode content: illegal base64 data at input byte 0\n", eout.String()) @@ -272,7 +283,7 @@ func TestKubectl_DeploymentEvents_Error(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "deployment", "image", "--context", "missing", "--namespace", "default", "--show-events", "true"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe deployment image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_DeploymentEvents_NoEvents(t *testing.T) { @@ -295,7 +306,7 @@ Events: assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "deployment", "image", "--context", "missing", "--namespace", "default", "--show-events", "true"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe deployment image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_DeploymentEvents_SomeEvents(t *testing.T) { @@ -324,7 +335,7 @@ Events: assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "deployment", "image", "--context", "missing", "--namespace", "default", "--show-events", "true"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe deployment image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_PodEvents_Error(t *testing.T) { @@ -343,7 +354,7 @@ func TestKubectl_PodEvents_Error(t *testing.T) { assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "pods", "--context", "missing", "--namespace", "default", "--show-events", "true", "--selector", "app=image"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe pods -l app=image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_PodEvents_NoEvents(t *testing.T) { @@ -366,7 +377,7 @@ Events: assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "pods", "--context", "missing", "--namespace", "default", "--show-events", "true", "--selector", "app=image"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe pods -l app=image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } func TestKubectl_PodEvents_SomeEvents(t *testing.T) { @@ -394,7 +405,7 @@ Events: assert.Equal(t, 1, len(calls)) assert.Equal(t, []string{"describe", "pods", "--context", "missing", "--namespace", "default", "--show-events", "true", "--selector", "app=image"}, calls[0]) assert.Equal(t, "kubectl --context missing --namespace default describe pods -l app=image --show-events=true\n", out.String()) - assert.Equal(t, "failed to get kubeconfig from environment\n", eout.String()) + assert.Equal(t, "", eout.String()) } var calls [][]string @@ -402,7 +413,7 @@ var cmdError *string var events *string var fatal = false -func mockCmd(in io.Reader, out, err io.Writer) *cobra.Command { +func mockCmd(_ io.Reader, out, _ io.Writer) *cobra.Command { var ctx, ns, file *string var timeout *time.Duration var showEvents *bool