blob: 5f133a0a186e66aa0659de0dee753a0c01530aef [file] [log] [blame]
garciadeblas83775ba2025-07-23 18:35:24 +02001#!/usr/bin/env -S nu --stdin
2#######################################################################################
3# Copyright ETSI Contributors and Others.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14# implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#######################################################################################
18
19
20use std assert
21use ../../krm/generator.nu *
22
23
24# --- from resourcelist tests ---
25
26export def "test generator from resourcelist empty inputs" []: [
27 nothing -> nothing
28] {
29 let in_rl: record = {
30 apiVersion: "config.kubernetes.io/v1"
31 kind: "ResourceList"
32 items: ["item1", "item2"]
33 }
34 let rl: record = {}
35
36 let actual: record = ($in_rl | from resourcelist $rl)
37 let expected: record = {
38 apiVersion: "config.kubernetes.io/v1"
39 kind: "ResourceList"
40 items: ["item1", "item2"]
41 }
42
43 assert equal $actual $expected
44}
45
46
47export def "test generator from resourcelist empty stdin" []: [
48 nothing -> nothing
49] {
50 let in_rl: record = {}
51 let rl: record = {
52 apiVersion: "config.kubernetes.io/v1"
53 kind: "ResourceList"
54 items: ["item1", "item2"]
55 }
56
57 let actual: record = ($in_rl | from resourcelist $rl)
58 let expected: record = $rl
59
60 assert equal $actual $expected
61}
62
63
64export def "test generator from resourcelist merge lists" []: [
65 nothing -> nothing
66] {
67 let in_rl: record = {
68 apiVersion: "config.kubernetes.io/v1"
69 kind: "ResourceList"
70 items: ["item1", "item2"]
71 }
72 let rl: record = {
73 apiVersion: "config.kubernetes.io/v1"
74 kind: "ResourceList"
75 items: ["item3", "item4"]
76 }
77
78 let actual: record = (
79 echo $in_rl | from resourcelist $rl
80 )
81 let expected: record = {
82 apiVersion: "config.kubernetes.io/v1"
83 kind: "ResourceList"
84 items: ["item1", "item2", "item3", "item4"]
85 }
86
87 assert equal $actual $expected
88}
89
90
91export def "test generator from resourcelist non-empty inputs with no items" []: [
92 nothing -> nothing
93] {
94 let in_rl: record = {
95 apiVersion: "config.kubernetes.io/v1"
96 kind: "ResourceList"
97 }
98 let rl: record = {
99 apiVersion: "config.kubernetes.io/v1"
100 kind: "ResourceList"
101 }
102
103 let actual: record = (
104 echo $in_rl | from resourcelist $rl
105 )
106 let expected: record = {
107 apiVersion: "config.kubernetes.io/v1"
108 kind: "ResourceList"
109 items: []
110 }
111
112 assert equal $actual $expected
113}
114
115
116export def "test generator from resourcelist invalid input parameter" []: [
117 nothing -> nothing
118] {
119 let in_rl: record = {
120 apiVersion: "config.kubernetes.io/v1"
121 kind: "ResourceList"
122 items: ["item1", "item2"]
123 }
124 let rl: record = { "Invalid input": "Invalid value" }
125
126 let error_occurred: any = try {
127 $in_rl | from resourcelist $rl
128 } catch {
129 |err| $err.json | from json | get inner.msg.0
130 }
131
132 assert ($error_occurred | str starts-with "Error: Expected a ResourceList, but received")
133}
134
135
136export def "test generator from resourcelist invalid input from stdin" []: [
137 nothing -> nothing
138] {
139 let in_rl: record = { "Invalid input": "Invalid value" }
140 let rl: record = {
141 apiVersion: "config.kubernetes.io/v1"
142 kind: "ResourceList"
143 items: ["item1", "item2"]
144 }
145
146 let error_occurred: any = try {
147 $in_rl | from resourcelist $rl
148 } catch {
149 |err| $err.json | from json | get inner.msg.0
150 }
151
152 assert ($error_occurred | str starts-with "Error: Expected a ResourceList, but received")
153}
154
155
156# --- from manifest tests ---
157
158export def "test generator from manifest empty inputs" []: [
159 nothing -> nothing
160] {
161 let manifest: any = null
162
163 let actual: record = from manifest $manifest
164 let expected: record = {
165 apiVersion: "config.kubernetes.io/v1"
166 kind: "ResourceList"
167 items: []
168 }
169
170 assert equal $actual $expected
171}
172
173
174export def "test generator from manifest empty stdin" []: [
175 nothing -> nothing
176] {
177 let manifest: record = {
178 name: "example"
179 kind: "Deployment"
180 }
181
182 let actual: record = from manifest $manifest
183 let expected: record = {
184 apiVersion: "config.kubernetes.io/v1"
185 kind: "ResourceList"
186 items: [ $manifest ]
187 }
188
189 assert equal $actual $expected
190}
191
192
193export def "test generator from manifest merge lists" []: [
194 nothing -> nothing
195] {
196 let in_rl: record = {
197 apiVersion: "config.kubernetes.io/v1"
198 kind: "ResourceList"
199 items: ["item1", "item2"]
200 }
201 let manifest: record = {
202 name: "example"
203 kind: "Deployment"
204 }
205
206 let actual: record = (
207 echo $in_rl | from manifest $manifest
208 )
209 let expected: record = {
210 apiVersion: "config.kubernetes.io/v1"
211 kind: "ResourceList"
212 items: ["item1", "item2", $manifest]
213 }
214
215 assert equal $actual.apiVersion $expected.apiVersion
216 assert equal $actual.kind $expected.kind
217 assert equal $actual.items $expected.items
218}
219
220
221export def "test generator from manifest list of manifests" []: [
222 nothing -> nothing
223] {
224 let in_rl: record = {
225 apiVersion: "config.kubernetes.io/v1"
226 kind: "ResourceList"
227 items: ["item1", "item2"]
228 }
229 let manifest: list<any> = [
230 { name: "example1", kind: "Deployment" }
231 { name: "example2", kind: "Service" }
232 ]
233
234 let actual: record = (
235 echo $in_rl | from manifest $manifest
236 )
237 let expected: record = {
238 apiVersion: "config.kubernetes.io/v1"
239 kind: "ResourceList"
240 items: ["item1", "item2", { name: "example1", kind: "Deployment" }, { name: "example2", kind: "Service" }]
241 }
242
243 assert equal $actual.apiVersion $expected.apiVersion
244 assert equal $actual.kind $expected.kind
245 assert equal $actual.items $expected.items
246}
247
248
249export def "test generator from manifest invalid input" []: [
250 nothing -> nothing
251] {
252 let manifest: string = "Invalid manifest"
253
254 let error_occurred: error = try {
255 from manifest $manifest
256 } catch {
257 |err| $err.msg
258 }
259
260 assert equal $error_occurred "Error: Expected a record or a list of records, but received string."
261}
262
263
264
265# --- configmap tests ---
266
267export def "test generator configmap basic" []: [
268 nothing -> nothing
269] {
270 let key_pairs: record = {
271 key1: "value1",
272 key2: "value2"
273 }
274 let name: string = "example-configmap"
275
276 let actual: record = configmap $key_pairs $name
277 let expected: record = {
278 apiVersion: "config.kubernetes.io/v1",
279 kind: ResourceList,
280 items: [
281 {
282 apiVersion: "v1"
283 kind: "ConfigMap"
284 metadata: { name: $name, namespace: "default" }
285 data: $key_pairs
286 }
287 ]
288 }
289
290 assert equal $actual $expected
291}
292
293
294export def "test generator configmap with namespace" []: [
295 nothing -> nothing
296] {
297 let key_pairs: record = {
298 key1: "value1",
299 key2: "value2"
300 }
301 let name: string = "example-configmap"
302 let namespace: string = "custom-namespace"
303
304 let actual: record = configmap $key_pairs $name $namespace
305 let expected: record = {
306 apiVersion: "config.kubernetes.io/v1",
307 kind: ResourceList,
308 items: [
309 {
310 apiVersion: "v1"
311 kind: "ConfigMap"
312 metadata: { name: $name, namespace: $namespace }
313 data: $key_pairs
314 }
315 ]
316 }
317
318 assert equal $actual $expected
319}
320
321
322export def "test generator configmap with filename" []: [
323 nothing -> nothing
324] {
325 let key_pairs: record = {
326 key1: "value1",
327 key2: "value2"
328 }
329 let name: string = "example-configmap"
330 let filename: string = "example-configmap.yaml"
331
332 let actual: record = configmap --filename $filename $key_pairs $name
333 let expected: record = {
334 apiVersion: "config.kubernetes.io/v1",
335 kind: ResourceList,
336 items: [
337 {
338 apiVersion: "v1"
339 kind: "ConfigMap"
340 metadata: {
341 name: $name,
342 namespace: "default",
343 annotations: {
344 "config.kubernetes.io/path": $filename,
345 "internal.config.kubernetes.io/path": $filename
346 }
347 }
348 data: $key_pairs
349 }
350 ]
351 }
352
353 assert equal $actual $expected
354}
355
356
357export def "test generator configmap with filename and index" []: [
358 nothing -> nothing
359] {
360 let key_pairs: record = {
361 key1: "value1",
362 key2: "value2"
363 }
364 let name: string = "example-configmap"
365 let filename: string = "example-configmap.yaml"
366 let index: int = 0
367
368 let actual: record = configmap --filename $filename --index $index $key_pairs $name
369 let expected: record = {
370 apiVersion: "config.kubernetes.io/v1",
371 kind: ResourceList,
372 items: [
373 {
374 apiVersion: "v1"
375 kind: "ConfigMap"
376 metadata: {
377 name: $name,
378 namespace: "default",
379 annotations: {
380 "config.kubernetes.io/path": $filename,
381 "internal.config.kubernetes.io/path": $filename,
382 "config.kubernetes.io/index": "0",
383 "internal.config.kubernetes.io/index": "0"
384 }
385 }
386 data: $key_pairs
387 }
388 ]
389 }
390
391 assert equal $actual $expected
392}
393
394
395
396# TODO:
397
398# --- secret tests ---
399
400export def "test generator secret basic" []: [
401 nothing -> nothing
402] {
403 let key_pairs: record = {
404 key1: "value1",
405 key2: "value2"
406 }
407 let name: string = "example-secret"
408
409 let actual: record = secret $key_pairs $name
410 let expected_encoded_values: record = {
411 key1: ("value1" | encode base64),
412 key2: ("value2" | encode base64)
413 }
414 let expected: record = {
415 apiVersion: "config.kubernetes.io/v1",
416 kind: ResourceList,
417 items: [
418 {
419 apiVersion: "v1"
420 kind: "Secret"
421 metadata: { name: $name, namespace: "default" }
422 data: $expected_encoded_values
423 }
424 ]
425 }
426
427 assert equal $actual $expected
428}
429
430
431export def "test generator secret with namespace" []: [
432 nothing -> nothing
433] {
434 let key_pairs: record = {
435 key1: "value1",
436 key2: "value2"
437 }
438 let name: string = "example-secret"
439 let namespace: string = "custom-namespace"
440
441 let actual: record = secret $key_pairs $name $namespace
442 let expected_encoded_values: record = {
443 key1: ("value1" | encode base64),
444 key2: ("value2" | encode base64)
445 }
446 let expected: record = {
447 apiVersion: "config.kubernetes.io/v1",
448 kind: ResourceList,
449 items: [
450 {
451 apiVersion: "v1"
452 kind: "Secret"
453 metadata: { name: $name, namespace: $namespace }
454 data: $expected_encoded_values
455 }
456 ]
457 }
458
459 assert equal $actual $expected
460}
461
462
463export def "test generator secret with filename" []: [
464 nothing -> nothing
465] {
466 let key_pairs: record = {
467 key1: "value1",
468 key2: "value2"
469 }
470 let name: string = "example-secret"
471 let filename: string = "example-secret.yaml"
472
473 let actual: record = (
474 secret
475 --filename $filename
476 $key_pairs
477 $name
478 )
479 let expected_encoded_values: record = {
480 key1: ("value1" | encode base64),
481 key2: ("value2" | encode base64)
482 }
483 let expected: record = {
484 apiVersion: "config.kubernetes.io/v1",
485 kind: ResourceList,
486 items: [
487 {
488 apiVersion: "v1"
489 kind: "Secret"
490 metadata: {
491 name: $name,
492 namespace: "default",
493 annotations: {
494 "config.kubernetes.io/path": $filename,
495 "internal.config.kubernetes.io/path": $filename
496 }
497 }
498 data: $expected_encoded_values
499 }
500 ]
501 }
502
503 assert equal $actual $expected
504}
505
506
507export def "test generator secret with filename and index" []: [
508 nothing -> nothing
509] {
510 let key_pairs: record = {
511 key1: "value1",
512 key2: "value2"
513 }
514 let name: string = "example-secret"
515 let filename: string = "example-secret.yaml"
516 let index: int = 0
517
518 let actual: record = (
519 secret
520 --filename $filename
521 --index $index
522 $key_pairs
523 $name
524 )
525 let expected_encoded_values: record = {
526 key1: ("value1" | encode base64),
527 key2: ("value2" | encode base64)
528 }
529 let expected: record = {
530 apiVersion: "config.kubernetes.io/v1",
531 kind: ResourceList,
532 items: [
533 {
534 apiVersion: "v1"
535 kind: "Secret"
536 metadata: {
537 name: $name,
538 namespace: "default",
539 annotations: {
540 "config.kubernetes.io/path": $filename,
541 "internal.config.kubernetes.io/path": $filename,
542 "config.kubernetes.io/index": "0",
543 "internal.config.kubernetes.io/index": "0"
544 }
545 }
546 data: $expected_encoded_values
547 }
548 ]
549 }
550
551 assert equal $actual $expected
552}
553
554
555export def "test generator secret with type" []: [
556 nothing -> nothing
557] {
558 let key_pairs: record = {
559 key1: "value1",
560 key2: "value2"
561 }
562 let name: string = "example-secret"
563 let type: string = "Opaque"
564
565 let actual: record = secret --type $type $key_pairs $name
566 let expected_encoded_values: record = {
567 key1: ("value1" | encode base64),
568 key2: ("value2" | encode base64)
569 }
570 let expected: record = {
571 apiVersion: "config.kubernetes.io/v1",
572 kind: ResourceList,
573 items: [
574 {
575 apiVersion: "v1"
576 kind: "Secret"
577 metadata: { name: $name, namespace: "default" }
578 type: $type
579 data: $expected_encoded_values
580 }
581 ]
582 }
583
584 assert equal $actual $expected
585}
586
587
588export def "test generator secret with age encryption" []: [
589 nothing -> nothing
590] {
591 let test_public_key: string = "age1hsrtxphk7exrdc0kt8dgr8a8r3hx88v3xpsw0ezaxvefsy9asegqknppc0"
592 let test_private_key: string = "AGE-SECRET-KEY-12CC3A4LEDYF4S26UV6Z2MEG7ZQL9PTU5NHH6N3FN6FLJ5HACW9LQX0UWP2"
593
594 let key_pairs: record = {
595 key1: "value1",
596 key2: "value2"
597 }
598 let name: string = "example-secret"
599 let filename: string = "example-secret.yaml"
600
601 # Here we extract the encrypted manifest only
602 # File name and index are also removed, since they were not taken into account for age encryptio
603 let result: record = (
604 secret
605 --filename $filename
606 --public-age-key $test_public_key
607 $key_pairs
608 $name
609 )
610 | get items.0
611 | reject $.metadata.annotations
612
613 # Verify decryption
614 let tmp_encrypted_file = (mktemp -t --suffix .yaml)
615 $result | save -f $tmp_encrypted_file
616 let actual: record = (
617 $test_private_key
618 | SOPS_AGE_KEY_FILE="/dev/stdin" sops --decrypt $tmp_encrypted_file
619 | from yaml
620 )
621 rm $tmp_encrypted_file # Clean up temporary key file
622
623
624 let expected_encoded_values: record = {
625 key1: ("value1" | encode base64),
626 key2: ("value2" | encode base64)
627 }
628
629 let expected: record = {
630 apiVersion: "v1"
631 kind: "Secret"
632 metadata: {
633 name: $name,
634 namespace: "default"
635 }
636 data: $expected_encoded_values
637 }
638
639 assert equal $actual $expected
640}