From 8c94c76da6499660d79924c0b8d0daa1862d57db Mon Sep 17 00:00:00 2001 From: Romain Beuque Date: Mon, 23 Mar 2020 17:41:52 +0100 Subject: [PATCH] fix: base_output not used if the plugin Output is not a map[string]interface{} Signed-off-by: Romain Beuque --- engine/engine_test.go | 17 +++++++++++++++++ engine/step/step.go | 8 ++++---- engine/templates_tests/no-output.yaml | 13 +++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 engine/templates_tests/no-output.yaml diff --git a/engine/engine_test.go b/engine/engine_test.go index df5b2d0b..c70c1caf 100644 --- a/engine/engine_test.go +++ b/engine/engine_test.go @@ -646,6 +646,23 @@ func TestEmptyStringInput(t *testing.T) { assert.Equal(t, "", output["foo"]) } +func TestBaseOutputNoOutput(t *testing.T) { + input := map[string]interface{}{} + res, err := createResolution("no-output.yaml", input, nil) + require.NotNil(t, res) + require.Nil(t, err) + + res, err = runResolution(res) + + require.Nilf(t, err, "got error %s", err) + require.NotNil(t, res) + assert.Equal(t, resolution.StateDone, res.State) + assert.Equal(t, step.StateDone, res.Steps["stepOne"].State) + + output := res.Steps["stepOne"].Output.(map[string]interface{}) + assert.Equal(t, "buzz", output["foobar"]) +} + func TestScriptPlugin(t *testing.T) { argv := "world" res, err := createResolution("execScript.yaml", map[string]interface{}{"argv": argv}, nil) diff --git a/engine/step/step.go b/engine/step/step.go index a4ea5a17..19926768 100644 --- a/engine/step/step.go +++ b/engine/step/step.go @@ -266,13 +266,13 @@ func Run(st *Step, baseConfig map[string]json.RawMessage, values *values.Values, default: st.Output, st.Metadata, err = runner.Exec(st.Name, baseCfgRaw, config, ctx) if baseOutput != nil { - marshaled, err := json.Marshal(st.Output) - if err == nil { - err = utils.JSONnumberUnmarshal(bytes.NewReader(marshaled), &baseOutput) + if st.Output != nil { + marshaled, err := json.Marshal(st.Output) if err == nil { - st.Output = baseOutput + _ = utils.JSONnumberUnmarshal(bytes.NewReader(marshaled), &baseOutput) } } + st.Output = baseOutput } st.Payload = st.Output // FIXME deprecate if err != nil { diff --git a/engine/templates_tests/no-output.yaml b/engine/templates_tests/no-output.yaml new file mode 100644 index 00000000..51baed3f --- /dev/null +++ b/engine/templates_tests/no-output.yaml @@ -0,0 +1,13 @@ +name: no-output +description: A template with step returning no output +title_format: "[test] no output" +auto_runnable: true +steps: + stepOne: + description: first step + idempotent: true + retry_pattern: seconds + action: + type: echo + base_output: {foobar: "buzz"} + configuration: {}