Skip to content

Commit

Permalink
Merge pull request #29 from buildtool/remove-output
Browse files Browse the repository at this point in the history
chore: remove output when no kubeconfig-content is found in environment
  • Loading branch information
peter-svensson authored Jan 1, 2020
2 parents 24b34d9 + 304753f commit 32c77ce
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 40 deletions.
36 changes: 19 additions & 17 deletions pkg/kubectl/kubectl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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: <green>'%s'</green>", args[kubeConfigArg]))
if _, exists := args[kubeconfigArg]; exists {
_, _ = fmt.Fprintln(out, tml.Sprintf("Using kubeconfig: <green>'%s'</green>", 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
Expand Down Expand Up @@ -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) {
Expand Down
57 changes: 34 additions & 23 deletions pkg/kubectl/kubectl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -202,14 +202,25 @@ func TestKubectl_KubeconfigSet(t *testing.T) {
cluster: k8s.prod
user: [email protected]
`
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: [email protected]\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()
}

Expand All @@ -221,21 +232,21 @@ func TestKubectl_KubeconfigBase64Set(t *testing.T) {
cluster: k8s.prod
user: [email protected]
`
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: [email protected]\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())

Expand Down Expand Up @@ -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) {
Expand All @@ -295,7 +306,7 @@ Events: <none>
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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -366,7 +377,7 @@ Events: <none>
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) {
Expand Down Expand Up @@ -394,15 +405,15 @@ 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
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
Expand Down

0 comments on commit 32c77ce

Please sign in to comment.