From ca1d5e671519aaa9f38f5f2564eb70c138fadda7 Mon Sep 17 00:00:00 2001 From: Saravanan Balasubramanian <33908564+sarabala1979@users.noreply.github.com> Date: Mon, 22 Jul 2019 15:12:04 -0700 Subject: [PATCH] Fix: Support the List within List type in withParam #1471 (#1473) Fix: Support the List within List type in withParam #1471 (#1473) --- workflow/controller/operator.go | 9 +++++- workflow/controller/operator_test.go | 46 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 0971d0226772..7b7d89bdc797 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1640,8 +1640,15 @@ func processItem(fstTmpl *fasttemplate.Template, name string, index int, item wf // sort the values so that the name is deterministic sort.Strings(vals) newName = fmt.Sprintf("%s(%d:%v)", name, index, strings.Join(vals, ",")) + case []interface{}: + byteVal, err := json.Marshal(val) + if err != nil { + return "", errors.InternalWrapError(err) + } + replaceMap["item"] = string(byteVal) + newName = fmt.Sprintf("%s(%d:%v)", name, index, val) default: - return "", errors.Errorf(errors.CodeBadRequest, "withItems[%d] expected string, number, or map. received: %s", index, val) + return "", errors.Errorf(errors.CodeBadRequest, "withItems[%d] expected string, number, list, or map. received: %s", index, val) } newStepStr, err := common.Replace(fstTmpl, replaceMap, false) if err != nil { diff --git a/workflow/controller/operator_test.go b/workflow/controller/operator_test.go index fbe94183869c..66931af18d5f 100644 --- a/workflow/controller/operator_test.go +++ b/workflow/controller/operator_test.go @@ -1159,3 +1159,49 @@ func TestResourceWithOwnerReferenceTemplate(t *testing.T) { assert.Equal(t, "resource-with-ownerreference-template", objectMetas["resource-cm-3"].OwnerReferences[1].Name) } } + +var withParamAsJsonList = ` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: expand-with-items +spec: + entrypoint: expand-with-items + arguments: + parameters: + - name: input + value: '[[1,2],[3,4],[4,5],[6,7]]' + templates: + - name: expand-with-items + steps: + - - name: whalesay + template: whalesay + arguments: + parameters: + - name: message + value: "{{item}}" + withParam: "{{workflow.parameters.input}}" + - name: whalesay + inputs: + parameters: + - name: message + container: + image: alpine:latest + command: [sh, -c] + args: ["echo "] +` + +func TestWithParamAsJsonList(t *testing.T) { + controller := newController() + wfcset := controller.wfclientset.ArgoprojV1alpha1().Workflows("") + + // Test list expansion + wf := unmarshalWF(withParamAsJsonList) + wf, err := wfcset.Create(wf) + assert.Nil(t, err) + woc := newWorkflowOperationCtx(wf, controller) + woc.operate() + pods, err := controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) + assert.Nil(t, err) + assert.Equal(t, 4, len(pods.Items)) +}