mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-07-17 17:52:12 +00:00
Merge pull request #4654 from aabouzaid/fix-krm-exec-function
fix: krm exec function working dir
This commit is contained in:
@@ -42,16 +42,24 @@ func NewLoader(
|
|||||||
return &Loader{pc: pc, rf: rf, fs: fs}
|
return &Loader{pc: pc, rf: rf, fs: fs}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoaderWithWorkingDir returns loader after setting its working directory.
|
||||||
|
// NOTE: This is not really a new loader since some of the Loader struct fields are pointers.
|
||||||
|
func (l *Loader) LoaderWithWorkingDir(wd string) *Loader {
|
||||||
|
lpc := &types.PluginConfig{
|
||||||
|
PluginRestrictions: l.pc.PluginRestrictions,
|
||||||
|
BpLoadingOptions: l.pc.BpLoadingOptions,
|
||||||
|
FnpLoadingOptions: l.pc.FnpLoadingOptions,
|
||||||
|
HelmConfig: l.pc.HelmConfig,
|
||||||
|
}
|
||||||
|
lpc.FnpLoadingOptions.WorkingDir = wd
|
||||||
|
return &Loader{pc: lpc, rf: l.rf, fs: l.fs}
|
||||||
|
}
|
||||||
|
|
||||||
// Config provides the global (not plugin specific) PluginConfig data.
|
// Config provides the global (not plugin specific) PluginConfig data.
|
||||||
func (l *Loader) Config() *types.PluginConfig {
|
func (l *Loader) Config() *types.PluginConfig {
|
||||||
return l.pc
|
return l.pc
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWorkDir sets the working directory for this loader's plugins
|
|
||||||
func (l *Loader) SetWorkDir(wd string) {
|
|
||||||
l.pc.FnpLoadingOptions.WorkingDir = wd
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Loader) LoadGenerators(
|
func (l *Loader) LoadGenerators(
|
||||||
ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) (
|
ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) (
|
||||||
result []*resmap.GeneratorWithProperties, err error) {
|
result []*resmap.GeneratorWithProperties, err error) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ package loader_test
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
. "sigs.k8s.io/kustomize/api/internal/plugins/loader"
|
. "sigs.k8s.io/kustomize/api/internal/plugins/loader"
|
||||||
"sigs.k8s.io/kustomize/api/loader"
|
"sigs.k8s.io/kustomize/api/loader"
|
||||||
"sigs.k8s.io/kustomize/api/provider"
|
"sigs.k8s.io/kustomize/api/provider"
|
||||||
@@ -78,3 +79,20 @@ func TestLoader(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoaderWithWorkingDir(t *testing.T) {
|
||||||
|
p := provider.NewDefaultDepProvider()
|
||||||
|
rmF := resmap.NewFactory(p.GetResourceFactory())
|
||||||
|
fsys := filesys.MakeFsInMemory()
|
||||||
|
c := types.EnabledPluginConfig(types.BploLoadFromFileSys)
|
||||||
|
pLdr := NewLoader(c, rmF, fsys)
|
||||||
|
npLdr := pLdr.LoaderWithWorkingDir("/tmp/dummy")
|
||||||
|
require.Equal(t,
|
||||||
|
"",
|
||||||
|
pLdr.Config().FnpLoadingOptions.WorkingDir,
|
||||||
|
"the plugin working dir should not change")
|
||||||
|
require.Equal(t,
|
||||||
|
"/tmp/dummy",
|
||||||
|
npLdr.Config().FnpLoadingOptions.WorkingDir,
|
||||||
|
"the plugin working dir is not updated")
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,13 +44,11 @@ func NewKustTarget(
|
|||||||
validator ifc.Validator,
|
validator ifc.Validator,
|
||||||
rFactory *resmap.Factory,
|
rFactory *resmap.Factory,
|
||||||
pLdr *loader.Loader) *KustTarget {
|
pLdr *loader.Loader) *KustTarget {
|
||||||
pLdrCopy := *pLdr
|
|
||||||
pLdrCopy.SetWorkDir(ldr.Root())
|
|
||||||
return &KustTarget{
|
return &KustTarget{
|
||||||
ldr: ldr,
|
ldr: ldr,
|
||||||
validator: validator,
|
validator: validator,
|
||||||
rFactory: rFactory,
|
rFactory: rFactory,
|
||||||
pLdr: &pLdrCopy,
|
pLdr: pLdr.LoaderWithWorkingDir(ldr.Root()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,19 @@ spec:
|
|||||||
EOF
|
EOF
|
||||||
`
|
`
|
||||||
|
|
||||||
func TestFnExecGenerator(t *testing.T) {
|
const krmTransformerDotSh = `#!/bin/bash
|
||||||
|
cat << EOF
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummyTransformed
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
type: Opaque
|
||||||
|
EOF
|
||||||
|
`
|
||||||
|
|
||||||
|
func TestFnExecGeneratorInBase(t *testing.T) {
|
||||||
fSys := filesys.MakeFsOnDisk()
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
@@ -87,7 +99,6 @@ spec:
|
|||||||
`)
|
`)
|
||||||
|
|
||||||
m := th.Run(tmpDir.String(), o)
|
m := th.Run(tmpDir.String(), o)
|
||||||
assert.NoError(t, err)
|
|
||||||
yml, err := m.AsYaml()
|
yml, err := m.AsYaml()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, `apiVersion: v1
|
assert.Equal(t, `apiVersion: v1
|
||||||
@@ -126,7 +137,7 @@ spec:
|
|||||||
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFnExecGeneratorWithOverlay(t *testing.T) {
|
func TestFnExecGeneratorInBaseWithOverlay(t *testing.T) {
|
||||||
fSys := filesys.MakeFsOnDisk()
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
@@ -217,6 +228,274 @@ spec:
|
|||||||
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFnExecGeneratorInOverlay(t *testing.T) {
|
||||||
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
|
o := th.MakeOptionsPluginsEnabled()
|
||||||
|
o.PluginConfig.FnpLoadingOptions.EnableExec = true
|
||||||
|
|
||||||
|
tmpDir, err := filesys.NewTmpConfirmedDir()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
base := filepath.Join(tmpDir.String(), "base")
|
||||||
|
prod := filepath.Join(tmpDir.String(), "prod")
|
||||||
|
assert.NoError(t, fSys.Mkdir(base))
|
||||||
|
assert.NoError(t, fSys.Mkdir(prod))
|
||||||
|
th.WriteK(base, `
|
||||||
|
resources:
|
||||||
|
- short_secret.yaml
|
||||||
|
`)
|
||||||
|
th.WriteK(prod, `
|
||||||
|
resources:
|
||||||
|
- ../base
|
||||||
|
generators:
|
||||||
|
- gener.yaml
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "short_secret.yaml"),
|
||||||
|
`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
airshipit.org/ephemeral-user-data: "true"
|
||||||
|
name: node1-bmc-secret
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
userData: |
|
||||||
|
bootcmd:
|
||||||
|
- mkdir /mnt/vda
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(prod, "generateDeployment.sh"), generateDeploymentDotSh)
|
||||||
|
|
||||||
|
assert.NoError(t, os.Chmod(filepath.Join(prod, "generateDeployment.sh"), 0777))
|
||||||
|
th.WriteF(filepath.Join(prod, "gener.yaml"), `
|
||||||
|
kind: executable
|
||||||
|
metadata:
|
||||||
|
name: demo
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/function: |
|
||||||
|
exec:
|
||||||
|
path: ./generateDeployment.sh
|
||||||
|
spec:
|
||||||
|
`)
|
||||||
|
|
||||||
|
m := th.Run(prod, o)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
yml, err := m.AsYaml()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, `apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
airshipit.org/ephemeral-user-data: "true"
|
||||||
|
name: node1-bmc-secret
|
||||||
|
stringData:
|
||||||
|
userData: |
|
||||||
|
bootcmd:
|
||||||
|
- mkdir /mnt/vda
|
||||||
|
type: Opaque
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
tshirt-size: small
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
`, string(yml))
|
||||||
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFnExecTransformerInBase(t *testing.T) {
|
||||||
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
|
o := th.MakeOptionsPluginsEnabled()
|
||||||
|
o.PluginConfig.FnpLoadingOptions.EnableExec = true
|
||||||
|
|
||||||
|
tmpDir, err := filesys.NewTmpConfirmedDir()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
base := filepath.Join(tmpDir.String(), "base")
|
||||||
|
assert.NoError(t, fSys.Mkdir(base))
|
||||||
|
th.WriteK(base, `
|
||||||
|
resources:
|
||||||
|
- secret.yaml
|
||||||
|
transformers:
|
||||||
|
- krm-transformer.yaml
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "secret.yaml"),
|
||||||
|
`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummy
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "krmTransformer.sh"), krmTransformerDotSh)
|
||||||
|
|
||||||
|
assert.NoError(t, os.Chmod(filepath.Join(base, "krmTransformer.sh"), 0777))
|
||||||
|
th.WriteF(filepath.Join(base, "krm-transformer.yaml"), `
|
||||||
|
apiVersion: examples.config.kubernetes.io/v1beta1
|
||||||
|
kind: MyPlugin
|
||||||
|
metadata:
|
||||||
|
name: notImportantHere
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/function: |
|
||||||
|
exec:
|
||||||
|
path: ./krmTransformer.sh
|
||||||
|
`)
|
||||||
|
|
||||||
|
m := th.Run(base, o)
|
||||||
|
yml, err := m.AsYaml()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, `apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummyTransformed
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
type: Opaque
|
||||||
|
`, string(yml))
|
||||||
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFnExecTransformerInBaseWithOverlay(t *testing.T) {
|
||||||
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
|
o := th.MakeOptionsPluginsEnabled()
|
||||||
|
o.PluginConfig.FnpLoadingOptions.EnableExec = true
|
||||||
|
|
||||||
|
tmpDir, err := filesys.NewTmpConfirmedDir()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
base := filepath.Join(tmpDir.String(), "base")
|
||||||
|
prod := filepath.Join(tmpDir.String(), "prod")
|
||||||
|
assert.NoError(t, fSys.Mkdir(base))
|
||||||
|
assert.NoError(t, fSys.Mkdir(prod))
|
||||||
|
th.WriteK(base, `
|
||||||
|
resources:
|
||||||
|
- secret.yaml
|
||||||
|
transformers:
|
||||||
|
- krm-transformer.yaml
|
||||||
|
`)
|
||||||
|
th.WriteK(prod, `
|
||||||
|
resources:
|
||||||
|
- ../base
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "secret.yaml"),
|
||||||
|
`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummy
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "krmTransformer.sh"), krmTransformerDotSh)
|
||||||
|
|
||||||
|
assert.NoError(t, os.Chmod(filepath.Join(base, "krmTransformer.sh"), 0777))
|
||||||
|
th.WriteF(filepath.Join(base, "krm-transformer.yaml"), `
|
||||||
|
apiVersion: examples.config.kubernetes.io/v1beta1
|
||||||
|
kind: MyPlugin
|
||||||
|
metadata:
|
||||||
|
name: notImportantHere
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/function: |
|
||||||
|
exec:
|
||||||
|
path: ./krmTransformer.sh
|
||||||
|
`)
|
||||||
|
|
||||||
|
m := th.Run(prod, o)
|
||||||
|
yml, err := m.AsYaml()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, `apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummyTransformed
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
type: Opaque
|
||||||
|
`, string(yml))
|
||||||
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFnExecTransformerInOverlay(t *testing.T) {
|
||||||
|
fSys := filesys.MakeFsOnDisk()
|
||||||
|
|
||||||
|
th := kusttest_test.MakeHarnessWithFs(t, fSys)
|
||||||
|
o := th.MakeOptionsPluginsEnabled()
|
||||||
|
o.PluginConfig.FnpLoadingOptions.EnableExec = true
|
||||||
|
|
||||||
|
tmpDir, err := filesys.NewTmpConfirmedDir()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
base := filepath.Join(tmpDir.String(), "base")
|
||||||
|
prod := filepath.Join(tmpDir.String(), "prod")
|
||||||
|
assert.NoError(t, fSys.Mkdir(base))
|
||||||
|
assert.NoError(t, fSys.Mkdir(prod))
|
||||||
|
th.WriteK(base, `
|
||||||
|
resources:
|
||||||
|
- secret.yaml
|
||||||
|
`)
|
||||||
|
th.WriteK(prod, `
|
||||||
|
resources:
|
||||||
|
- ../base
|
||||||
|
transformers:
|
||||||
|
- krm-transformer.yaml
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(base, "secret.yaml"),
|
||||||
|
`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummy
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
`)
|
||||||
|
th.WriteF(filepath.Join(prod, "krmTransformer.sh"), krmTransformerDotSh)
|
||||||
|
|
||||||
|
assert.NoError(t, os.Chmod(filepath.Join(prod, "krmTransformer.sh"), 0777))
|
||||||
|
th.WriteF(filepath.Join(prod, "krm-transformer.yaml"), `
|
||||||
|
apiVersion: examples.config.kubernetes.io/v1beta1
|
||||||
|
kind: MyPlugin
|
||||||
|
metadata:
|
||||||
|
name: notImportantHere
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/function: |
|
||||||
|
exec:
|
||||||
|
path: ./krmTransformer.sh
|
||||||
|
`)
|
||||||
|
|
||||||
|
m := th.Run(prod, o)
|
||||||
|
yml, err := m.AsYaml()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, `apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: dummyTransformed
|
||||||
|
stringData:
|
||||||
|
foo: bar
|
||||||
|
type: Opaque
|
||||||
|
`, string(yml))
|
||||||
|
assert.NoError(t, fSys.RemoveAll(tmpDir.String()))
|
||||||
|
}
|
||||||
|
|
||||||
func skipIfNoDocker(t *testing.T) {
|
func skipIfNoDocker(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
if _, err := exec.LookPath("docker"); err != nil {
|
if _, err := exec.LookPath("docker"); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user