From 5308957dbc1916fe57fb8ec058b15dd1154561b8 Mon Sep 17 00:00:00 2001 From: lalyos Date: Mon, 14 May 2018 17:53:31 +0200 Subject: [PATCH] Sort arguments before joining them, for reproducible return string --- cmd/kubeadm/app/util/arguments.go | 21 ++++++++++++++++++--- cmd/kubeadm/app/util/arguments_test.go | 12 +++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cmd/kubeadm/app/util/arguments.go b/cmd/kubeadm/app/util/arguments.go index 323b2da944c..60dfb6eac87 100644 --- a/cmd/kubeadm/app/util/arguments.go +++ b/cmd/kubeadm/app/util/arguments.go @@ -18,17 +18,32 @@ package util import ( "fmt" + "sort" "strings" ) -// BuildArgumentListFromMap takes two string-string maps, one with the base arguments and one with optional override arguments +// BuildArgumentListFromMap takes two string-string maps, one with the base arguments and one +// with optional override arguments. In the return list override arguments will precede base +// arguments func BuildArgumentListFromMap(baseArguments map[string]string, overrideArguments map[string]string) []string { var command []string - for k, v := range overrideArguments { + var keys []string + for k := range overrideArguments { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + v := overrideArguments[k] // values of "" are allowed as well command = append(command, fmt.Sprintf("--%s=%s", k, v)) } - for k, v := range baseArguments { + keys = []string{} + for k := range baseArguments { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + v := baseArguments[k] if _, overrideExists := overrideArguments[k]; !overrideExists { command = append(command, fmt.Sprintf("--%s=%s", k, v)) } diff --git a/cmd/kubeadm/app/util/arguments_test.go b/cmd/kubeadm/app/util/arguments_test.go index f2c6373bf81..bdfd5e414f4 100644 --- a/cmd/kubeadm/app/util/arguments_test.go +++ b/cmd/kubeadm/app/util/arguments_test.go @@ -39,8 +39,8 @@ func TestBuildArgumentListFromMap(t *testing.T) { }, expected: []string{ "--admission-control=NamespaceLifecycle,LimitRanger", - "--insecure-bind-address=127.0.0.1", "--allow-privileged=true", + "--insecure-bind-address=127.0.0.1", }, }, { // add an argument that is not in base @@ -53,8 +53,8 @@ func TestBuildArgumentListFromMap(t *testing.T) { }, expected: []string{ "--admission-control=NamespaceLifecycle,LimitRanger", - "--insecure-bind-address=127.0.0.1", "--allow-privileged=true", + "--insecure-bind-address=127.0.0.1", }, }, { // allow empty strings in base @@ -68,8 +68,8 @@ func TestBuildArgumentListFromMap(t *testing.T) { }, expected: []string{ "--admission-control=NamespaceLifecycle,LimitRanger", - "--insecure-bind-address=127.0.0.1", "--allow-privileged=true", + "--insecure-bind-address=127.0.0.1", "--something-that-allows-empty-string=", }, }, @@ -85,17 +85,15 @@ func TestBuildArgumentListFromMap(t *testing.T) { }, expected: []string{ "--admission-control=NamespaceLifecycle,LimitRanger", - "--insecure-bind-address=127.0.0.1", - "--allow-privileged=true", "--something-that-allows-empty-string=", + "--allow-privileged=true", + "--insecure-bind-address=127.0.0.1", }, }, } for _, rt := range tests { actual := BuildArgumentListFromMap(rt.base, rt.overrides) - sort.Strings(actual) - sort.Strings(rt.expected) if !reflect.DeepEqual(actual, rt.expected) { t.Errorf("failed BuildArgumentListFromMap:\nexpected:\n%v\nsaw:\n%v", rt.expected, actual) }