mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-11 17:12:51 +00:00
252 lines
5.7 KiB
Go
252 lines
5.7 KiB
Go
// Copyright 2019 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package runfn
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"sigs.k8s.io/kustomize/kyaml/copyutil"
|
|
"sigs.k8s.io/kustomize/kyaml/kio"
|
|
"sigs.k8s.io/kustomize/kyaml/kio/filters"
|
|
"sigs.k8s.io/kustomize/kyaml/yaml"
|
|
)
|
|
|
|
func TestRunFns_Execute(t *testing.T) {
|
|
instance := RunFns{}
|
|
instance.init()
|
|
api, err := yaml.Parse(`apiVersion: apps/v1
|
|
kind:
|
|
`)
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
filter := instance.containerFilterProvider("example.com:version", "", api)
|
|
defaultMount:= filters.StorageMount{}
|
|
mounts := []filters.StorageMount{}
|
|
mounts = append(mounts, defaultMount)
|
|
assert.Equal(t, &filters.ContainerFilter{Image: "example.com:version", Config: api, StorageMounts: mounts}, filter)
|
|
}
|
|
|
|
func TestCmd_Execute(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "kustomize-kyaml-test")
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
_, filename, _, ok := runtime.Caller(0)
|
|
if !assert.True(t, ok) {
|
|
t.FailNow()
|
|
}
|
|
ds, err := filepath.Abs(filepath.Join(filepath.Dir(filename), "test", "testdata"))
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, copyutil.CopyDir(ds, dir)) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, os.Chdir(filepath.Dir(dir))) {
|
|
return
|
|
}
|
|
|
|
// write a test filter
|
|
f := `apiVersion: v1
|
|
kind: ValueReplacer
|
|
metadata:
|
|
configFn:
|
|
container:
|
|
image: gcr.io/example.com/image:version
|
|
stringMatch: Deployment
|
|
replace: StatefulSet
|
|
`
|
|
if !assert.NoError(t, ioutil.WriteFile(
|
|
filepath.Join(dir, "filter.yaml"), []byte(f), 0600)) {
|
|
return
|
|
}
|
|
|
|
instance := RunFns{
|
|
Path: dir,
|
|
containerFilterProvider: func(s, _ string, node *yaml.RNode) kio.Filter {
|
|
// parse the filter from the input
|
|
filter := yaml.YFilter{}
|
|
b := &bytes.Buffer{}
|
|
e := yaml.NewEncoder(b)
|
|
if !assert.NoError(t, e.Encode(node.YNode())) {
|
|
t.FailNow()
|
|
}
|
|
e.Close()
|
|
d := yaml.NewDecoder(b)
|
|
if !assert.NoError(t, d.Decode(&filter)) {
|
|
t.FailNow()
|
|
}
|
|
|
|
return filters.Modifier{
|
|
Filters: []yaml.YFilter{{Filter: yaml.Lookup("kind")}, filter},
|
|
}
|
|
},
|
|
}
|
|
if !assert.NoError(t, instance.Execute()) {
|
|
t.FailNow()
|
|
}
|
|
b, err := ioutil.ReadFile(
|
|
filepath.Join(dir, "java", "java-deployment.resource.yaml"))
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
assert.Contains(t, string(b), "kind: StatefulSet")
|
|
}
|
|
|
|
func TestCmd_Execute_APIs(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "kustomize-kyaml-test")
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
_, filename, _, ok := runtime.Caller(0)
|
|
if !assert.True(t, ok) {
|
|
t.FailNow()
|
|
}
|
|
ds, err := filepath.Abs(filepath.Join(filepath.Dir(filename), "test", "testdata"))
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, copyutil.CopyDir(ds, dir)) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, os.Chdir(filepath.Dir(dir))) {
|
|
return
|
|
}
|
|
|
|
// write a test filter
|
|
f := `apiVersion: v1
|
|
kind: ValueReplacer
|
|
metadata:
|
|
configFn:
|
|
container:
|
|
image: gcr.io/example.com/image:version
|
|
stringMatch: Deployment
|
|
replace: StatefulSet
|
|
`
|
|
tmpF, err := ioutil.TempFile("", "filter*.yaml")
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
os.RemoveAll(tmpF.Name())
|
|
if !assert.NoError(t, ioutil.WriteFile(tmpF.Name(), []byte(f), 0600)) {
|
|
return
|
|
}
|
|
|
|
instance := RunFns{
|
|
FunctionPaths: []string{tmpF.Name()},
|
|
Path: dir,
|
|
containerFilterProvider: func(s, _ string, node *yaml.RNode) kio.Filter {
|
|
// parse the filter from the input
|
|
filter := yaml.YFilter{}
|
|
b := &bytes.Buffer{}
|
|
e := yaml.NewEncoder(b)
|
|
if !assert.NoError(t, e.Encode(node.YNode())) {
|
|
t.FailNow()
|
|
}
|
|
e.Close()
|
|
d := yaml.NewDecoder(b)
|
|
if !assert.NoError(t, d.Decode(&filter)) {
|
|
t.FailNow()
|
|
}
|
|
|
|
return filters.Modifier{
|
|
Filters: []yaml.YFilter{{Filter: yaml.Lookup("kind")}, filter},
|
|
}
|
|
},
|
|
}
|
|
err = instance.Execute()
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
b, err := ioutil.ReadFile(
|
|
filepath.Join(dir, "java", "java-deployment.resource.yaml"))
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
assert.Contains(t, string(b), "kind: StatefulSet")
|
|
}
|
|
|
|
func TestCmd_Execute_Stdout(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "kustomize-kyaml-test")
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
_, filename, _, ok := runtime.Caller(0)
|
|
if !assert.True(t, ok) {
|
|
t.FailNow()
|
|
}
|
|
ds, err := filepath.Abs(filepath.Join(filepath.Dir(filename), "test", "testdata"))
|
|
if !assert.NoError(t, err) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, copyutil.CopyDir(ds, dir)) {
|
|
t.FailNow()
|
|
}
|
|
if !assert.NoError(t, os.Chdir(filepath.Dir(dir))) {
|
|
return
|
|
}
|
|
|
|
// write a test filter
|
|
f := `apiVersion: v1
|
|
kind: ValueReplacer
|
|
metadata:
|
|
configFn:
|
|
container:
|
|
image: gcr.io/example.com/image:version
|
|
stringMatch: Deployment
|
|
replace: StatefulSet
|
|
`
|
|
if !assert.NoError(t, ioutil.WriteFile(
|
|
filepath.Join(dir, "filter.yaml"), []byte(f), 0600)) {
|
|
return
|
|
}
|
|
|
|
out := &bytes.Buffer{}
|
|
instance := RunFns{
|
|
Output: out,
|
|
Path: dir,
|
|
containerFilterProvider: func(s, _ string, node *yaml.RNode) kio.Filter {
|
|
// parse the filter from the input
|
|
filter := yaml.YFilter{}
|
|
b := &bytes.Buffer{}
|
|
e := yaml.NewEncoder(b)
|
|
if !assert.NoError(t, e.Encode(node.YNode())) {
|
|
t.FailNow()
|
|
}
|
|
e.Close()
|
|
d := yaml.NewDecoder(b)
|
|
if !assert.NoError(t, d.Decode(&filter)) {
|
|
t.FailNow()
|
|
}
|
|
|
|
return filters.Modifier{
|
|
Filters: []yaml.YFilter{{Filter: yaml.Lookup("kind")}, filter},
|
|
}
|
|
},
|
|
}
|
|
if !assert.NoError(t, instance.Execute()) {
|
|
return
|
|
}
|
|
b, err := ioutil.ReadFile(
|
|
filepath.Join(dir, "java", "java-deployment.resource.yaml"))
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
assert.NotContains(t, string(b), "kind: StatefulSet")
|
|
assert.Contains(t, out.String(), "kind: StatefulSet")
|
|
}
|