From 02a36fe644482e5405958ec04c45cbfa8fd20c17 Mon Sep 17 00:00:00 2001 From: Alan Clucas Date: Wed, 21 Jun 2023 12:48:10 +0100 Subject: [PATCH] fix: Allow hooks to be specified in workflowDefaults (#11214) Signed-off-by: Jeremy Hager <47301461+jeremyhager@users.noreply.github.com> --- workflow/util/merge.go | 9 +++++++++ workflow/util/merge_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/workflow/util/merge.go b/workflow/util/merge.go index 976025c89113..7db69763f347 100644 --- a/workflow/util/merge.go +++ b/workflow/util/merge.go @@ -16,6 +16,8 @@ func MergeTo(patch, target *wfv1.Workflow) error { return nil } + patchHooks := patch.Spec.Hooks + patch.Spec.Hooks = nil patchWfBytes, err := json.Marshal(patch) if err != nil { return err @@ -36,6 +38,13 @@ func MergeTo(patch, target *wfv1.Workflow) error { if err != nil { return err } + + for name, hook := range patchHooks { + // If the patch hook doesn't exist in target + if _, ok := target.Spec.Hooks[name]; !ok { + target.Spec.Hooks[name] = hook + } + } return nil } diff --git a/workflow/util/merge_test.go b/workflow/util/merge_test.go index 5e3b258ca601..c9c83d7edc20 100644 --- a/workflow/util/merge_test.go +++ b/workflow/util/merge_test.go @@ -271,3 +271,40 @@ func TestJoinWorkflowMetaData(t *testing.T) { assert.Equal("wf", wf2.Annotations["testAnnotation"]) }) } + +var baseHookWF = ` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + generateName: workflow-template-hello-world- +spec: + hooks: + foo: + template: a + expression: workflow.status == "Pending" +` + +var patchHookWF = ` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +spec: + hooks: + foo: + template: c + expression: workflow.status == "Pending" + bar: + template: b + expression: workflow.status == "Pending" +` + +// Ensure hook bar ends up in result, but foo is unchanged +func TestMergeHooks(t *testing.T) { + patchHookWf := wfv1.MustUnmarshalWorkflow(patchHookWF) + targetHookWf := wfv1.MustUnmarshalWorkflow(baseHookWF) + + err := MergeTo(patchHookWf, targetHookWf) + assert.NoError(t, err) + assert.Equal(t, 2, len(targetHookWf.Spec.Hooks)) + assert.Equal(t, "a", targetHookWf.Spec.Hooks[`foo`].Template) + assert.Equal(t, "b", targetHookWf.Spec.Hooks[`bar`].Template) +}