diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 75ef44daa47a..346b9751de5c 100644 --- a/workflow/controller/dag.go +++ b/workflow/controller/dag.go @@ -201,8 +201,11 @@ func (d *dagContext) hasMoreRetries(node *wfv1.NodeStatus) bool { return true } -func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, boundaryID string) error { - node := woc.markNodePhase(nodeName, wfv1.NodeRunning) +func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + } defer func() { if woc.wf.Status.Nodes[node.ID].Completed() { @@ -238,11 +241,11 @@ func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresoluti dagPhase := dagCtx.assessDAGPhase(targetTasks, woc.wf.Status.Nodes) switch dagPhase { case wfv1.NodeRunning: - return nil + return node, nil case wfv1.NodeError, wfv1.NodeFailed: woc.updateOutboundNodesForTargetTasks(dagCtx, targetTasks, nodeName) _ = woc.markNodePhase(nodeName, dagPhase) - return nil + return node, nil } // set outputs from tasks in order for DAG templates to support outputs @@ -260,7 +263,7 @@ func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresoluti } outputs, err := getTemplateOutputsFromScope(tmpl, &scope) if err != nil { - return err + return node, err } if outputs != nil { node = woc.getNodeByName(nodeName) @@ -271,7 +274,7 @@ func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresoluti woc.updateOutboundNodesForTargetTasks(dagCtx, targetTasks, nodeName) _ = woc.markNodePhase(nodeName, wfv1.NodeSucceeded) - return nil + return node, nil } func (woc *wfOperationCtx) updateOutboundNodesForTargetTasks(dagCtx *dagContext, targetTasks []string, nodeName string) { diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 1569b835739c..67b9bf660751 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1281,40 +1281,22 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat } } - // Initialize node based on the template type. - if node == nil { - var nodeType wfv1.NodeType - switch processedTmpl.GetType() { - case wfv1.TemplateTypeContainer, wfv1.TemplateTypeScript, wfv1.TemplateTypeResource: - nodeType = wfv1.NodeTypePod - case wfv1.TemplateTypeSteps: - nodeType = wfv1.NodeTypeSteps - case wfv1.TemplateTypeDAG: - nodeType = wfv1.NodeTypeDAG - case wfv1.TemplateTypeSuspend: - nodeType = wfv1.NodeTypeSuspend - default: - err := errors.InternalErrorf("Template '%s' has unknown node type", processedTmpl.Name) - return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err - } - node = woc.initializeExecutableNode(nodeName, nodeType, templateScope, processedTmpl, orgTmpl, boundaryID, wfv1.NodePending) - } - switch processedTmpl.GetType() { case wfv1.TemplateTypeContainer: - err = woc.executeContainer(node.Name, processedTmpl, boundaryID) + node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSteps: - err = woc.executeSteps(node.Name, newTmplCtx, processedTmpl, boundaryID) + node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: - err = woc.executeScript(node.Name, processedTmpl, boundaryID) + node, err = woc.executeScript(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeResource: - err = woc.executeResource(node.Name, processedTmpl, boundaryID) + node, err = woc.executeResource(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeDAG: - err = woc.executeDAG(node.Name, newTmplCtx, processedTmpl, boundaryID) + node, err = woc.executeDAG(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSuspend: - err = woc.executeSuspend(node.Name, processedTmpl, boundaryID) + node, err = woc.executeSuspend(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) default: err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) + return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err } if err != nil { node = woc.markNodeError(node.Name, err) @@ -1556,10 +1538,16 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node return nil } -func (woc *wfOperationCtx) executeContainer(nodeName string, tmpl *wfv1.Template, boundaryID string) error { +func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node != nil { + return node, nil + } + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + woc.log.Debugf("Executing node %s with container template: %v\n", nodeName, tmpl) _, err := woc.createWorkflowPod(nodeName, *tmpl.Container, tmpl, false) - return err + return node, err } func (woc *wfOperationCtx) getOutboundNodes(nodeID string) []string { @@ -1663,12 +1651,18 @@ func getStepOrDAGTaskName(nodeName string, hasRetryStrategy bool) string { return nodeName } -func (woc *wfOperationCtx) executeScript(nodeName string, tmpl *wfv1.Template, boundaryID string) error { +func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node != nil { + return node, nil + } + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + includeScriptOutput := false if boundaryNode, ok := woc.wf.Status.Nodes[boundaryID]; ok { _, parentTemplate, err := woc.tmplCtx.ResolveTemplate(&boundaryNode) if err != nil { - return err + return node, err } name := getStepOrDAGTaskName(nodeName, tmpl.RetryStrategy != nil) includeScriptOutput = hasOutputResultRef(name, parentTemplate) @@ -1677,10 +1671,7 @@ func (woc *wfOperationCtx) executeScript(nodeName string, tmpl *wfv1.Template, b mainCtr := tmpl.Script.Container mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath) _, err := woc.createWorkflowPod(nodeName, mainCtr, tmpl, includeScriptOutput) - if err != nil { - return err - } - return nil + return node, err } // processNodeOutputs adds all of a nodes outputs to the local scope with the given prefix, as well @@ -1891,14 +1882,20 @@ func (woc *wfOperationCtx) addChildNode(parent string, child string) { } // executeResource is runs a kubectl command against a manifest -func (woc *wfOperationCtx) executeResource(nodeName string, tmpl *wfv1.Template, boundaryID string) error { +func (woc *wfOperationCtx) executeResource(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node != nil { + return node, nil + } + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + tmpl = tmpl.DeepCopy() // Try to unmarshal the given manifest. obj := unstructured.Unstructured{} err := yaml.Unmarshal([]byte(tmpl.Resource.Manifest), &obj) if err != nil { - return err + return node, err } if tmpl.Resource.SetOwnerReference { @@ -1906,7 +1903,7 @@ func (woc *wfOperationCtx) executeResource(nodeName string, tmpl *wfv1.Template, obj.SetOwnerReferences(append(ownerReferences, *metav1.NewControllerRef(woc.wf, wfv1.SchemeGroupVersion.WithKind(workflow.WorkflowKind)))) bytes, err := yaml.Marshal(obj.Object) if err != nil { - return err + return node, err } tmpl.Resource.Manifest = string(bytes) } @@ -1914,13 +1911,14 @@ func (woc *wfOperationCtx) executeResource(nodeName string, tmpl *wfv1.Template, mainCtr := woc.newExecContainer(common.MainContainerName, tmpl) mainCtr.Command = []string{"argoexec", "resource", tmpl.Resource.Action} _, err = woc.createWorkflowPod(nodeName, *mainCtr, tmpl, false) - if err != nil { - return err - } - return nil + return node, err } -func (woc *wfOperationCtx) executeSuspend(nodeName string, tmpl *wfv1.Template, boundaryID string) error { +func (woc *wfOperationCtx) executeSuspend(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + } woc.log.Infof("node %s suspended", nodeName) // If there is either an active workflow deadline, or if this node is suspended with a duration, then the workflow @@ -1931,7 +1929,7 @@ func (woc *wfOperationCtx) executeSuspend(nodeName string, tmpl *wfv1.Template, node := woc.getNodeByName(nodeName) suspendDuration, err := parseStringToDuration(tmpl.Suspend.Duration) if err != nil { - return err + return node, err } suspendDeadline := node.StartedAt.Add(suspendDuration) requeueTime = &suspendDeadline @@ -1939,7 +1937,7 @@ func (woc *wfOperationCtx) executeSuspend(nodeName string, tmpl *wfv1.Template, // Suspension is expired, node can be resumed woc.log.Infof("auto resuming node %s", nodeName) _ = woc.markNodePhase(nodeName, wfv1.NodeSucceeded) - return nil + return node, nil } } @@ -1957,7 +1955,7 @@ func (woc *wfOperationCtx) executeSuspend(nodeName string, tmpl *wfv1.Template, } _ = woc.markNodePhase(nodeName, wfv1.NodeRunning) - return nil + return node, nil } func parseStringToDuration(durationString string) (time.Duration, error) { diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go index b7b22be70392..25f316f2533c 100644 --- a/workflow/controller/steps.go +++ b/workflow/controller/steps.go @@ -25,8 +25,11 @@ type stepsContext struct { tmplCtx *templateresolution.Context } -func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, boundaryID string) error { - node := woc.markNodePhase(nodeName, wfv1.NodeRunning) +func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + } defer func() { if woc.wf.Status.Nodes[node.ID].Completed() { @@ -79,7 +82,7 @@ func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolu if !sgNode.Completed() { woc.log.Infof("Workflow step group node %v not yet completed", sgNode) - return nil + return node, nil } if !sgNode.Successful() { @@ -87,7 +90,7 @@ func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolu woc.log.Info(failMessage) woc.updateOutboundNodes(nodeName, tmpl) _ = woc.markNodePhase(nodeName, wfv1.NodeFailed, sgNode.Message) - return nil + return node, nil } // Add all outputs of each step in the group to the scope @@ -108,11 +111,11 @@ func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolu // Expanded child nodes should be created from the same template. _, tmpl, err := woc.tmplCtx.ResolveTemplate(&childNodes[0]) if err != nil { - return err + return node, err } err = woc.processAggregateNodeOutputs(tmpl, stepsCtx.scope, prefix, childNodes) if err != nil { - return err + return node, err } } else { woc.log.Infof("Step '%s' has no expanded child nodes", childNode) @@ -126,7 +129,7 @@ func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolu // If this template has outputs from any of its steps, copy them to this node here outputs, err := getTemplateOutputsFromScope(tmpl, stepsCtx.scope) if err != nil { - return err + return node, err } if outputs != nil { node := woc.getNodeByName(nodeName) @@ -135,7 +138,7 @@ func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolu } _ = woc.markNodePhase(nodeName, wfv1.NodeSucceeded) - return nil + return node, nil } // updateOutboundNodes set the outbound nodes from the last step group diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go index 5807f52dc0c8..72b6930c9f58 100644 --- a/workflow/controller/workflowpod_test.go +++ b/workflow/controller/workflowpod_test.go @@ -62,7 +62,7 @@ script: func TestScriptTemplateWithVolume(t *testing.T) { tmpl := unmarshalTemplate(scriptTemplateWithInputArtifact) woc := newWoc() - err := woc.executeScript(tmpl.Name, tmpl, "") + _, err := woc.executeScript(tmpl.Name, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), tmpl, tmpl, "") assert.NoError(t, err) } @@ -131,7 +131,7 @@ func TestScriptTemplateWithoutVolumeOptionalArtifact(t *testing.T) { func TestWFLevelServiceAccount(t *testing.T) { woc := newWoc() woc.wf.Spec.ServiceAccountName = "foo" - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -146,7 +146,7 @@ func TestTmplServiceAccount(t *testing.T) { woc := newWoc() woc.wf.Spec.ServiceAccountName = "foo" woc.wf.Spec.Templates[0].ServiceAccountName = "tmpl" - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -164,7 +164,7 @@ func TestWFLevelAutomountServiceAccountToken(t *testing.T) { falseValue := false woc.wf.Spec.AutomountServiceAccountToken = &falseValue woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"} - err = woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -184,7 +184,7 @@ func TestTmplLevelAutomountServiceAccountToken(t *testing.T) { woc.wf.Spec.AutomountServiceAccountToken = &trueValue woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"} woc.wf.Spec.Templates[0].AutomountServiceAccountToken = &falseValue - err = woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -210,7 +210,7 @@ func TestWFLevelExecutorServiceAccountName(t *testing.T) { assert.NoError(t, err) woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"} - err = woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -233,7 +233,7 @@ func TestTmplLevelExecutorServiceAccountName(t *testing.T) { woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"} woc.wf.Spec.Templates[0].Executor = &wfv1.ExecutorConfig{ServiceAccountName: "tmpl"} - err = woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -254,7 +254,7 @@ func TestImagePullSecrets(t *testing.T) { Name: "secret-name", }, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -286,7 +286,7 @@ func TestAffinity(t *testing.T) { }, }, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -303,7 +303,7 @@ func TestTolerations(t *testing.T) { Operator: "Exists", Effect: "NoSchedule", }} - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -316,7 +316,7 @@ func TestTolerations(t *testing.T) { // TestMetadata verifies ability to carry forward annotations and labels func TestMetadata(t *testing.T) { woc := newWoc() - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -467,7 +467,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) { woc.wf.Spec.Templates[0].Container.VolumeMounts = volumeMounts woc.controller.Config.ContainerRuntimeExecutor = common.ContainerRuntimeExecutorDocker - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -488,7 +488,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) { woc.wf.Spec.Templates[0].Container.VolumeMounts = volumeMounts woc.controller.Config.ContainerRuntimeExecutor = common.ContainerRuntimeExecutorKubelet - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -508,7 +508,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) { woc.wf.Spec.Templates[0].Container.VolumeMounts = volumeMounts woc.controller.Config.ContainerRuntimeExecutor = common.ContainerRuntimeExecutorK8sAPI - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -553,7 +553,7 @@ func TestVolumesPodSubstitution(t *testing.T) { woc.wf.Spec.Templates[0].Inputs.Parameters = inputParameters woc.controller.Config.ContainerRuntimeExecutor = common.ContainerRuntimeExecutorDocker - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -589,7 +589,7 @@ func TestOutOfCluster(t *testing.T) { SecretKey: "bar", } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -612,7 +612,7 @@ func TestOutOfCluster(t *testing.T) { VolumeName: "kube-config-secret", } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -633,7 +633,7 @@ func TestPriority(t *testing.T) { woc := newWoc() woc.wf.Spec.Templates[0].PriorityClassName = "foo" woc.wf.Spec.Templates[0].Priority = &priority - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -647,7 +647,7 @@ func TestPriority(t *testing.T) { func TestSchedulerName(t *testing.T) { woc := newWoc() woc.wf.Spec.Templates[0].SchedulerName = "foo" - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -699,7 +699,7 @@ func TestInitContainers(t *testing.T) { }, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -758,7 +758,7 @@ func TestSidecars(t *testing.T) { }, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -810,7 +810,7 @@ func TestTemplateLocalVolumes(t *testing.T) { woc.wf.Spec.Templates[0].Container.VolumeMounts = volumeMounts woc.wf.Spec.Templates[0].Volumes = localVolumes - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -831,7 +831,7 @@ func TestWFLevelHostAliases(t *testing.T) { {IP: "127.0.0.1"}, {IP: "127.0.0.1"}, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -848,7 +848,7 @@ func TestTmplLevelHostAliases(t *testing.T) { {IP: "127.0.0.1"}, {IP: "127.0.0.1"}, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -865,7 +865,7 @@ func TestWFLevelSecurityContext(t *testing.T) { woc.wf.Spec.SecurityContext = &apiv1.PodSecurityContext{ RunAsUser: &runAsUser, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) @@ -882,7 +882,7 @@ func TestTmplLevelSecurityContext(t *testing.T) { woc.wf.Spec.Templates[0].SecurityContext = &apiv1.PodSecurityContext{ RunAsUser: &runAsUser, } - err := woc.executeContainer(woc.wf.Spec.Entrypoint, &woc.wf.Spec.Templates[0], "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err)