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
This commit is contained in:
Joseph Gu
2023-11-18 02:28:00 +08:00
committed by GitHub
parent 30893b0184
commit fdf8f44c90
2 changed files with 95 additions and 20 deletions

View File

@@ -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{

View File

@@ -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))
}