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()) }) } }