From 7282c14cf8d672798d98ae7a126d14d6a555fca3 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Thu, 5 Dec 2019 15:21:13 -0800 Subject: [PATCH 1/6] Revert node creation logic --- pkg/apis/workflow/v1alpha1/workflow_types.go | 1 + workflow/controller/dag.go | 13 +-- workflow/controller/operator.go | 86 ++++++++++---------- workflow/controller/steps.go | 19 +++-- workflow/controller/workflowpod_test.go | 52 ++++++------ 5 files changed, 88 insertions(+), 83 deletions(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 1eb9c56a2f3c..beac98ef8132 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -791,6 +791,7 @@ type NodeStatus struct { WorkflowTemplateName string `json:"workflowTemplateName,omitempty" protobuf:"bytes,19,opt,name=workflowTemplateName"` // TemplateScope is the template scope in which the template of this node was retrieved. + // DEPRECATED: This value is not used anymore. TemplateScope string `json:"templateScope,omitempty" protobuf:"bytes,20,opt,name=templateScope"` // Phase a simple, high-level summary of where the node is in its lifecycle. diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 75ef44daa47a..5299a7a9efdc 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, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, 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) diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 1569b835739c..e2fb3789fc52 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, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSteps: - err = woc.executeSteps(node.Name, newTmplCtx, processedTmpl, boundaryID) + node, err = woc.executeSteps(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: - err = woc.executeScript(node.Name, processedTmpl, boundaryID) + node, err = woc.executeScript(nodeName, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeResource: - err = woc.executeResource(node.Name, processedTmpl, boundaryID) + node, err = woc.executeResource(nodeName, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeDAG: - err = woc.executeDAG(node.Name, newTmplCtx, processedTmpl, boundaryID) + node, err = woc.executeDAG(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSuspend: - err = woc.executeSuspend(node.Name, processedTmpl, boundaryID) + node, err = woc.executeSuspend(nodeName, 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, 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, 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, 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, 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, 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, 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, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, 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..5a3ad04eae5d 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, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { + node := woc.getNodeByName(nodeName) + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, 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..afff910c2562 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, tmpl, &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") 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.wf.Spec.Templates[0], &wfv1.Template{}, "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) From 133ff6d6e7f52f400570bd09826f4d02e5be1908 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Thu, 5 Dec 2019 15:35:35 -0800 Subject: [PATCH 2/6] Codegen --- api/openapi-spec/swagger.json | 2 +- pkg/apis/workflow/v1alpha1/generated.proto | 1 + pkg/apis/workflow/v1alpha1/openapi_generated.go | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 5745a38d1f3a..c2b09aaf015d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -663,7 +663,7 @@ "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.TemplateRef" }, "templateScope": { - "description": "TemplateScope is the template scope in which the template of this node was retrieved.", + "description": "TemplateScope is the template scope in which the template of this node was retrieved. DEPRECATED: This value is not used anymore.", "type": "string" }, "type": { diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index 5c96ef7bad4a..a25d255c2db6 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -363,6 +363,7 @@ message NodeStatus { optional string workflowTemplateName = 19; // TemplateScope is the template scope in which the template of this node was retrieved. + // DEPRECATED: This value is not used anymore. optional string templateScope = 20; // Phase a simple, high-level summary of where the node is in its lifecycle. diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index ef0cd880f2dd..78e286b57acc 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -1163,7 +1163,7 @@ func schema_pkg_apis_workflow_v1alpha1_NodeStatus(ref common.ReferenceCallback) }, "templateScope": { SchemaProps: spec.SchemaProps{ - Description: "TemplateScope is the template scope in which the template of this node was retrieved.", + Description: "TemplateScope is the template scope in which the template of this node was retrieved. DEPRECATED: This value is not used anymore.", Type: []string{"string"}, Format: "", }, From 871f2175260a8891537146c804c1cd5a45f7fe06 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Fri, 6 Dec 2019 07:17:23 -0800 Subject: [PATCH 3/6] Reverted TemplateScope deprecation --- pkg/apis/workflow/v1alpha1/workflow_types.go | 1 - workflow/controller/dag.go | 2 +- workflow/controller/operator.go | 24 ++++----- workflow/controller/steps.go | 2 +- workflow/controller/workflowpod_test.go | 52 ++++++++++---------- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index beac98ef8132..1eb9c56a2f3c 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -791,7 +791,6 @@ type NodeStatus struct { WorkflowTemplateName string `json:"workflowTemplateName,omitempty" protobuf:"bytes,19,opt,name=workflowTemplateName"` // TemplateScope is the template scope in which the template of this node was retrieved. - // DEPRECATED: This value is not used anymore. TemplateScope string `json:"templateScope,omitempty" protobuf:"bytes,20,opt,name=templateScope"` // Phase a simple, high-level summary of where the node is in its lifecycle. diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 5299a7a9efdc..6e2be0db5c09 100644 --- a/workflow/controller/dag.go +++ b/workflow/controller/dag.go @@ -204,7 +204,7 @@ func (d *dagContext) hasMoreRetries(node *wfv1.NodeStatus) bool { func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { node := woc.getNodeByName(nodeName) if node == nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) } defer func() { diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index e2fb3789fc52..42e5806e65fc 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1283,17 +1283,17 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat switch processedTmpl.GetType() { case wfv1.TemplateTypeContainer: - node, err = woc.executeContainer(nodeName, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeContainer(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSteps: node, err = woc.executeSteps(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: - node, err = woc.executeScript(nodeName, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeScript(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeResource: - node, err = woc.executeResource(nodeName, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeResource(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeDAG: node, err = woc.executeDAG(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSuspend: - node, err = woc.executeSuspend(nodeName, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeSuspend(nodeName, newTmplCtx, 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 @@ -1538,12 +1538,12 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node return nil } -func (woc *wfOperationCtx) executeContainer(nodeName string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +func (woc *wfOperationCtx) executeContainer(nodeName string, tmplCtx *templateresolution.Context, 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, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, tmplCtx, 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) @@ -1651,12 +1651,12 @@ func getStepOrDAGTaskName(nodeName string, hasRetryStrategy bool) string { return nodeName } -func (woc *wfOperationCtx) executeScript(nodeName string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +func (woc *wfOperationCtx) executeScript(nodeName string, tmplCtx *templateresolution.Context, 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, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) includeScriptOutput := false if boundaryNode, ok := woc.wf.Status.Nodes[boundaryID]; ok { @@ -1882,12 +1882,12 @@ 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, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +func (woc *wfOperationCtx) executeResource(nodeName string, tmplCtx *templateresolution.Context, 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, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) tmpl = tmpl.DeepCopy() @@ -1914,10 +1914,10 @@ func (woc *wfOperationCtx) executeResource(nodeName string, tmpl *wfv1.Template, return node, err } -func (woc *wfOperationCtx) executeSuspend(nodeName string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +func (woc *wfOperationCtx) executeSuspend(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { node := woc.getNodeByName(nodeName) if node == nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) } woc.log.Infof("node %s suspended", nodeName) diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go index 5a3ad04eae5d..0284bda33e39 100644 --- a/workflow/controller/steps.go +++ b/workflow/controller/steps.go @@ -28,7 +28,7 @@ type stepsContext struct { func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { node := woc.getNodeByName(nodeName) if node == nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) } defer func() { diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go index afff910c2562..357c4eed0d3b 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, &wfv1.Template{}, "") + _, err := woc.executeScript(tmpl.Name, woc.tmplCtx, tmpl, &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err = woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") 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], &wfv1.Template{}, "") + _, err := woc.executeContainer(woc.wf.Spec.Entrypoint, woc.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") assert.NoError(t, err) pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{}) assert.NoError(t, err) From c76638f281366cbb2c9906b776cd32c05a9a4180 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Fri, 6 Dec 2019 07:18:39 -0800 Subject: [PATCH 4/6] Codegen --- api/openapi-spec/swagger.json | 2 +- pkg/apis/workflow/v1alpha1/generated.proto | 1 - pkg/apis/workflow/v1alpha1/openapi_generated.go | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index c2b09aaf015d..5745a38d1f3a 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -663,7 +663,7 @@ "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.TemplateRef" }, "templateScope": { - "description": "TemplateScope is the template scope in which the template of this node was retrieved. DEPRECATED: This value is not used anymore.", + "description": "TemplateScope is the template scope in which the template of this node was retrieved.", "type": "string" }, "type": { diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index a25d255c2db6..5c96ef7bad4a 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -363,7 +363,6 @@ message NodeStatus { optional string workflowTemplateName = 19; // TemplateScope is the template scope in which the template of this node was retrieved. - // DEPRECATED: This value is not used anymore. optional string templateScope = 20; // Phase a simple, high-level summary of where the node is in its lifecycle. diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index 78e286b57acc..ef0cd880f2dd 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -1163,7 +1163,7 @@ func schema_pkg_apis_workflow_v1alpha1_NodeStatus(ref common.ReferenceCallback) }, "templateScope": { SchemaProps: spec.SchemaProps{ - Description: "TemplateScope is the template scope in which the template of this node was retrieved. DEPRECATED: This value is not used anymore.", + Description: "TemplateScope is the template scope in which the template of this node was retrieved.", Type: []string{"string"}, Format: "", }, From 8e636397c04fbe29583546c8d6c6b993e3cf7e96 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Mon, 9 Dec 2019 11:45:35 -0800 Subject: [PATCH 5/6] Minor --- workflow/controller/workflowpod_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go index 357c4eed0d3b..cfabe3bd990a 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, woc.tmplCtx, tmpl, &wfv1.Template{}, "") + _, err := woc.executeScript(tmpl.Name, woc.tmplCtx, tmpl, tmpl, "") assert.NoError(t, err) } From 8de23847ed909408929e7ca758bc1c7b8b151d21 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Thu, 2 Jan 2020 13:03:35 -0800 Subject: [PATCH 6/6] Refine tests and use new template scope --- workflow/controller/dag.go | 6 +-- workflow/controller/operator.go | 28 ++++++------- workflow/controller/steps.go | 4 +- workflow/controller/workflowpod_test.go | 52 ++++++++++++------------- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 6e2be0db5c09..346b9751de5c 100644 --- a/workflow/controller/dag.go +++ b/workflow/controller/dag.go @@ -201,10 +201,10 @@ func (d *dagContext) hasMoreRetries(node *wfv1.NodeStatus) bool { return true } -func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) } defer func() { @@ -274,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 42e5806e65fc..67b9bf660751 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1283,17 +1283,17 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat switch processedTmpl.GetType() { case wfv1.TemplateTypeContainer: - node, err = woc.executeContainer(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSteps: - node, err = woc.executeSteps(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: - node, err = woc.executeScript(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeScript(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeResource: - node, err = woc.executeResource(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeResource(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeDAG: - node, err = woc.executeDAG(nodeName, newTmplCtx, processedTmpl, orgTmpl, boundaryID) + node, err = woc.executeDAG(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSuspend: - node, err = woc.executeSuspend(nodeName, newTmplCtx, processedTmpl, orgTmpl, 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 @@ -1538,12 +1538,12 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node return nil } -func (woc *wfOperationCtx) executeContainer(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, 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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + 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) @@ -1651,12 +1651,12 @@ func getStepOrDAGTaskName(nodeName string, hasRetryStrategy bool) string { return nodeName } -func (woc *wfOperationCtx) executeScript(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, 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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) includeScriptOutput := false if boundaryNode, ok := woc.wf.Status.Nodes[boundaryID]; ok { @@ -1882,12 +1882,12 @@ func (woc *wfOperationCtx) addChildNode(parent string, child string) { } // executeResource is runs a kubectl command against a manifest -func (woc *wfOperationCtx) executeResource(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, 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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) tmpl = tmpl.DeepCopy() @@ -1914,10 +1914,10 @@ func (woc *wfOperationCtx) executeResource(nodeName string, tmplCtx *templateres return node, err } -func (woc *wfOperationCtx) executeSuspend(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, 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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) } woc.log.Infof("node %s suspended", nodeName) diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go index 0284bda33e39..25f316f2533c 100644 --- a/workflow/controller/steps.go +++ b/workflow/controller/steps.go @@ -25,10 +25,10 @@ type stepsContext struct { tmplCtx *templateresolution.Context } -func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { +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, tmplCtx, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning) } defer func() { diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go index cfabe3bd990a..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, woc.tmplCtx, tmpl, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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.tmplCtx, &woc.wf.Spec.Templates[0], &wfv1.Template{}, "") + _, 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)