From 013de40a6cc03c001e8c93f9cd3728a36406d5ac Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Tue, 29 Sep 2020 18:11:25 +0200 Subject: [PATCH] UnitTest: DockerConfLocation must return a file if it is existent and passed using env, or default if the file is incorrect --- pkg/executor/push.go | 11 ++++-- pkg/executor/push_test.go | 70 ++++++++++++++++++++++++++++++++++----- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/pkg/executor/push.go b/pkg/executor/push.go index a99554e98c..f855060e6a 100644 --- a/pkg/executor/push.go +++ b/pkg/executor/push.go @@ -67,8 +67,15 @@ const ( func DockerConfLocation() string { configFile := "config.json" if dockerConfig := os.Getenv("DOCKER_CONFIG"); dockerConfig != "" { - if file, err := os.Stat(dockerConfig); err == nil && file.IsDir() { - return filepath.Join(dockerConfig, configFile) + file, err := os.Stat(dockerConfig) + if err == nil { + if file.IsDir() { + return filepath.Join(dockerConfig, configFile) + } + } else { + if os.IsNotExist(err) { + return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) + } } return filepath.Clean(dockerConfig) } diff --git a/pkg/executor/push_test.go b/pkg/executor/push_test.go index 41b5c5708d..53475fe3ec 100644 --- a/pkg/executor/push_test.go +++ b/pkg/executor/push_test.go @@ -37,6 +37,11 @@ import ( "github.com/spf13/afero" ) +const ( + DefaultKanikoDockerConfigJSON = "/kaniko/.docker/config.json" + DockerConfigEnvKey = "DOCKER_CONFIG" +) + func mustTag(t *testing.T, s string) name.Tag { tag, err := name.NewTag(s, name.StrictValidation) if err != nil { @@ -45,15 +50,59 @@ func mustTag(t *testing.T, s string) name.Tag { return tag } +func TestDockerConfLocationWithFileLocation(t *testing.T) { + originalDockerConfig := os.Getenv(DockerConfigEnvKey) + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + file, err := ioutil.TempFile("", "docker.conf") + if err != nil { + t.Fatalf("could not create temp file: %s", err) + } + defer os.Remove(file.Name()) + if err := os.Setenv(DockerConfigEnvKey, file.Name()); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + unset := DockerConfLocation() + unsetExpected := file.Name() + if unset != unsetExpected { + t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) + } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} + +func TestDockerConfLocationWithInvalidFileLocation(t *testing.T) { + originalDockerConfig := os.Getenv(DockerConfigEnvKey) + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + tmpDir, err := ioutil.TempDir("", "*") + if err != nil { + t.Fatalf("could not create temp dir: %s", err) + } + defer os.RemoveAll(tmpDir) + random := "fdgdsfrdfgdf-fdfsf-24dsgfd" //replace with a really random string + file := filepath.Join(tmpDir, random) // an random file name, shouldn't exist + if err := os.Setenv(DockerConfigEnvKey, file); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + unset := DockerConfLocation() + // as file doesn't point to a real file, DockerConfLocation() should return the default kaniko path for config.json + unsetExpected := DefaultKanikoDockerConfigJSON + if unset != unsetExpected { + t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) + } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} + func TestDockerConfLocation(t *testing.T) { - dcfg := "DOCKER_CONFIG" - originalDockerConfig := os.Getenv(dcfg) + originalDockerConfig := os.Getenv(DockerConfigEnvKey) - if err := os.Unsetenv(dcfg); err != nil { + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } unset := DockerConfLocation() - unsetExpected := "/kaniko/.docker/config.json" // will fail on Windows + unsetExpected := DefaultKanikoDockerConfigJSON // will fail on Windows if unset != unsetExpected { t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) } @@ -65,11 +114,11 @@ func TestDockerConfLocation(t *testing.T) { dir := filepath.Join(tmpDir, "/kaniko/.docker") os.MkdirAll(dir, os.ModePerm) - if err := os.Setenv(dcfg, dir); err != nil { + if err := os.Setenv(DockerConfigEnvKey, dir); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } kanikoDefault := DockerConfLocation() - kanikoDefaultExpected := filepath.Join(tmpDir, "/kaniko/.docker/config.json") // will fail on Windows + kanikoDefaultExpected := filepath.Join(tmpDir, DefaultKanikoDockerConfigJSON) // will fail on Windows if kanikoDefault != kanikoDefaultExpected { t.Errorf("Unexpected kaniko default Docker conf file location: expected:'%s' got:'%s'", kanikoDefaultExpected, kanikoDefault) } @@ -79,7 +128,7 @@ func TestDockerConfLocation(t *testing.T) { t.Fatalf("could not create temp dir: %s", err) } defer os.RemoveAll(differentPath) - if err := os.Setenv(dcfg, differentPath); err != nil { + if err := os.Setenv(DockerConfigEnvKey, differentPath); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } set := DockerConfLocation() @@ -87,13 +136,16 @@ func TestDockerConfLocation(t *testing.T) { if set != setExpected { t.Errorf("Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'", setExpected, set) } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} +func restoreOriginalDockerConfigEnv(t *testing.T, originalDockerConfig string) { if originalDockerConfig != "" { - if err := os.Setenv(dcfg, originalDockerConfig); err != nil { + if err := os.Setenv(DockerConfigEnvKey, originalDockerConfig); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG back to original value '%s': %v", originalDockerConfig, err) } } else { - if err := os.Unsetenv(dcfg); err != nil { + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG after testing: %v", err) } }