From 90493ec374741306183a33404f41ab61831cd940 Mon Sep 17 00:00:00 2001 From: Sam Dowell Date: Fri, 28 Jan 2022 20:53:45 +0000 Subject: [PATCH] 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. --- api/filters/prefix/prefix.go | 10 +++++- api/filters/prefix/prefix_test.go | 54 +++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/api/filters/prefix/prefix.go b/api/filters/prefix/prefix.go index dc7fb134f..daa375d1f 100644 --- a/api/filters/prefix/prefix.go +++ b/api/filters/prefix/prefix.go @@ -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) } diff --git a/api/filters/prefix/prefix_test.go b/api/filters/prefix/prefix_test.go index 2bcdbdeab..607aa757d 100644 --- a/api/filters/prefix/prefix_test.go +++ b/api/filters/prefix/prefix_test.go @@ -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()) }) } }