Skip to content

Commit 6e7e8de

Browse files
committed
fix: Adjust parameter value overriding. Fixes argoproj#14426
Signed-off-by: Nicola Dardanis <nicdard@gmail.com>
1 parent fd45fbd commit 6e7e8de

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

workflow/controller/operator_workflow_template_ref_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,60 @@ func TestWorkflowTemplateRefParamMerge(t *testing.T) {
216216
})
217217
}
218218

219+
var wftWithValueFromParam = `
220+
apiVersion: argoproj.io/v1alpha1
221+
kind: WorkflowTemplate
222+
metadata:
223+
name: wf-template-echo
224+
namespace: argo
225+
spec:
226+
entrypoint: echo
227+
arguments:
228+
parameters:
229+
- name: message
230+
valueFrom:
231+
configMapKeyRef:
232+
name: config-properties
233+
key: message
234+
templates:
235+
- name: echo
236+
container:
237+
image: busybox
238+
command: [echo]
239+
args: ["{{workflow.parameters.message}}"]
240+
`
241+
242+
var wfWithValueParamOverride = `
243+
apiVersion: argoproj.io/v1alpha1
244+
kind: Workflow
245+
metadata:
246+
generateName: wf-parameter-overwrite-
247+
namespace: argo
248+
spec:
249+
entrypoint: echo
250+
arguments:
251+
parameters:
252+
- name: message
253+
value: "configmap argument overwrite with argument"
254+
workflowTemplateRef:
255+
name: wf-template-echo
256+
`
257+
258+
// https://github.com/argoproj/argo-workflows/issues/14426
259+
func TestWorkflowTemplateRefValueFromParamOverwrite(t *testing.T) {
260+
wf := wfv1.MustUnmarshalWorkflow(wfWithValueParamOverride)
261+
wftmpl := wfv1.MustUnmarshalWorkflowTemplate(wftWithValueFromParam)
262+
t.Run("CheckArgumentFromWFT", func(t *testing.T) {
263+
cancel, controller := newController(wf, wftmpl)
264+
defer cancel()
265+
ctx := context.Background()
266+
woc := newWorkflowOperationCtx(wf, controller)
267+
woc.operate(ctx)
268+
assert.Equal(t, wf.Spec.Arguments.Parameters, woc.wf.Spec.Arguments.Parameters)
269+
assert.Equal(t, "configmap argument overwrite with argument", woc.wf.Spec.Arguments.Parameters[0].Value.String())
270+
})
271+
}
272+
219273
var wftWithArtifact = `
220274
apiVersion: argoproj.io/v1alpha1
221275
kind: WorkflowTemplate

workflow/util/merge.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,36 @@ func JoinWorkflowSpec(wfSpec, wftSpec, wfDefaultSpec *wfv1.WorkflowSpec) (*wfv1.
9797
if wfSpec.Suspend != targetWf.Spec.Suspend {
9898
targetWf.Spec.Suspend = wfSpec.Suspend
9999
}
100+
// The value of an argument should respect the priority order of the merge.
101+
// However, if Value, ValueFrom and Default are set in different places,
102+
// i.e. the Workflow, WorflowTemplate and WorkflowDefault, we should only keep the one with the greatest priority.
103+
wfParamsMap := parametersToMapByName(wfSpec)
104+
wftParamsMap := parametersToMapByName(wfSpec)
105+
for index, parameter := range targetWf.Spec.Arguments.Parameters {
106+
if parameter.HasValue() {
107+
if param, ok := wfParamsMap[parameter.Name]; ok {
108+
targetWf.Spec.Arguments.Parameters[index] = *param.DeepCopy()
109+
} else if param, ok := wftParamsMap[parameter.Name]; ok {
110+
targetWf.Spec.Arguments.Parameters[index] = *param.DeepCopy()
111+
}
112+
// If none of the above conditions are met, we can safely assume that the parameter is set from the wfDefaultSpec.
113+
}
114+
}
100115
return &targetWf, nil
101116
}
102117

118+
func parametersToMapByName(spec *wfv1.WorkflowSpec) map[string]wfv1.Parameter {
119+
parameterMap := make(map[string]wfv1.Parameter)
120+
if spec != nil {
121+
for _, param := range spec.Arguments.Parameters {
122+
if param.HasValue() {
123+
parameterMap[param.Name] = param
124+
}
125+
}
126+
}
127+
return parameterMap
128+
}
129+
103130
// mergeMetadata will merge the labels and annotations into the target metadata.
104131
func mergeMetaDataTo(from, to *metav1.ObjectMeta) {
105132
if from == nil {

workflow/util/merge_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ spec:
267267
arguments:
268268
parameters:
269269
- name: PARAM1
270+
value: WorkflowTemplate value 1 ignored
270271
- name: PARAM2
271272
- name: PARAM3
272273
value: WorkflowTemplate value 3
@@ -386,6 +387,15 @@ func TestJoinWfSpecArguments(t *testing.T) {
386387
assert.Equal(result.Spec.Arguments, targetWf.Spec.Arguments)
387388
}
388389

390+
func TestJoinWfSpecArgumentsWithNil(t *testing.T) {
391+
assert := assert.New(t)
392+
wf := wfv1.MustUnmarshalWorkflow(wfArguments)
393+
result := wfv1.MustUnmarshalWorkflow(wfArguments)
394+
targetWf, err := JoinWorkflowSpec(&wf.Spec, nil, nil)
395+
require.NoError(t, err)
396+
assert.Equal(result.Spec.Arguments, targetWf.Spec.Arguments)
397+
}
398+
389399
func TestJoinWorkflowMetaData(t *testing.T) {
390400
assert := assert.New(t)
391401
t.Run("WfDefaultMetaData", func(t *testing.T) {

0 commit comments

Comments
 (0)