diff --git a/api/builtins/ReplicaCountTransformer.go b/api/builtins/ReplicaCountTransformer.go index ad314a5c6..367402d97 100644 --- a/api/builtins/ReplicaCountTransformer.go +++ b/api/builtins/ReplicaCountTransformer.go @@ -6,7 +6,8 @@ package builtins import ( "fmt" - "sigs.k8s.io/kustomize/api/transform" + "sigs.k8s.io/kustomize/api/filters/replicacount" + "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/resmap" @@ -30,18 +31,24 @@ func (p *ReplicaCountTransformerPlugin) Config( func (p *ReplicaCountTransformerPlugin) Transform(m resmap.ResMap) error { found := false - for i, replicaSpec := range p.FieldSpecs { - matcher := p.createMatcher(i) + for _, fs := range p.FieldSpecs { + matcher := p.createMatcher(fs) matchOriginal := m.GetMatchingResourcesByOriginalId(matcher) - matchCurrent := m.GetMatchingResourcesByCurrentId(matcher) - - for _, res := range append(matchOriginal, matchCurrent...) { + resList := append( + matchOriginal, m.GetMatchingResourcesByCurrentId(matcher)...) + if len(resList) > 0 { found = true - err := transform.MutateField( - res.Map(), replicaSpec.PathSlice(), - replicaSpec.CreateIfNotPresent, p.addReplicas) - if err != nil { - return err + for _, r := range resList { + // There are redundant checks in the filter + // that we'll live with until resolution of + // https://github.com/kubernetes-sigs/kustomize/issues/2506 + err := filtersutil.ApplyToJSON(replicacount.Filter{ + Replica: p.Replica, + FieldSpec: fs, + }, r) + if err != nil { + return err + } } } } @@ -59,30 +66,12 @@ func (p *ReplicaCountTransformerPlugin) Transform(m resmap.ResMap) error { } // Match Replica.Name and FieldSpec -func (p *ReplicaCountTransformerPlugin) createMatcher(i int) resmap.IdMatcher { +func (p *ReplicaCountTransformerPlugin) createMatcher(fs types.FieldSpec) resmap.IdMatcher { return func(r resid.ResId) bool { - return r.Name == p.Replica.Name && - r.Gvk.IsSelected(&p.FieldSpecs[i].Gvk) + return r.Name == p.Replica.Name && r.Gvk.IsSelected(&fs.Gvk) } } -func (p *ReplicaCountTransformerPlugin) addReplicas(in interface{}) (interface{}, error) { - switch m := in.(type) { - case int64: - // Was already in the field. - case map[string]interface{}: - if len(m) != 0 { - // A map was already in the replicas field, don't want to - // discard this data silently. - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - // Just got added, default type is map, but we can return anything. - default: - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - return p.Replica.Count, nil -} - func NewReplicaCountTransformerPlugin() resmap.TransformerPlugin { return &ReplicaCountTransformerPlugin{} } diff --git a/api/filters/replicacount/example_test.go b/api/filters/replicacount/example_test.go index fbd587068..b72d03f57 100644 --- a/api/filters/replicacount/example_test.go +++ b/api/filters/replicacount/example_test.go @@ -33,10 +33,8 @@ spec: Count: 42, Name: "instance", }, - FsSlice: types.FsSlice{ - { - Path: "spec/template/replicas", - }, + FieldSpec: types.FieldSpec{ + Path: "spec/template/replicas", }, }}, Outputs: []kio.Writer{kio.ByteWriter{Writer: os.Stdout}}, diff --git a/api/filters/replicacount/replicacount.go b/api/filters/replicacount/replicacount.go index 8efb7e0d1..ebb372c85 100644 --- a/api/filters/replicacount/replicacount.go +++ b/api/filters/replicacount/replicacount.go @@ -3,8 +3,8 @@ package replicacount import ( "strconv" + "sigs.k8s.io/kustomize/api/filters/fieldspec" "sigs.k8s.io/kustomize/api/filters/filtersutil" - "sigs.k8s.io/kustomize/api/filters/fsslice" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" @@ -12,10 +12,8 @@ import ( // Filter updates/sets replicas fields using the fieldSpecs type Filter struct { - Replica types.Replica `json:"replica,omitempty" yaml:"replica,omitempty"` - - // FsSlice contains the FieldSpecs to locate the namespace field - FsSlice types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` + Replica types.Replica `json:"replica,omitempty" yaml:"replica,omitempty"` + FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"` } var _ kio.Filter = Filter{} @@ -24,20 +22,9 @@ func (rc Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { return kio.FilterAll(yaml.FilterFunc(rc.run)).Filter(nodes) } -// run processes each node individually. func (rc Filter) run(node *yaml.RNode) (*yaml.RNode, error) { - meta, err := node.GetMeta() - if err != nil { - return nil, err - } - - // only update resources where the name matches the Replica name. - if meta.Name != rc.Replica.Name { - return node, nil - } - - err = node.PipeE(fsslice.Filter{ - FsSlice: rc.FsSlice, + err := node.PipeE(fieldspec.Filter{ + FieldSpec: rc.FieldSpec, SetValue: rc.set, CreateKind: yaml.ScalarNode, // replicas is a ScalarNode CreateTag: yaml.IntTag, diff --git a/api/filters/replicacount/replicacount_test.go b/api/filters/replicacount/replicacount_test.go index 811fa4d30..a61889e2d 100644 --- a/api/filters/replicacount/replicacount_test.go +++ b/api/filters/replicacount/replicacount_test.go @@ -5,19 +5,16 @@ import ( "testing" "github.com/stretchr/testify/assert" - "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest" "sigs.k8s.io/kustomize/api/types" ) func TestFilter(t *testing.T) { - var config = builtinconfig.MakeDefaultConfig() testCases := map[string]struct { input string expected string filter Filter - fsslice types.FsSlice }{ "update field": { input: ` @@ -41,11 +38,7 @@ spec: Name: "dep", Count: 42, }, - }, - fsslice: types.FsSlice{ - { - Path: "spec/replicas", - }, + FieldSpec: types.FieldSpec{Path: "spec/replicas"}, }, }, "add field": { @@ -73,9 +66,7 @@ spec: Name: "cus", Count: 42, }, - }, - fsslice: types.FsSlice{ - { + FieldSpec: types.FieldSpec{ Path: "spec/template/replicas", CreateIfNotPresent: true, }, @@ -108,9 +99,7 @@ spec: Name: "cus", Count: 42, }, - }, - fsslice: types.FsSlice{ - { + FieldSpec: types.FieldSpec{ Path: "spec/template/replicas", CreateIfNotPresent: true, }, @@ -140,9 +129,7 @@ spec: Name: "cus", Count: 42, }, - }, - fsslice: types.FsSlice{ - { + FieldSpec: types.FieldSpec{ Path: "spec/template/replicas", }, }, @@ -154,7 +141,6 @@ kind: Custom metadata: name: cus spec: - replicas: 5 template: replicas: 5 `, @@ -164,7 +150,6 @@ kind: Custom metadata: name: cus spec: - replicas: 42 template: replicas: 42 `, @@ -173,21 +158,13 @@ spec: Name: "cus", Count: 42, }, - }, - fsslice: types.FsSlice{ - { - Path: "spec/template/replicas", - }, - { - Path: "spec/replicas", - }, + FieldSpec: types.FieldSpec{Path: "spec/template/replicas"}, }, }, } for tn, tc := range testCases { t.Run(tn, func(t *testing.T) { - tc.filter.FsSlice = append(config.Replicas, tc.fsslice...) if !assert.Equal(t, strings.TrimSpace(tc.expected), strings.TrimSpace( diff --git a/plugin/builtin/replicacounttransformer/ReplicaCountTransformer.go b/plugin/builtin/replicacounttransformer/ReplicaCountTransformer.go index 208a996ea..fee8468a5 100644 --- a/plugin/builtin/replicacounttransformer/ReplicaCountTransformer.go +++ b/plugin/builtin/replicacounttransformer/ReplicaCountTransformer.go @@ -7,7 +7,8 @@ package main import ( "fmt" - "sigs.k8s.io/kustomize/api/transform" + "sigs.k8s.io/kustomize/api/filters/replicacount" + "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/resmap" @@ -34,18 +35,24 @@ func (p *plugin) Config( func (p *plugin) Transform(m resmap.ResMap) error { found := false - for i, replicaSpec := range p.FieldSpecs { - matcher := p.createMatcher(i) + for _, fs := range p.FieldSpecs { + matcher := p.createMatcher(fs) matchOriginal := m.GetMatchingResourcesByOriginalId(matcher) - matchCurrent := m.GetMatchingResourcesByCurrentId(matcher) - - for _, res := range append(matchOriginal, matchCurrent...) { + resList := append( + matchOriginal, m.GetMatchingResourcesByCurrentId(matcher)...) + if len(resList) > 0 { found = true - err := transform.MutateField( - res.Map(), replicaSpec.PathSlice(), - replicaSpec.CreateIfNotPresent, p.addReplicas) - if err != nil { - return err + for _, r := range resList { + // There are redundant checks in the filter + // that we'll live with until resolution of + // https://github.com/kubernetes-sigs/kustomize/issues/2506 + err := filtersutil.ApplyToJSON(replicacount.Filter{ + Replica: p.Replica, + FieldSpec: fs, + }, r) + if err != nil { + return err + } } } } @@ -63,26 +70,8 @@ func (p *plugin) Transform(m resmap.ResMap) error { } // Match Replica.Name and FieldSpec -func (p *plugin) createMatcher(i int) resmap.IdMatcher { +func (p *plugin) createMatcher(fs types.FieldSpec) resmap.IdMatcher { return func(r resid.ResId) bool { - return r.Name == p.Replica.Name && - r.Gvk.IsSelected(&p.FieldSpecs[i].Gvk) + return r.Name == p.Replica.Name && r.Gvk.IsSelected(&fs.Gvk) } } - -func (p *plugin) addReplicas(in interface{}) (interface{}, error) { - switch m := in.(type) { - case int64: - // Was already in the field. - case map[string]interface{}: - if len(m) != 0 { - // A map was already in the replicas field, don't want to - // discard this data silently. - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - // Just got added, default type is map, but we can return anything. - default: - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - return p.Replica.Count, nil -} diff --git a/plugin/builtin/replicacounttransformer/go.mod b/plugin/builtin/replicacounttransformer/go.mod index 8706ddba2..72c5dd712 100644 --- a/plugin/builtin/replicacounttransformer/go.mod +++ b/plugin/builtin/replicacounttransformer/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( sigs.k8s.io/kustomize/api v0.5.1 + sigs.k8s.io/kustomize/kyaml v0.4.1 sigs.k8s.io/yaml v1.2.0 )