Skip to content

Commit

Permalink
fix(controller): prepend script path to the script template args. Res…
Browse files Browse the repository at this point in the history
…olves argoproj#4481 (argoproj#4492)

Signed-off-by: ivancili <[email protected]>
  • Loading branch information
ivancili committed Nov 10, 2020
1 parent 0931baf commit 64ae330
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
13 changes: 11 additions & 2 deletions workflow/controller/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -2286,6 +2286,16 @@ func getStepOrDAGTaskName(nodeName string) string {
return nodeName
}

func extractMainCtrFromScriptTemplate(tmpl *wfv1.Template) apiv1.Container {
mainCtr := tmpl.Script.Container
// If script source is provided then pass all container args to the
// script instead of passing them to the container command directly
if tmpl.Script.Source != "" {
mainCtr.Args = append([]string{common.ExecutorScriptSourcePath}, mainCtr.Args...)
}
return mainCtr
}

func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
node := woc.wf.GetNodeByName(nodeName)
if node == nil {
Expand All @@ -2301,8 +2311,7 @@ func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string,
return node, err
}

mainCtr := tmpl.Script.Container
mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath)
mainCtr := extractMainCtrFromScriptTemplate(tmpl)
_, err = woc.createWorkflowPod(nodeName, mainCtr, tmpl, &createWorkflowPodOpts{
includeScriptOutput: includeScriptOutput,
onExitPod: opts.onExitTemplate,
Expand Down
36 changes: 36 additions & 0 deletions workflow/controller/workflowpod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,42 @@ func TestScriptTemplateWithVolume(t *testing.T) {
assert.NoError(t, err)
}

var scriptTemplateWithArgsAndWithSource = `
name: script-with-args-and-with-source
script:
image: alpine:latest
command: [sh]
args: ["hello world"]
source: |
echo $@
`

// TestScriptTemplateMainCtrArgsWhenArgsAndWhenSource ensure order of merged args
// and script path is correct when both args and script source are specified
func TestScriptTemplateMainCtrArgsWhenArgsAndWhenSource(t *testing.T) {
tmpl := unmarshalTemplate(scriptTemplateWithArgsAndWithSource)
mainCtr := extractMainCtrFromScriptTemplate(tmpl)
assert.Equal(t, []string{"sh"}, mainCtr.Command)
assert.Equal(t, []string{common.ExecutorScriptSourcePath, "hello world"}, mainCtr.Args)
}

var scriptTemplateWithArgsAndWithoutSource = `
name: script-with-args-and-without-source
script:
image: alpine:latest
command: [echo]
args: ["hello world"]
`

// TestScriptTemplateMainCtrArgsWhenArgsAndWhenNoSource ensure only args are passed
// to the resulting container when script source is empty
func TestScriptTemplateMainCtrArgsWhenArgsAndWhenNoSource(t *testing.T) {
tmpl := unmarshalTemplate(scriptTemplateWithArgsAndWithoutSource)
mainCtr := extractMainCtrFromScriptTemplate(tmpl)
assert.Equal(t, []string{"echo"}, mainCtr.Command)
assert.Equal(t, []string{"hello world"}, mainCtr.Args)
}

var scriptTemplateWithOptionalInputArtifactProvided = `
name: script-with-input-artifact
inputs:
Expand Down

0 comments on commit 64ae330

Please sign in to comment.