MCPcopy
hub / github.com/argoproj/argo-workflows / ValidateWorkflow

Function ValidateWorkflow

workflow/validate/validate.go:141–350  ·  view source on GitHub ↗

ValidateWorkflow accepts a workflow and performs validation against it.

(ctx context.Context, wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, cwftmplGetter templateresolution.ClusterWorkflowTemplateGetter, wf *wfv1.Workflow, wfDefaults *wfv1.Workflow, opts ValidateOpts)

Source from the content-addressed store, hash-verified

139
140// ValidateWorkflow accepts a workflow and performs validation against it.
141func ValidateWorkflow(ctx context.Context, wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, cwftmplGetter templateresolution.ClusterWorkflowTemplateGetter, wf *wfv1.Workflow, wfDefaults *wfv1.Workflow, opts ValidateOpts) error {
142 tctx := newTemplateValidationCtx(wf, opts)
143
144 tmplCtx := templateresolution.NewContext(wftmplGetter, cwftmplGetter, wf, wf, logging.RequireLoggerFromContext(ctx))
145 var wfSpecHolder wfv1.WorkflowSpecHolder
146 var wfTmplRef *wfv1.TemplateRef
147 var err error
148
149 if len(wf.Name) > maxCharsInObjectName {
150 return fmt.Errorf("workflow name %q must not be more than 63 characters long (currently %d)", wf.Name, len(wf.Name))
151 }
152
153 entrypoint := wf.Spec.Entrypoint
154
155 hasWorkflowTemplateRef := wf.Spec.WorkflowTemplateRef != nil
156
157 if hasWorkflowTemplateRef {
158 err := ValidateWorkflowTemplateRefFields(wf.Spec)
159 if err != nil {
160 return err
161 }
162 if wf.Spec.WorkflowTemplateRef.ClusterScope {
163 wfSpecHolder, err = cwftmplGetter.Get(ctx, wf.Spec.WorkflowTemplateRef.Name)
164 } else {
165 wfSpecHolder, err = wftmplGetter.Get(ctx, wf.Spec.WorkflowTemplateRef.Name)
166 }
167 if err != nil {
168 return err
169 }
170 if entrypoint == "" {
171 entrypoint = wfSpecHolder.GetWorkflowSpec().Entrypoint
172 }
173 wfTmplRef = wf.Spec.WorkflowTemplateRef.ToTemplateRef(entrypoint)
174 }
175 err = validateWorkflowFieldNames(wf.Spec.Templates)
176
177 wfArgs := wf.Spec.Arguments
178
179 if hasWorkflowTemplateRef {
180 wfArgs.Parameters = util.MergeParameters(wfArgs.Parameters, wfSpecHolder.GetWorkflowSpec().Arguments.Parameters)
181 wfArgs.Artifacts = util.MergeArtifacts(wfArgs.Artifacts, wfSpecHolder.GetWorkflowSpec().Arguments.Artifacts)
182 }
183 if err != nil {
184 return errors.Errorf(errors.CodeBadRequest, "spec.templates%s", err.Error())
185 }
186
187 // if we are linting, we don't care if spec.arguments.parameters.XXX doesn't have an
188 // explicit value. Workflow templates without a default value are also a desired use
189 // case, since values will be provided during workflow submission.
190 allowEmptyValues := tctx.Lint || (tctx.WorkflowTemplateValidation && !tctx.Submit)
191 err = validateArguments("spec.arguments.", wfArgs, allowEmptyValues)
192 if err != nil {
193 return err
194 }
195 if len(wfArgs.Parameters) > 0 {
196 tctx.globalParams[common.GlobalVarWorkflowParameters] = placeholderGenerator.NextPlaceholder()
197 tctx.globalParams[common.GlobalVarWorkflowParametersJSON] = placeholderGenerator.NextPlaceholder()
198 }

Callers 15

LintWorkflowMethod · 0.92
CreateWorkflowMethod · 0.92
LintWorkflowMethod · 0.92
SubmitWorkflowMethod · 0.92
setExecWorkflowMethod · 0.92
SubmitWorkflowFunction · 0.92
ValidateWorkflowTemplateFunction · 0.85
ValidateCronWorkflowFunction · 0.85
validateFunction · 0.85

Calls 15

GetWorkflowSpecMethod · 0.95
NewContextFunction · 0.92
RequireLoggerFromContextFunction · 0.92
MergeParametersFunction · 0.92
MergeArtifactsFunction · 0.92
ErrorfFunction · 0.92
NewFunction · 0.92
newTemplateValidationCtxFunction · 0.85
validateArgumentsFunction · 0.85
getUniqueKeysFunction · 0.85
isParameterFunction · 0.85