Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion workflow/util/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,20 @@ func MergeTo(patch, target *wfv1.Workflow) error {
return nil
}

// Temporarily remove hooks and labelsFrom as they don't merge
patchHooks := patch.Spec.Hooks
// Temporarily remove hooks as they don't merge
patch.Spec.Hooks = nil
var patchLabelsFrom map[string]wfv1.LabelValueFrom
if patch.Spec.WorkflowMetadata != nil {
patchLabelsFrom = patch.Spec.WorkflowMetadata.LabelsFrom
patch.Spec.WorkflowMetadata.LabelsFrom = nil
}

patchWfBytes, err := json.Marshal(patch)
patch.Spec.Hooks = patchHooks
if len(patchLabelsFrom) != 0 {
patch.Spec.WorkflowMetadata.LabelsFrom = patchLabelsFrom
}
if err != nil {
return err
}
Expand Down Expand Up @@ -52,6 +61,16 @@ func MergeTo(patch, target *wfv1.Workflow) error {
target.Spec.Hooks[name] = hook
}
}

if len(patchLabelsFrom) != 0 && target.Spec.WorkflowMetadata.LabelsFrom == nil {
target.Spec.WorkflowMetadata.LabelsFrom = make(map[string]wfv1.LabelValueFrom)
}
for key, val := range patchLabelsFrom {
// If the patch labelFrom doesn't exist in target
if _, ok := target.Spec.WorkflowMetadata.LabelsFrom[key]; !ok {
target.Spec.WorkflowMetadata.LabelsFrom[key] = val
}
}
return nil
}

Expand Down
54 changes: 51 additions & 3 deletions workflow/util/merge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ func TestJoinWorkflowMetaData(t *testing.T) {
})
}

var baseNilHookWF = `
var baseNilWF = `
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
Expand Down Expand Up @@ -471,7 +471,7 @@ spec:
func TestMergeHooks(t *testing.T) {
t.Run("NilBaseAndNilPatch", func(t *testing.T) {
patchHookWf := wfv1.MustUnmarshalWorkflow(patchNilHookWF)
targetHookWf := wfv1.MustUnmarshalWorkflow(baseNilHookWF)
targetHookWf := wfv1.MustUnmarshalWorkflow(baseNilWF)

err := MergeTo(patchHookWf, targetHookWf)
require.NoError(t, err)
Expand All @@ -480,7 +480,7 @@ func TestMergeHooks(t *testing.T) {

t.Run("NilBaseAndNotNilPatch", func(t *testing.T) {
patchHookWf := wfv1.MustUnmarshalWorkflow(patchHookWF)
targetHookWf := wfv1.MustUnmarshalWorkflow(baseNilHookWF)
targetHookWf := wfv1.MustUnmarshalWorkflow(baseNilWF)

err := MergeTo(patchHookWf, targetHookWf)
require.NoError(t, err)
Expand All @@ -501,3 +501,51 @@ func TestMergeHooks(t *testing.T) {
assert.Equal(t, "b", targetHookWf.Spec.Hooks[`bar`].Template)
})
}

var patchLabelsFromWF = `
apiVersion: argoproj.io/v1alpha1
kind: Workflow
spec:
workflowMetadata:
labelsFrom:
foo:
expression: PATCH
bar:
expression: PATCH
`
var baseLabelsFromWF = `
apiVersion: argoproj.io/v1alpha1
kind: Workflow
spec:
workflowMetadata:
labelsFrom:
foo:
expression: BASE
baz:
expression: BASE
`

func TestMergeLabelsFrom(t *testing.T) {
t.Run("NilBaseAndNotNilPatch", func(t *testing.T) {
patchWf := wfv1.MustUnmarshalWorkflow(patchLabelsFromWF)
targetWf := wfv1.MustUnmarshalWorkflow(baseNilWF)

err := MergeTo(patchWf, targetWf)
require.NoError(t, err)
assert.Len(t, targetWf.Spec.WorkflowMetadata.LabelsFrom, 2)
assert.Equal(t, "PATCH", targetWf.Spec.WorkflowMetadata.LabelsFrom[`foo`].Expression)
assert.Equal(t, "PATCH", targetWf.Spec.WorkflowMetadata.LabelsFrom[`bar`].Expression)
})

t.Run("NotNilBaseAndPatch", func(t *testing.T) {
patchWf := wfv1.MustUnmarshalWorkflow(patchLabelsFromWF)
targetWf := wfv1.MustUnmarshalWorkflow(baseLabelsFromWF)

err := MergeTo(patchWf, targetWf)
require.NoError(t, err)
assert.Len(t, targetWf.Spec.WorkflowMetadata.LabelsFrom, 3)
assert.Equal(t, "BASE", targetWf.Spec.WorkflowMetadata.LabelsFrom[`foo`].Expression)
assert.Equal(t, "PATCH", targetWf.Spec.WorkflowMetadata.LabelsFrom[`bar`].Expression)
assert.Equal(t, "BASE", targetWf.Spec.WorkflowMetadata.LabelsFrom[`baz`].Expression)
})
}
Loading