diff --git a/api/filters/replicacount/replicacount.go b/api/filters/replicacount/replicacount.go index 8a503966a..84005f26a 100644 --- a/api/filters/replicacount/replicacount.go +++ b/api/filters/replicacount/replicacount.go @@ -14,9 +14,17 @@ import ( type Filter struct { Replica types.Replica `json:"replica,omitempty" yaml:"replica,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 (rc *Filter) WithMutationTracker(callback func(key, value, tag string, node *yaml.RNode)) { + rc.trackableSetter.WithMutationTracker(callback) +} func (rc Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { return kio.FilterAll(yaml.FilterFunc(rc.run)).Filter(nodes) @@ -33,5 +41,5 @@ func (rc Filter) run(node *yaml.RNode) (*yaml.RNode, error) { } func (rc Filter) set(node *yaml.RNode) error { - return filtersutil.SetScalar(strconv.FormatInt(rc.Replica.Count, 10))(node) + return rc.trackableSetter.SetScalar(strconv.FormatInt(rc.Replica.Count, 10))(node) } diff --git a/api/filters/replicacount/replicacount_test.go b/api/filters/replicacount/replicacount_test.go index a61889e2d..e690192fc 100644 --- a/api/filters/replicacount/replicacount_test.go +++ b/api/filters/replicacount/replicacount_test.go @@ -7,14 +7,17 @@ import ( "github.com/stretchr/testify/assert" filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" ) func TestFilter(t *testing.T) { - + mutationTrackerStub := filtertest_test.MutationTrackerStub{} testCases := map[string]struct { - input string - expected string - filter Filter + input string + expected string + filter Filter + mutationTracker func(key, value, tag string, node *yaml.RNode) + expectedSetValueArgs []filtertest_test.SetValueArg }{ "update field": { input: ` @@ -161,9 +164,43 @@ spec: FieldSpec: types.FieldSpec{Path: "spec/template/replicas"}, }, }, + "mutation tracker": { + input: ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: dep +spec: + replicas: 5 +`, + expected: ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: dep +spec: + replicas: 42 +`, + filter: Filter{ + Replica: types.Replica{ + Name: "dep", + Count: 42, + }, + FieldSpec: types.FieldSpec{Path: "spec/replicas"}, + }, + mutationTracker: mutationTrackerStub.MutationTracker, + expectedSetValueArgs: []filtertest_test.SetValueArg{ + { + Value: "42", + NodePath: []string{"spec", "replicas"}, + }, + }, + }, } for tn, tc := range testCases { + mutationTrackerStub.Reset() + tc.filter.WithMutationTracker(tc.mutationTracker) t.Run(tn, func(t *testing.T) { if !assert.Equal(t, strings.TrimSpace(tc.expected), @@ -171,6 +208,7 @@ spec: filtertest_test.RunFilter(t, tc.input, tc.filter))) { t.FailNow() } + assert.Equal(t, tc.expectedSetValueArgs, mutationTrackerStub.SetValueArgs()) }) } }