mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-11 17:12:51 +00:00
Add TrackableFilter interface (#4410)
* add kio filter interface This interface is an extension of the Filter interface which can be used for filters which are capable of tracking which fields they mutate. * add TrackableSetter struct to filtersutil This struct provides an abstraction to help Filters implement the TrackableFilter interface * implement TrackableFilter with annotations This updates the annotations filter to implement the TrackableFilter interface by reusing the TrackableSetter abstraction provided by filtersutil. This is done to provide a generic and consistent experience across the filters * implement TrackableFilter with labels This updates the labels filter to implement the TrackableFilter interface by reusing the TrackableSetter abstraction provided by filtersutil. This is done to provide a generic and consistent experience across the filters
This commit is contained in:
@@ -21,22 +21,15 @@ type Filter struct {
|
||||
// FsSlice identifies the label fields.
|
||||
FsSlice types.FsSlice
|
||||
|
||||
// SetEntryCallback is invoked each time a label is applied
|
||||
// Example use cases:
|
||||
// - Tracking all paths where labels have been applied
|
||||
SetEntryCallback func(key, value, tag string, node *yaml.RNode)
|
||||
trackableSetter filtersutil.TrackableSetter
|
||||
}
|
||||
|
||||
var _ kio.Filter = Filter{}
|
||||
var _ kio.TrackableFilter = &Filter{}
|
||||
|
||||
func (f Filter) setEntry(key, value, tag string) filtersutil.SetFn {
|
||||
baseSetEntryFunc := filtersutil.SetEntry(key, value, tag)
|
||||
return func(node *yaml.RNode) error {
|
||||
if f.SetEntryCallback != nil {
|
||||
f.SetEntryCallback(key, value, tag, node)
|
||||
}
|
||||
return baseSetEntryFunc(node)
|
||||
}
|
||||
// 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) {
|
||||
@@ -46,7 +39,7 @@ func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
for _, k := range keys {
|
||||
if err := node.PipeE(fsslice.Filter{
|
||||
FsSlice: f.FsSlice,
|
||||
SetValue: f.setEntry(
|
||||
SetValue: f.trackableSetter.SetEntry(
|
||||
k, f.Labels[k], yaml.NodeTagString),
|
||||
CreateKind: yaml.MappingNode, // Labels are MappingNodes.
|
||||
CreateTag: yaml.NodeTagMap,
|
||||
|
||||
@@ -37,6 +37,7 @@ func TestLabels_Filter(t *testing.T) {
|
||||
input string
|
||||
expectedOutput string
|
||||
filter Filter
|
||||
setEntryCallback func(key, value, tag string, node *yaml.RNode)
|
||||
expectedSetEntryArgs []setEntryArg
|
||||
}{
|
||||
"add": {
|
||||
@@ -456,8 +457,8 @@ a:
|
||||
CreateIfNotPresent: true,
|
||||
},
|
||||
},
|
||||
SetEntryCallback: setEntryCallbackStub,
|
||||
},
|
||||
setEntryCallback: setEntryCallbackStub,
|
||||
expectedSetEntryArgs: []setEntryArg{
|
||||
{
|
||||
Key: "mage",
|
||||
@@ -478,6 +479,7 @@ a:
|
||||
for tn, tc := range testCases {
|
||||
setEntryArgs = nil
|
||||
t.Run(tn, func(t *testing.T) {
|
||||
tc.filter.WithMutationTracker(tc.setEntryCallback)
|
||||
if !assert.Equal(t,
|
||||
strings.TrimSpace(tc.expectedOutput),
|
||||
strings.TrimSpace(filtertest_test.RunFilter(t, tc.input, tc.filter))) {
|
||||
|
||||
Reference in New Issue
Block a user