diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 0874c1ccb276..f91b2a8da312 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" "k8s.io/utils/pointer" @@ -3215,7 +3216,16 @@ func (woc *wfOperationCtx) setExecWorkflow(ctx context.Context) error { cwftmplGetter := templateresolution.WrapClusterWorkflowTemplateInterface(woc.controller.wfclientset.ArgoprojV1alpha1().ClusterWorkflowTemplates()) // Validate the execution wfSpec - wfConditions, err := validate.ValidateWorkflow(wftmplGetter, cwftmplGetter, woc.wf, validateOpts) + var wfConditions *wfv1.Conditions + err := wait.ExponentialBackoff(retry.DefaultRetry, + func() (bool, error) { + var validationErr error + wfConditions, validationErr = validate.ValidateWorkflow(wftmplGetter, cwftmplGetter, woc.wf, validateOpts) + if validationErr != nil { + return !errorsutil.IsTransientErr(validationErr), validationErr + } + return true, nil + }) if err != nil { msg := fmt.Sprintf("invalid spec: %s", err.Error()) woc.markWorkflowFailed(ctx, msg)