From 9ca8f4602d40ce12438ca85e0f9a3339654e26a9 Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Tue, 1 Sep 2020 13:06:14 -0700 Subject: [PATCH] add legacy filter to image tag transformer --- api/builtins/ImageTagTransformer.go | 17 +-- api/krusty/transformersimage_test.go | 14 +-- .../ImageTagTransformer.go | 17 +-- .../ImageTagTransformer_test.go | 101 ++++++++++++++++++ 4 files changed, 126 insertions(+), 23 deletions(-) diff --git a/api/builtins/ImageTagTransformer.go b/api/builtins/ImageTagTransformer.go index a403699e68..bab00819e7 100644 --- a/api/builtins/ImageTagTransformer.go +++ b/api/builtins/ImageTagTransformer.go @@ -31,14 +31,15 @@ func (p *ImageTagTransformerPlugin) Config( func (p *ImageTagTransformerPlugin) Transform(m resmap.ResMap) error { for _, r := range m.Resources() { - // If you're here because someone expected any field containing - // the string "containers" or "initContainers" to get an image - // update (not just spec/template/spec/containers[], etc.) then - // a code change is needed. See api/filters/imagetag/legacy - // for the start of an implementation that won't use an - // allowlist like FsSlice, and instead walks the object looking - // for fields named containers or initContainers. - err := filtersutil.ApplyToJSON(imagetag.Filter{ + // traverse all fields at first + err := filtersutil.ApplyToJSON(imagetag.LegacyFilter{ + ImageTag: p.ImageTag, + }, r) + if err != nil { + return err + } + // then use user specified field specs + err = filtersutil.ApplyToJSON(imagetag.Filter{ ImageTag: p.ImageTag, FsSlice: p.FieldSpecs, }, r) diff --git a/api/krusty/transformersimage_test.go b/api/krusty/transformersimage_test.go index 6627de5438..91b95ad064 100644 --- a/api/krusty/transformersimage_test.go +++ b/api/krusty/transformersimage_test.go @@ -215,25 +215,25 @@ spec2: template: spec: containers: - - image: nginx:v1 + - image: nginx:v2 name: nginx3 - - image: my-nginx:latest + - image: my-nginx:previous name: nginx4 spec3: template: spec: initContainers: - - image: postgres:alpine-9 + - image: my-postgres:v3 name: postgresdb - - image: docker:17-git + - image: my-docker@sha256:25a0d4b4 name: init-docker - - image: myprivaterepohostname:1234/my/image:latest + - image: myprivaterepohostname:1234/my/image:v1.0.1 name: myImage - - image: myprivaterepohostname:1234/my/image + - image: myprivaterepohostname:1234/my/image:v1.0.1 name: myImage2 - image: my-app-image:v1 name: my-app - - image: gcr.io:8080/my-project/my-cool-app:latest + - image: my-cool-app:latest name: my-cool-app `) } diff --git a/plugin/builtin/imagetagtransformer/ImageTagTransformer.go b/plugin/builtin/imagetagtransformer/ImageTagTransformer.go index feb4a41b65..04c2961c28 100644 --- a/plugin/builtin/imagetagtransformer/ImageTagTransformer.go +++ b/plugin/builtin/imagetagtransformer/ImageTagTransformer.go @@ -35,14 +35,15 @@ func (p *plugin) Config( func (p *plugin) Transform(m resmap.ResMap) error { for _, r := range m.Resources() { - // If you're here because someone expected any field containing - // the string "containers" or "initContainers" to get an image - // update (not just spec/template/spec/containers[], etc.) then - // a code change is needed. See api/filters/imagetag/legacy - // for the start of an implementation that won't use an - // allowlist like FsSlice, and instead walks the object looking - // for fields named containers or initContainers. - err := filtersutil.ApplyToJSON(imagetag.Filter{ + // traverse all fields at first + err := filtersutil.ApplyToJSON(imagetag.LegacyFilter{ + ImageTag: p.ImageTag, + }, r) + if err != nil { + return err + } + // then use user specified field specs + err = filtersutil.ApplyToJSON(imagetag.Filter{ ImageTag: p.ImageTag, FsSlice: p.FieldSpecs, }, r) diff --git a/plugin/builtin/imagetagtransformer/ImageTagTransformer_test.go b/plugin/builtin/imagetagtransformer/ImageTagTransformer_test.go index f9b13f0e57..1b7361b04a 100644 --- a/plugin/builtin/imagetagtransformer/ImageTagTransformer_test.go +++ b/plugin/builtin/imagetagtransformer/ImageTagTransformer_test.go @@ -452,3 +452,104 @@ spec: name: my-image `) } + +func TestImageTagTransformerArbitraryPath(t *testing.T) { + th := kusttest_test.MakeEnhancedHarness(t). + PrepBuiltin("ImageTagTransformer") + defer th.Reset() + + rm := th.LoadAndRunTransformer(` +apiVersion: builtin +kind: ImageTagTransformer +metadata: + name: notImportantHere +imageTag: + name: some.registry.io/my-image + newTag: "my-fixed-tag" +`, ` +group: apps +apiVersion: v1 +kind: Deployment +metadata: + name: deploy1 +spec: + template: + spec: + containers: + - image: some.registry.io/my-image:old-tag + name: my-image +`) + + th.AssertActualEqualsExpected(rm, ` +apiVersion: v1 +group: apps +kind: Deployment +metadata: + name: deploy1 +spec: + template: + spec: + containers: + - image: some.registry.io/my-image:my-fixed-tag + name: my-image +`) +} + +func TestImageTagTransformerInKustomization(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK("/app", ` +resources: +- resources.yaml +images: +- name: old-image-name + newName: new-image-name + newTag: new-tag +`) + + th.WriteF("/app/resources.yaml", ` +apiVersion: v1 +group: apps +kind: Deployment +metadata: + name: deploy1 +spec: + containers: + - image: old-image-name + name: my-image + initContainers: + - image: old-image-name + name: my-image + template: + spec: + containers: + - image: old-image-name + name: my-image + initContainers: + - image: old-image-name + name: my-image +`) + + m := th.Run("/app", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: v1 +group: apps +kind: Deployment +metadata: + name: deploy1 +spec: + containers: + - image: new-image-name:new-tag + name: my-image + initContainers: + - image: new-image-name:new-tag + name: my-image + template: + spec: + containers: + - image: new-image-name:new-tag + name: my-image + initContainers: + - image: new-image-name:new-tag + name: my-image +`) +}