Setters with subpackages

This commit is contained in:
Phani Teja Marupaka
2020-08-27 21:22:43 -07:00
parent 0e9428c8b0
commit f432f4d75e
35 changed files with 795 additions and 210 deletions

View File

@@ -7,12 +7,13 @@ import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"sigs.k8s.io/kustomize/cmd/config/ext"
"sigs.k8s.io/kustomize/cmd/config/internal/commands"
"sigs.k8s.io/kustomize/kyaml/copyutil"
"sigs.k8s.io/kustomize/kyaml/openapi"
)
@@ -43,6 +44,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -81,6 +83,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -122,7 +125,7 @@ openAPI:
- marker: ${my-tag-setter}
ref: '#/definitions/io.k8s.cli.setters.my-tag-setter'
`,
err: "substitution with name my-image already exists, substitution and setter can't have same name",
err: `substitution with name "my-image" already exists, substitution and setter can't have same name`,
},
{
@@ -140,7 +143,7 @@ openAPI:
name: my-image
value: "nginx"
`,
err: "setter with name my-image already exists, if you want to modify it, please delete the existing setter and recreate it",
err: `setter with name "my-image" already exists, if you want to modify it, please delete the existing setter and recreate it`,
},
{
@@ -159,6 +162,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -200,6 +204,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter replicas in package ${baseDir}`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -254,6 +259,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "list" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -354,6 +360,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter replicas in package ${baseDir}`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -400,6 +407,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -437,6 +445,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "foo.bar" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -587,6 +596,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -712,6 +722,7 @@ spec:
apiVersion: v1alpha1
kind: Example
`,
out: `created setter "replicas" in package "${baseDir}"`,
expectedOpenAPI: `
apiVersion: v1alpha1
kind: Example
@@ -742,13 +753,14 @@ spec:
openapi.ResetOpenAPI()
defer openapi.ResetOpenAPI()
f, err := ioutil.TempFile("", "k8s-cli-")
baseDir, err := ioutil.TempDir("", "")
if !assert.NoError(t, err) {
t.FailNow()
}
defer os.Remove(f.Name())
defer os.RemoveAll(baseDir)
err = ioutil.WriteFile(f.Name(), []byte(test.inputOpenAPI), 0600)
f := filepath.Join(baseDir, "Krmfile")
err = ioutil.WriteFile(f, []byte(test.inputOpenAPI), 0600)
if !assert.NoError(t, err) {
t.FailNow()
}
@@ -768,13 +780,7 @@ spec:
test.args = append(test.args, "--schema-path", sch.Name())
}
old := ext.GetOpenAPIFile
defer func() { ext.GetOpenAPIFile = old }()
ext.GetOpenAPIFile = func(args []string) (s string, err error) {
return f.Name(), nil
}
r, err := ioutil.TempFile("", "k8s-cli-*.yaml")
r, err := ioutil.TempFile(baseDir, "k8s-cli-*.yaml")
if !assert.NoError(t, err) {
t.FailNow()
}
@@ -787,7 +793,7 @@ spec:
runner := commands.NewCreateSetterRunner("")
out := &bytes.Buffer{}
runner.Command.SetOut(out)
runner.Command.SetArgs(append([]string{r.Name()}, test.args...))
runner.Command.SetArgs(append([]string{baseDir}, test.args...))
err = runner.Command.Execute()
if test.err != "" {
if !assert.NotNil(t, err) {
@@ -801,7 +807,14 @@ spec:
t.FailNow()
}
if !assert.Equal(t, test.out, out.String()) {
expectedOut := strings.Replace(test.out, "${baseDir}", baseDir, -1)
expectedNormalized := strings.Replace(expectedOut, "\\", "/", -1)
// normalize path format for windows
actualNormalized := strings.Replace(
strings.Replace(out.String(), "\\", "/", -1),
"//", "/", -1)
if !assert.Equal(t, expectedNormalized, strings.TrimSpace(actualNormalized)) {
t.FailNow()
}
@@ -815,7 +828,7 @@ spec:
t.FailNow()
}
actualOpenAPI, err := ioutil.ReadFile(f.Name())
actualOpenAPI, err := ioutil.ReadFile(f)
if !assert.NoError(t, err) {
t.FailNow()
}
@@ -827,3 +840,80 @@ spec:
})
}
}
func TestCreateSetterSubPackages(t *testing.T) {
var tests = []struct {
name string
dataset string
packagePath string
args []string
expected string
}{
{
name: "create-setter-recurse-subpackages",
dataset: "dataset-without-setters",
args: []string{"namespace", "myspace", "-R"},
expected: `
created setter "namespace" in package "${baseDir}/mysql"
created setter "namespace" in package "${baseDir}/mysql/storage"
`,
},
{
name: "create-setter-top-level-pkg-no-recurse-subpackages",
dataset: "dataset-without-setters",
packagePath: "mysql",
args: []string{"namespace", "myspace"},
expected: `created setter "namespace" in package "${baseDir}/mysql"`,
},
{
name: "create-setter-nested-pkg-no-recurse-subpackages",
dataset: "dataset-without-setters",
packagePath: "mysql/storage",
args: []string{"namespace", "myspace"},
expected: `created setter "namespace" in package "${baseDir}/mysql/storage"`,
},
{
name: "create-setter-already-exists",
dataset: "dataset-with-setters",
packagePath: "mysql",
args: []string{"namespace", "myspace", "-R"},
expected: `setter with name "namespace" already exists, if you want to modify it, please delete the existing setter and recreate it in package "${baseDir}/mysql"
created setter "namespace" in package "${baseDir}/mysql/nosetters"
setter with name "namespace" already exists, if you want to modify it, please delete the existing setter and recreate it in package "${baseDir}/mysql/storage"`,
},
}
for i := range tests {
test := tests[i]
t.Run(test.name, func(t *testing.T) {
// reset the openAPI afterward
openapi.ResetOpenAPI()
defer openapi.ResetOpenAPI()
sourceDir := filepath.Join("test", "testdata", test.dataset)
baseDir, err := ioutil.TempDir("", "")
if !assert.NoError(t, err) {
t.FailNow()
}
copyutil.CopyDir(sourceDir, baseDir)
defer os.RemoveAll(baseDir)
runner := commands.NewCreateSetterRunner("")
actual := &bytes.Buffer{}
runner.Command.SetOut(actual)
runner.Command.SetArgs(append([]string{filepath.Join(baseDir, test.packagePath)}, test.args...))
err = runner.Command.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
// normalize path format for windows
actualNormalized := strings.Replace(
strings.Replace(actual.String(), "\\", "/", -1),
"//", "/", -1)
expected := strings.Replace(test.expected, "${baseDir}", baseDir, -1)
expectedNormalized := strings.Replace(expected, "\\", "/", -1)
if !assert.Equal(t, strings.TrimSpace(expectedNormalized), strings.TrimSpace(actualNormalized)) {
t.FailNow()
}
})
}
}