From ba55d95542505afeaf589cca25b8610c471c0a0c Mon Sep 17 00:00:00 2001 From: Sam Dowell Date: Fri, 28 Jan 2022 20:55:08 +0000 Subject: [PATCH] feat: implement TrackableFilter for suffix This change updates the suffix filter to implement the TrackableFilter interface. This provides the functionality for the user to track which fields were updated by the suffix filter. --- api/filters/suffix/suffix.go | 10 +++++- api/filters/suffix/suffix_test.go | 54 +++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/api/filters/suffix/suffix.go b/api/filters/suffix/suffix.go index a3df62557..babc257be 100644 --- a/api/filters/suffix/suffix.go +++ b/api/filters/suffix/suffix.go @@ -18,9 +18,17 @@ type Filter struct { Suffix string `json:"suffix,omitempty" yaml:"suffix,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", node.YNode().Value, f.Suffix))(node) } diff --git a/api/filters/suffix/suffix_test.go b/api/filters/suffix/suffix_test.go index 94020ed94..53489c746 100644 --- a/api/filters/suffix/suffix_test.go +++ b/api/filters/suffix/suffix_test.go @@ -11,8 +11,11 @@ import ( "sigs.k8s.io/kustomize/api/filters/suffix" 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{ "suffix": { 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: instance-foo +--- +apiVersion: example.com/v1 +kind: Bar +metadata: + name: instance-foo +`, + filter: suffix.Filter{ + Suffix: "-foo", + FieldSpec: types.FieldSpec{Path: "metadata/name"}, + }, + mutationTracker: mutationTrackerStub.MutationTracker, + expectedSetValueArgs: []filtertest_test.SetValueArg{ + { + Value: "instance-foo", + NodePath: []string{"metadata", "name"}, + }, + { + Value: "instance-foo", + NodePath: []string{"metadata", "name"}, + }, + }, + }, } type TestCase struct { - input string - expected string - filter suffix.Filter + input string + expected string + filter suffix.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()) }) } }