...
1
2
3
4 package kio_test
5
6 import (
7 "bytes"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12 . "sigs.k8s.io/kustomize/kyaml/kio"
13 "sigs.k8s.io/kustomize/kyaml/yaml"
14 )
15
16 func TestPrinter_Write_Package_Structure(t *testing.T) {
17 in := `kind: Deployment
18 metadata:
19 labels:
20 app: nginx3
21 name: foo
22 namespace: default
23 annotations:
24 app: nginx3
25 config.kubernetes.io/path: foo-package/3/f3.yaml
26 spec:
27 replicas: 1
28 ---
29 kind: Deployment
30 metadata:
31 labels:
32 app: nginx2
33 name: foo
34 namespace: default
35 annotations:
36 app: nginx2
37 config.kubernetes.io/path: foo-package/f1.yaml
38 spec:
39 replicas: 1
40 ---
41 kind: Deployment
42 metadata:
43 labels:
44 app: nginx
45 annotations:
46 app: nginx
47 config.kubernetes.io/path: bar-package/f2.yaml
48 name: bar
49 spec:
50 replicas: 3
51 ---
52 kind: Service
53 metadata:
54 name: foo
55 namespace: default
56 annotations:
57 app: nginx
58 config.kubernetes.io/path: foo-package/f1.yaml
59 spec:
60 selector:
61 app: nginx
62 `
63 out := &bytes.Buffer{}
64 err := Pipeline{
65 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
66 Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
67 }.Execute()
68 if !assert.NoError(t, err) {
69 t.FailNow()
70 }
71
72 if !assert.Equal(t, `
73 ├── bar-package
74 │ └── [f2.yaml] Deployment bar
75 └── foo-package
76 ├── [f1.yaml] Deployment default/foo
77 ├── [f1.yaml] Service default/foo
78 └── 3
79 └── [f3.yaml] Deployment default/foo
80 `, out.String()) {
81 t.FailNow()
82 }
83 }
84
85 func TestPrinter_Write_Package_Structure_base(t *testing.T) {
86 in := `kind: Deployment
87 metadata:
88 labels:
89 app: nginx3
90 name: foo
91 namespace: default
92 annotations:
93 app: nginx3
94 config.kubernetes.io/path: f3.yaml
95 spec:
96 replicas: 1
97 ---
98 kind: Deployment
99 metadata:
100 labels:
101 app: nginx2
102 name: foo
103 namespace: default
104 annotations:
105 app: nginx2
106 config.kubernetes.io/path: foo-package/f1.yaml
107 spec:
108 replicas: 1
109 ---
110 kind: Deployment
111 metadata:
112 labels:
113 app: nginx
114 annotations:
115 app: nginx
116 config.kubernetes.io/package:
117 config.kubernetes.io/path: bar-package/f2.yaml
118 name: bar
119 spec:
120 replicas: 3
121 ---
122 kind: Service
123 metadata:
124 name: foo
125 namespace: default
126 annotations:
127 app: nginx
128 config.kubernetes.io/package: .
129 config.kubernetes.io/path: f1.yaml
130 spec:
131 selector:
132 app: nginx
133 `
134 out := &bytes.Buffer{}
135 err := Pipeline{
136 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
137 Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
138 }.Execute()
139 if !assert.NoError(t, err) {
140 t.FailNow()
141 }
142
143 if !assert.Equal(t, `
144 ├── [f1.yaml] Service default/foo
145 ├── [f3.yaml] Deployment default/foo
146 ├── bar-package
147 │ └── [f2.yaml] Deployment bar
148 └── foo-package
149 └── [f1.yaml] Deployment default/foo
150 `, out.String()) {
151 t.FailNow()
152 }
153 }
154
155 func TestPrinter_Write_Package_Structure_sort(t *testing.T) {
156 in := `apiVersion: extensions/v1
157 kind: Deployment
158 metadata:
159 labels:
160 app: nginx2
161 name: foo3
162 namespace: default
163 annotations:
164 app: nginx2
165 config.kubernetes.io/path: f1.yaml
166 spec:
167 replicas: 1
168 ---
169 apiVersion: extensions/v1
170 kind: Deployment
171 metadata:
172 labels:
173 app: nginx2
174 name: foo3
175 namespace: default
176 annotations:
177 app: nginx2
178 config.kubernetes.io/path: f1.yaml
179 spec:
180 replicas: 1
181 ---
182 apiVersion: apps/v1
183 kind: Deployment
184 metadata:
185 labels:
186 app: nginx2
187 name: foo3
188 namespace: default
189 annotations:
190 app: nginx2
191 config.kubernetes.io/path: f1.yaml
192 spec:
193 replicas: 1
194 ---
195 apiVersion: apps/v1
196 kind: Deployment
197 metadata:
198 labels:
199 app: nginx2
200 name: foo2
201 namespace: default2
202 annotations:
203 app: nginx2
204 config.kubernetes.io/path: f1.yaml
205 spec:
206 replicas: 1
207 ---
208 apiVersion: apps/v1
209 kind: Deployment
210 metadata:
211 labels:
212 app: nginx3
213 name: foo
214 namespace: default
215 annotations:
216 app: nginx3
217 config.kubernetes.io/path: f1.yaml
218 spec:
219 replicas: 1
220 ---
221 kind: Deployment
222 metadata:
223 labels:
224 app: nginx
225 annotations:
226 app: nginx
227 config.kubernetes.io/path: bar-package/f2.yaml
228 name: bar
229 spec:
230 replicas: 3
231 ---
232 kind: Service
233 metadata:
234 name: foo
235 namespace: default
236 annotations:
237 app: nginx
238 config.kubernetes.io/path: f1.yaml
239 spec:
240 selector:
241 app: nginx
242 `
243 out := &bytes.Buffer{}
244 err := Pipeline{
245 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
246 Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
247 }.Execute()
248 if !assert.NoError(t, err) {
249 t.FailNow()
250 }
251
252 if !assert.Equal(t, `
253 ├── [f1.yaml] Deployment default/foo
254 ├── [f1.yaml] Service default/foo
255 ├── [f1.yaml] Deployment default/foo3
256 ├── [f1.yaml] Deployment default/foo3
257 ├── [f1.yaml] Deployment default/foo3
258 ├── [f1.yaml] Deployment default2/foo2
259 └── bar-package
260 └── [f2.yaml] Deployment bar
261 `, out.String()) {
262 t.FailNow()
263 }
264 }
265
266 func TestPrinter_metaError(t *testing.T) {
267 out := &bytes.Buffer{}
268 err := TreeWriter{Writer: out}.Write([]*yaml.RNode{{}})
269 if !assert.NoError(t, err) {
270 t.FailNow()
271 }
272 if !assert.Equal(t, `
273 `, out.String()) {
274 t.FailNow()
275 }
276 }
277
278 func TestPrinter_Write_Graph_Structure(t *testing.T) {
279 in := `
280 apiVersion: v1
281 kind: Pod
282 metadata:
283 name: cockroachdb-0
284 namespace: myapp-staging
285 ownerReferences:
286 - apiVersion: apps/v1
287 kind: StatefulSet
288 name: cockroachdb
289 spec:
290 containers:
291 - name: cockroachdb
292 image: cockraochdb:1.1.1
293 ---
294 apiVersion: v1
295 kind: Pod
296 metadata:
297 name: cockroachdb-1
298 namespace: myapp-staging
299 ownerReferences:
300 - apiVersion: apps/v1
301 kind: StatefulSet
302 name: cockroachdb
303 spec:
304 containers:
305 - name: cockroachdb
306 image: cockraochdb:1.1.1
307 ---
308 apiVersion: v1
309 kind: Pod
310 metadata:
311 name: cockroachdb-2
312 namespace: myapp-staging
313 ownerReferences:
314 - apiVersion: apps/v1
315 kind: StatefulSet
316 name: cockroachdb
317 spec:
318 containers:
319 - name: cockroachdb
320 image: cockraochdb:1.1.0
321 ---
322 apiVersion: apps/v1
323 kind: StatefulSet
324 metadata:
325 name: cockroachdb
326 namespace: myapp-staging
327 ownerReferences:
328 - apiVersion: app.k8s.io/v1beta1
329 kind: Application
330 name: myapp
331 spec:
332 replicas: 3
333 containers:
334 - name: cockroachdb
335 image: cockraochdb:1.1.1
336 ---
337 apiVersion: v1
338 kind: Service
339 metadata:
340 name: cockroachdb
341 namespace: myapp-staging
342 ownerReferences:
343 - apiVersion: app.k8s.io/v1beta1
344 kind: Application
345 name: myapp
346 ---
347 apiVersion: app.k8s.io/v1beta1
348 kind: Application
349 metadata:
350 labels:
351 app.kubernetes.io/name: myapp
352 name: myapp
353 namespace: myapp-staging
354 `
355 out := &bytes.Buffer{}
356 err := Pipeline{
357 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
358 Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructureGraph}},
359 }.Execute()
360 if !assert.NoError(t, err) {
361 t.FailNow()
362 }
363
364 if !assert.Equal(t, `.
365 └── [Resource] Application myapp-staging/myapp
366 ├── [Resource] Service myapp-staging/cockroachdb
367 └── [Resource] StatefulSet myapp-staging/cockroachdb
368 ├── [Resource] Pod myapp-staging/cockroachdb-0
369 ├── [Resource] Pod myapp-staging/cockroachdb-1
370 └── [Resource] Pod myapp-staging/cockroachdb-2
371 `, out.String()) {
372 t.FailNow()
373 }
374 }
375
376 func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_present(t *testing.T) {
377 in := `
378 apiVersion: v1
379 kind: Pod
380 metadata:
381 name: cockroachdb-0
382 namespace: myapp-staging
383 ownerReferences:
384 - apiVersion: apps/v1
385 kind: StatefulSet
386 name: cockroachdb
387 spec:
388 containers:
389 - name: cockroachdb
390 image: cockraochdb:1.1.1
391 ---
392 apiVersion: v1
393 kind: Pod
394 metadata:
395 name: cockroachdb-1
396 namespace: myapp-staging
397 ownerReferences:
398 - apiVersion: apps/v1
399 kind: StatefulSet
400 name: cockroachdb
401 spec:
402 containers:
403 - name: cockroachdb
404 image: cockraochdb:1.1.1
405 ---
406 apiVersion: v1
407 kind: Pod
408 metadata:
409 name: cockroachdb-2
410 namespace: myapp-staging
411 ownerReferences:
412 - apiVersion: apps/v1
413 kind: StatefulSet
414 name: cockroachdb
415 spec:
416 containers:
417 - name: cockroachdb
418 image: cockraochdb:1.1.0
419 ---
420 apiVersion: apps/v1
421 kind: StatefulSet
422 metadata:
423 name: cockroachdb
424 namespace: myapp-staging
425 ownerReferences:
426 - apiVersion: app.k8s.io/v1beta1
427 kind: Application
428 name: myapp
429 spec:
430 replicas: 3
431 containers:
432 - name: cockroachdb
433 image: cockraochdb:1.1.1
434 ---
435 apiVersion: v1
436 kind: Service
437 metadata:
438 name: cockroachdb
439 namespace: myapp-staging
440 ownerReferences:
441 - apiVersion: app.k8s.io/v1beta1
442 kind: Application
443 name: myapp
444 ---
445 apiVersion: app.k8s.io/v1beta1
446 kind: Application
447 metadata:
448 labels:
449 app.kubernetes.io/name: myapp
450 name: myapp
451 namespace: myapp-staging
452 `
453 out := &bytes.Buffer{}
454 err := Pipeline{
455 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
456 Outputs: []Writer{TreeWriter{Writer: out}},
457 }.Execute()
458 if !assert.NoError(t, err) {
459 t.FailNow()
460 }
461
462 if !assert.Equal(t, `.
463 └── [Resource] Application myapp-staging/myapp
464 ├── [Resource] Service myapp-staging/cockroachdb
465 └── [Resource] StatefulSet myapp-staging/cockroachdb
466 ├── [Resource] Pod myapp-staging/cockroachdb-0
467 ├── [Resource] Pod myapp-staging/cockroachdb-1
468 └── [Resource] Pod myapp-staging/cockroachdb-2
469 `, out.String()) {
470 t.FailNow()
471 }
472 }
473
474 func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_absent(t *testing.T) {
475 in := `
476 apiVersion: v1
477 kind: Pod
478 metadata:
479 name: cockroachdb-0
480 namespace: myapp-staging
481 spec:
482 containers:
483 - name: cockroachdb
484 image: cockraochdb:1.1.1
485 ---
486 apiVersion: v1
487 kind: Pod
488 metadata:
489 name: cockroachdb-1
490 namespace: myapp-staging
491 spec:
492 containers:
493 - name: cockroachdb
494 image: cockraochdb:1.1.1
495 ---
496 apiVersion: v1
497 kind: Pod
498 metadata:
499 name: cockroachdb-2
500 namespace: myapp-staging
501 spec:
502 containers:
503 - name: cockroachdb
504 image: cockraochdb:1.1.0
505 ---
506 apiVersion: apps/v1
507 kind: StatefulSet
508 metadata:
509 name: cockroachdb
510 namespace: myapp-staging
511 spec:
512 replicas: 3
513 containers:
514 - name: cockroachdb
515 image: cockraochdb:1.1.1
516 ---
517 apiVersion: v1
518 kind: Service
519 metadata:
520 name: cockroachdb
521 namespace: myapp-staging
522 ---
523 apiVersion: app.k8s.io/v1beta1
524 kind: Application
525 metadata:
526 labels:
527 app.kubernetes.io/name: myapp
528 name: myapp
529 namespace: myapp-staging
530 `
531 out := &bytes.Buffer{}
532 err := Pipeline{
533 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
534 Outputs: []Writer{TreeWriter{Writer: out}},
535 }.Execute()
536 if !assert.NoError(t, err) {
537 t.FailNow()
538 }
539
540 if !assert.Equal(t, `
541 ├── [.] Service myapp-staging/cockroachdb
542 ├── [.] StatefulSet myapp-staging/cockroachdb
543 ├── [.] Pod myapp-staging/cockroachdb-0
544 ├── [.] Pod myapp-staging/cockroachdb-1
545 ├── [.] Pod myapp-staging/cockroachdb-2
546 └── [.] Application myapp-staging/myapp
547 `, out.String()) {
548 t.FailNow()
549 }
550 }
551
552 func TestPrinter_Write_error_when_owner_missing(t *testing.T) {
553 in := `
554 ---
555 apiVersion: v1
556 kind: Service
557 metadata:
558 name: cockroachdb
559 namespace: myapp-staging
560 ownerReferences:
561 - apiVersion: app.k8s.io/v1beta1
562 kind: Application
563 name: nginx
564 ---
565 apiVersion: app.k8s.io/v1beta1
566 kind: Application
567 metadata:
568 labels:
569 app.kubernetes.io/name: myapp
570 name: myapp
571 namespace: myapp-staging
572 `
573 out := &bytes.Buffer{}
574 err := Pipeline{
575 Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
576 Outputs: []Writer{TreeWriter{Writer: out}},
577 }.Execute()
578 require.Error(t, err)
579 assert.Equal(t, "owner 'Application myapp-staging/nginx' not found in input, but found as an owner of input objects", err.Error())
580 }
581
View as plain text