feat: implement TrackableFilter for prefix

This change updates the prefix filter to implement the TrackableFilter
interface. This provides the functionality for the user to track which
fields were updated by the prefix filter.
This commit is contained in:
Sam Dowell
2022-01-28 20:53:45 +00:00
parent 51b767b06e
commit 90493ec374
2 changed files with 60 additions and 4 deletions

View File

@@ -18,9 +18,17 @@ type Filter struct {
Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"`
trackableSetter filtersutil.TrackableSetter
}
var _ kio.Filter = Filter{}
var _ kio.TrackableFilter = &Filter{}
// WithMutationTracker registers a callback which will be invoked each time a field is mutated
func (f *Filter) WithMutationTracker(callback func(key, value, tag string, node *yaml.RNode)) {
f.trackableSetter.WithMutationTracker(callback)
}
func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
return kio.FilterAll(yaml.FilterFunc(f.run)).Filter(nodes)
@@ -37,6 +45,6 @@ func (f Filter) run(node *yaml.RNode) (*yaml.RNode, error) {
}
func (f Filter) evaluateField(node *yaml.RNode) error {
return filtersutil.SetScalar(fmt.Sprintf(
return f.trackableSetter.SetScalar(fmt.Sprintf(
"%s%s", f.Prefix, node.YNode().Value))(node)
}

View File

@@ -11,8 +11,11 @@ import (
"sigs.k8s.io/kustomize/api/filters/prefix"
filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest"
"sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var mutationTrackerStub = filtertest_test.MutationTrackerStub{}
var tests = map[string]TestCase{
"prefix": {
input: `
@@ -83,17 +86,61 @@ a:
FieldSpec: types.FieldSpec{Path: "a/b/c"},
},
},
"mutation tracker": {
input: `
apiVersion: example.com/v1
kind: Foo
metadata:
name: instance
---
apiVersion: example.com/v1
kind: Bar
metadata:
name: instance
`,
expected: `
apiVersion: example.com/v1
kind: Foo
metadata:
name: foo-instance
---
apiVersion: example.com/v1
kind: Bar
metadata:
name: foo-instance
`,
filter: prefix.Filter{
Prefix: "foo-",
FieldSpec: types.FieldSpec{Path: "metadata/name"},
},
mutationTracker: mutationTrackerStub.MutationTracker,
expectedSetValueArgs: []filtertest_test.SetValueArg{
{
Value: "foo-instance",
NodePath: []string{"metadata", "name"},
},
{
Value: "foo-instance",
NodePath: []string{"metadata", "name"},
},
},
},
}
type TestCase struct {
input string
expected string
filter prefix.Filter
input string
expected string
filter prefix.Filter
mutationTracker func(key, value, tag string, node *yaml.RNode)
expectedSetValueArgs []filtertest_test.SetValueArg
}
func TestFilter(t *testing.T) {
for name := range tests {
mutationTrackerStub.Reset()
test := tests[name]
test.filter.WithMutationTracker(test.mutationTracker)
t.Run(name, func(t *testing.T) {
if !assert.Equal(t,
strings.TrimSpace(test.expected),
@@ -101,6 +148,7 @@ func TestFilter(t *testing.T) {
filtertest_test.RunFilter(t, test.input, test.filter))) {
t.FailNow()
}
assert.Equal(t, test.expectedSetValueArgs, mutationTrackerStub.SetValueArgs())
})
}
}