diff --git a/pkg/plugins/execplugin.go b/pkg/plugins/execplugin.go index 1fd2d1bff..bf46c0925 100644 --- a/pkg/plugins/execplugin.go +++ b/pkg/plugins/execplugin.go @@ -33,8 +33,6 @@ import ( ) const ( - ArgsOneLiner = "argsOneLiner" - ArgsFromFile = "argsFromFile" idAnnotation = "kustomize.config.k8s.io/id" ) @@ -75,30 +73,26 @@ func (p *ExecPlugin) isAvailable() bool { } func (p *ExecPlugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) error { + ldr ifc.Loader, rf *resmap.Factory, config []byte) error { p.rf = rf p.ldr = ldr - - var err error - p.cfg, err = yaml.Marshal(k) - if err != nil { - return err - } - err = p.processOptionalArgsFields(k) - if err != nil { - return err - } - return nil + p.cfg = config + return p.processOptionalArgsFields() } -func (p *ExecPlugin) processOptionalArgsFields(k ifc.Kunstructured) error { - args, err := k.GetFieldValue(ArgsOneLiner) - if err == nil && args != "" { - p.args = strings.Split(args, " ") +type argsConfig struct { + ArgsOneLiner string `json:"argsOneLiner,omitempty" yaml:"argsOneLiner,omitempty"` + ArgsFromFile string `json:"argsFromFile,omitempty" yaml:"argsFromFile,omitempty"` +} + +func (p *ExecPlugin) processOptionalArgsFields() error { + var c argsConfig + yaml.Unmarshal(p.cfg, &c) + if c.ArgsOneLiner != "" { + p.args = strings.Split(c.ArgsOneLiner, " ") } - fileName, err := k.GetFieldValue(ArgsFromFile) - if err == nil && fileName != "" { - content, err := p.ldr.Load(fileName) + if c.ArgsFromFile != "" { + content, err := p.ldr.Load(c.ArgsFromFile) if err != nil { return err } diff --git a/pkg/plugins/execplugin_test.go b/pkg/plugins/execplugin_test.go index a2f2d294a..9651ffc05 100644 --- a/pkg/plugins/execplugin_test.go +++ b/pkg/plugins/execplugin_test.go @@ -40,8 +40,8 @@ func TestExecPluginConfig(t *testing.T) { "metadata": map[string]interface{}{ "name": "some-random-name", }, - ArgsOneLiner: "one two", - ArgsFromFile: "sed-input.txt", + "argsOneLiner": "one two", + "argsFromFile": "sed-input.txt", }) ldr.AddFile("/app/sed-input.txt", []byte(` @@ -54,7 +54,11 @@ s/$BAR/bar/g plugin.DefaultPluginConfig().DirectoryPath, pluginConfig.Id()) - p.Config(ldr, rf, pluginConfig) + yaml, err := pluginConfig.AsYAML() + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + p.Config(ldr, rf, yaml) expected := "/kustomize/plugin/someteam.example.com/v1/SedTransformer" if !strings.HasSuffix(p.name, expected) { diff --git a/pkg/plugins/loader.go b/pkg/plugins/loader.go index e5dfe5905..42ea16061 100644 --- a/pkg/plugins/loader.go +++ b/pkg/plugins/loader.go @@ -31,7 +31,7 @@ import ( ) type Configurable interface { - Config(ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) error + Config(ldr ifc.Loader, rf *resmap.Factory, config []byte) error } type Loader struct { @@ -114,7 +114,11 @@ func (l *Loader) loadAndConfigurePlugin( return nil, err } } - err = c.Config(ldr, l.rf, res) + yaml, err := res.AsYAML() + if err != nil { + return nil, errors.Wrapf(err, "marshalling yaml from res %s", res.Id()) + } + err = c.Config(ldr, l.rf, yaml) if err != nil { return nil, errors.Wrapf( err, "plugin %s fails configuration", res.Id()) diff --git a/pkg/resmap/factory_test.go b/pkg/resmap/factory_test.go index dc74412f8..6fbcffff6 100644 --- a/pkg/resmap/factory_test.go +++ b/pkg/resmap/factory_test.go @@ -18,7 +18,6 @@ package resmap_test import ( "encoding/base64" - "fmt" "reflect" "testing" @@ -124,7 +123,6 @@ metadata: }), } m, err := rmF.NewResMapFromBytes(encoded) - fmt.Printf("%v\n", m) if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/resource/resource.go b/pkg/resource/resource.go index 697959cbf..919268040 100644 --- a/pkg/resource/resource.go +++ b/pkg/resource/resource.go @@ -23,6 +23,7 @@ import ( "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/types" + "sigs.k8s.io/yaml" ) // Resource is map representation of a Kubernetes API resource object @@ -56,6 +57,16 @@ func (r *Resource) DeepCopy() *Resource { return rc } +// AsYAML returns the resource in Yaml form. +// Easier to read than JSON. +func (r *Resource) AsYAML() ([]byte, error) { + json, err := r.MarshalJSON() + if err != nil { + return nil, err + } + return yaml.JSONToYAML(json) +} + // Behavior returns the behavior for the resource. func (r *Resource) Behavior() types.GenerationBehavior { return r.options.Behavior() diff --git a/pkg/resource/resource_test.go b/pkg/resource/resource_test.go index 57fd0d6ff..427f4e3f0 100644 --- a/pkg/resource/resource_test.go +++ b/pkg/resource/resource_test.go @@ -54,6 +54,21 @@ var testDeployment = factory.FromMap( const deploymentAsString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}` +func TestAsYAML(t *testing.T) { + expected := `apiVersion: apps/v1 +kind: Deployment +metadata: + name: pooh +` + yaml, err := testDeployment.AsYAML() + if err != nil { + t.Fatal(err) + } + if string(yaml) != expected { + t.Fatalf("--- expected\n%s\n--- got\n%s\n", expected, string(yaml)) + } +} + func TestResourceString(t *testing.T) { tests := []struct { in *Resource diff --git a/pkg/target/generatorplugin_test.go b/pkg/target/generatorplugin_test.go index a0e5565b8..094e0c32f 100644 --- a/pkg/target/generatorplugin_test.go +++ b/pkg/target/generatorplugin_test.go @@ -31,7 +31,7 @@ apiVersion: someteam.example.com/v1 kind: ServiceGenerator metadata: name: myServiceGenerator -service: my-service +name: my-service port: "12345" `) } @@ -74,12 +74,13 @@ func writeSecretGeneratorConfig(th *kusttest_test.KustTestHarness, root string) apiVersion: builtin kind: SecretGenerator metadata: - name: mySecret + name: mySecGen +name: mySecret behavior: merge -envFiles: +envs: - a.env - b.env -valueFiles: +files: - longsecret.txt literals: - FRUIT=apple diff --git a/plugin/builtin/ConfigMapGenerator.go b/plugin/builtin/ConfigMapGenerator.go index afb5cf9f6..c3c316b07 100644 --- a/plugin/builtin/ConfigMapGenerator.go +++ b/plugin/builtin/ConfigMapGenerator.go @@ -22,27 +22,31 @@ import ( "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/types" + "sigs.k8s.io/yaml" ) type plugin struct { ldr ifc.Loader rf *resmap.Factory - options types.GeneratorOptions - args types.ConfigMapArgs + types.GeneratorOptions + types.ConfigMapArgs } var KustomizePlugin plugin func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) (err error) { + ldr ifc.Loader, rf *resmap.Factory, config []byte) (err error) { + p.GeneratorOptions = types.GeneratorOptions{} + p.ConfigMapArgs = types.ConfigMapArgs{} + err = yaml.Unmarshal(config, p) p.ldr = ldr p.rf = rf - p.args.GeneratorArgs, err = resmap.GeneratorArgsFromKunstruct(k) return } func (p *plugin) Generate() (resmap.ResMap, error) { argsList := make([]types.ConfigMapArgs, 1) - argsList[0] = p.args - return p.rf.NewResMapFromConfigMapArgs(p.ldr, &p.options, argsList) + argsList[0] = p.ConfigMapArgs + return p.rf.NewResMapFromConfigMapArgs( + p.ldr, &p.GeneratorOptions, argsList) } diff --git a/plugin/builtin/ConfigMapGenerator_test.go b/plugin/builtin/ConfigMapGenerator_test.go index 7790368f5..17f8f70a4 100644 --- a/plugin/builtin/ConfigMapGenerator_test.go +++ b/plugin/builtin/ConfigMapGenerator_test.go @@ -46,8 +46,9 @@ COLOR=red apiVersion: builtin kind: ConfigMapGenerator metadata: - name: myMap -envFiles: + name: myMapGen +name: myMap +envs: - devops.env - uxteam.env literals: diff --git a/plugin/builtin/SecretGenerator.go b/plugin/builtin/SecretGenerator.go index e789b7271..aacbb4d02 100644 --- a/plugin/builtin/SecretGenerator.go +++ b/plugin/builtin/SecretGenerator.go @@ -22,34 +22,31 @@ import ( "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/types" + "sigs.k8s.io/yaml" ) type plugin struct { - ldr ifc.Loader - rf *resmap.Factory - options types.GeneratorOptions - args types.SecretArgs + ldr ifc.Loader + rf *resmap.Factory + types.GeneratorOptions + types.SecretArgs } var KustomizePlugin plugin func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) (err error) { + ldr ifc.Loader, rf *resmap.Factory, config []byte) (err error) { + p.GeneratorOptions = types.GeneratorOptions{} + p.SecretArgs = types.SecretArgs{} + err = yaml.Unmarshal(config, p) p.ldr = ldr p.rf = rf - p.args.GeneratorArgs, err = resmap.GeneratorArgsFromKunstruct(k) - if err != nil { - return - } - p.args.Type, err = k.GetFieldValue("type") - if !resmap.IsAcceptableError(err) { - return - } - return nil + return } func (p *plugin) Generate() (resmap.ResMap, error) { argsList := make([]types.SecretArgs, 1) - argsList[0] = p.args - return p.rf.NewResMapFromSecretArgs(p.ldr, &p.options, argsList) + argsList[0] = p.SecretArgs + return p.rf.NewResMapFromSecretArgs( + p.ldr, &p.GeneratorOptions, argsList) } diff --git a/plugin/builtin/SecretGenerator_test.go b/plugin/builtin/SecretGenerator_test.go index cd108989d..9e7ecf714 100644 --- a/plugin/builtin/SecretGenerator_test.go +++ b/plugin/builtin/SecretGenerator_test.go @@ -50,12 +50,14 @@ consectetur adipiscing elit. apiVersion: builtin kind: SecretGenerator metadata: - name: mySecret + name: exampleSecGen +name: mySecret +namespace: whatever behavior: merge -envFiles: +envs: - a.env - b.env -valueFiles: +files: - obscure=longsecret.txt literals: - FRUIT=apple @@ -73,6 +75,7 @@ data: kind: Secret metadata: name: mySecret + namespace: whatever type: Opaque `) } diff --git a/plugin/someteam.example.com/v1/DatePrefixer.go b/plugin/someteam.example.com/v1/DatePrefixer.go index 88d3e3493..8f9ba6812 100644 --- a/plugin/someteam.example.com/v1/DatePrefixer.go +++ b/plugin/someteam.example.com/v1/DatePrefixer.go @@ -30,7 +30,7 @@ type plugin struct{} var KustomizePlugin plugin func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) error { + ldr ifc.Loader, rf *resmap.Factory, c []byte) error { return nil } diff --git a/plugin/someteam.example.com/v1/ServiceGenerator.go b/plugin/someteam.example.com/v1/ServiceGenerator.go index 9137a2146..489075948 100644 --- a/plugin/someteam.example.com/v1/ServiceGenerator.go +++ b/plugin/someteam.example.com/v1/ServiceGenerator.go @@ -26,22 +26,23 @@ import ( "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resource" + "sigs.k8s.io/yaml" ) type plugin struct { - ServiceName string - Port string + Name string `json:"name,omitempty" yaml:"name,omitempty"` + Port string `json:"port,omitempty" yaml:"port,omitempty"` } var KustomizePlugin plugin -var manifest = ` +const tmpl = ` apiVersion: v1 kind: Service metadata: labels: app: dev - name: {{.ServiceName}} + name: {{.Name}} spec: ports: - port: {{.Port}} @@ -50,23 +51,13 @@ spec: ` func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) error { - var err error - p.ServiceName, err = k.GetFieldValue("service") - if err != nil { - return err - } - p.Port, err = k.GetFieldValue("port") - if err != nil { - return err - } - return nil + ldr ifc.Loader, rf *resmap.Factory, config []byte) error { + return yaml.Unmarshal(config, p) } func (p *plugin) Generate() (resmap.ResMap, error) { var buf bytes.Buffer - - temp := template.Must(template.New("manifest").Parse(manifest)) + temp := template.Must(template.New("tmpl").Parse(tmpl)) err := temp.Execute(&buf, p) if err != nil { return nil, err diff --git a/plugin/someteam.example.com/v1/StringPrefixer.go b/plugin/someteam.example.com/v1/StringPrefixer.go index 6f3dac2fd..db8049b4e 100644 --- a/plugin/someteam.example.com/v1/StringPrefixer.go +++ b/plugin/someteam.example.com/v1/StringPrefixer.go @@ -16,44 +16,34 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Assuming GOPATH is something like -// ~/gopath -// and this source file is located at -// $GOPATH/src/sigs.k8s.io/kustomize/plugins/StringPrefixer.go, -// build it like this: -// dir=$GOPATH/src/sigs.k8s.io/kustomize/plugins -// go build -buildmode plugin -tags=plugin \ -// -o $dir/StringPrefixer.so $dir/StringPrefixer.go - package main import ( - "fmt" "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" ) type plugin struct { - prefix string + Metadata metaData `json:"metadata,omitempty" yaml:"metadata,omitempty"` +} + +type metaData struct { + Name string `json:"name,omitempty" yaml:"name,omitempty"` } var KustomizePlugin plugin func (p *plugin) Config( - ldr ifc.Loader, rf *resmap.Factory, k ifc.Kunstructured) error { - name := k.GetName() - if name == "" { - return fmt.Errorf("name cannot be empty") - } - p.prefix = name + "-" - return nil + ldr ifc.Loader, rf *resmap.Factory, c []byte) error { + return yaml.Unmarshal(c, p) } func (p *plugin) Transform(m resmap.ResMap) error { tr, err := transformers.NewNamePrefixSuffixTransformer( - p.prefix, "", + p.Metadata.Name + "-", "", config.MakeDefaultConfig().NamePrefix) if err != nil { return err