add legacy filter to image tag transformer

This commit is contained in:
Donny Xia
2020-09-01 13:06:14 -07:00
parent 17793abacd
commit 9ca8f4602d
4 changed files with 126 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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