mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-09-15 12:18:57 +00:00
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:
@@ -18,9 +18,17 @@ type Filter struct {
|
|||||||
Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
|
Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
|
||||||
|
|
||||||
FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"`
|
FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"`
|
||||||
|
|
||||||
|
trackableSetter filtersutil.TrackableSetter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ kio.Filter = Filter{}
|
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) {
|
func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||||
return kio.FilterAll(yaml.FilterFunc(f.run)).Filter(nodes)
|
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 {
|
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)
|
"%s%s", f.Prefix, node.YNode().Value))(node)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ import (
|
|||||||
"sigs.k8s.io/kustomize/api/filters/prefix"
|
"sigs.k8s.io/kustomize/api/filters/prefix"
|
||||||
filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest"
|
filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest"
|
||||||
"sigs.k8s.io/kustomize/api/types"
|
"sigs.k8s.io/kustomize/api/types"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var mutationTrackerStub = filtertest_test.MutationTrackerStub{}
|
||||||
|
|
||||||
var tests = map[string]TestCase{
|
var tests = map[string]TestCase{
|
||||||
"prefix": {
|
"prefix": {
|
||||||
input: `
|
input: `
|
||||||
@@ -83,17 +86,61 @@ a:
|
|||||||
FieldSpec: types.FieldSpec{Path: "a/b/c"},
|
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 {
|
type TestCase struct {
|
||||||
input string
|
input string
|
||||||
expected string
|
expected string
|
||||||
filter prefix.Filter
|
filter prefix.Filter
|
||||||
|
mutationTracker func(key, value, tag string, node *yaml.RNode)
|
||||||
|
expectedSetValueArgs []filtertest_test.SetValueArg
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFilter(t *testing.T) {
|
func TestFilter(t *testing.T) {
|
||||||
for name := range tests {
|
for name := range tests {
|
||||||
|
mutationTrackerStub.Reset()
|
||||||
test := tests[name]
|
test := tests[name]
|
||||||
|
test.filter.WithMutationTracker(test.mutationTracker)
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
if !assert.Equal(t,
|
if !assert.Equal(t,
|
||||||
strings.TrimSpace(test.expected),
|
strings.TrimSpace(test.expected),
|
||||||
@@ -101,6 +148,7 @@ func TestFilter(t *testing.T) {
|
|||||||
filtertest_test.RunFilter(t, test.input, test.filter))) {
|
filtertest_test.RunFilter(t, test.input, test.filter))) {
|
||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
|
assert.Equal(t, test.expectedSetValueArgs, mutationTrackerStub.SetValueArgs())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user