1
2
3
4 package krusty_test
5
6 import (
7 "strings"
8 "testing"
9
10 . "sigs.k8s.io/kustomize/api/krusty"
11 kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
12 "sigs.k8s.io/kustomize/api/types"
13 )
14
15 func TestOrderPreserved(t *testing.T) {
16 th := kusttest_test.MakeHarness(t)
17 th.WriteK("base", `
18 namePrefix: b-
19 resources:
20 - namespace.yaml
21 - role.yaml
22 - service.yaml
23 - deployment.yaml
24 `)
25 th.WriteF("base/service.yaml", `
26 apiVersion: v1
27 kind: Service
28 metadata:
29 name: myService
30 `)
31 th.WriteF("base/namespace.yaml", `
32 apiVersion: v1
33 kind: Namespace
34 metadata:
35 name: myNs
36 `)
37 th.WriteF("base/role.yaml", `
38 apiVersion: v1
39 kind: Role
40 metadata:
41 name: myRole
42 `)
43 th.WriteF("base/deployment.yaml", `
44 apiVersion: v1
45 kind: Deployment
46 metadata:
47 name: myDep
48 `)
49 th.WriteK("prod", `
50 namePrefix: p-
51 resources:
52 - ../base
53 - service.yaml
54 - namespace.yaml
55 `)
56 th.WriteF("prod/service.yaml", `
57 apiVersion: v1
58 kind: Service
59 metadata:
60 name: myService2
61 `)
62 th.WriteF("prod/namespace.yaml", `
63 apiVersion: v1
64 kind: Namespace
65 metadata:
66 name: myNs2
67 `)
68 m := th.Run("prod", th.MakeDefaultOptions())
69 th.AssertActualEqualsExpected(m, `
70 apiVersion: v1
71 kind: Namespace
72 metadata:
73 name: myNs
74 ---
75 apiVersion: v1
76 kind: Role
77 metadata:
78 name: p-b-myRole
79 ---
80 apiVersion: v1
81 kind: Service
82 metadata:
83 name: p-b-myService
84 ---
85 apiVersion: v1
86 kind: Deployment
87 metadata:
88 name: p-b-myDep
89 ---
90 apiVersion: v1
91 kind: Service
92 metadata:
93 name: p-myService2
94 ---
95 apiVersion: v1
96 kind: Namespace
97 metadata:
98 name: myNs2
99 `)
100 }
101
102 func TestBaseInResourceList(t *testing.T) {
103 th := kusttest_test.MakeHarness(t)
104 th.WriteK("prod", `
105 namePrefix: b-
106 resources:
107 - ../base
108 `)
109 th.WriteK("base", `
110 namePrefix: a-
111 resources:
112 - service.yaml
113 `)
114 th.WriteF("base/service.yaml", `
115 apiVersion: v1
116 kind: Service
117 metadata:
118 name: myService
119 spec:
120 selector:
121 backend: bungie
122 `)
123 m := th.Run("prod", th.MakeDefaultOptions())
124 th.AssertActualEqualsExpected(m, `
125 apiVersion: v1
126 kind: Service
127 metadata:
128 name: b-a-myService
129 spec:
130 selector:
131 backend: bungie
132 `)
133 }
134
135 func TestTinyOverlay(t *testing.T) {
136 th := kusttest_test.MakeHarness(t)
137 th.WriteK("base", `
138 namePrefix: a-
139 resources:
140 - deployment.yaml
141 `)
142 th.WriteF("base/deployment.yaml", `
143 apiVersion: apps/v1
144 kind: Deployment
145 metadata:
146 name: myDeployment
147 spec:
148 template:
149 spec:
150 containers:
151 - image: whatever
152 `)
153 th.WriteK("overlay", `
154 namePrefix: b-
155 resources:
156 - ../base
157 patchesStrategicMerge:
158 - depPatch.yaml
159 `)
160 th.WriteF("overlay/depPatch.yaml", `
161 apiVersion: apps/v1
162 kind: Deployment
163 metadata:
164 name: myDeployment
165 spec:
166 replicas: 999
167 `)
168 m := th.Run("overlay", th.MakeDefaultOptions())
169 th.AssertActualEqualsExpected(m, `
170 apiVersion: apps/v1
171 kind: Deployment
172 metadata:
173 name: b-a-myDeployment
174 spec:
175 replicas: 999
176 template:
177 spec:
178 containers:
179 - image: whatever
180 `)
181 }
182
183 func writeSmallBase(th kusttest_test.Harness) {
184 th.WriteK("base", `
185 namePrefix: a-
186 commonLabels:
187 app: myApp
188 resources:
189 - deployment.yaml
190 - service.yaml
191 `)
192 th.WriteF("base/service.yaml", `
193 apiVersion: v1
194 kind: Service
195 metadata:
196 name: myService
197 spec:
198 selector:
199 backend: bungie
200 ports:
201 - port: 7002
202 `)
203 th.WriteF("base/deployment.yaml", `
204 apiVersion: apps/v1
205 kind: Deployment
206 metadata:
207 name: myDeployment
208 spec:
209 template:
210 metadata:
211 labels:
212 backend: awesome
213 spec:
214 containers:
215 - name: whatever
216 image: whatever
217 `)
218 }
219
220 func TestSmallBase(t *testing.T) {
221 th := kusttest_test.MakeHarness(t)
222 writeSmallBase(th)
223 m := th.Run("base", th.MakeDefaultOptions())
224 th.AssertActualEqualsExpected(m, `
225 apiVersion: apps/v1
226 kind: Deployment
227 metadata:
228 labels:
229 app: myApp
230 name: a-myDeployment
231 spec:
232 selector:
233 matchLabels:
234 app: myApp
235 template:
236 metadata:
237 labels:
238 app: myApp
239 backend: awesome
240 spec:
241 containers:
242 - image: whatever
243 name: whatever
244 ---
245 apiVersion: v1
246 kind: Service
247 metadata:
248 labels:
249 app: myApp
250 name: a-myService
251 spec:
252 ports:
253 - port: 7002
254 selector:
255 app: myApp
256 backend: bungie
257 `)
258 }
259
260 func TestSmallOverlay(t *testing.T) {
261 th := kusttest_test.MakeHarness(t)
262 writeSmallBase(th)
263 th.WriteK("overlay", `
264 namePrefix: b-
265 commonLabels:
266 env: prod
267 quotedFruit: "peach"
268 quotedBoolean: "true"
269 resources:
270 - ../base
271 patchesStrategicMerge:
272 - deployment/deployment.yaml
273 images:
274 - name: whatever
275 newTag: 1.8.0
276 `)
277
278 th.WriteF("overlay/configmap/app.env", `
279 DB_USERNAME=admin
280 DB_PASSWORD=somepw
281 `)
282 th.WriteF("overlay/configmap/app-init.ini", `
283 FOO=bar
284 BAR=baz
285 `)
286 th.WriteF("overlay/deployment/deployment.yaml", `
287 apiVersion: apps/v1
288 kind: Deployment
289 metadata:
290 name: myDeployment
291 spec:
292 replicas: 1000
293 `)
294 m := th.Run("overlay", th.MakeDefaultOptions())
295 th.AssertActualEqualsExpected(m, `
296 apiVersion: apps/v1
297 kind: Deployment
298 metadata:
299 labels:
300 app: myApp
301 env: prod
302 quotedBoolean: "true"
303 quotedFruit: peach
304 name: b-a-myDeployment
305 spec:
306 replicas: 1000
307 selector:
308 matchLabels:
309 app: myApp
310 env: prod
311 quotedBoolean: "true"
312 quotedFruit: peach
313 template:
314 metadata:
315 labels:
316 app: myApp
317 backend: awesome
318 env: prod
319 quotedBoolean: "true"
320 quotedFruit: peach
321 spec:
322 containers:
323 - image: whatever:1.8.0
324 name: whatever
325 ---
326 apiVersion: v1
327 kind: Service
328 metadata:
329 labels:
330 app: myApp
331 env: prod
332 quotedBoolean: "true"
333 quotedFruit: peach
334 name: b-a-myService
335 spec:
336 ports:
337 - port: 7002
338 selector:
339 app: myApp
340 backend: bungie
341 env: prod
342 quotedBoolean: "true"
343 quotedFruit: peach
344 `)
345 }
346
347 func TestSharedPatchDisAllowed(t *testing.T) {
348 th := kusttest_test.MakeHarness(t)
349 writeSmallBase(th)
350 th.WriteK("overlay", `
351 commonLabels:
352 env: prod
353 resources:
354 - ../base
355 patchesStrategicMerge:
356 - ../shared/deployment-patch.yaml
357 `)
358 th.WriteF("shared/deployment-patch.yaml", `
359 apiVersion: apps/v1
360 kind: Deployment
361 metadata:
362 name: myDeployment
363 spec:
364 replicas: 1000
365 `)
366 err := th.RunWithErr("overlay", func() Options {
367 o := th.MakeDefaultOptions()
368 o.LoadRestrictions = types.LoadRestrictionsRootOnly
369 return o
370 }())
371 if !strings.Contains(
372 err.Error(),
373 "security; file '/shared/deployment-patch.yaml' is not in or below '/overlay'") {
374 t.Fatalf("unexpected error: %s", err)
375 }
376 }
377
378 func TestSharedPatchAllowed(t *testing.T) {
379 th := kusttest_test.MakeHarness(t)
380 writeSmallBase(th)
381 th.WriteK("overlay", `
382 commonLabels:
383 env: prod
384 resources:
385 - ../base
386 patchesStrategicMerge:
387 - ../shared/deployment-patch.yaml
388 `)
389 th.WriteF("shared/deployment-patch.yaml", `
390 apiVersion: apps/v1
391 kind: Deployment
392 metadata:
393 name: myDeployment
394 spec:
395 replicas: 1000
396 `)
397 m := th.Run("overlay", func() Options {
398 o := th.MakeDefaultOptions()
399 o.LoadRestrictions = types.LoadRestrictionsNone
400 return o
401 }())
402 th.AssertActualEqualsExpected(m, `
403 apiVersion: apps/v1
404 kind: Deployment
405 metadata:
406 labels:
407 app: myApp
408 env: prod
409 name: a-myDeployment
410 spec:
411 replicas: 1000
412 selector:
413 matchLabels:
414 app: myApp
415 env: prod
416 template:
417 metadata:
418 labels:
419 app: myApp
420 backend: awesome
421 env: prod
422 spec:
423 containers:
424 - image: whatever
425 name: whatever
426 ---
427 apiVersion: v1
428 kind: Service
429 metadata:
430 labels:
431 app: myApp
432 env: prod
433 name: a-myService
434 spec:
435 ports:
436 - port: 7002
437 selector:
438 app: myApp
439 backend: bungie
440 env: prod
441 `)
442 }
443
444 func TestSmallOverlayJSONPatch(t *testing.T) {
445 th := kusttest_test.MakeHarness(t)
446 writeSmallBase(th)
447 th.WriteK("overlay", `
448 resources:
449 - ../base
450 patchesJson6902:
451 - target:
452 version: v1
453 kind: Service
454 name: a-myService
455 path: service-patch.yaml
456 `)
457
458 th.WriteF("overlay/service-patch.yaml", `
459 - op: add
460 path: /spec/selector/backend
461 value: beagle
462 `)
463 m := th.Run("overlay", th.MakeDefaultOptions())
464 th.AssertActualEqualsExpected(m, `
465 apiVersion: apps/v1
466 kind: Deployment
467 metadata:
468 labels:
469 app: myApp
470 name: a-myDeployment
471 spec:
472 selector:
473 matchLabels:
474 app: myApp
475 template:
476 metadata:
477 labels:
478 app: myApp
479 backend: awesome
480 spec:
481 containers:
482 - image: whatever
483 name: whatever
484 ---
485 apiVersion: v1
486 kind: Service
487 metadata:
488 labels:
489 app: myApp
490 name: a-myService
491 spec:
492 ports:
493 - port: 7002
494 selector:
495 app: myApp
496 backend: beagle
497 `)
498 }
499
View as plain text