diff --git a/workflow/validate/validate.go b/workflow/validate/validate.go index 43e6739ecb5b..cdc0e7e61749 100644 --- a/workflow/validate/validate.go +++ b/workflow/validate/validate.go @@ -39,6 +39,9 @@ type ValidateOpts struct { // IgnoreEntrypoint indicates to skip/ignore the EntryPoint validation on workflow spec. // Entrypoint is optional for WorkflowTemplate and ClusterWorkflowTemplate IgnoreEntrypoint bool + + // WorkflowTemplateValidation indicates that the current context is validating a WorkflowTemplate or ClusterWorkflowTemplate + WorkflowTemplateValidation bool } // templateValidationCtx is the context for validating a workflow spec @@ -172,7 +175,13 @@ func ValidateWorkflow(wftmplGetter templateresolution.WorkflowTemplateNamespaced } if !opts.IgnoreEntrypoint { - _, err = ctx.validateTemplateHolder(&wfv1.WorkflowStep{Template: wf.Spec.Entrypoint}, tmplCtx, &wf.Spec.Arguments, map[string]interface{}{}) + var args wfv1.ArgumentsProvider + args = &wf.Spec.Arguments + + if opts.WorkflowTemplateValidation { + args = &FakeArguments{} + } + _, err = ctx.validateTemplateHolder(&wfv1.WorkflowStep{Template: wf.Spec.Entrypoint}, tmplCtx, args, map[string]interface{}{}) if err != nil { return nil, err } @@ -208,13 +217,13 @@ func ValidateWorkflow(wftmplGetter templateresolution.WorkflowTemplateNamespaced // ValidateWorkflowTemplate accepts a workflow template and performs validation against it. func ValidateWorkflowTemplate(wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, cwftmplGetter templateresolution.ClusterWorkflowTemplateGetter, wftmpl *wfv1.WorkflowTemplate) (*wfv1.WorkflowConditions, error) { wf := common.ConvertWorkflowTemplateToWorkflow(wftmpl) - return ValidateWorkflow(wftmplGetter, cwftmplGetter, wf, ValidateOpts{IgnoreEntrypoint: wf.Spec.Entrypoint == ""}) + return ValidateWorkflow(wftmplGetter, cwftmplGetter, wf, ValidateOpts{IgnoreEntrypoint: wf.Spec.Entrypoint == "", WorkflowTemplateValidation: true}) } // ValidateClusterWorkflowTemplate accepts a cluster workflow template and performs validation against it. func ValidateClusterWorkflowTemplate(wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, cwftmplGetter templateresolution.ClusterWorkflowTemplateGetter, cwftmpl *wfv1.ClusterWorkflowTemplate) (*wfv1.WorkflowConditions, error) { wf := common.ConvertClusterWorkflowTemplateToWorkflow(cwftmpl) - return ValidateWorkflow(wftmplGetter, cwftmplGetter, wf, ValidateOpts{IgnoreEntrypoint: wf.Spec.Entrypoint == ""}) + return ValidateWorkflow(wftmplGetter, cwftmplGetter, wf, ValidateOpts{IgnoreEntrypoint: wf.Spec.Entrypoint == "", WorkflowTemplateValidation: true}) } // ValidateCronWorkflow validates a CronWorkflow diff --git a/workflow/validate/validate_test.go b/workflow/validate/validate_test.go index 939aa36a17f0..05602746b0ef 100644 --- a/workflow/validate/validate_test.go +++ b/workflow/validate/validate_test.go @@ -2385,3 +2385,26 @@ func TestWorfklowGlobalVariables(t *testing.T) { _, err := validate(globalVariables) assert.NoError(t, err) } + +var wfTemplateWithEntrypoint = ` +apiVersion: argoproj.io/v1alpha1 +kind: WorkflowTemplate +metadata: + name: template-with-entrypoint +spec: + entrypoint: whalesay-template + templates: + - name: whalesay-template + inputs: + parameters: + - name: message + container: + image: docker/whalesay + command: [cowsay] + args: ["{{inputs.parameters.message}}"] +` + +func TestWorkflowTemplateWithEntrypoint(t *testing.T) { + err := validateWorkflowTemplate(wfTemplateWithEntrypoint) + assert.NoError(t, err) +}