mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
Merge pull request #4733 from koba1t/feat/add_edit-fix_for_patchesStrategicMerge_to_patches
add `edit fix` for patchesStrategicMerge to patches
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||
"sigs.k8s.io/yaml"
|
||||
)
|
||||
|
||||
@@ -217,11 +218,25 @@ func (k *Kustomization) FixKustomizationPostUnmarshalling() {
|
||||
// FixKustomizationPreMarshalling fixes things
|
||||
// that should occur after the kustomization file
|
||||
// has been processed.
|
||||
func (k *Kustomization) FixKustomizationPreMarshalling() error {
|
||||
func (k *Kustomization) FixKustomizationPreMarshalling(fSys filesys.FileSystem) error {
|
||||
// PatchesJson6902 should be under the Patches field.
|
||||
k.Patches = append(k.Patches, k.PatchesJson6902...)
|
||||
k.PatchesJson6902 = nil
|
||||
|
||||
if k.PatchesStrategicMerge != nil {
|
||||
for _, patchStrategicMerge := range k.PatchesStrategicMerge {
|
||||
// check this patch is file path select.
|
||||
if _, err := fSys.ReadFile(string(patchStrategicMerge)); err == nil {
|
||||
// path patch
|
||||
k.Patches = append(k.Patches, Patch{Path: string(patchStrategicMerge)})
|
||||
} else {
|
||||
// inline string patch
|
||||
k.Patches = append(k.Patches, Patch{Patch: string(patchStrategicMerge)})
|
||||
}
|
||||
}
|
||||
k.PatchesStrategicMerge = nil
|
||||
}
|
||||
|
||||
// this fix is not in FixKustomizationPostUnmarshalling because
|
||||
// it will break some commands like `create` and `add`. those
|
||||
// commands depend on 'commonLabels' field
|
||||
|
||||
@@ -55,8 +55,7 @@ func RunFix(fSys filesys.FileSystem, w io.Writer) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.FixKustomizationPreMarshalling()
|
||||
if err != nil {
|
||||
if err := m.FixKustomizationPreMarshalling(fSys); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -68,12 +67,14 @@ func RunFix(fSys filesys.FileSystem, w io.Writer) error {
|
||||
fmt.Fprintln(w, `
|
||||
Fixed fields:
|
||||
patchesJson6902 -> patches
|
||||
patchesStrategicMerge -> patches
|
||||
commonLabels -> labels
|
||||
vars -> replacements`)
|
||||
} else {
|
||||
fmt.Fprintln(w, `
|
||||
Fixed fields:
|
||||
patchesJson6902 -> patches
|
||||
patchesStrategicMerge -> patches
|
||||
commonLabels -> labels
|
||||
|
||||
To convert vars -> replacements, run the command `+"`kustomize edit fix --vars`"+`
|
||||
@@ -89,7 +90,7 @@ We recommend doing this in a clean git repository where the change is easy to un
|
||||
fixedBuildCmd := build.NewCmdBuild(fSys, build.MakeHelp(konfig.ProgramName, "build"), &fixedOutput)
|
||||
err = fixedBuildCmd.RunE(fixedBuildCmd, nil)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces the error when running `kustomize build`: %s", err.Error())
|
||||
fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces the error when running `kustomize build`: %s\n", err.Error())
|
||||
} else if fixedOutput.String() != oldOutput.String() {
|
||||
fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces different output when running `kustomize build`:\n...%s...\n", fixedOutput.String())
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
testutils_test "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/testutils"
|
||||
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||
)
|
||||
@@ -27,8 +28,16 @@ func TestFix(t *testing.T) {
|
||||
assert.Contains(t, string(content), "kind: Kustomization")
|
||||
}
|
||||
|
||||
func TestFixOutdatedPatchesFieldTitle(t *testing.T) {
|
||||
kustomizationContentWithOutdatedPatchesFieldTitle := []byte(`
|
||||
func TestFixCommand(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
input string
|
||||
files map[string]string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "FixOutdatedPatchesFieldTitle",
|
||||
input: `
|
||||
patchesJson6902:
|
||||
- path: patch1.yaml
|
||||
target:
|
||||
@@ -38,9 +47,8 @@ patchesJson6902:
|
||||
group: apps
|
||||
kind: Deployment
|
||||
version: v1
|
||||
`)
|
||||
|
||||
expected := []byte(`
|
||||
`,
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
@@ -52,24 +60,11 @@ patches:
|
||||
group: apps
|
||||
kind: Deployment
|
||||
version: v1
|
||||
`)
|
||||
fSys := filesys.MakeFsInMemory()
|
||||
testutils_test.WriteTestKustomizationWith(fSys, kustomizationContentWithOutdatedPatchesFieldTitle)
|
||||
cmd := NewCmdFix(fSys, os.Stdout)
|
||||
assert.NoError(t, cmd.RunE(cmd, nil))
|
||||
|
||||
content, err := testutils_test.ReadTestKustomization(fSys)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(content), "apiVersion: ")
|
||||
assert.Contains(t, string(content), "kind: Kustomization")
|
||||
|
||||
if diff := cmp.Diff(expected, content); diff != "" {
|
||||
t.Errorf("Mismatch (-expected, +actual):\n%s", diff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenameAndKeepOutdatedPatchesField(t *testing.T) {
|
||||
kustomizationContentWithOutdatedPatchesFieldTitle := []byte(`
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestRenameAndKeepOutdatedPatchesField",
|
||||
input: `
|
||||
patchesJson6902:
|
||||
- path: patch1.yaml
|
||||
target:
|
||||
@@ -81,9 +76,8 @@ patches:
|
||||
- path: patch3.yaml
|
||||
target:
|
||||
kind: Service
|
||||
`)
|
||||
|
||||
expected := []byte(`
|
||||
`,
|
||||
expected: `
|
||||
patches:
|
||||
- path: patch2.yaml
|
||||
target:
|
||||
@@ -96,32 +90,273 @@ patches:
|
||||
kind: Deployment
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
`)
|
||||
fSys := filesys.MakeFsInMemory()
|
||||
testutils_test.WriteTestKustomizationWith(fSys, kustomizationContentWithOutdatedPatchesFieldTitle)
|
||||
cmd := NewCmdFix(fSys, os.Stdout)
|
||||
assert.NoError(t, cmd.RunE(cmd, nil))
|
||||
|
||||
content, err := testutils_test.ReadTestKustomization(fSys)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(content), "apiVersion: ")
|
||||
assert.Contains(t, string(content), "kind: Kustomization")
|
||||
|
||||
if diff := cmp.Diff(expected, content); diff != "" {
|
||||
t.Errorf("Mismatch (-expected, +actual):\n%s", diff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFixOutdatedCommonLabels(t *testing.T) {
|
||||
kustomizationContentWithOutdatedCommonLabels := []byte(`
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixOutdatedPatchesStrategicMergeFieldTitle",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nignx:latest
|
||||
`,
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- patch: |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nignx:latest
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixAndMergeOutdatedPatchesStrategicMergeFieldTitle",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nignx:latest
|
||||
patches:
|
||||
- path: patch2.yaml
|
||||
target:
|
||||
kind: Deployment
|
||||
`,
|
||||
expected: `
|
||||
patches:
|
||||
- path: patch2.yaml
|
||||
target:
|
||||
kind: Deployment
|
||||
- patch: |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nignx:latest
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixOutdatedPatchesStrategicMergeToPathFieldTitle",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- deploy.yaml
|
||||
`,
|
||||
files: map[string]string{
|
||||
"deploy.yaml": `
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml`,
|
||||
},
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- path: deploy.yaml
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixOutdatedPatchesStrategicMergeToPathFieldYMLTitle",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- deploy.yml
|
||||
`,
|
||||
files: map[string]string{
|
||||
"deploy.yml": `
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml`,
|
||||
},
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- path: deploy.yml
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "Test fix outdated patchesStrategicMerge from a file and one string literal",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- deploy.yaml
|
||||
- |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml
|
||||
`,
|
||||
files: map[string]string{
|
||||
"deploy.yaml": `
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml`,
|
||||
},
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- path: deploy.yaml
|
||||
- patch: |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "Test fix outdated patchesStrategicMerge and patchesJson6902",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- deploy.yaml
|
||||
patchesJson6902:
|
||||
- path: patch1.yaml
|
||||
target:
|
||||
kind: Deployment
|
||||
`,
|
||||
files: map[string]string{
|
||||
"deploy.yaml": `
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml`,
|
||||
},
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- path: patch1.yaml
|
||||
target:
|
||||
kind: Deployment
|
||||
- path: deploy.yaml
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixOutdatedPatchesStrategicMergeFieldPatchEndOfYamlTitle",
|
||||
input: `
|
||||
patchesStrategicMerge:
|
||||
- |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml
|
||||
`,
|
||||
expected: `
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
patches:
|
||||
- patch: |-
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
env:
|
||||
- name: CONFIG_FILE_PATH
|
||||
value: home.yaml
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "TestFixOutdatedCommonLabels",
|
||||
input: `
|
||||
commonLabels:
|
||||
foo: bar
|
||||
labels:
|
||||
- pairs:
|
||||
a: b
|
||||
`)
|
||||
|
||||
expected := []byte(`
|
||||
`,
|
||||
expected: `
|
||||
labels:
|
||||
- pairs:
|
||||
a: b
|
||||
@@ -130,19 +365,26 @@ labels:
|
||||
foo: bar
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
`)
|
||||
fSys := filesys.MakeFsInMemory()
|
||||
testutils_test.WriteTestKustomizationWith(fSys, kustomizationContentWithOutdatedCommonLabels)
|
||||
cmd := NewCmdFix(fSys, os.Stdout)
|
||||
assert.NoError(t, cmd.RunE(cmd, nil))
|
||||
`,
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
fSys := filesys.MakeFsInMemory()
|
||||
testutils_test.WriteTestKustomizationWith(fSys, []byte(test.input))
|
||||
for filename, content := range test.files {
|
||||
require.NoError(t, fSys.WriteFile(filename, []byte(content)))
|
||||
}
|
||||
cmd := NewCmdFix(fSys, os.Stdout)
|
||||
require.NoError(t, cmd.RunE(cmd, nil))
|
||||
|
||||
content, err := testutils_test.ReadTestKustomization(fSys)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(content), "apiVersion: ")
|
||||
assert.Contains(t, string(content), "kind: Kustomization")
|
||||
content, err := testutils_test.ReadTestKustomization(fSys)
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, string(content), "apiVersion: ")
|
||||
require.Contains(t, string(content), "kind: Kustomization")
|
||||
|
||||
if diff := cmp.Diff(expected, content); diff != "" {
|
||||
t.Errorf("Mismatch (-expected, +actual):\n%s", diff)
|
||||
require.Empty(t, cmp.Diff([]byte(test.expected), content))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user