From 6be53b1bcc778b941f80df315c0e4d7dc4a3150e Mon Sep 17 00:00:00 2001 From: rmartinez3 Date: Mon, 3 Sep 2018 02:45:02 -0500 Subject: [PATCH] WIP: adding to be albe to set multiple flags for --set, -f, --value in args (#278) * adding to be albe to set multiple flags for --set, -f, --value in args * add test for passing a set flag with two or more key-values --- args/args.go | 67 +++++++++++++++++++++++++++++------------------ args/args_test.go | 22 ++++++++++++---- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/args/args.go b/args/args.go index 34917c0e..9c27ef5f 100644 --- a/args/args.go +++ b/args/args.go @@ -7,44 +7,57 @@ import ( "github.com/roboll/helmfile/state" ) +type keyVal struct { + key string + val string + spaceFlag bool +} type argMap struct { - m map[string]string + //m map[string]string + m map[string][]*keyVal flags []string } -func (a *argMap) SetArg(flag, arg string) { +func (a *argMap) SetArg(flag, arg string, isSpace bool) { if _, exists := a.m[flag]; !exists { - a.m[flag] = arg + keyarg := &keyVal{key: flag, val: arg, spaceFlag: isSpace} + a.m[flag] = append(a.m[flag], keyarg) a.flags = append(a.flags, flag) + } else if flag == "--set" || flag == "-f" || flag == "--values" { + keyarg := &keyVal{key: flag, val: arg, spaceFlag: isSpace} + a.m[flag] = append(a.m[flag], keyarg) } } func newArgMap() *argMap { - return &argMap{m: map[string]string{}} + return &argMap{m: map[string][]*keyVal{}} } func GetArgs(args string, state *state.HelmState) []string { - //args := c.String("args") argsMap := newArgMap() - spaceflagArg := map[string]bool{} if len(args) > 0 { argsVals := strings.Split(args, " ") - prevFlag := "" - for _, arg := range argsVals { + for index, arg := range argsVals { if strings.HasPrefix(arg, "--") { argVal := strings.SplitN(arg, "=", 2) if len(argVal) > 1 { arg := argVal[0] value := argVal[1] - argsMap.SetArg(arg, value) + argsMap.SetArg(arg, value, false) } else { - argsMap.SetArg(arg, "") + //check if next value is arg to flag + if index+1 < len(argsVals) { + nextVal := argsVals[index+1] + if strings.HasPrefix(nextVal, "--") { + argsMap.SetArg(arg, "", false) + } else { + argsMap.SetArg(arg, nextVal, true) + } + } else { + argsMap.SetArg(arg, "", false) + } } - prevFlag = arg - } else { - spaceflagArg[prevFlag] = true - argsMap.m[prevFlag] = arg } } } @@ -56,25 +69,25 @@ func GetArgs(args string, state *state.HelmState) []string { argsNum, _ := fmt.Sscanf(arg, "--%s %s", &flag, &val) if argsNum == 2 { - argsMap.SetArg(flag, arg) + argsMap.SetArg(flag, val, true) } else { argVal := strings.SplitN(arg, "=", 2) argFirst := argVal[0] if len(argVal) > 1 { val = argVal[1] - argsMap.SetArg(argFirst, val) + argsMap.SetArg(argFirst, val, false) } else { - argsMap.SetArg(argFirst, "") + argsMap.SetArg(argFirst, "", false) } } } } if state.HelmDefaults.TillerNamespace != "" { - argsMap.SetArg("--tiller-namespace", state.HelmDefaults.TillerNamespace) + argsMap.SetArg("--tiller-namespace", state.HelmDefaults.TillerNamespace, false) } if state.HelmDefaults.KubeContext != "" { - argsMap.SetArg("--kube-context", state.HelmDefaults.KubeContext) + argsMap.SetArg("--kube-context", state.HelmDefaults.KubeContext, false) } var argArr []string @@ -82,16 +95,18 @@ func GetArgs(args string, state *state.HelmState) []string { for _, flag := range argsMap.flags { val := argsMap.m[flag] - if val != "" { - if spaceflagArg[flag] { - argArr = append(argArr, flag, val) + for _, obj := range val { + if obj.val != "" { + if obj.spaceFlag { + argArr = append(argArr, obj.key, obj.val) + } else { + argArr = append(argArr, fmt.Sprintf("%s=%s", obj.key, obj.val)) + } } else { - argArr = append(argArr, fmt.Sprintf("%s=%s", flag, val)) + argArr = append(argArr, fmt.Sprintf("%s", obj.key)) } - - } else { - argArr = append(argArr, fmt.Sprintf("%s", flag)) } + } state.HelmDefaults.Args = argArr diff --git a/args/args_test.go b/args/args_test.go index 9655256f..5e51401d 100644 --- a/args/args_test.go +++ b/args/args_test.go @@ -1,7 +1,6 @@ package args import ( - "fmt" "strings" "testing" @@ -9,21 +8,34 @@ import ( ) func TestGetArgs(t *testing.T) { - args := "--timeout=3600 --set app1.bootstrap=true,app2.bootstrap=false --tiller-namespace ns" + args := "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns" defaultArgs := []string{"--recreate-pods", "--force"} - fmt.Println(defaultArgs) - fmt.Println(len(defaultArgs)) Helmdefaults := state.HelmSpec{KubeContext: "test", TillerNamespace: "test-namespace", Args: defaultArgs} testState := &state.HelmState{HelmDefaults: Helmdefaults} receivedArgs := GetArgs(args, testState) - expectedOutput := "--timeout=3600 --set app1.bootstrap=true,app2.bootstrap=false --tiller-namespace ns --recreate-pods --force --kube-context=test" + expectedOutput := "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns --recreate-pods --force --kube-context=test" if compareArgs(expectedOutput, receivedArgs) == false { t.Errorf("expected %s, got %s", expectedOutput, strings.Join(receivedArgs, " ")) } } +func Test2(t *testing.T) { + args := "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns" + defaultArgs := []string{"--recreate-pods", "--force"} + Helmdefaults := state.HelmSpec{KubeContext: "test", TillerNamespace: "test-namespace", Args: defaultArgs} + testState := &state.HelmState{HelmDefaults: Helmdefaults} + receivedArgs := GetArgs(args, testState) + + expectedOutput := "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns --recreate-pods --force --kube-context=test" + + if compareArgs(expectedOutput, receivedArgs) == false { + t.Errorf("expected %s, got %s", expectedOutput, strings.Join(receivedArgs, " ")) + } + +} + func compareArgs(expectedArgs string, args []string) bool { if strings.Compare(strings.Join(args, " "), expectedArgs) != 0 {