mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-07-17 17:52:12 +00:00
Merge pull request #2546 from phanimarupaka/FnSourceJson
Include json files for fn source and sink
This commit is contained in:
@@ -30,6 +30,7 @@ func TestRunE2e(t *testing.T) {
|
|||||||
expectedErr string
|
expectedErr string
|
||||||
skipIfFalseEnv string
|
skipIfFalseEnv string
|
||||||
}{
|
}{
|
||||||
|
|
||||||
{
|
{
|
||||||
name: "exec_function_no_args",
|
name: "exec_function_no_args",
|
||||||
args: func(d string) []string {
|
args: func(d string) []string {
|
||||||
@@ -63,6 +64,36 @@ metadata:
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "exec_function_no_args_json",
|
||||||
|
args: func(d string) []string {
|
||||||
|
return []string{
|
||||||
|
"--enable-exec", "--exec-path", filepath.Join(d, "e2econtainerconfig"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
files: func(d string) map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
"deployment.json": `
|
||||||
|
{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"name": "foo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
expectedFiles: func(d string) map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
"deployment.json": `
|
||||||
|
{"apiVersion": "apps/v1", "kind": "Deployment", "metadata": {"name": "foo", annotations: {
|
||||||
|
a-string-value: '', a-int-value: '0', a-bool-value: 'false'}}}
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
name: "exec_function_args",
|
name: "exec_function_args",
|
||||||
args: func(d string) []string {
|
args: func(d string) []string {
|
||||||
@@ -468,7 +499,6 @@ def run(r, fc):
|
|||||||
resource["metadata"]["annotations"]["a-string-value"] = fc["data"]["stringValue"]
|
resource["metadata"]["annotations"]["a-string-value"] = fc["data"]["stringValue"]
|
||||||
resource["metadata"]["annotations"]["a-int-value"] = fc["data"]["intValue"]
|
resource["metadata"]["annotations"]["a-int-value"] = fc["data"]["intValue"]
|
||||||
resource["metadata"]["annotations"]["a-bool-value"] = fc["data"]["boolValue"]
|
resource["metadata"]["annotations"]["a-bool-value"] = fc["data"]["boolValue"]
|
||||||
|
|
||||||
run(ctx.resource_list["items"], ctx.resource_list["functionConfig"])
|
run(ctx.resource_list["items"], ctx.resource_list["functionConfig"])
|
||||||
`,
|
`,
|
||||||
"config.yaml": `
|
"config.yaml": `
|
||||||
@@ -545,7 +575,6 @@ def run(r, fc):
|
|||||||
resource["metadata"]["annotations"]["a-string-value"] = fc["data"]["stringValue"]
|
resource["metadata"]["annotations"]["a-string-value"] = fc["data"]["stringValue"]
|
||||||
resource["metadata"]["annotations"]["a-int-value"] = fc["data"]["intValue"]
|
resource["metadata"]["annotations"]["a-int-value"] = fc["data"]["intValue"]
|
||||||
resource["metadata"]["annotations"]["a-bool-value"] = fc["data"]["boolValue"]
|
resource["metadata"]["annotations"]["a-bool-value"] = fc["data"]["boolValue"]
|
||||||
|
|
||||||
run(ctx.resource_list["items"], ctx.resource_list["functionConfig"])
|
run(ctx.resource_list["items"], ctx.resource_list["functionConfig"])
|
||||||
`,
|
`,
|
||||||
"deployment.yaml": `
|
"deployment.yaml": `
|
||||||
|
|||||||
@@ -136,6 +136,51 @@ spec:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSinkCommandJSON(t *testing.T) {
|
||||||
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d)
|
||||||
|
|
||||||
|
r := commands.GetSinkRunner("")
|
||||||
|
r.Command.SetIn(bytes.NewBufferString(`apiVersion: config.kubernetes.io/v1alpha1
|
||||||
|
kind: ResourceList
|
||||||
|
items:
|
||||||
|
- {"kind": "Deployment", "metadata": {"labels": {"app": "nginx2"}, "name": "foo",
|
||||||
|
"annotations": {"app": "nginx2", config.kubernetes.io/index: '0',
|
||||||
|
config.kubernetes.io/path: 'f1.json'}}, "spec": {"replicas": 1}}
|
||||||
|
`))
|
||||||
|
r.Command.SetArgs([]string{d})
|
||||||
|
if !assert.NoError(t, r.Command.Execute()) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
actual, err := ioutil.ReadFile(filepath.Join(d, "f1.json"))
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
expected := `{
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"annotations": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"name": "foo"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
if !assert.Equal(t, expected, string(actual)) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSinkCommand_Stdout(t *testing.T) {
|
func TestSinkCommand_Stdout(t *testing.T) {
|
||||||
d, err := ioutil.TempDir("", "kustomize-source-test")
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
@@ -249,3 +294,49 @@ spec:
|
|||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSinkCommandJSON_Stdout(t *testing.T) {
|
||||||
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d)
|
||||||
|
|
||||||
|
// fmt the files
|
||||||
|
out := &bytes.Buffer{}
|
||||||
|
r := commands.GetSinkRunner("")
|
||||||
|
r.Command.SetIn(bytes.NewBufferString(`apiVersion: config.kubernetes.io/v1alpha1
|
||||||
|
kind: ResourceList
|
||||||
|
items:
|
||||||
|
- {"kind": "Deployment", "metadata": {"labels": {"app": "nginx2"}, "name": "foo",
|
||||||
|
"annotations": {"app": "nginx2", config.kubernetes.io/index: '0',
|
||||||
|
config.kubernetes.io/path: 'f1.json'}}, "spec": {"replicas": 1}}
|
||||||
|
`))
|
||||||
|
|
||||||
|
r.Command.SetOut(out)
|
||||||
|
r.Command.SetArgs([]string{})
|
||||||
|
if !assert.NoError(t, r.Command.Execute()) {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := `{
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"annotations": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"name": "foo"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
if !assert.Equal(t, expected, out.String()) {
|
||||||
|
println(out.String())
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func (r *SourceRunner) runE(c *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
var inputs []kio.Reader
|
var inputs []kio.Reader
|
||||||
for _, a := range args {
|
for _, a := range args {
|
||||||
inputs = append(inputs, kio.LocalPackageReader{PackagePath: a})
|
inputs = append(inputs, kio.LocalPackageReader{PackagePath: a, MatchFilesGlob: kio.MatchAll})
|
||||||
}
|
}
|
||||||
if len(inputs) == 0 {
|
if len(inputs) == 0 {
|
||||||
inputs = []kio.Reader{&kio.ByteReader{Reader: c.InOrStdin()}}
|
inputs = []kio.Reader{&kio.ByteReader{Reader: c.InOrStdin()}}
|
||||||
|
|||||||
@@ -135,6 +135,77 @@ items:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSourceCommandJSON(t *testing.T) {
|
||||||
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d)
|
||||||
|
|
||||||
|
err = ioutil.WriteFile(filepath.Join(d, "f1.json"), []byte(`
|
||||||
|
{
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"name": "foo",
|
||||||
|
"annotations": {
|
||||||
|
"app": "nginx2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`), 0600)
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = ioutil.WriteFile(filepath.Join(d, "f2.json"), []byte(`
|
||||||
|
{
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"kind": "Abstraction",
|
||||||
|
"metadata": {
|
||||||
|
"name": "foo",
|
||||||
|
"annotations": {
|
||||||
|
"config.kubernetes.io/function": "container:\n image: gcr.io/example/reconciler:v1\n",
|
||||||
|
"config.kubernetes.io/local-config": "true"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`), 0600)
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt the files
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
r := commands.GetSourceRunner("")
|
||||||
|
r.Command.SetArgs([]string{d})
|
||||||
|
r.Command.SetOut(b)
|
||||||
|
if !assert.NoError(t, r.Command.Execute()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !assert.Equal(t, `apiVersion: config.kubernetes.io/v1alpha1
|
||||||
|
kind: ResourceList
|
||||||
|
items:
|
||||||
|
- {"kind": "Deployment", "metadata": {"labels": {"app": "nginx2"}, "name": "foo",
|
||||||
|
"annotations": {"app": "nginx2", config.kubernetes.io/index: '0', config.kubernetes.io/path: 'f1.json'}},
|
||||||
|
"spec": {"replicas": 1}}
|
||||||
|
- {"apiVersion": "v1", "kind": "Abstraction", "metadata": {"name": "foo", "annotations": {
|
||||||
|
"config.kubernetes.io/function": "container:\n image: gcr.io/example/reconciler:v1\n",
|
||||||
|
"config.kubernetes.io/local-config": "true", config.kubernetes.io/index: '0',
|
||||||
|
config.kubernetes.io/path: 'f2.json'}}, "spec": {"replicas": 3}}
|
||||||
|
`, b.String()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSourceCommand_Stdin(t *testing.T) {
|
func TestSourceCommand_Stdin(t *testing.T) {
|
||||||
d, err := ioutil.TempDir("", "kustomize-source-test")
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
@@ -198,3 +269,48 @@ items:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSourceCommandJSON_Stdin(t *testing.T) {
|
||||||
|
d, err := ioutil.TempDir("", "kustomize-source-test")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d)
|
||||||
|
|
||||||
|
in := bytes.NewBufferString(`
|
||||||
|
{
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx2"
|
||||||
|
},
|
||||||
|
"name": "foo",
|
||||||
|
"annotations": {
|
||||||
|
"app": "nginx2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"replicas": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
out := &bytes.Buffer{}
|
||||||
|
r := commands.GetSourceRunner("")
|
||||||
|
r.Command.SetArgs([]string{})
|
||||||
|
r.Command.SetIn(in)
|
||||||
|
r.Command.SetOut(out)
|
||||||
|
if !assert.NoError(t, r.Command.Execute()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !assert.Equal(t, `apiVersion: config.kubernetes.io/v1alpha1
|
||||||
|
kind: ResourceList
|
||||||
|
items:
|
||||||
|
- {"kind": "Deployment", "metadata": {"labels": {"app": "nginx2"}, "name": "foo",
|
||||||
|
"annotations": {"app": "nginx2", config.kubernetes.io/index: '0'}}, "spec": {
|
||||||
|
"replicas": 1}}
|
||||||
|
`, out.String()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
package kio
|
package kio
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"sigs.k8s.io/kustomize/kyaml/errors"
|
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||||
@@ -90,9 +91,8 @@ func (w ByteWriter) Write(nodes []*yaml.RNode) error {
|
|||||||
// don't wrap the elements
|
// don't wrap the elements
|
||||||
if w.WrappingKind == "" {
|
if w.WrappingKind == "" {
|
||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
err := encoder.Encode(nodes[i].Document())
|
if err := w.encode(encoder, nodes[i].Document()); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return errors.Wrap(err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -125,7 +125,23 @@ func (w ByteWriter) Write(nodes []*yaml.RNode) error {
|
|||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
items.Content = append(items.Content, nodes[i].YNode())
|
items.Content = append(items.Content, nodes[i].YNode())
|
||||||
}
|
}
|
||||||
err := errors.Wrap(encoder.Encode(doc))
|
err := w.encode(encoder, doc)
|
||||||
yaml.UndoSerializationHacksOnNodes(nodes)
|
yaml.UndoSerializationHacksOnNodes(nodes)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// encode encodes the input document node to appropriate node format
|
||||||
|
func (w ByteWriter) encode(encoder *yaml.Encoder, doc *yaml.Node) error {
|
||||||
|
rNode := &yaml.RNode{}
|
||||||
|
rNode.SetYNode(doc)
|
||||||
|
str, err := rNode.String()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err)
|
||||||
|
}
|
||||||
|
if json.Valid([]byte(str)) {
|
||||||
|
je := json.NewEncoder(w.Writer)
|
||||||
|
je.SetIndent("", " ")
|
||||||
|
return errors.Wrap(je.Encode(rNode))
|
||||||
|
}
|
||||||
|
return encoder.Encode(doc)
|
||||||
|
}
|
||||||
|
|||||||
@@ -56,6 +56,16 @@ status2:
|
|||||||
- 2
|
- 2
|
||||||
`)
|
`)
|
||||||
|
|
||||||
var FormattedJSON1 = []byte(`{"apiVersion": "example.com/v1beta1", "kind": "MyType", "spec": "a", "status": {"conditions": [
|
var FormattedJSON1 = []byte(`{
|
||||||
3, 1, 2]}}
|
"apiVersion": "example.com/v1beta1",
|
||||||
|
"kind": "MyType",
|
||||||
|
"spec": "a",
|
||||||
|
"status": {
|
||||||
|
"conditions": [
|
||||||
|
3,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
`)
|
`)
|
||||||
|
|||||||
@@ -167,6 +167,8 @@ type LocalPackageReader struct {
|
|||||||
var _ Reader = LocalPackageReader{}
|
var _ Reader = LocalPackageReader{}
|
||||||
|
|
||||||
var DefaultMatch = []string{"*.yaml", "*.yml"}
|
var DefaultMatch = []string{"*.yaml", "*.yml"}
|
||||||
|
var JSONMatch = []string{"*.json"}
|
||||||
|
var MatchAll = append(DefaultMatch, JSONMatch...)
|
||||||
|
|
||||||
// Read reads the Resources.
|
// Read reads the Resources.
|
||||||
func (r LocalPackageReader) Read() ([]*yaml.RNode, error) {
|
func (r LocalPackageReader) Read() ([]*yaml.RNode, error) {
|
||||||
@@ -238,6 +240,7 @@ func (r *LocalPackageReader) readFile(path string, _ os.FileInfo) ([]*yaml.RNode
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
rr := &ByteReader{
|
rr := &ByteReader{
|
||||||
DisableUnwrapping: true,
|
DisableUnwrapping: true,
|
||||||
Reader: f,
|
Reader: f,
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ func (r RunFns) getNodesAndFilters() (
|
|||||||
// the same one for reading must be used for writing if deleting Resources
|
// the same one for reading must be used for writing if deleting Resources
|
||||||
var outputPkg *kio.LocalPackageReadWriter
|
var outputPkg *kio.LocalPackageReadWriter
|
||||||
if r.Path != "" {
|
if r.Path != "" {
|
||||||
outputPkg = &kio.LocalPackageReadWriter{PackagePath: r.Path}
|
outputPkg = &kio.LocalPackageReadWriter{PackagePath: r.Path, MatchFilesGlob: kio.MatchAll}
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Input == nil {
|
if r.Input == nil {
|
||||||
|
|||||||
@@ -497,7 +497,6 @@ func String(node *yaml.Node, opts ...string) (string, error) {
|
|||||||
if node == nil {
|
if node == nil {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
DoSerializationHacks(node)
|
|
||||||
optsSet := sets.String{}
|
optsSet := sets.String{}
|
||||||
optsSet.Insert(opts...)
|
optsSet.Insert(opts...)
|
||||||
if optsSet.Has(Flow) {
|
if optsSet.Has(Flow) {
|
||||||
@@ -516,7 +515,6 @@ func String(node *yaml.Node, opts ...string) (string, error) {
|
|||||||
if optsSet.Has(Trim) {
|
if optsSet.Has(Trim) {
|
||||||
val = strings.TrimSpace(val)
|
val = strings.TrimSpace(val)
|
||||||
}
|
}
|
||||||
UndoSerializationHacks(node)
|
|
||||||
return val, errors.Wrap(err)
|
return val, errors.Wrap(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user