From d98af3f06a01e6df5aedba73aed7f6ea2b12d011 Mon Sep 17 00:00:00 2001 From: jregan Date: Sat, 30 Nov 2019 09:27:38 -0800 Subject: [PATCH] Add PrintPluginEnv plugin. --- .../target/errmissingkustomization.go | 48 ++++++++++ api/internal/target/kusttarget.go | 36 ------- api/internal/target/plugindir_test.go | 93 ------------------- api/krusty/pluginenv_test.go | 80 ++++++++++++++++ api/krusty/testingharness_test.go | 11 ++- api/testutils/kusttest/plugintestenv.go | 5 + .../v1/printpluginenv/PrintPluginEnv | 13 +++ .../PrintPluginEnv_test.go} | 10 +- .../{printworkdir => printpluginenv}/go.mod | 0 .../{printworkdir => printpluginenv}/go.sum | 0 .../v1/printworkdir/PrintWorkDir | 13 --- 11 files changed, 161 insertions(+), 148 deletions(-) create mode 100644 api/internal/target/errmissingkustomization.go delete mode 100644 api/internal/target/plugindir_test.go create mode 100644 api/krusty/pluginenv_test.go create mode 100755 plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv rename plugin/someteam.example.com/v1/{printworkdir/PrintWorkDir_test.go => printpluginenv/PrintPluginEnv_test.go} (71%) rename plugin/someteam.example.com/v1/{printworkdir => printpluginenv}/go.mod (100%) rename plugin/someteam.example.com/v1/{printworkdir => printpluginenv}/go.sum (100%) delete mode 100755 plugin/someteam.example.com/v1/printworkdir/PrintWorkDir diff --git a/api/internal/target/errmissingkustomization.go b/api/internal/target/errmissingkustomization.go new file mode 100644 index 000000000..45e489593 --- /dev/null +++ b/api/internal/target/errmissingkustomization.go @@ -0,0 +1,48 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/konfig" +) + +type errMissingKustomization struct { + path string +} + +func (e *errMissingKustomization) Error() string { + return fmt.Sprintf( + "unable to find one of %v in directory '%s'", + commaOr(quoted(konfig.RecognizedKustomizationFileNames())), + e.path) +} + +func IsMissingKustomizationFileError(err error) bool { + _, ok := err.(*errMissingKustomization) + if ok { + return true + } + _, ok = errors.Cause(err).(*errMissingKustomization) + return ok +} + +func NewErrMissingKustomization(p string) *errMissingKustomization { + return &errMissingKustomization{path: p} +} + +func quoted(l []string) []string { + r := make([]string, len(l)) + for i, v := range l { + r[i] = "'" + v + "'" + } + return r +} + +func commaOr(q []string) string { + return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1] +} diff --git a/api/internal/target/kusttarget.go b/api/internal/target/kusttarget.go index 2ee0d03cf..cb7db9f1c 100644 --- a/api/internal/target/kusttarget.go +++ b/api/internal/target/kusttarget.go @@ -70,18 +70,6 @@ func NewKustTarget( }, nil } -func quoted(l []string) []string { - r := make([]string, len(l)) - for i, v := range l { - r[i] = "'" + v + "'" - } - return r -} - -func commaOr(q []string) string { - return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1] -} - func loadKustFile(ldr ifc.Loader) ([]byte, error) { var content []byte match := 0 @@ -103,30 +91,6 @@ func loadKustFile(ldr ifc.Loader) ([]byte, error) { } } -type errMissingKustomization struct { - path string -} - -func (e *errMissingKustomization) Error() string { - return fmt.Sprintf( - "unable to find one of %v in directory '%s'", - commaOr(quoted(konfig.RecognizedKustomizationFileNames())), - e.path) -} - -func NewErrMissingKustomization(p string) *errMissingKustomization { - return &errMissingKustomization{path: p} -} - -func IsMissingKustomizationFileError(err error) bool { - _, ok := err.(*errMissingKustomization) - if ok { - return true - } - _, ok = errors.Cause(err).(*errMissingKustomization) - return ok -} - func unmarshal(y []byte, o interface{}) error { j, err := yaml.YAMLToJSON(y) if err != nil { diff --git a/api/internal/target/plugindir_test.go b/api/internal/target/plugindir_test.go deleted file mode 100644 index 463f9fd24..000000000 --- a/api/internal/target/plugindir_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package target_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - "sigs.k8s.io/kustomize/api/filesys" - "sigs.k8s.io/kustomize/api/internal/k8sdeps/transformer" - pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader" - . "sigs.k8s.io/kustomize/api/internal/target" - "sigs.k8s.io/kustomize/api/k8sdeps/kunstruct" - "sigs.k8s.io/kustomize/api/konfig" - fLdr "sigs.k8s.io/kustomize/api/loader" - "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/resource" - kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" - valtest_test "sigs.k8s.io/kustomize/api/testutils/valtest" -) - -func TestPluginDir(t *testing.T) { - tc := kusttest_test.NewPluginTestEnv(t).Set() - defer tc.Reset() - - tc.PrepExecPlugin( - "someteam.example.com", "v1", "PrintWorkDir") - - base, err := os.Getwd() - if err != nil { - t.Fatalf("err %v", err) - } - dir, err := ioutil.TempDir(base, "kustomize-") - if err != nil { - t.Fatalf("err %v", err) - } - defer os.RemoveAll(dir) - - fSys := filesys.MakeFsOnDisk() - err = fSys.WriteFile(filepath.Join(dir, "kustomization.yaml"), []byte(` -generators: -- config.yaml -`)) - if err != nil { - t.Fatalf("err %v", err) - } - err = fSys.WriteFile(filepath.Join(dir, "config.yaml"), []byte(` -apiVersion: someteam.example.com/v1 -kind: PrintWorkDir -metadata: - name: some-random-name -`)) - if err != nil { - t.Fatalf("err %v", err) - } - - ldr, err := fLdr.NewLoader( - fLdr.RestrictionRootOnly, dir, fSys) - if err != nil { - t.Fatalf("Err: %v", err) - } - rf := resmap.NewFactory(resource.NewFactory( - kunstruct.NewKunstructuredFactoryImpl()), nil) - - c, err := konfig.EnabledPluginConfig() - if err != nil { - t.Fatal(err) - } - pl := pLdr.NewLoader(c, rf) - tg, err := NewKustTarget( - ldr, valtest_test.MakeFakeValidator(), rf, transformer.NewFactoryImpl(), pl) - if err != nil { - t.Fatalf("err %v", err) - } - - m, err := tg.MakeCustomizedResMap() - if err != nil { - t.Fatalf("Err: %v", err) - } - - th := kusttest_test.NewKustTestHarness(t, filesys.SelfDir) - th.AssertActualEqualsExpected(m, ` -apiVersion: v1 -kind: WorkDir -metadata: - name: `+dir+` -spec: - path: `+dir+` -`) -} diff --git a/api/krusty/pluginenv_test.go b/api/krusty/pluginenv_test.go new file mode 100644 index 000000000..6dbdd3f6b --- /dev/null +++ b/api/krusty/pluginenv_test.go @@ -0,0 +1,80 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package krusty_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/konfig" + kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" +) + +// The PrintPluginEnv plugin is a toy plugin that emits +// its working directory and some environment variables, +// to add regression protection to plugin loading logic. +func TestPluginEnvironment(t *testing.T) { + tc := kusttest_test.NewPluginTestEnv(t).Set() + defer tc.Reset() + + tc.PrepExecPlugin( + "someteam.example.com", "v1", "PrintPluginEnv") + + confirmBehavior( + makeTestHarnessWithFs(t, filesys.MakeFsInMemory()), + filesys.Separator) + + dir := makeTmpDir(t) + defer os.RemoveAll(dir) + confirmBehavior( + makeTestHarnessWithFs(t, filesys.MakeFsOnDisk()), + dir) +} + +func confirmBehavior(th testingHarness, dir string) { + th.WriteK(dir, ` +generators: +- config.yaml +`) + th.WriteF(filepath.Join(dir, "config.yaml"), ` +apiVersion: someteam.example.com/v1 +kind: PrintPluginEnv +metadata: + name: irrelevantHere +`) + m := th.Run(dir, th.MakeOptionsPluginsEnabled()) + + pHome, ok := os.LookupEnv(konfig.KustomizePluginHomeEnv) + if !ok { + th.GetT().Fatalf( + "expected env var '%s' to be defined", + konfig.KustomizePluginHomeEnv) + } + + th.AssertActualEqualsExpected(m, ` +apiVersion: v1 +env: + kustomize_plugin_config_root: `+dir+` + kustomize_plugin_home: `+pHome+` + pwd: `+dir+` +kind: GeneratedEnv +metadata: + name: hello +`) +} + +func makeTmpDir(t *testing.T) string { + base, err := os.Getwd() + if err != nil { + t.Fatalf("err %v", err) + } + dir, err := ioutil.TempDir(base, "kustomize-tmp-test-") + if err != nil { + t.Fatalf("err %v", err) + } + return dir +} diff --git a/api/krusty/testingharness_test.go b/api/krusty/testingharness_test.go index 7cf3d403c..2f7431abf 100644 --- a/api/krusty/testingharness_test.go +++ b/api/krusty/testingharness_test.go @@ -23,12 +23,21 @@ type testingHarness struct { } func makeTestHarness(t *testing.T) testingHarness { + return makeTestHarnessWithFs(t, filesys.MakeFsInMemory()) +} + +func makeTestHarnessWithFs( + t *testing.T, fSys filesys.FileSystem) testingHarness { return testingHarness{ t: t, - fSys: filesys.MakeFsInMemory(), + fSys: fSys, } } +func (th testingHarness) GetT() *testing.T { + return th.t +} + func (th testingHarness) WriteK(path string, content string) { th.fSys.WriteFile( filepath.Join( diff --git a/api/testutils/kusttest/plugintestenv.go b/api/testutils/kusttest/plugintestenv.go index 9d8a9b1ac..1bb41c963 100644 --- a/api/testutils/kusttest/plugintestenv.go +++ b/api/testutils/kusttest/plugintestenv.go @@ -53,6 +53,11 @@ func (x *PluginTestEnv) Reset() { x.removeWorkDir() } +// WorkDir allows inspection of the temp working directory. +func (x *PluginTestEnv) WorkDir() string { + return x.workDir +} + // BuildGoPlugin compiles a Go plugin, leaving the newly // created object code in the right place - a temporary // working directory pointed to by KustomizePluginHomeEnv. diff --git a/plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv b/plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv new file mode 100755 index 000000000..154b845db --- /dev/null +++ b/plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +echo " +kind: GeneratedEnv +apiVersion: v1 +metadata: + name: hello +env: + pwd: $PWD + kustomize_plugin_home: $KUSTOMIZE_PLUGIN_HOME + kustomize_plugin_config_root: $KUSTOMIZE_PLUGIN_CONFIG_ROOT +" diff --git a/plugin/someteam.example.com/v1/printworkdir/PrintWorkDir_test.go b/plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv_test.go similarity index 71% rename from plugin/someteam.example.com/v1/printworkdir/PrintWorkDir_test.go rename to plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv_test.go index 353915969..c01e3d7e5 100644 --- a/plugin/someteam.example.com/v1/printworkdir/PrintWorkDir_test.go +++ b/plugin/someteam.example.com/v1/printpluginenv/PrintPluginEnv_test.go @@ -16,18 +16,18 @@ func shouldContain(t *testing.T, s []byte, x string) { } } -func TestPrintWorkDirPlugin(t *testing.T) { +func TestPrintPluginEnvPlugin(t *testing.T) { tc := kusttest_test.NewPluginTestEnv(t).Set() defer tc.Reset() tc.PrepExecPlugin( - "someteam.example.com", "v1", "PrintWorkDir") + "someteam.example.com", "v1", "PrintPluginEnv") th := kusttest_test.NewKustTestHarnessAllowPlugins(t, "/theAppRoot") m := th.LoadAndRunGenerator(` apiVersion: someteam.example.com/v1 -kind: PrintWorkDir +kind: PrintPluginEnv metadata: name: whatever `) @@ -35,6 +35,6 @@ metadata: if err != nil { t.Error(err) } - shouldContain(t, a, "path: /theAppRoot") - shouldContain(t, a, "plugin/someteam.example.com/v1/printworkdir") + shouldContain(t, a, "kustomize_plugin_config_root: /theAppRoot") + shouldContain(t, a, "plugin/someteam.example.com/v1/printpluginenv") } diff --git a/plugin/someteam.example.com/v1/printworkdir/go.mod b/plugin/someteam.example.com/v1/printpluginenv/go.mod similarity index 100% rename from plugin/someteam.example.com/v1/printworkdir/go.mod rename to plugin/someteam.example.com/v1/printpluginenv/go.mod diff --git a/plugin/someteam.example.com/v1/printworkdir/go.sum b/plugin/someteam.example.com/v1/printpluginenv/go.sum similarity index 100% rename from plugin/someteam.example.com/v1/printworkdir/go.sum rename to plugin/someteam.example.com/v1/printpluginenv/go.sum diff --git a/plugin/someteam.example.com/v1/printworkdir/PrintWorkDir b/plugin/someteam.example.com/v1/printworkdir/PrintWorkDir deleted file mode 100755 index f196d6ca2..000000000 --- a/plugin/someteam.example.com/v1/printworkdir/PrintWorkDir +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -e - -dir=`pwd` - -echo " -kind: WorkDir -apiVersion: v1 -metadata: - name: $dir -spec: - path: ${KUSTOMIZE_PLUGIN_CONFIG_ROOT} -"