From fdf8f44c90f0a8f159cbfccce28d9ab0ab765085 Mon Sep 17 00:00:00 2001 From: Joseph Gu Date: Sat, 18 Nov 2023 02:28:00 +0800 Subject: [PATCH] Fix nil pointer dereferencing when converting `vars` to `replacements ` (#5211) * fix patch.Target is nil in writePatchTargets * add test case * lint * lint err not check * remove new lin in imports * rollback changes to `cmd :=` * remove extra lines --- kustomize/commands/edit/fix/convert.go | 8 +- kustomize/commands/edit/fix/convert_test.go | 107 ++++++++++++++++---- 2 files changed, 95 insertions(+), 20 deletions(-) diff --git a/kustomize/commands/edit/fix/convert.go b/kustomize/commands/edit/fix/convert.go index 43aeadf17..f6c450803 100644 --- a/kustomize/commands/edit/fix/convert.go +++ b/kustomize/commands/edit/fix/convert.go @@ -134,7 +134,7 @@ func getNodesFromFile(fileName string, fSys filesys.FileSystem) ([]*kyaml.RNode, } out := &bytes.Buffer{} r := kio.ByteReadWriter{ - Reader: bytes.NewBufferString(string(b)), + Reader: bytes.NewBuffer(b), Writer: out, KeepReaderAnnotations: true, OmitReaderAnnotations: true, @@ -284,7 +284,11 @@ func constructTargets(file string, node *kyaml.RNode, fieldPaths []string, func writePatchTargets(patch types.Patch, node *kyaml.RNode, fieldPaths []string, options []*types.FieldOptions) ([]*types.TargetSelector, error) { var result []*types.TargetSelector - selector := patch.Target.Copy() + + selector := types.Selector{} + if patch.Target != nil { + selector = patch.Target.Copy() + } for i := range fieldPaths { target := &types.TargetSelector{ diff --git a/kustomize/commands/edit/fix/convert_test.go b/kustomize/commands/edit/fix/convert_test.go index 2472c5046..5e072a488 100644 --- a/kustomize/commands/edit/fix/convert_test.go +++ b/kustomize/commands/edit/fix/convert_test.go @@ -43,7 +43,7 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -119,7 +119,7 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -197,7 +197,7 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -276,7 +276,7 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -355,7 +355,7 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) err := cmd.RunE(cmd, nil) @@ -412,8 +412,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) - fSys.WriteFile("patch.yaml", patch) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -533,8 +533,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) - fSys.WriteFile("patch.yaml", patch) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -657,8 +657,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) - fSys.WriteFile("patch.yaml", patch) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -780,8 +780,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) - fSys.WriteFile("patch.yaml", patch) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -910,8 +910,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) - fSys.WriteFile("patch.yaml", patch) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -1023,8 +1023,8 @@ spec: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomizationOverlay) - fSys.WriteFile("base/pod.yaml", pod) - fSys.WriteFile("base/kustomization.yaml", kustomizationBase) + assert.NoError(t, fSys.WriteFile("base/pod.yaml", pod)) + assert.NoError(t, fSys.WriteFile("base/kustomization.yaml", kustomizationBase)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -1104,7 +1104,7 @@ metadata: fSys := filesys.MakeFsInMemory() testutils_test.WriteTestKustomizationWith(fSys, kustomization) - fSys.WriteFile("pod.yaml", pod) + assert.NoError(t, fSys.WriteFile("pod.yaml", pod)) cmd := NewCmdFix(fSys, os.Stdout) assert.NoError(t, cmd.Flags().Set("vars", "true")) assert.NoError(t, cmd.RunE(cmd, nil)) @@ -1143,3 +1143,74 @@ metadata: a.b.c: SOME_SECRET_NAME_PLACEHOLDER `, string(content)) } + +func TestFixVarsWithPatch(t *testing.T) { + kustomization := []byte(` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +patchesStrategicMerge: + - patch.yaml + +vars: + - name: CERTIFICATE_NAMESPACE + objref: + name: system + fieldref: + fieldpath: metadata.namespace +`) + patch := []byte(` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: $(CERTIFICATE_NAMESPACE) +`) + + fSys := filesys.MakeFsInMemory() + testutils_test.WriteTestKustomizationWith(fSys, kustomization) + assert.NoError(t, fSys.WriteFile("patch.yaml", patch)) + cmd := NewCmdFix(fSys, os.Stdout) + assert.NoError(t, cmd.Flags().Set("vars", "true")) + assert.NoError(t, cmd.RunE(cmd, nil)) + content, err := testutils_test.ReadTestKustomization(fSys) + assert.NoError(t, err) + + assert.Equal(t, ` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + + +patches: +- path: patch.yaml +replacements: +- source: + fieldPath: metadata.namespace + name: system + targets: + - fieldPaths: + - spec.template.spec.containers.0.name + select: + namespace: system +`, string(content)) + + content, err = fSys.ReadFile("patch.yaml") + assert.NoError(t, err) + assert.Equal(t, ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: CERTIFICATE_NAMESPACE_PLACEHOLDER +`, string(content)) +}