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