Skip to content

Commit

Permalink
fix(controller): validation failed when dynamic templateRef is used i…
Browse files Browse the repository at this point in the history
…n nested template (#14053)

Signed-off-by: joey <[email protected]>
(cherry picked from commit 82537a7)
  • Loading branch information
chengjoey authored and Joibel committed Feb 7, 2025
1 parent 7a29866 commit 59026f5
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 2 deletions.
15 changes: 13 additions & 2 deletions workflow/validate/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -958,7 +958,12 @@ func (ctx *templateValidationCtx) validateSteps(scope map[string]interface{}, tm
if err != nil {
return err
}
resolvedTmpl, err := ctx.validateTemplateHolder(&step, tmplCtx, &FakeArguments{}, workflowTemplateValidation)
var args wfv1.ArgumentsProvider
args = &FakeArguments{}
if step.TemplateRef != nil {
args = &step.Arguments
}
resolvedTmpl, err := ctx.validateTemplateHolder(&step, tmplCtx, args, workflowTemplateValidation)
if err != nil {
return errors.Errorf(errors.CodeBadRequest, "templates.%s.steps[%d].%s %s", tmpl.Name, i, step.Name, err.Error())
}
Expand Down Expand Up @@ -1351,7 +1356,13 @@ func (ctx *templateValidationCtx) validateDAG(scope map[string]interface{}, tmpl
return errors.Errorf(errors.CodeBadRequest, "templates.%s cannot use 'continueOn' when using 'depends'. Instead use 'dep-task.Failed'/'dep-task.Errored'", tmpl.Name)
}

resolvedTmpl, err := ctx.validateTemplateHolder(&task, tmplCtx, &FakeArguments{}, workflowTemplateValidation)
var args wfv1.ArgumentsProvider
args = &FakeArguments{}
if task.TemplateRef != nil {
args = &task.Arguments
}

resolvedTmpl, err := ctx.validateTemplateHolder(&task, tmplCtx, args, workflowTemplateValidation)

if err != nil {
return errors.Errorf(errors.CodeBadRequest, "templates.%s.tasks.%s %s", tmpl.Name, task.Name, err.Error())
Expand Down
69 changes: 69 additions & 0 deletions workflow/validate/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3294,3 +3294,72 @@ func TestShouldCheckValidationToSpacedParameters(t *testing.T) {
// Do not allow leading or trailing spaces in parameters
require.ErrorContains(t, err, "failed to resolve {{ workflow.thisdoesnotexist }}")
}

var dynamicWorkflowTemplateARefB = `
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: workflow-template-a
spec:
templates:
- name: template-a
inputs:
parameters:
- name: message
steps:
- - name: step-a
templateRef:
name: workflow-template-b
template: "{{ inputs.parameters.message }}"
`

var dynamicWorkflowTemplateRefB = `
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: workflow-template-b
spec:
templates:
- name: template-b
container:
image: docker/whalesay
command: [cowsay]
args: ["hello from template"]
`

var dynamicTemplateRefWorkflow = `
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dynamic-workflow-
spec:
entrypoint: whalesay
templates:
- name: whalesay
steps:
- - name: whalesay
templateRef:
name: workflow-template-a
template: template-a
arguments:
parameters:
- name: message
value: "template-b"
`

func TestDynamicWorkflowTemplateRef(t *testing.T) {
wf := wfv1.MustUnmarshalWorkflow(dynamicTemplateRefWorkflow)
wftmplA := wfv1.MustUnmarshalWorkflowTemplate(dynamicWorkflowTemplateARefB)
wftmplB := wfv1.MustUnmarshalWorkflowTemplate(dynamicWorkflowTemplateRefB)

err := createWorkflowTemplate(wftmplA)
require.NoError(t, err)
err = createWorkflowTemplate(wftmplB)
require.NoError(t, err)

err = ValidateWorkflow(wftmplGetter, cwftmplGetter, wf, ValidateOpts{})
require.NoError(t, err)

_ = deleteWorkflowTemplate(wftmplA.Name)
_ = deleteWorkflowTemplate(wftmplB.Name)
}

0 comments on commit 59026f5

Please sign in to comment.