diff --git a/api/types/kustomization.go b/api/types/kustomization.go index c194dcc3c..4e7ac9e87 100644 --- a/api/types/kustomization.go +++ b/api/types/kustomization.go @@ -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 diff --git a/kustomize/commands/edit/fix/fix.go b/kustomize/commands/edit/fix/fix.go index eb1e260fb..bae67811d 100644 --- a/kustomize/commands/edit/fix/fix.go +++ b/kustomize/commands/edit/fix/fix.go @@ -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()) } diff --git a/kustomize/commands/edit/fix/fix_test.go b/kustomize/commands/edit/fix/fix_test.go index 163d03baa..fc6cced28 100644 --- a/kustomize/commands/edit/fix/fix_test.go +++ b/kustomize/commands/edit/fix/fix_test.go @@ -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)) + }) } }