From 2825888ffd08b3e9b6fc70f661b27e2ccc5a0b6d Mon Sep 17 00:00:00 2001 From: Jeffrey Regan Date: Tue, 7 May 2019 16:10:39 -0700 Subject: [PATCH] Add test for builtin secretgenerator plugin. --- pkg/kusttest/kusttestharness.go | 17 +++++++ pkg/plugins/loader.go | 38 +++++++++++----- pkg/resmap/legacygeneratorargs.go | 26 +++++++++++ pkg/target/generatorplugin_test.go | 11 ++--- plugin/builtin/SecretGenerator.go | 24 +++------- plugin/builtin/SecretGenerator_test.go | 62 ++++++++++++++++++++++++++ 6 files changed, 143 insertions(+), 35 deletions(-) create mode 100644 pkg/resmap/legacygeneratorargs.go create mode 100644 plugin/builtin/SecretGenerator_test.go diff --git a/pkg/kusttest/kusttestharness.go b/pkg/kusttest/kusttestharness.go index e3d3b245e..72defaea8 100644 --- a/pkg/kusttest/kusttestharness.go +++ b/pkg/kusttest/kusttestharness.go @@ -111,6 +111,23 @@ func (th *KustTestHarness) WriteDefaultConfigs(fName string) { } } +func (th *KustTestHarness) LoadAndRunGenerator( + config string) resmap.ResMap { + res, err := th.rf.RF().FromBytes([]byte(config)) + if err != nil { + th.t.Fatalf("Err: %v", err) + } + g, err := th.pl.LoadGenerator(th.ldr, res) + if err != nil { + th.t.Fatalf("Err: %v", err) + } + rm, err := g.Generate() + if err != nil { + th.t.Fatalf("Err: %v", err) + } + return rm +} + func tabToSpace(input string) string { var result []string for _, i := range input { diff --git a/pkg/plugins/loader.go b/pkg/plugins/loader.go index 07a0d89e2..b40c37bb6 100644 --- a/pkg/plugins/loader.go +++ b/pkg/plugins/loader.go @@ -48,36 +48,54 @@ func (l *Loader) LoadGenerators( ldr ifc.Loader, rm resmap.ResMap) ([]transformers.Generator, error) { var result []transformers.Generator for _, res := range rm { - c, err := l.loadAndConfigurePlugin(ldr, res) + g, err := l.LoadGenerator(ldr, res) if err != nil { return nil, err } - g, ok := c.(transformers.Generator) - if !ok { - return nil, fmt.Errorf("plugin %s not a generator", res.Id()) - } result = append(result, g) } return result, nil } +func (l *Loader) LoadGenerator( + ldr ifc.Loader, res *resource.Resource) (transformers.Generator, error) { + c, err := l.loadAndConfigurePlugin(ldr, res) + if err != nil { + return nil, err + } + g, ok := c.(transformers.Generator) + if !ok { + return nil, fmt.Errorf("plugin %s not a generator", res.Id()) + } + return g, nil +} + func (l *Loader) LoadTransformers( ldr ifc.Loader, rm resmap.ResMap) ([]transformers.Transformer, error) { var result []transformers.Transformer for _, res := range rm { - c, err := l.loadAndConfigurePlugin(ldr, res) + t, err := l.LoadTransformer(ldr, res) if err != nil { return nil, err } - t, ok := c.(transformers.Transformer) - if !ok { - return nil, fmt.Errorf("plugin %s not a transformer", res.Id()) - } result = append(result, t) } return result, nil } +func (l *Loader) LoadTransformer( + ldr ifc.Loader, res *resource.Resource) (transformers.Transformer, error) { + c, err := l.loadAndConfigurePlugin(ldr, res) + if err != nil { + return nil, err + } + t, ok := c.(transformers.Transformer) + if !ok { + return nil, fmt.Errorf("plugin %s not a transformer", res.Id()) + } + return t, nil +} + func pluginPath(id resid.ResId) string { return filepath.Join(id.Gvk().Group, id.Gvk().Version, id.Gvk().Kind) } diff --git a/pkg/resmap/legacygeneratorargs.go b/pkg/resmap/legacygeneratorargs.go new file mode 100644 index 000000000..272b3946d --- /dev/null +++ b/pkg/resmap/legacygeneratorargs.go @@ -0,0 +1,26 @@ +package resmap + +import ( + "sigs.k8s.io/kustomize/pkg/ifc" + "sigs.k8s.io/kustomize/pkg/types" +) + +func GeneratorArgsFromKunstruct(k ifc.Kunstructured) ( + result types.GeneratorArgs, err error) { + result.Name = k.GetName() + // TODO: validate behavior values. + result.Behavior, err = k.GetFieldValue("behavior") + if err != nil { + return + } + result.EnvSources, err = k.GetStringSlice("envFiles") + if err != nil { + return + } + result.FileSources, err = k.GetStringSlice("valueFiles") + if err != nil { + return + } + result.LiteralSources, err = k.GetStringSlice("literals") + return +} diff --git a/pkg/target/generatorplugin_test.go b/pkg/target/generatorplugin_test.go index 3c1ad153f..f7096d4df 100644 --- a/pkg/target/generatorplugin_test.go +++ b/pkg/target/generatorplugin_test.go @@ -71,7 +71,7 @@ func writeSecretGeneratorConfig(th *kusttest_test.KustTestHarness, root string) apiVersion: builtin kind: SecretGenerator metadata: - name: secretGenerator + name: mySecret behavior: merge envFiles: - a.env @@ -90,13 +90,10 @@ DB_PASSWORD=iloveyou `) th.WriteF(filepath.Join(root, "longsecret.txt"), ` Lorem ipsum dolor sit amet, -consectetur adipiscing elit, -sed do eiusmod tempor incididunt -ut labore et dolore magna aliqua. +consectetur adipiscing elit. `) } -// nolint:lll func TestSecretGenerator(t *testing.T) { tc := plugintest_test.NewPluginTestEnv(t).Set() defer tc.Reset() @@ -122,10 +119,10 @@ data: FRUIT: YXBwbGU= ROUTER_PASSWORD: YWRtaW4= VEGETABLE: Y2Fycm90 - longsecret.txt: CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LApjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsCnNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50CnV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLgo= + longsecret.txt: CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LApjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuCg== kind: Secret metadata: - name: -ktm999dkcc + name: mySecret-g4g4kh4f7t type: Opaque `) } diff --git a/plugin/builtin/SecretGenerator.go b/plugin/builtin/SecretGenerator.go index bf6028efa..96be2e77e 100644 --- a/plugin/builtin/SecretGenerator.go +++ b/plugin/builtin/SecretGenerator.go @@ -18,28 +18,16 @@ 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, k ifc.Kunstructured) (err error) { p.ldr = ldr p.rf = rf - var err error - // TODO: validate behavior values. - p.args.Behavior, err = k.GetFieldValue("behavior") + p.args.GeneratorArgs, err = resmap.GeneratorArgsFromKunstruct(k) if err != nil { - return err + return } - p.args.EnvSources, err = k.GetStringSlice("envFiles") - if err != nil { - return err - } - p.args.FileSources, err = k.GetStringSlice("valueFiles") - if err != nil { - return err - } - p.args.LiteralSources, err = k.GetStringSlice("literals") - if err != nil { - return err - } - return nil + // Ignore missing type - it defaults. + p.args.Type, _ = k.GetFieldValue("type") + return } func (p *plugin) Generate() (resmap.ResMap, error) { diff --git a/plugin/builtin/SecretGenerator_test.go b/plugin/builtin/SecretGenerator_test.go new file mode 100644 index 000000000..a229bc4b2 --- /dev/null +++ b/plugin/builtin/SecretGenerator_test.go @@ -0,0 +1,62 @@ +package builtin + +import ( + "testing" + + "sigs.k8s.io/kustomize/internal/plugintest" + "sigs.k8s.io/kustomize/k8sdeps/kv/plugin" + "sigs.k8s.io/kustomize/pkg/kusttest" + "sigs.k8s.io/kustomize/pkg/loader" +) + +func TestSecretGenerator(t *testing.T) { + tc := plugintest_test.NewPluginTestEnv(t).Set() + defer tc.Reset() + + tc.BuildGoPlugin( + "builtin", "", "SecretGenerator") + + th := kusttest_test.NewKustTestHarnessFull( + t, "/app", loader.RestrictionRootOnly, plugin.ActivePluginConfig()) + + th.WriteF("/app/a.env", ` +ROUTER_PASSWORD=admin +`) + th.WriteF("/app/b.env", ` +DB_PASSWORD=iloveyou +`) + th.WriteF("/app/longsecret.txt", ` +Lorem ipsum dolor sit amet, +consectetur adipiscing elit. +`) + + rm := th.LoadAndRunGenerator(` +apiVersion: builtin +kind: SecretGenerator +metadata: + name: mySecret +behavior: merge +envFiles: +- a.env +- b.env +valueFiles: +- obscure=longsecret.txt +literals: +- FRUIT=apple +- VEGETABLE=carrot +`) + + th.AssertActualEqualsExpected(rm, ` +apiVersion: v1 +data: + DB_PASSWORD: aWxvdmV5b3U= + FRUIT: YXBwbGU= + ROUTER_PASSWORD: YWRtaW4= + VEGETABLE: Y2Fycm90 + obscure: CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LApjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuCg== +kind: Secret +metadata: + name: mySecret +type: Opaque +`) +}