Skip to content

Commit

Permalink
Localize patchesJson6902, patchesStrategicMerge, replacements (kubern…
Browse files Browse the repository at this point in the history
…etes-sigs#4904)

* Localize patchesJson6902, patchesStrategicMerge, replacements

* Address code review feedback

* Improve readability
* Remove deprecation warning check
  • Loading branch information
annasong20 authored and Cailyn Edwards committed Jan 11, 2023
1 parent ddf350a commit a1dab8d
Show file tree
Hide file tree
Showing 2 changed files with 174 additions and 28 deletions.
61 changes: 48 additions & 13 deletions api/internal/localizer/localizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,6 @@ func (lc *localizer) localizeNativeFields(kust *types.Kustomization) error {
}
kust.Components[i] = newPath
}
for i := range kust.Patches {
if kust.Patches[i].Path != "" {
newPath, err := lc.localizeFile(kust.Patches[i].Path)
if err != nil {
return errors.WrapPrefixf(err, "unable to localize patches path %q", kust.Patches[i].Path)
}
kust.Patches[i].Path = newPath
}
}

for i := range kust.ConfigMapGenerator {
if err := lc.localizeGenerator(&kust.ConfigMapGenerator[i].GeneratorArgs); err != nil {
Expand All @@ -140,9 +131,39 @@ func (lc *localizer) localizeNativeFields(kust *types.Kustomization) error {
return errors.WrapPrefixf(err, "unable to localize secretGenerator")
}
}
if err := lc.localizePatches(kust.Patches); err != nil {
return errors.WrapPrefixf(err, "unable to localize patches")
}
// Allow use of deprecated field
//nolint:staticcheck
if err := lc.localizePatches(kust.PatchesJson6902); err != nil {
return errors.WrapPrefixf(err, "unable to localize patchesJson6902")
}
//nolint:staticcheck
for i, patch := range kust.PatchesStrategicMerge {
_, isFile, err := lc.loadResource(string(patch))
if err != nil {
return errors.WrapPrefixf(err, "invalid patchesStrategicMerge entry")
}
if isFile {
newPath, err := lc.localizeFile(string(patch))
if err != nil {
return errors.WrapPrefixf(err, "unable to localize patchesStrategicMerge entry")
}
kust.PatchesStrategicMerge[i] = types.PatchStrategicMerge(newPath)
}
}
for i, replacement := range kust.Replacements {
if replacement.Path != "" {
newPath, err := lc.localizeFile(replacement.Path)
if err != nil {
return errors.WrapPrefixf(err, "unable to localize replacements entry")
}
kust.Replacements[i].Path = newPath
}
}

// TODO(annasong): localize all other kustomization fields: resources, bases, crds, configurations,
// openapi, patchesJson6902, patchesStrategicMerge, replacements
// TODO(annasong): localize all other kustomization fields: resources, bases, crds, configurations, openapi
return nil
}

Expand Down Expand Up @@ -176,6 +197,20 @@ func (lc *localizer) localizeGenerator(generator *types.GeneratorArgs) error {
return nil
}

// localizePatches localizes the file paths on patches if they are non-empty
func (lc *localizer) localizePatches(patches []types.Patch) error {
for i := range patches {
if patches[i].Path != "" {
newPath, err := lc.localizeFile(patches[i].Path)
if err != nil {
return err
}
patches[i].Path = newPath
}
}
return nil
}

