Allowing RunFns not to stop on empty result

Introducing the additional flag
ContinueOnEmptyResult that is false by default
to keep compatibility with the previous behavior.
Based on [1]

[1]
https://github.com/kubernetes-sigs/kustomize/pull/3112
This commit is contained in:
Alexey Odinokov
2020-11-05 07:04:08 +00:00
parent e6b21174f1
commit 28cdcc2e46
2 changed files with 79 additions and 3 deletions

View File

@@ -92,6 +92,14 @@ type RunFns struct {
// Env contains environment variables that will be exported to container
Env []string
// ContinueOnEmptyResult configures what happens when the underlying pipeline
// returns an empty result.
// If it is false (default), subsequent functions will be skipped and the
// result will be returned immediately.
// If it is true, the empty result will be provided as input to the next
// function in the list.
ContinueOnEmptyResult bool
}
// Execute runs the command
@@ -183,9 +191,10 @@ func (r RunFns) runFunctions(
var err error
pipeline := kio.Pipeline{
Inputs: []kio.Reader{input},
Filters: fltrs,
Outputs: outputs,
Inputs: []kio.Reader{input},
Filters: fltrs,
Outputs: outputs,
ContinueOnEmptyResult: r.ContinueOnEmptyResult,
}
if r.LogSteps {
err = pipeline.ExecuteWithCallback(func(op kio.Filter) {

View File

@@ -1080,6 +1080,73 @@ func TestCmd_Execute_enableLogSteps(t *testing.T) {
assert.Equal(t, "Running unknown-type function\n", logs.String())
}
func getGeneratorFilterProvider(t *testing.T) func(runtimeutil.FunctionSpec, *yaml.RNode, currentUserFunc) (kio.Filter, error) {
return func(f runtimeutil.FunctionSpec, node *yaml.RNode, currentUser currentUserFunc) (kio.Filter, error) {
return kio.FilterFunc(func(items []*yaml.RNode) ([]*yaml.RNode, error) {
if f.Container.Image == "generate" {
node, err := yaml.Parse("kind: generated")
if !assert.NoError(t, err) {
t.FailNow()
}
return append(items, node), nil
}
return items, nil
}), nil
}
}
func TestRunFns_ContinueOnEmptyResult(t *testing.T) {
fn1, err := yaml.Parse(`
kind: fakefn
metadata:
annotations:
config.kubernetes.io/function: |
container:
image: pass
`)
if !assert.NoError(t, err) {
t.FailNow()
}
fn2, err := yaml.Parse(`
kind: fakefn
metadata:
annotations:
config.kubernetes.io/function: |
container:
image: generate
`)
if !assert.NoError(t, err) {
t.FailNow()
}
var test = []struct {
ContinueOnEmptyResult bool
ExpectedOutput string
}{
{
ContinueOnEmptyResult: false,
ExpectedOutput: "",
},
{
ContinueOnEmptyResult: true,
ExpectedOutput: "kind: generated\n",
},
}
for i := range test {
ouputBuffer := bytes.Buffer{}
instance := RunFns{
Input: bytes.NewReader([]byte{}),
Output: &ouputBuffer,
Functions: []*yaml.RNode{fn1, fn2},
functionFilterProvider: getGeneratorFilterProvider(t),
ContinueOnEmptyResult: test[i].ContinueOnEmptyResult,
}
if !assert.NoError(t, instance.Execute()) {
t.FailNow()
}
assert.Equal(t, test[i].ExpectedOutput, ouputBuffer.String())
}
}
// setupTest initializes a temp test directory containing test data
func setupTest(t *testing.T) string {
dir, err := ioutil.TempDir("", "kustomize-kyaml-test")