diff --git a/hack/preload-images/preload_images.go b/hack/preload-images/preload_images.go index e119237ab1..6a27e4c0b2 100644 --- a/hack/preload-images/preload_images.go +++ b/hack/preload-images/preload_images.go @@ -32,6 +32,7 @@ import ( "github.com/spf13/viper" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/download" + "k8s.io/minikube/pkg/util" ) const ( @@ -129,11 +130,12 @@ func collectK8sVers() ([]string, error) { } k8sVersions = recent } - return append([]string{ + versions := append([]string{ constants.DefaultKubernetesVersion, constants.NewestKubernetesVersion, constants.OldestKubernetesVersion, - }, k8sVersions...), nil + }, k8sVersions...) + return util.RemoveDuplicateStrings(versions), nil } func makePreload(cfg preloadCfg) error { diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index 37f2cc4320..80210f8426 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -51,6 +51,7 @@ import ( "k8s.io/minikube/pkg/minikube/registry" "k8s.io/minikube/pkg/minikube/style" "k8s.io/minikube/pkg/minikube/vmpath" + "k8s.io/minikube/pkg/util" "k8s.io/minikube/pkg/util/lock" ) @@ -108,15 +109,7 @@ func engineOptions(cfg config.ClusterConfig) *engine.Options { // get docker env from user specifiec config dockerEnv = append(dockerEnv, cfg.DockerEnv...) - // remove duplicates - seen := map[string]bool{} - uniqueEnvs := []string{} - for e := range dockerEnv { - if !seen[dockerEnv[e]] { - seen[dockerEnv[e]] = true - uniqueEnvs = append(uniqueEnvs, dockerEnv[e]) - } - } + uniqueEnvs := util.RemoveDuplicateStrings(dockerEnv) o := engine.Options{ Env: uniqueEnvs, diff --git a/pkg/minikube/proxy/proxy.go b/pkg/minikube/proxy/proxy.go index bab3355669..6cdfb96d79 100644 --- a/pkg/minikube/proxy/proxy.go +++ b/pkg/minikube/proxy/proxy.go @@ -29,6 +29,7 @@ import ( "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/out" + "k8s.io/minikube/pkg/util" ) // EnvVars are variables we plumb through to the underlying container runtime @@ -184,16 +185,7 @@ func SetDockerEnv() []string { } } - // remove duplicates - seen := map[string]bool{} - uniqueEnvs := []string{} - for e := range config.DockerEnv { - if !seen[config.DockerEnv[e]] { - seen[config.DockerEnv[e]] = true - uniqueEnvs = append(uniqueEnvs, config.DockerEnv[e]) - } - } - config.DockerEnv = uniqueEnvs + config.DockerEnv = util.RemoveDuplicateStrings(config.DockerEnv) return config.DockerEnv } diff --git a/pkg/util/utils.go b/pkg/util/utils.go index 8ce9df808d..a30b9e08e5 100644 --- a/pkg/util/utils.go +++ b/pkg/util/utils.go @@ -109,3 +109,17 @@ func MaybeChownDirRecursiveToMinikubeUser(dir string) error { func ParseKubernetesVersion(version string) (semver.Version, error) { return semver.Make(version[1:]) } + +// RemoveDuplicateStrings takes a string slice and returns a slice without duplicates +func RemoveDuplicateStrings(initial []string) []string { + var result []string + m := make(map[string]bool, len(initial)) + for _, v := range initial { + if _, ok := m[v]; ok { + continue + } + m[v] = true + result = append(result, v) + } + return result +} diff --git a/pkg/util/utils_test.go b/pkg/util/utils_test.go index ea1c63f950..67a0d855f6 100644 --- a/pkg/util/utils_test.go +++ b/pkg/util/utils_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/blang/semver/v4" + "github.com/google/go-cmp/cmp" ) func TestGetBinaryDownloadURL(t *testing.T) { @@ -171,3 +172,45 @@ func TestMaybeChownDirRecursiveToMinikubeUser(t *testing.T) { }) } } + +func TestRemoveDuplicateStrings(t *testing.T) { + testCases := []struct { + desc string + slice []string + want []string + }{ + { + desc: "NoDuplicates", + slice: []string{"alpha", "bravo", "charlie"}, + want: []string{"alpha", "bravo", "charlie"}, + }, + { + desc: "AdjacentDuplicates", + slice: []string{"alpha", "bravo", "bravo", "charlie"}, + want: []string{"alpha", "bravo", "charlie"}, + }, + { + desc: "NonAdjacentDuplicates", + slice: []string{"alpha", "bravo", "alpha", "charlie"}, + want: []string{"alpha", "bravo", "charlie"}, + }, + { + desc: "MultipleDuplicates", + slice: []string{"alpha", "bravo", "alpha", "alpha", "charlie", "charlie", "alpha", "bravo"}, + want: []string{"alpha", "bravo", "charlie"}, + }, + { + desc: "UnsortedDuplicates", + slice: []string{"charlie", "bravo", "alpha", "bravo"}, + want: []string{"charlie", "bravo", "alpha"}, + }, + } + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + got := RemoveDuplicateStrings(tc.slice) + if diff := cmp.Diff(got, tc.want); diff != "" { + t.Errorf("RemoveDuplicateStrings(%v) = %v, want: %v", tc.slice, got, tc.want) + } + }) + } +}