// localizeFile localizes file path and returns the localized path
func (lc *localizer) localizeFile(path string) (string, error) {
content, err := lc.ldr.Load(path)
Expand Down Expand Up @@ -303,9 +338,9 @@ func (lc *localizer) localizeBuiltinPlugins(kust *types.Kustomization) error {
// loadResource tries to load resourceEntry as a file path or inline.
// On success, loadResource returns the loaded resource map and whether resourceEntry is a file path.
func (lc *localizer) loadResource(resourceEntry string) (resmap.ResMap, bool, error) {
var fileErr error
rm, inlineErr := lc.rFactory.NewResMapFromBytes([]byte(resourceEntry))
if inlineErr != nil {
var fileErr error
rm, fileErr = lc.rFactory.FromFile(lc.ldr, resourceEntry)
if fileErr != nil {
err := ResourceLoadError{
Expand All @@ -315,5 +350,5 @@ func (lc *localizer) loadResource(resourceEntry string) (resmap.ResMap, bool, er
return nil, false, errors.WrapPrefixf(err, "unable to load resource entry %q", resourceEntry)
}
}
return rm, fileErr == nil, nil
return rm, inlineErr != nil, nil
}
141 changes: 126 additions & 15 deletions api/internal/localizer/localizer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ spec:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
`
- containerPort: 80`

func makeMemoryFs(t *testing.T) filesys.FileSystem {
t.Helper()
Expand Down Expand Up @@ -290,6 +289,117 @@ spec:
checkFSys(t, fSysExpected, fSys)
}

func TestLocalizePatchesJson(t *testing.T) {
fSys := makeMemoryFs(t)
kustAndPatches := map[string]string{
"kustomization.yaml": `apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesJson6902:
- path: patch.yaml
target:
annotationSelector: zone=west
name: pod
version: v1
- patch: '[{"op": "add", "path": "/new/path", "value": "value"}]'
target:
group: apps
kind: Pod
- path: patch.json
target:
namespace: my
`,
"patch.yaml": `- op: add
path: /some/new/path
value: value
- op: replace
path: /some/existing/path
value: new value`,
"patch.json": ` [
{"op": "copy", "from": "/here", "path": "/there"},
{"op": "remove", "path": "/some/existing/path"},
]`,
}
addFiles(t, fSys, "/alpha/beta", kustAndPatches)

err := Run("/alpha/beta", "/", "/beta", fSys)
require.NoError(t, err)

fSysExpected := makeMemoryFs(t)
addFiles(t, fSysExpected, "/alpha/beta", kustAndPatches)
addFiles(t, fSysExpected, "/beta/alpha/beta", kustAndPatches)
checkFSys(t, fSysExpected, fSys)
}

func TestLocalizePatchesSM(t *testing.T) {
fSys := makeMemoryFs(t)
kustAndPatches := map[string]string{
"kustomization.yaml": `apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesStrategicMerge:
- |-
apiVersion: v1
kind: ConfigMap
metadata:
name: map
data:
- APPLE: orange
- patch.yaml
`,
"patch.yaml": podConfiguration,
}
addFiles(t, fSys, "/a", kustAndPatches)

err := Run("/a", "", "/dst", fSys)
require.NoError(t, err)

fSysExpected := makeMemoryFs(t)
addFiles(t, fSysExpected, "/a", kustAndPatches)
addFiles(t, fSysExpected, "/dst", kustAndPatches)
checkFSys(t, fSysExpected, fSys)
}

func TestLocalizeReplacements(t *testing.T) {
fSys := makeMemoryFs(t)
kustAndReplacement := map[string]string{
"kustomization.yaml": `apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
replacements:
- path: replacement.yaml
- source:
fieldPath: path
name: map
targets:
- fieldPaths:
- path
select:
name: my-map
`,
"replacement.yaml": `source:
fieldPath: path.*.to.[some=field]
kind: Pod
options:
delimiter: /
targets:
- fieldPaths:
- config\.kubernetes\.io.annotations
- second.path
reject:
- group: apps
version: v2
select:
namespace: my`,
}
addFiles(t, fSys, "/a", kustAndReplacement)

err := Run("/a", "/", "/dst", fSys)
require.NoError(t, err)

fSysExpected := makeMemoryFs(t)
addFiles(t, fSysExpected, "/a", kustAndReplacement)
addFiles(t, fSysExpected, "/dst/a", kustAndReplacement)
checkFSys(t, fSysExpected, fSys)
}

func TestLocalizeConfigMapGenerator(t *testing.T) {
fSys := makeMemoryFs(t)
kustAndData := map[string]string{
Expand Down Expand Up @@ -480,20 +590,20 @@ func TestLocalizeValidators(t *testing.T) {
"kustomization.yaml": `apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
validators:
- |-
- |
apiVersion: builtin
kind: ReplacementTransformer
metadata:
name: replacement
replacements:
- source:
kind: ConfigMap
fieldPath: metadata.name
fieldPath: data.[field=value]
group: apps
targets:
- select:
kind: ConfigMap
fieldPaths:
- metadata.name
- fieldPaths:
- spec.*
select:
kind: Pod
- replacement.yaml
`,
"replacement.yaml": `apiVersion: builtin
Expand All @@ -502,13 +612,14 @@ metadata:
name: replacement-2
replacements:
- source:
kind: Secret
fieldPath: data.USER_NAME
fieldPath: spec.containers.1.image
kind: Custom
namespace: test
targets:
- select:
kind: Secret
fieldPaths:
- data.USER_NAME
- fieldPaths:
- path
select:
namespace: test
`,
}
addFiles(t, fSys, "/", kustAndPlugin)
Expand Down

0 comments on commit a1dab8d

Please sign in to comment.