diff --git a/docs/plugins.md b/docs/plugins.md index e252efda8..befbaa62a 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -101,7 +101,7 @@ To get the plugin ready to generator or transform, it is given the entire contents of the configuration file. -[NameTransformer]: ../plugin/builtin/nametransformer/NameTransformer_test.go +[NameTransformer]: ../plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer_test.go [ChartInflator]: ../plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go [plugins]: ../plugin/builtin diff --git a/pkg/resid/resid.go b/pkg/resid/resid.go index 3e2ecc852..d92eb0709 100644 --- a/pkg/resid/resid.go +++ b/pkg/resid/resid.go @@ -53,11 +53,6 @@ func NewResIdWithSuffixNamespace(k gvk.Gvk, n, s, ns string) ResId { return ResId{ItemId: ItemId{Gvk: k, Name: n, Namespace: ns}, Suffix: s} } -// NewResIdWithPrefixSuffix creates new resource identifier with a prefix and suffix -func NewResIdWithPrefixSuffix(k gvk.Gvk, n, p, s string) ResId { - return ResId{ItemId: ItemId{Gvk: k, Name: n}, Prefix: p, Suffix: s} -} - // NewResId creates new resource identifier func NewResId(k gvk.Gvk, n string) ResId { return ResId{ItemId: ItemId{Gvk: k, Name: n}} diff --git a/pkg/target/kusttarget_configplugin.go b/pkg/target/kusttarget_configplugin.go index a6371089a..d1b830eb9 100644 --- a/pkg/target/kusttarget_configplugin.go +++ b/pkg/target/kusttarget_configplugin.go @@ -206,8 +206,8 @@ func (kt *KustTarget) configureBuiltinNameTransformer( c.Prefix = kt.kustomization.NamePrefix c.Suffix = kt.kustomization.NameSuffix c.FieldSpecs = tConfig.NamePrefix - p := builtin.NewNameTransformerPlugin() - err = kt.configureBuiltinPlugin(p, c, "name") + p := builtin.NewPrefixSuffixTransformerPlugin() + err = kt.configureBuiltinPlugin(p, c, "prefixsuffix") if err != nil { return nil, err } diff --git a/pkg/transformers/image.go b/pkg/transformers/image.go index 847b6e0b1..0ddcca92e 100644 --- a/pkg/transformers/image.go +++ b/pkg/transformers/image.go @@ -49,7 +49,7 @@ func (pt *imageTransformer) Transform(m resmap.ResMap) error { if !r.Id().Gvk().IsSelected(&path.Gvk) { continue } - err := mutateField(r.Map(), path.PathSlice(), false, pt.mutateImage) + err := MutateField(r.Map(), path.PathSlice(), false, pt.mutateImage) if err != nil { return err } diff --git a/pkg/transformers/labelsandannotations.go b/pkg/transformers/labelsandannotations.go index 836db2e48..5d92ac1ef 100644 --- a/pkg/transformers/labelsandannotations.go +++ b/pkg/transformers/labelsandannotations.go @@ -64,7 +64,7 @@ func (o *mapTransformer) Transform(m resmap.ResMap) error { if !r.Id().Gvk().IsSelected(&path.Gvk) { continue } - err := mutateField( + err := MutateField( r.Map(), path.PathSlice(), path.CreateIfNotPresent, o.addMap) if err != nil { diff --git a/pkg/transformers/mutatefield.go b/pkg/transformers/mutatefield.go index eddfeee20..87c659c97 100644 --- a/pkg/transformers/mutatefield.go +++ b/pkg/transformers/mutatefield.go @@ -24,7 +24,7 @@ import ( type mutateFunc func(interface{}) (interface{}, error) -func mutateField( +func MutateField( m map[string]interface{}, pathToField []string, createIfNotPresent bool, @@ -61,7 +61,7 @@ func mutateField( strings.Join(pathToField, ".")) return nil case map[string]interface{}: - return mutateField(typedV, newPathToField, createIfNotPresent, fns...) + return MutateField(typedV, newPathToField, createIfNotPresent, fns...) case []interface{}: for i := range typedV { item := typedV[i] @@ -69,7 +69,7 @@ func mutateField( if !ok { return fmt.Errorf("%#v is expected to be %T", item, typedItem) } - err := mutateField(typedItem, newPathToField, createIfNotPresent, fns...) + err := MutateField(typedItem, newPathToField, createIfNotPresent, fns...) if err != nil { return err } diff --git a/pkg/transformers/mutatefield_test.go b/pkg/transformers/mutatefield_test.go index e3f526275..31fd8d643 100644 --- a/pkg/transformers/mutatefield_test.go +++ b/pkg/transformers/mutatefield_test.go @@ -89,7 +89,7 @@ func getFieldValue(t *testing.T, obj ifc.Kunstructured, fieldName string) string func TestNoPath(t *testing.T) { obj := makeTestDeployment() m := &noopMutator{} - err := mutateField( + err := MutateField( obj.Map(), []string{}, false, m.mutate) if m.wasCalled { t.Fatalf("mutator should not have been called.") @@ -111,7 +111,7 @@ func TestHappyPath(t *testing.T) { } m := &noopMutator{} - err := mutateField( + err := MutateField( obj.Map(), []string{"metadata", "name"}, false, m.mutate) if !m.wasCalled { t.Fatalf("mutator should have been called.") @@ -125,7 +125,7 @@ func TestHappyPath(t *testing.T) { } m = &noopMutator{} - err = mutateField( + err = MutateField( obj.Map(), []string{"spec", "template", "metadata", "labels", "vegetable"}, false, m.mutate) if !m.wasCalled { t.Fatalf("mutator should have been called.") @@ -142,7 +142,7 @@ func TestHappyPath(t *testing.T) { func TestWithError(t *testing.T) { obj := makeTestDeployment() m := noopMutator{errorToReturn: errExpected} - err := mutateField( + err := MutateField( obj.Map(), []string{"metadata", "name"}, false, m.mutate) if !m.wasCalled { t.Fatalf("mutator was not called!") @@ -160,7 +160,7 @@ func TestWithNil(t *testing.T) { foo.(map[string]interface{})["labels"] = nil m := &noopMutator{} - err := mutateField( + err := MutateField( obj.Map(), []string{"spec", "template", "metadata", "labels", "vegetable"}, false, m.mutate) if err != nil { t.Fatalf("Unexpected error: %v", err) diff --git a/pkg/transformers/namereference.go b/pkg/transformers/namereference.go index 219f76fdc..7bfe01c65 100644 --- a/pkg/transformers/namereference.go +++ b/pkg/transformers/namereference.go @@ -97,7 +97,7 @@ func (o *nameReferenceTransformer) Transform(m resmap.ResMap) error { if candidates == nil { candidates = m.SubsetThatCouldBeReferencedBy(referrer) } - err := mutateField( + err := MutateField( res.Map(), fSpec.PathSlice(), fSpec.CreateIfNotPresent, diff --git a/pkg/transformers/namespace.go b/pkg/transformers/namespace.go index 0f66aba86..990ec546b 100644 --- a/pkg/transformers/namespace.go +++ b/pkg/transformers/namespace.go @@ -59,7 +59,7 @@ func (o *namespaceTransformer) Transform(m resmap.ResMap) error { case "metadata/namespace": if id.Gvk().IsSelected(&path.Gvk) && !id.Gvk().IsClusterKind() { if len(objMap) > 0 { - err := mutateField( + err := MutateField( objMap, path.PathSlice(), path.CreateIfNotPresent, func(_ interface{}) (interface{}, error) { return o.namespace, nil @@ -75,7 +75,7 @@ func (o *namespaceTransformer) Transform(m resmap.ResMap) error { } // make sure the object is non empty if len(objMap) > 0 { - err := mutateField( + err := MutateField( objMap, path.PathSlice(), path.CreateIfNotPresent, func(_ interface{}) (interface{}, error) { return o.namespace, nil @@ -144,7 +144,7 @@ func (o *namespaceTransformer) updateClusterRoleBinding(m resmap.ResMap) { // a ServiceAccount named “default” exists in every active namespace if name.(string) == "default" || saMap[name.(string)] { subject := subjects[i].(map[string]interface{}) - mutateField(subject, []string{"namespace"}, true, func(_ interface{}) (interface{}, error) { + MutateField(subject, []string{"namespace"}, true, func(_ interface{}) (interface{}, error) { return o.namespace, nil }) subjects[i] = subject diff --git a/pkg/transformers/prefixsuffix.go b/pkg/transformers/prefixsuffix.go deleted file mode 100644 index f020b0f32..000000000 --- a/pkg/transformers/prefixsuffix.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package transformers - -import ( - "errors" - "fmt" - - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -// prefixSuffixTransformer contains the prefix, suffix, and the FieldSpecs -// for each field needing a prefix and suffix. -type prefixSuffixTransformer struct { - prefix string - suffix string - fieldSpecsToUse []config.FieldSpec - fieldSpecsToSkip []config.FieldSpec -} - -var _ Transformer = &prefixSuffixTransformer{} - -// Not placed in a file yet due to lack of demand. -var prefixSuffixFieldSpecsToSkip = []config.FieldSpec{ - { - Gvk: gvk.Gvk{Kind: "CustomResourceDefinition"}, - }, -} - -// NewPrefixSuffixTransformer makes a prefixSuffixTransformer. -func NewPrefixSuffixTransformer( - np, ns string, fieldSpecs []config.FieldSpec) (Transformer, error) { - if len(np) == 0 && len(ns) == 0 { - return NewNoOpTransformer(), nil - } - if fieldSpecs == nil { - return nil, errors.New("fieldSpecs is not expected to be nil") - } - return &prefixSuffixTransformer{ - prefix: np, - suffix: ns, - fieldSpecsToUse: fieldSpecs, - fieldSpecsToSkip: prefixSuffixFieldSpecsToSkip}, nil -} - -// Transform prepends the prefix and appends the suffix to the field contents. -// TODO: this transformer breaks internal -// ordering and depends on Id hackery. Rewrite completely. -func (o *prefixSuffixTransformer) Transform(m resmap.ResMap) error { - // Fill map "mf" with entries subject to name modification, and - // delete these entries from "m", so that for now m retains only - // the entries whose names will not be modified. - mf := resmap.New() - for id, r := range m.AsMap() { - found := false - for _, path := range o.fieldSpecsToSkip { - if id.Gvk().IsSelected(&path.Gvk) { - found = true - break - } - } - if !found { - mf.AppendWithId(id, r) - m.Remove(id) - } - } - - for id, r := range mf.AsMap() { - objMap := r.Map() - for _, path := range o.fieldSpecsToUse { - if !id.Gvk().IsSelected(&path.Gvk) { - continue - } - err := mutateField( - objMap, - path.PathSlice(), - path.CreateIfNotPresent, - o.addPrefixSuffix) - if err != nil { - return err - } - newId := id.CopyWithNewPrefixSuffix(o.prefix, o.suffix) - m.AppendWithId(newId, r) - } - } - return nil -} - -func (o *prefixSuffixTransformer) addPrefixSuffix( - in interface{}) (interface{}, error) { - s, ok := in.(string) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", in, s) - } - return fmt.Sprintf("%s%s%s", o.prefix, s, o.suffix), nil -} diff --git a/pkg/transformers/prefixsuffix_test.go b/pkg/transformers/prefixsuffix_test.go deleted file mode 100644 index 7f723ecd0..000000000 --- a/pkg/transformers/prefixsuffix_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package transformers - -import ( - "testing" - - "sigs.k8s.io/kustomize/k8sdeps/kunstruct" - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" -) - -func TestPrefixSuffixNameRun(t *testing.T) { - rf := resource.NewFactory( - kunstruct.NewKunstructuredFactoryImpl()) - m := resmap.FromMap(map[resid.ResId]*resource.Resource{ - resid.NewResId(cmap, "cm1"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - }, - }), - resid.NewResId(cmap, "cm2"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm2", - }, - }), - resid.NewResId(crd, "crd"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "apiextensions.k8s.io/v1beta1", - "kind": "CustomResourceDefinition", - "metadata": map[string]interface{}{ - "name": "crd", - }, - }), - }) - expected := resmap.FromMap(map[resid.ResId]*resource.Resource{ - resid.NewResIdWithPrefixSuffix(cmap, "cm1", "someprefix-", "-somesuffix"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "someprefix-cm1-somesuffix", - }, - }), - resid.NewResIdWithPrefixSuffix(cmap, "cm2", "someprefix-", "-somesuffix"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "someprefix-cm2-somesuffix", - }, - }), - resid.NewResId(crd, "crd"): rf.FromMap( - map[string]interface{}{ - "apiVersion": "apiextensions.k8s.io/v1beta1", - "kind": "CustomResourceDefinition", - "metadata": map[string]interface{}{ - "name": "crd", - }, - }), - }) - - npst, err := NewPrefixSuffixTransformer( - "someprefix-", "-somesuffix", defaultTransformerConfig.NamePrefix) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = npst.Transform(m) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err = expected.ErrorIfNotEqualSets(m); err != nil { - t.Fatalf("actual doesn't match expected: %v", err) - } -} diff --git a/pkg/transformers/refvars.go b/pkg/transformers/refvars.go index 87dda4eb1..8366f6f42 100644 --- a/pkg/transformers/refvars.go +++ b/pkg/transformers/refvars.go @@ -98,7 +98,7 @@ func (rv *RefVarTransformer) Transform(m resmap.ResMap) error { for _, res := range m.Resources() { for _, fieldSpec := range rv.fieldSpecs { if res.Id().Gvk().IsSelected(&fieldSpec.Gvk) { - if err := mutateField( + if err := MutateField( res.Map(), fieldSpec.PathSlice(), false, rv.replaceVars); err != nil { return err diff --git a/plugin/builtin/NameTransformer.go b/plugin/builtin/NameTransformer.go deleted file mode 100644 index c0ab1194e..000000000 --- a/plugin/builtin/NameTransformer.go +++ /dev/null @@ -1,41 +0,0 @@ -// Code generated by pluginator on NameTransformer; DO NOT EDIT. -package builtin - -import ( - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers" - "sigs.k8s.io/kustomize/pkg/transformers/config" - "sigs.k8s.io/yaml" -) - -// Add the given prefix and suffix to the resource name. -type NameTransformerPlugin struct { - Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` - Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` - FieldSpecs []config.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` -} - -func NewNameTransformerPlugin() *NameTransformerPlugin { - return &NameTransformerPlugin{} -} - -func (p *NameTransformerPlugin) Config( - ldr ifc.Loader, rf *resmap.Factory, c []byte) (err error) { - p.Prefix = "" - p.Suffix = "" - p.FieldSpecs = nil - return yaml.Unmarshal(c, p) -} - -func (p *NameTransformerPlugin) Transform(m resmap.ResMap) error { - t, err := transformers.NewPrefixSuffixTransformer( - p.Prefix, - p.Suffix, - p.FieldSpecs, - ) - if err != nil { - return err - } - return t.Transform(m) -} diff --git a/plugin/builtin/PrefixSuffixTransformer.go b/plugin/builtin/PrefixSuffixTransformer.go new file mode 100644 index 000000000..96fbbbe73 --- /dev/null +++ b/plugin/builtin/PrefixSuffixTransformer.go @@ -0,0 +1,100 @@ +// Code generated by pluginator on PrefixSuffixTransformer; DO NOT EDIT. +package builtin + +import ( + "errors" + "fmt" + + "sigs.k8s.io/kustomize/pkg/gvk" + "sigs.k8s.io/kustomize/pkg/ifc" + "sigs.k8s.io/kustomize/pkg/resmap" + "sigs.k8s.io/kustomize/pkg/transformers" + "sigs.k8s.io/kustomize/pkg/transformers/config" + "sigs.k8s.io/yaml" +) + +// Add the given prefix and suffix to the field. +type PrefixSuffixTransformerPlugin struct { + Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` + Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` + FieldSpecs []config.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func NewPrefixSuffixTransformerPlugin() *PrefixSuffixTransformerPlugin { + return &PrefixSuffixTransformerPlugin{} +} + +// Not placed in a file yet due to lack of demand. +var prefixSuffixFieldSpecsToSkip = []config.FieldSpec{ + { + Gvk: gvk.Gvk{Kind: "CustomResourceDefinition"}, + }, +} + +func (p *PrefixSuffixTransformerPlugin) Config( + ldr ifc.Loader, rf *resmap.Factory, c []byte) (err error) { + p.Prefix = "" + p.Suffix = "" + p.FieldSpecs = nil + err = yaml.Unmarshal(c, p) + if err != nil { + return + } + if p.FieldSpecs == nil { + return errors.New("fieldSpecs is not expected to be nil") + } + return +} + +func (p *PrefixSuffixTransformerPlugin) Transform(m resmap.ResMap) error { + if len(p.Prefix) == 0 && len(p.Suffix) == 0 { + return nil + } + + // Fill map "mf" with entries subject to name modification, and + // delete these entries from "m", so that for now m retains only + // the entries whose names will not be modified. + mf := resmap.New() + for id, r := range m.AsMap() { + found := false + for _, path := range prefixSuffixFieldSpecsToSkip { + if id.Gvk().IsSelected(&path.Gvk) { + found = true + break + } + } + if !found { + mf.AppendWithId(id, r) + m.Remove(id) + } + } + + for id, r := range mf.AsMap() { + objMap := r.Map() + for _, path := range p.FieldSpecs { + if !id.Gvk().IsSelected(&path.Gvk) { + continue + } + err := transformers.MutateField( + objMap, + path.PathSlice(), + path.CreateIfNotPresent, + p.addPrefixSuffix) + if err != nil { + return err + } + newId := id.CopyWithNewPrefixSuffix(p.Prefix, p.Suffix) + m.AppendWithId(newId, r) + } + } + return nil +} + +func (p *PrefixSuffixTransformerPlugin) addPrefixSuffix( + in interface{}) (interface{}, error) { + s, ok := in.(string) + if !ok { + return nil, fmt.Errorf("%#v is expected to be %T", in, s) + } + return fmt.Sprintf("%s%s%s", p.Prefix, s, p.Suffix), nil +} diff --git a/plugin/builtin/nametransformer/NameTransformer.go b/plugin/builtin/nametransformer/NameTransformer.go deleted file mode 100644 index 577498876..000000000 --- a/plugin/builtin/nametransformer/NameTransformer.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -//go:generate go run sigs.k8s.io/kustomize/plugin/pluginator -package main - -import ( - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers" - "sigs.k8s.io/kustomize/pkg/transformers/config" - "sigs.k8s.io/yaml" -) - -// Add the given prefix and suffix to the field. -type plugin struct { - Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` - Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` - FieldSpecs []config.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` -} - -var KustomizePlugin plugin - -func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, c []byte) (err error) { - p.Prefix = "" - p.Suffix = "" - p.FieldSpecs = nil - return yaml.Unmarshal(c, p) -} - -func (p *plugin) Transform(m resmap.ResMap) error { - t, err := transformers.NewPrefixSuffixTransformer( - p.Prefix, - p.Suffix, - p.FieldSpecs, - ) - if err != nil { - return err - } - return t.Transform(m) -} diff --git a/plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer.go b/plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer.go new file mode 100644 index 000000000..252ecf753 --- /dev/null +++ b/plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer.go @@ -0,0 +1,101 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +//go:generate go run sigs.k8s.io/kustomize/plugin/pluginator +package main + +import ( + "errors" + "fmt" + + "sigs.k8s.io/kustomize/pkg/gvk" + "sigs.k8s.io/kustomize/pkg/ifc" + "sigs.k8s.io/kustomize/pkg/resmap" + "sigs.k8s.io/kustomize/pkg/transformers" + "sigs.k8s.io/kustomize/pkg/transformers/config" + "sigs.k8s.io/yaml" +) + +// Add the given prefix and suffix to the field. +type plugin struct { + Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` + Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` + FieldSpecs []config.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +var KustomizePlugin plugin + +// Not placed in a file yet due to lack of demand. +var prefixSuffixFieldSpecsToSkip = []config.FieldSpec{ + { + Gvk: gvk.Gvk{Kind: "CustomResourceDefinition"}, + }, +} + +func (p *plugin) Config( + ldr ifc.Loader, rf *resmap.Factory, c []byte) (err error) { + p.Prefix = "" + p.Suffix = "" + p.FieldSpecs = nil + err = yaml.Unmarshal(c, p) + if err != nil { + return + } + if p.FieldSpecs == nil { + return errors.New("fieldSpecs is not expected to be nil") + } + return +} + +func (p *plugin) Transform(m resmap.ResMap) error { + if len(p.Prefix) == 0 && len(p.Suffix) == 0 { + return nil + } + + // Fill map "mf" with entries subject to name modification, and + // delete these entries from "m", so that for now m retains only + // the entries whose names will not be modified. + mf := resmap.New() + for id, r := range m.AsMap() { + found := false + for _, path := range prefixSuffixFieldSpecsToSkip { + if id.Gvk().IsSelected(&path.Gvk) { + found = true + break + } + } + if !found { + mf.AppendWithId(id, r) + m.Remove(id) + } + } + + for id, r := range mf.AsMap() { + objMap := r.Map() + for _, path := range p.FieldSpecs { + if !id.Gvk().IsSelected(&path.Gvk) { + continue + } + err := transformers.MutateField( + objMap, + path.PathSlice(), + path.CreateIfNotPresent, + p.addPrefixSuffix) + if err != nil { + return err + } + newId := id.CopyWithNewPrefixSuffix(p.Prefix, p.Suffix) + m.AppendWithId(newId, r) + } + } + return nil +} + +func (p *plugin) addPrefixSuffix( + in interface{}) (interface{}, error) { + s, ok := in.(string) + if !ok { + return nil, fmt.Errorf("%#v is expected to be %T", in, s) + } + return fmt.Sprintf("%s%s%s", p.Prefix, s, p.Suffix), nil +} diff --git a/plugin/builtin/nametransformer/NameTransformer_test.go b/plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer_test.go similarity index 61% rename from plugin/builtin/nametransformer/NameTransformer_test.go rename to plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer_test.go index 1b6f0c5e0..0ed935ece 100644 --- a/plugin/builtin/nametransformer/NameTransformer_test.go +++ b/plugin/builtin/prefixsuffixtransformer/PrefixSuffixTransformer_test.go @@ -10,17 +10,17 @@ import ( "sigs.k8s.io/kustomize/plugin" ) -func TestNameTransformer(t *testing.T) { +func TestPrefixSuffixTransformer(t *testing.T) { tc := plugin.NewEnvForTest(t).Set() defer tc.Reset() tc.BuildGoPlugin( - "builtin", "", "NameTransformer") + "builtin", "", "PrefixSuffixTransformer") th := kusttest_test.NewKustTestPluginHarness(t, "/app") rm := th.LoadAndRunTransformer(` apiVersion: builtin -kind: NameTransformer +kind: PrefixSuffixTransformer metadata: name: notImportantHere prefix: baked- @@ -35,9 +35,29 @@ metadata: spec: ports: - port: 7002 +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: crd +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm `) th.AssertActualEqualsExpected(rm, ` +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: crd +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: baked-cm-pie +--- apiVersion: v1 kind: Service metadata: diff --git a/plugin/someteam.example.com/v1/dateprefixer/DatePrefixer.go b/plugin/someteam.example.com/v1/dateprefixer/DatePrefixer.go index 9f29b08b2..2f46d5f92 100644 --- a/plugin/someteam.example.com/v1/dateprefixer/DatePrefixer.go +++ b/plugin/someteam.example.com/v1/dateprefixer/DatePrefixer.go @@ -4,18 +4,51 @@ package main import ( + "github.com/pkg/errors" "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/transformers" "sigs.k8s.io/kustomize/pkg/transformers/config" + "sigs.k8s.io/kustomize/plugin/builtin" + "sigs.k8s.io/yaml" ) -type plugin struct{} +// Add a date prefix to the name. +// A plugin that adapts another plugin. +type plugin struct { + t transformers.Transformer +} var KustomizePlugin plugin +func (p *plugin) makePrefixSuffixPluginConfig() ([]byte, error) { + var s struct { + Prefix string + Suffix string + FieldSpecs []config.FieldSpec + } + s.Prefix = getDate() + "-" + s.FieldSpecs = []config.FieldSpec{ + {Path: "metadata/name"}, + } + return yaml.Marshal(s) +} + func (p *plugin) Config( ldr ifc.Loader, rf *resmap.Factory, c []byte) error { + // Ignore the incoming c, compute new config. + c, err := p.makePrefixSuffixPluginConfig() + if err != nil { + return errors.Wrapf( + err, "dateprefixer makeconfig") + } + prefixer := builtin.NewPrefixSuffixTransformerPlugin() + err = prefixer.Config(ldr, rf, c) + if err != nil { + return errors.Wrapf( + err, "prefixsuffix configure") + } + p.t = prefixer return nil } @@ -28,11 +61,5 @@ func getDate() string { } func (p *plugin) Transform(m resmap.ResMap) error { - tr, err := transformers.NewPrefixSuffixTransformer( - getDate()+"-", "", - config.MakeDefaultConfig().NamePrefix) - if err != nil { - return err - } - return tr.Transform(m) + return p.t.Transform(m) } diff --git a/plugin/someteam.example.com/v1/stringprefixer/StringPrefixer.go b/plugin/someteam.example.com/v1/stringprefixer/StringPrefixer.go index 879ab9d71..8688d8204 100644 --- a/plugin/someteam.example.com/v1/stringprefixer/StringPrefixer.go +++ b/plugin/someteam.example.com/v1/stringprefixer/StringPrefixer.go @@ -4,15 +4,20 @@ package main import ( + "github.com/pkg/errors" "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/transformers" "sigs.k8s.io/kustomize/pkg/transformers/config" + "sigs.k8s.io/kustomize/plugin/builtin" "sigs.k8s.io/yaml" ) +// Add a string prefix to the name. +// A plugin that adapts another plugin. type plugin struct { Metadata metaData `json:"metadata,omitempty" yaml:"metadata,omitempty"` + t transformers.Transformer } type metaData struct { @@ -21,17 +26,39 @@ type metaData struct { var KustomizePlugin plugin -func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, c []byte) error { - return yaml.Unmarshal(c, p) +func (p *plugin) makePrefixSuffixPluginConfig(n string) ([]byte, error) { + var s struct { + Prefix string + Suffix string + FieldSpecs []config.FieldSpec + } + s.Prefix = n + "-" + s.FieldSpecs = []config.FieldSpec{ + {Path: "metadata/name"}, + } + return yaml.Marshal(s) } -func (p *plugin) Transform(m resmap.ResMap) error { - tr, err := transformers.NewPrefixSuffixTransformer( - p.Metadata.Name+"-", "", - config.MakeDefaultConfig().NamePrefix) +func (p *plugin) Config( + ldr ifc.Loader, rf *resmap.Factory, c []byte) error { + err := yaml.Unmarshal(c, p) if err != nil { return err } - return tr.Transform(m) + c, err = p.makePrefixSuffixPluginConfig(p.Metadata.Name) + if err != nil { + return err + } + prefixer := builtin.NewPrefixSuffixTransformerPlugin() + err = prefixer.Config(ldr, rf, c) + if err != nil { + return errors.Wrapf( + err, "stringprefixer configure") + } + p.t = prefixer + return nil +} + +func (p *plugin) Transform(m resmap.ResMap) error { + return p.t.Transform(m) }