Skip to content

Commit 42bf3c0

Browse files
prevent all uses of YAML aliases from being overwritten by a transformer (#5096)
* return copied Node * add a test case about imageTagTransformer for anchor scenario * add TestPatchTransformerAnchor * TestReplacementTransformerAnchor
1 parent 3b395a9 commit 42bf3c0

File tree

4 files changed

+164
-1
lines changed

4 files changed

+164
-1
lines changed

kyaml/yaml/rnode.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,11 @@ func deAnchor(yn *yaml.Node) (res *yaml.Node, err error) {
10071007
case yaml.ScalarNode:
10081008
return yn, nil
10091009
case yaml.AliasNode:
1010-
return deAnchor(yn.Alias)
1010+
result, err := deAnchor(yn.Alias)
1011+
if err != nil {
1012+
return nil, err
1013+
}
1014+
return CopyYNode(result), nil
10111015
case yaml.MappingNode:
10121016
toMerge, err := removeMergeTags(yn)
10131017
if err != nil {

plugin/builtin/imagetagtransformer/ImageTagTransformer_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,49 @@ spec:
409409
`)
410410
}
411411

412+
func TestImageTagTransformerAnchor(t *testing.T) {
413+
th := kusttest_test.MakeEnhancedHarness(t).
414+
PrepBuiltin("ImageTagTransformer")
415+
defer th.Reset()
416+
417+
rm := th.LoadAndRunTransformer(`
418+
apiVersion: builtin
419+
kind: ImageTagTransformer
420+
metadata:
421+
name: notImportantHere
422+
imageTag:
423+
name: nginx
424+
newName: my-nginx
425+
fieldSpecs:
426+
- path: spec/template/spec/containers[]/image
427+
`, `
428+
group: apps
429+
apiVersion: v1
430+
kind: Deployment
431+
metadata:
432+
name: &name nginx
433+
spec:
434+
template:
435+
spec:
436+
containers:
437+
- image: *name
438+
name: *name
439+
`)
440+
th.AssertActualEqualsExpectedNoIdAnnotations(rm, `
441+
apiVersion: v1
442+
group: apps
443+
kind: Deployment
444+
metadata:
445+
name: nginx
446+
spec:
447+
template:
448+
spec:
449+
containers:
450+
- image: my-nginx
451+
name: nginx
452+
`)
453+
}
454+
412455
func TestImageTagTransformerTagWithBraces(t *testing.T) {
413456
th := kusttest_test.MakeEnhancedHarness(t).
414457
PrepBuiltin("ImageTagTransformer")

plugin/builtin/patchtransformer/PatchTransformer_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,3 +828,65 @@ spec:
828828
protocol: TCP
829829
`)
830830
}
831+
832+
func TestPatchTransformerAnchor(t *testing.T) {
833+
th := kusttest_test.MakeEnhancedHarness(t).
834+
PrepBuiltin("PatchTransformer")
835+
defer th.Reset()
836+
837+
th.RunTransformerAndCheckResult(`
838+
apiVersion: builtin
839+
kind: PatchTransformer
840+
metadata:
841+
name: test-transformer
842+
patch: |-
843+
apiVersion: apps/v1
844+
kind: Deployment
845+
metadata:
846+
name: test-deployment
847+
spec:
848+
selector:
849+
matchLabels:
850+
app: &name test-label
851+
template:
852+
metadata:
853+
labels:
854+
app: *name
855+
target:
856+
kind: Deployment
857+
name: test-deployment
858+
`, `apiVersion: apps/v1
859+
kind: Deployment
860+
metadata:
861+
name: &name test-deployment
862+
spec:
863+
selector:
864+
matchLabels:
865+
app: *name
866+
template:
867+
metadata:
868+
labels:
869+
app: *name
870+
spec:
871+
containers:
872+
- image: test-image
873+
name: *name
874+
`, `
875+
apiVersion: apps/v1
876+
kind: Deployment
877+
metadata:
878+
name: test-deployment
879+
spec:
880+
selector:
881+
matchLabels:
882+
app: test-label
883+
template:
884+
metadata:
885+
labels:
886+
app: test-label
887+
spec:
888+
containers:
889+
- image: test-image
890+
name: test-deployment
891+
`)
892+
}

plugin/builtin/replacementtransformer/ReplacementTransformer_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,60 @@ spec:
174174
`)
175175
}
176176

177+
func TestReplacementTransformerAnchor(t *testing.T) {
178+
th := kusttest_test.MakeEnhancedHarness(t).
179+
PrepBuiltin("ReplacementTransformer")
180+
defer th.Reset()
181+
182+
rm := th.LoadAndRunTransformer(`
183+
apiVersion: builtin
184+
kind: ReplacementTransformer
185+
metadata:
186+
name: notImportantHere
187+
replacements:
188+
- source:
189+
kind: Deployment
190+
fieldPath: spec.template.spec.containers.0.name
191+
targets:
192+
- select:
193+
kind: Deployment
194+
fieldPaths:
195+
- spec.template.spec.containers.1.name
196+
`, `
197+
apiVersion: apps/v1
198+
kind: Deployment
199+
metadata:
200+
name: &name origin
201+
spec:
202+
template:
203+
spec:
204+
containers:
205+
- image: foobar:1
206+
name: replaced
207+
- image: foobar:1
208+
name: *name
209+
- image: foobar:1
210+
name: *name
211+
`)
212+
213+
th.AssertActualEqualsExpected(rm, `
214+
apiVersion: apps/v1
215+
kind: Deployment
216+
metadata:
217+
name: origin
218+
spec:
219+
template:
220+
spec:
221+
containers:
222+
- image: foobar:1
223+
name: replaced
224+
- image: foobar:1
225+
name: replaced
226+
- image: foobar:1
227+
name: origin
228+
`)
229+
}
230+
177231
func TestReplacementTransformerComplexType(t *testing.T) {
178232
th := kusttest_test.MakeEnhancedHarness(t).
179233
PrepBuiltin("ReplacementTransformer")

0 commit comments

Comments
 (0)