1
2
3
4 package krusty_test
5
6 import (
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13 "sigs.k8s.io/kustomize/api/internal/utils"
14 "sigs.k8s.io/kustomize/api/krusty"
15 kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
16 "sigs.k8s.io/kustomize/kyaml/filesys"
17 )
18
19 func TestAnnoOriginLocalFiles(t *testing.T) {
20 th := kusttest_test.MakeHarness(t)
21 th.WriteF("service.yaml", `
22 apiVersion: v1
23 kind: Service
24 metadata:
25 name: myService
26 spec:
27 ports:
28 - port: 7002
29 `)
30 th.WriteK(".", `
31 resources:
32 - service.yaml
33 buildMetadata: [originAnnotations]
34 `)
35 options := th.MakeDefaultOptions()
36 m := th.Run(".", options)
37 th.AssertActualEqualsExpected(m, `
38 apiVersion: v1
39 kind: Service
40 metadata:
41 annotations:
42 config.kubernetes.io/origin: |
43 path: service.yaml
44 name: myService
45 spec:
46 ports:
47 - port: 7002
48 `)
49 }
50
51 func TestAnnoOriginLocalFilesWithOverlay(t *testing.T) {
52 th := kusttest_test.MakeHarness(t)
53 th.WriteK("base", `
54 namePrefix: b-
55 resources:
56 - namespace.yaml
57 - role.yaml
58 - service.yaml
59 - deployment.yaml
60 `)
61 th.WriteF("base/service.yaml", `
62 apiVersion: v1
63 kind: Service
64 metadata:
65 name: myService
66 `)
67 th.WriteF("base/namespace.yaml", `
68 apiVersion: v1
69 kind: Namespace
70 metadata:
71 name: myNs
72 `)
73 th.WriteF("base/role.yaml", `
74 apiVersion: v1
75 kind: Role
76 metadata:
77 name: myRole
78 `)
79 th.WriteF("base/deployment.yaml", `
80 apiVersion: v1
81 kind: Deployment
82 metadata:
83 name: myDep
84 `)
85 th.WriteK("prod", `
86 namePrefix: p-
87 resources:
88 - ../base
89 - service.yaml
90 - namespace.yaml
91 buildMetadata: [originAnnotations]
92 `)
93 th.WriteF("prod/service.yaml", `
94 apiVersion: v1
95 kind: Service
96 metadata:
97 name: myService2
98 `)
99 th.WriteF("prod/namespace.yaml", `
100 apiVersion: v1
101 kind: Namespace
102 metadata:
103 name: myNs2
104 `)
105 m := th.Run("prod", th.MakeDefaultOptions())
106 th.AssertActualEqualsExpected(m, `
107 apiVersion: v1
108 kind: Namespace
109 metadata:
110 annotations:
111 config.kubernetes.io/origin: |
112 path: ../base/namespace.yaml
113 name: myNs
114 ---
115 apiVersion: v1
116 kind: Role
117 metadata:
118 annotations:
119 config.kubernetes.io/origin: |
120 path: ../base/role.yaml
121 name: p-b-myRole
122 ---
123 apiVersion: v1
124 kind: Service
125 metadata:
126 annotations:
127 config.kubernetes.io/origin: |
128 path: ../base/service.yaml
129 name: p-b-myService
130 ---
131 apiVersion: v1
132 kind: Deployment
133 metadata:
134 annotations:
135 config.kubernetes.io/origin: |
136 path: ../base/deployment.yaml
137 name: p-b-myDep
138 ---
139 apiVersion: v1
140 kind: Service
141 metadata:
142 annotations:
143 config.kubernetes.io/origin: |
144 path: service.yaml
145 name: p-myService2
146 ---
147 apiVersion: v1
148 kind: Namespace
149 metadata:
150 annotations:
151 config.kubernetes.io/origin: |
152 path: namespace.yaml
153 name: myNs2
154 `)
155 }
156
157
158
159 func TestGeneratorWithAnnoOrigin(t *testing.T) {
160 th := kusttest_test.MakeHarness(t)
161 th.WriteK(".", `
162 namePrefix: blah-
163 configMapGenerator:
164 - name: bob
165 literals:
166 - fruit=apple
167 - vegetable=broccoli
168 envs:
169 - foo.env
170 env: bar.env
171 files:
172 - passphrase=phrase.dat
173 - forces.txt
174 - name: json
175 literals:
176 - 'v2=[{"path": "var/druid/segment-cache"}]'
177 - >-
178 druid_segmentCache_locations=[{"path":
179 "var/druid/segment-cache",
180 "maxSize": 32000000000,
181 "freeSpacePercent": 1.0}]
182 secretGenerator:
183 - name: bob
184 literals:
185 - fruit=apple
186 - vegetable=broccoli
187 envs:
188 - foo.env
189 files:
190 - passphrase=phrase.dat
191 - forces.txt
192 env: bar.env
193 buildMetadata: [originAnnotations]
194 `)
195 th.WriteF("foo.env", `
196 MOUNTAIN=everest
197 OCEAN=pacific
198 `)
199 th.WriteF("bar.env", `
200 BIRD=falcon
201 `)
202 th.WriteF("phrase.dat", `
203 Life is short.
204 But the years are long.
205 Not while the evil days come not.
206 `)
207 th.WriteF("forces.txt", `
208 gravitational
209 electromagnetic
210 strong nuclear
211 weak nuclear
212 `)
213 opts := th.MakeDefaultOptions()
214 m := th.Run(".", opts)
215 th.AssertActualEqualsExpected(
216 m, `
217 apiVersion: v1
218 data:
219 BIRD: falcon
220 MOUNTAIN: everest
221 OCEAN: pacific
222 forces.txt: |2
223
224 gravitational
225 electromagnetic
226 strong nuclear
227 weak nuclear
228 fruit: apple
229 passphrase: |2
230
231 Life is short.
232 But the years are long.
233 Not while the evil days come not.
234 vegetable: broccoli
235 kind: ConfigMap
236 metadata:
237 annotations:
238 config.kubernetes.io/origin: |
239 configuredIn: kustomization.yaml
240 configuredBy:
241 apiVersion: builtin
242 kind: ConfigMapGenerator
243 name: blah-bob-g9df72cd5b
244 ---
245 apiVersion: v1
246 data:
247 druid_segmentCache_locations: '[{"path": "var/druid/segment-cache", "maxSize": 32000000000,
248 "freeSpacePercent": 1.0}]'
249 v2: '[{"path": "var/druid/segment-cache"}]'
250 kind: ConfigMap
251 metadata:
252 annotations:
253 config.kubernetes.io/origin: |
254 configuredIn: kustomization.yaml
255 configuredBy:
256 apiVersion: builtin
257 kind: ConfigMapGenerator
258 name: blah-json-m8529t979f
259 ---
260 apiVersion: v1
261 data:
262 BIRD: ZmFsY29u
263 MOUNTAIN: ZXZlcmVzdA==
264 OCEAN: cGFjaWZpYw==
265 forces.txt: |
266 CmdyYXZpdGF0aW9uYWwKZWxlY3Ryb21hZ25ldGljCnN0cm9uZyBudWNsZWFyCndlYWsgbn
267 VjbGVhcgo=
268 fruit: YXBwbGU=
269 passphrase: |
270 CkxpZmUgaXMgc2hvcnQuCkJ1dCB0aGUgeWVhcnMgYXJlIGxvbmcuCk5vdCB3aGlsZSB0aG
271 UgZXZpbCBkYXlzIGNvbWUgbm90Lgo=
272 vegetable: YnJvY2NvbGk=
273 kind: Secret
274 metadata:
275 annotations:
276 config.kubernetes.io/origin: |
277 configuredIn: kustomization.yaml
278 configuredBy:
279 apiVersion: builtin
280 kind: SecretGenerator
281 name: blah-bob-58g62h555c
282 type: Opaque
283 `)
284 }
285
286 func TestAnnoOriginLocalBuiltinGenerator(t *testing.T) {
287 th := kusttest_test.MakeHarness(t)
288 th.WriteK(".", `
289 resources:
290 - service.yaml
291 configMapGenerator:
292 - name: bob
293 literals:
294 - fruit=Indian Gooseberry
295 - year=2020
296 - crisis=true
297 buildMetadata: [originAnnotations]
298
299 `)
300 th.WriteF("service.yaml", `
301 apiVersion: v1
302 kind: Service
303 metadata:
304 name: demo
305 spec:
306 clusterIP: None
307 `)
308 m := th.Run(".", th.MakeDefaultOptions())
309 th.AssertActualEqualsExpected(
310 m, `
311 apiVersion: v1
312 kind: Service
313 metadata:
314 annotations:
315 config.kubernetes.io/origin: |
316 path: service.yaml
317 name: demo
318 spec:
319 clusterIP: None
320 ---
321 apiVersion: v1
322 data:
323 crisis: "true"
324 fruit: Indian Gooseberry
325 year: "2020"
326 kind: ConfigMap
327 metadata:
328 annotations:
329 config.kubernetes.io/origin: |
330 configuredIn: kustomization.yaml
331 configuredBy:
332 apiVersion: builtin
333 kind: ConfigMapGenerator
334 name: bob-79t79mt227
335 `)
336 }
337
338 func TestAnnoOriginConfigMapGeneratorMerge(t *testing.T) {
339 th := kusttest_test.MakeHarness(t)
340 th.WriteK("base", `
341 configMapGenerator:
342 - name: bob
343 literals:
344 - fruit=Indian Gooseberry
345 - year=2020
346 - crisis=true
347 `)
348 th.WriteK("overlay", `
349 resources:
350 - ../base
351 configMapGenerator:
352 - name: bob
353 behavior: merge
354 literals:
355 - month=12
356 buildMetadata: [originAnnotations]
357 `)
358 m := th.Run("overlay", th.MakeDefaultOptions())
359 th.AssertActualEqualsExpected(m, `apiVersion: v1
360 data:
361 crisis: "true"
362 fruit: Indian Gooseberry
363 month: "12"
364 year: "2020"
365 kind: ConfigMap
366 metadata:
367 annotations:
368 config.kubernetes.io/origin: |
369 configuredIn: ../base/kustomization.yaml
370 configuredBy:
371 apiVersion: builtin
372 kind: ConfigMapGenerator
373 name: bob-bk46gm59c6
374 `)
375 }
376
377 func TestAnnoOriginConfigMapGeneratorReplace(t *testing.T) {
378 th := kusttest_test.MakeHarness(t)
379 th.WriteK("base", `
380 configMapGenerator:
381 - name: bob
382 literals:
383 - fruit=Indian Gooseberry
384 - year=2020
385 - crisis=true
386 `)
387 th.WriteK("overlay", `
388 resources:
389 - ../base
390 configMapGenerator:
391 - name: bob
392 behavior: replace
393 literals:
394 - month=12
395 buildMetadata: [originAnnotations]
396 `)
397 m := th.Run("overlay", th.MakeDefaultOptions())
398 th.AssertActualEqualsExpected(m, `apiVersion: v1
399 data:
400 month: "12"
401 kind: ConfigMap
402 metadata:
403 annotations:
404 config.kubernetes.io/origin: |
405 configuredIn: kustomization.yaml
406 configuredBy:
407 apiVersion: builtin
408 kind: ConfigMapGenerator
409 name: bob-f8t5fhtbhc
410 `)
411 }
412
413 func TestAnnoOriginCustomExecGenerator(t *testing.T) {
414 fSys := filesys.MakeFsOnDisk()
415
416 th := kusttest_test.MakeHarnessWithFs(t, fSys)
417 o := th.MakeOptionsPluginsEnabled()
418 o.PluginConfig.FnpLoadingOptions.EnableExec = true
419
420 tmpDir, err := filesys.NewTmpConfirmedDir()
421 require.NoError(t, err)
422 th.WriteK(tmpDir.String(), `
423 resources:
424 - short_secret.yaml
425 generators:
426 - gener.yaml
427 buildMetadata: [originAnnotations]
428 `)
429
430
431 th.WriteF(filepath.Join(tmpDir.String(), "short_secret.yaml"),
432 `
433 apiVersion: v1
434 kind: Secret
435 metadata:
436 labels:
437 airshipit.org/ephemeral-user-data: "true"
438 name: node1-bmc-secret
439 type: Opaque
440 stringData:
441 userData: |
442 bootcmd:
443 - mkdir /mnt/vda
444 `)
445 th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
446
447 require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
448 th.WriteF(filepath.Join(tmpDir.String(), "gener.yaml"), `
449 kind: executable
450 metadata:
451 name: demo
452 annotations:
453 config.kubernetes.io/function: |
454 exec:
455 path: ./generateDeployment.sh
456 spec:
457 `)
458
459 m := th.Run(tmpDir.String(), o)
460 require.NoError(t, err)
461 yml, err := m.AsYaml()
462 require.NoError(t, err)
463 assert.Equal(t, `apiVersion: v1
464 kind: Secret
465 metadata:
466 annotations:
467 config.kubernetes.io/origin: |
468 path: short_secret.yaml
469 labels:
470 airshipit.org/ephemeral-user-data: "true"
471 name: node1-bmc-secret
472 stringData:
473 userData: |
474 bootcmd:
475 - mkdir /mnt/vda
476 type: Opaque
477 ---
478 apiVersion: apps/v1
479 kind: Deployment
480 metadata:
481 annotations:
482 config.kubernetes.io/origin: |
483 configuredIn: gener.yaml
484 configuredBy:
485 kind: executable
486 name: demo
487 tshirt-size: small
488 labels:
489 app: nginx
490 name: nginx
491 spec:
492 selector:
493 matchLabels:
494 app: nginx
495 template:
496 metadata:
497 labels:
498 app: nginx
499 spec:
500 containers:
501 - image: nginx
502 name: nginx
503 `, string(yml))
504 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
505 }
506
507 func TestAnnoOriginCustomInlineExecGenerator(t *testing.T) {
508 fSys := filesys.MakeFsOnDisk()
509
510 th := kusttest_test.MakeHarnessWithFs(t, fSys)
511 o := th.MakeOptionsPluginsEnabled()
512 o.PluginConfig.FnpLoadingOptions.EnableExec = true
513
514 tmpDir, err := filesys.NewTmpConfirmedDir()
515 require.NoError(t, err)
516 th.WriteK(tmpDir.String(), `
517 resources:
518 - short_secret.yaml
519 generators:
520 - |-
521 kind: executable
522 metadata:
523 name: demo
524 annotations:
525 config.kubernetes.io/function: |
526 exec:
527 path: ./generateDeployment.sh
528 spec:
529 buildMetadata: [originAnnotations]
530 `)
531
532
533 th.WriteF(filepath.Join(tmpDir.String(), "short_secret.yaml"),
534 `
535 apiVersion: v1
536 kind: Secret
537 metadata:
538 labels:
539 airshipit.org/ephemeral-user-data: "true"
540 name: node1-bmc-secret
541 type: Opaque
542 stringData:
543 userData: |
544 bootcmd:
545 - mkdir /mnt/vda
546 `)
547 th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
548 require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
549 m := th.Run(tmpDir.String(), o)
550 require.NoError(t, err)
551 yml, err := m.AsYaml()
552 require.NoError(t, err)
553 assert.Equal(t, `apiVersion: v1
554 kind: Secret
555 metadata:
556 annotations:
557 config.kubernetes.io/origin: |
558 path: short_secret.yaml
559 labels:
560 airshipit.org/ephemeral-user-data: "true"
561 name: node1-bmc-secret
562 stringData:
563 userData: |
564 bootcmd:
565 - mkdir /mnt/vda
566 type: Opaque
567 ---
568 apiVersion: apps/v1
569 kind: Deployment
570 metadata:
571 annotations:
572 config.kubernetes.io/origin: |
573 configuredIn: kustomization.yaml
574 configuredBy:
575 kind: executable
576 name: demo
577 tshirt-size: small
578 labels:
579 app: nginx
580 name: nginx
581 spec:
582 selector:
583 matchLabels:
584 app: nginx
585 template:
586 metadata:
587 labels:
588 app: nginx
589 spec:
590 containers:
591 - image: nginx
592 name: nginx
593 `, string(yml))
594 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
595 }
596
597 func TestAnnoOriginCustomExecGeneratorWithOverlay(t *testing.T) {
598 fSys := filesys.MakeFsOnDisk()
599
600 th := kusttest_test.MakeHarnessWithFs(t, fSys)
601 o := th.MakeOptionsPluginsEnabled()
602 o.PluginConfig.FnpLoadingOptions.EnableExec = true
603
604 tmpDir, err := filesys.NewTmpConfirmedDir()
605 require.NoError(t, err)
606 base := filepath.Join(tmpDir.String(), "base")
607 prod := filepath.Join(tmpDir.String(), "prod")
608 require.NoError(t, fSys.Mkdir(base))
609 require.NoError(t, fSys.Mkdir(prod))
610 th.WriteK(base, `
611 resources:
612 - short_secret.yaml
613 generators:
614 - gener.yaml
615 `)
616 th.WriteK(prod, `
617 resources:
618 - ../base
619 buildMetadata: [originAnnotations]
620 `)
621 th.WriteF(filepath.Join(base, "short_secret.yaml"),
622 `
623 apiVersion: v1
624 kind: Secret
625 metadata:
626 labels:
627 airshipit.org/ephemeral-user-data: "true"
628 name: node1-bmc-secret
629 type: Opaque
630 stringData:
631 userData: |
632 bootcmd:
633 - mkdir /mnt/vda
634 `)
635 th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
636
637 require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
638 th.WriteF(filepath.Join(base, "gener.yaml"), `
639 kind: executable
640 metadata:
641 name: demo
642 annotations:
643 config.kubernetes.io/function: |
644 exec:
645 path: ./generateDeployment.sh
646 spec:
647 `)
648
649 m := th.Run(prod, o)
650 require.NoError(t, err)
651 yml, err := m.AsYaml()
652 require.NoError(t, err)
653 assert.Equal(t, `apiVersion: v1
654 kind: Secret
655 metadata:
656 annotations:
657 config.kubernetes.io/origin: |
658 path: ../base/short_secret.yaml
659 labels:
660 airshipit.org/ephemeral-user-data: "true"
661 name: node1-bmc-secret
662 stringData:
663 userData: |
664 bootcmd:
665 - mkdir /mnt/vda
666 type: Opaque
667 ---
668 apiVersion: apps/v1
669 kind: Deployment
670 metadata:
671 annotations:
672 config.kubernetes.io/origin: |
673 configuredIn: ../base/gener.yaml
674 configuredBy:
675 kind: executable
676 name: demo
677 tshirt-size: small
678 labels:
679 app: nginx
680 name: nginx
681 spec:
682 selector:
683 matchLabels:
684 app: nginx
685 template:
686 metadata:
687 labels:
688 app: nginx
689 spec:
690 containers:
691 - image: nginx
692 name: nginx
693 `, string(yml))
694 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
695 }
696
697 func TestAnnoOriginCustomInlineExecGeneratorWithOverlay(t *testing.T) {
698 fSys := filesys.MakeFsOnDisk()
699
700 th := kusttest_test.MakeHarnessWithFs(t, fSys)
701 o := th.MakeOptionsPluginsEnabled()
702 o.PluginConfig.FnpLoadingOptions.EnableExec = true
703
704 tmpDir, err := filesys.NewTmpConfirmedDir()
705 require.NoError(t, err)
706 base := filepath.Join(tmpDir.String(), "base")
707 prod := filepath.Join(tmpDir.String(), "prod")
708 require.NoError(t, fSys.Mkdir(base))
709 require.NoError(t, fSys.Mkdir(prod))
710 th.WriteK(base, `
711 resources:
712 - short_secret.yaml
713 generators:
714 - |-
715 kind: executable
716 metadata:
717 name: demo
718 annotations:
719 config.kubernetes.io/function: |
720 exec:
721 path: ./generateDeployment.sh
722 spec:
723 `)
724 th.WriteK(prod, `
725 resources:
726 - ../base
727 buildMetadata: [originAnnotations]
728 `)
729 th.WriteF(filepath.Join(base, "short_secret.yaml"),
730 `
731 apiVersion: v1
732 kind: Secret
733 metadata:
734 labels:
735 airshipit.org/ephemeral-user-data: "true"
736 name: node1-bmc-secret
737 type: Opaque
738 stringData:
739 userData: |
740 bootcmd:
741 - mkdir /mnt/vda
742 `)
743 th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
744 require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
745 m := th.Run(prod, o)
746 require.NoError(t, err)
747 yml, err := m.AsYaml()
748 require.NoError(t, err)
749 assert.Equal(t, `apiVersion: v1
750 kind: Secret
751 metadata:
752 annotations:
753 config.kubernetes.io/origin: |
754 path: ../base/short_secret.yaml
755 labels:
756 airshipit.org/ephemeral-user-data: "true"
757 name: node1-bmc-secret
758 stringData:
759 userData: |
760 bootcmd:
761 - mkdir /mnt/vda
762 type: Opaque
763 ---
764 apiVersion: apps/v1
765 kind: Deployment
766 metadata:
767 annotations:
768 config.kubernetes.io/origin: |
769 configuredIn: ../base/kustomization.yaml
770 configuredBy:
771 kind: executable
772 name: demo
773 tshirt-size: small
774 labels:
775 app: nginx
776 name: nginx
777 spec:
778 selector:
779 matchLabels:
780 app: nginx
781 template:
782 metadata:
783 labels:
784 app: nginx
785 spec:
786 containers:
787 - image: nginx
788 name: nginx
789 `, string(yml))
790 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
791 }
792
793 func TestAnnoOriginRemoteBuiltinGenerator(t *testing.T) {
794 fSys := filesys.MakeFsOnDisk()
795 b := krusty.MakeKustomizer(krusty.MakeDefaultOptions())
796 tmpDir, err := filesys.NewTmpConfirmedDir()
797 require.NoError(t, err)
798 require.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(`
799 resources:
800 - github.com/kubernetes-sigs/kustomize/examples/ldap/base/?ref=v1.0.6
801 buildMetadata: [originAnnotations]
802 `)))
803 m, err := b.Run(
804 fSys,
805 tmpDir.String())
806 if utils.IsErrTimeout(err) {
807
808 t.SkipNow()
809 }
810 if !assert.NoError(t, err) {
811 t.FailNow()
812 }
813 yml, err := m.AsYaml()
814 require.NoError(t, err)
815 assert.Contains(t, string(yml), `kind: ConfigMap
816 metadata:
817 annotations:
818 config.kubernetes.io/origin: |
819 repo: https://github.com/kubernetes-sigs/kustomize
820 ref: v1.0.6
821 configuredIn: examples/ldap/base/kustomization.yaml
822 configuredBy:
823 apiVersion: builtin
824 kind: ConfigMapGenerator
825 name: ldap-configmap-4d7m6k5b42`)
826 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
827 }
828
829 func TestAnnoOriginInlineBuiltinGenerator(t *testing.T) {
830 th := kusttest_test.MakeHarness(t)
831 th.WriteK(".", `
832 resources:
833 - service.yaml
834 generators:
835 - |-
836 apiVersion: builtin
837 kind: ConfigMapGenerator
838 metadata:
839 name: notImportantHere
840 name: bob
841 literals:
842 - fruit=Indian Gooseberry
843 - year=2020
844 - crisis=true
845 buildMetadata: [originAnnotations]
846 `)
847
848 th.WriteF("service.yaml", `
849 apiVersion: v1
850 kind: Service
851 metadata:
852 name: apple
853 `)
854 m := th.Run(".", th.MakeDefaultOptions())
855 th.AssertActualEqualsExpected(m, `
856 apiVersion: v1
857 kind: Service
858 metadata:
859 annotations:
860 config.kubernetes.io/origin: |
861 path: service.yaml
862 name: apple
863 ---
864 apiVersion: v1
865 data:
866 crisis: "true"
867 fruit: Indian Gooseberry
868 year: "2020"
869 kind: ConfigMap
870 metadata:
871 annotations:
872 config.kubernetes.io/origin: |
873 configuredIn: kustomization.yaml
874 configuredBy:
875 apiVersion: builtin
876 kind: ConfigMapGenerator
877 name: notImportantHere
878 name: bob-79t79mt227
879 `)
880 }
881
882 func TestAnnoOriginGeneratorFromFile(t *testing.T) {
883 th := kusttest_test.MakeHarness(t)
884 th.WriteK(".", `
885 resources:
886 - service.yaml
887 generators:
888 - configmap.yaml
889 buildMetadata: [originAnnotations]
890 `)
891 th.WriteF("configmap.yaml", `
892 apiVersion: builtin
893 kind: ConfigMapGenerator
894 metadata:
895 name: notImportantHere
896 name: bob
897 literals:
898 - fruit=Indian Gooseberry
899 - year=2020
900 - crisis=true
901 `)
902 th.WriteF("service.yaml", `
903 apiVersion: v1
904 kind: Service
905 metadata:
906 name: apple
907 `)
908 m := th.Run(".", th.MakeDefaultOptions())
909 th.AssertActualEqualsExpected(m, `
910 apiVersion: v1
911 kind: Service
912 metadata:
913 annotations:
914 config.kubernetes.io/origin: |
915 path: service.yaml
916 name: apple
917 ---
918 apiVersion: v1
919 data:
920 crisis: "true"
921 fruit: Indian Gooseberry
922 year: "2020"
923 kind: ConfigMap
924 metadata:
925 annotations:
926 config.kubernetes.io/origin: |
927 configuredIn: configmap.yaml
928 configuredBy:
929 apiVersion: builtin
930 kind: ConfigMapGenerator
931 name: notImportantHere
932 name: bob-79t79mt227
933 `)
934 }
935
936 func TestAnnoOriginBuiltinGeneratorFromFileWithOverlay(t *testing.T) {
937 th := kusttest_test.MakeHarness(t)
938 th.WriteK("base", `
939 resources:
940 - short_secret.yaml
941 generators:
942 - configmap.yaml
943 `)
944 th.WriteF("base/configmap.yaml", `apiVersion: builtin
945 kind: ConfigMapGenerator
946 metadata:
947 name: notImportantHere
948 name: bob
949 literals:
950 - fruit=Indian Gooseberry
951 - year=2020
952 - crisis=true
953 `)
954 th.WriteK("prod", `
955 resources:
956 - ../base
957 buildMetadata: [originAnnotations]
958 `)
959 th.WriteF("base/short_secret.yaml",
960 `
961 apiVersion: v1
962 kind: Secret
963 metadata:
964 labels:
965 airshipit.org/ephemeral-user-data: "true"
966 name: node1-bmc-secret
967 type: Opaque
968 stringData:
969 userData: |
970 bootcmd:
971 - mkdir /mnt/vda
972 `)
973 m := th.Run("prod", th.MakeDefaultOptions())
974 th.AssertActualEqualsExpected(m, `apiVersion: v1
975 kind: Secret
976 metadata:
977 annotations:
978 config.kubernetes.io/origin: |
979 path: ../base/short_secret.yaml
980 labels:
981 airshipit.org/ephemeral-user-data: "true"
982 name: node1-bmc-secret
983 stringData:
984 userData: |
985 bootcmd:
986 - mkdir /mnt/vda
987 type: Opaque
988 ---
989 apiVersion: v1
990 data:
991 crisis: "true"
992 fruit: Indian Gooseberry
993 year: "2020"
994 kind: ConfigMap
995 metadata:
996 annotations:
997 config.kubernetes.io/origin: |
998 configuredIn: ../base/configmap.yaml
999 configuredBy:
1000 apiVersion: builtin
1001 kind: ConfigMapGenerator
1002 name: notImportantHere
1003 name: bob-79t79mt227
1004 `)
1005 }
1006
1007 func TestAnnoOriginGeneratorInTransformersField(t *testing.T) {
1008 fSys := filesys.MakeFsOnDisk()
1009
1010 th := kusttest_test.MakeHarnessWithFs(t, fSys)
1011 o := th.MakeOptionsPluginsEnabled()
1012 o.PluginConfig.FnpLoadingOptions.EnableExec = true
1013
1014 tmpDir, err := filesys.NewTmpConfirmedDir()
1015 require.NoError(t, err)
1016 th.WriteK(tmpDir.String(), `
1017 transformers:
1018 - gener.yaml
1019 buildMetadata: [originAnnotations]
1020 `)
1021
1022 th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
1023
1024 require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
1025 th.WriteF(filepath.Join(tmpDir.String(), "gener.yaml"), `
1026 kind: executable
1027 metadata:
1028 name: demo
1029 annotations:
1030 config.kubernetes.io/function: |
1031 exec:
1032 path: ./generateDeployment.sh
1033 spec:
1034 `)
1035
1036 m := th.Run(tmpDir.String(), o)
1037 require.NoError(t, err)
1038 yml, err := m.AsYaml()
1039 require.NoError(t, err)
1040 assert.Equal(t, `apiVersion: apps/v1
1041 kind: Deployment
1042 metadata:
1043 annotations:
1044 config.kubernetes.io/origin: |
1045 configuredIn: gener.yaml
1046 configuredBy:
1047 kind: executable
1048 name: demo
1049 tshirt-size: small
1050 labels:
1051 app: nginx
1052 name: nginx
1053 spec:
1054 selector:
1055 matchLabels:
1056 app: nginx
1057 template:
1058 metadata:
1059 labels:
1060 app: nginx
1061 spec:
1062 containers:
1063 - image: nginx
1064 name: nginx
1065 `, string(yml))
1066 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
1067 }
1068
1069 func TestAnnoOriginGeneratorInTransformersFieldWithOverlay(t *testing.T) {
1070 fSys := filesys.MakeFsOnDisk()
1071
1072 th := kusttest_test.MakeHarnessWithFs(t, fSys)
1073 o := th.MakeOptionsPluginsEnabled()
1074 o.PluginConfig.FnpLoadingOptions.EnableExec = true
1075
1076 tmpDir, err := filesys.NewTmpConfirmedDir()
1077 require.NoError(t, err)
1078 base := filepath.Join(tmpDir.String(), "base")
1079 prod := filepath.Join(tmpDir.String(), "prod")
1080 require.NoError(t, fSys.Mkdir(base))
1081 require.NoError(t, fSys.Mkdir(prod))
1082
1083 th.WriteK(base, `
1084 transformers:
1085 - gener.yaml
1086 `)
1087
1088 th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
1089
1090 require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
1091 th.WriteF(filepath.Join(base, "gener.yaml"), `
1092 kind: executable
1093 metadata:
1094 name: demo
1095 annotations:
1096 config.kubernetes.io/function: |
1097 exec:
1098 path: ./generateDeployment.sh
1099 spec:
1100 `)
1101 th.WriteK(prod, `
1102 resources:
1103 - ../base
1104 nameSuffix: -foo
1105 buildMetadata: [originAnnotations, transformerAnnotations]
1106 `)
1107
1108 m := th.Run(prod, o)
1109 require.NoError(t, err)
1110 yml, err := m.AsYaml()
1111 require.NoError(t, err)
1112 assert.Equal(t, `apiVersion: apps/v1
1113 kind: Deployment
1114 metadata:
1115 annotations:
1116 alpha.config.kubernetes.io/transformations: |
1117 - configuredIn: kustomization.yaml
1118 configuredBy:
1119 apiVersion: builtin
1120 kind: SuffixTransformer
1121 config.kubernetes.io/origin: |
1122 configuredIn: ../base/gener.yaml
1123 configuredBy:
1124 kind: executable
1125 name: demo
1126 tshirt-size: small
1127 labels:
1128 app: nginx
1129 name: nginx-foo
1130 spec:
1131 selector:
1132 matchLabels:
1133 app: nginx
1134 template:
1135 metadata:
1136 labels:
1137 app: nginx
1138 spec:
1139 containers:
1140 - image: nginx
1141 name: nginx
1142 `, string(yml))
1143 require.NoError(t, fSys.RemoveAll(tmpDir.String()))
1144 }
1145
View as plain text