@@ -19,14 +19,17 @@ package controllers
19
19
import (
20
20
"context"
21
21
"reflect"
22
+ "strings"
22
23
"testing"
24
+ "time"
23
25
24
26
"github.com/go-logr/logr"
25
27
"helm.sh/helm/v3/pkg/chartutil"
26
28
corev1 "k8s.io/api/core/v1"
27
29
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
28
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
31
"k8s.io/apimachinery/pkg/runtime"
32
+ "sigs.k8s.io/controller-runtime/pkg/client"
30
33
"sigs.k8s.io/controller-runtime/pkg/client/fake"
31
34
"sigs.k8s.io/yaml"
32
35
@@ -278,6 +281,208 @@ invalid`,
278
281
}
279
282
}
280
283
284
+ func TestValidation (t * testing.T ) {
285
+ tests := []struct {
286
+ name string
287
+ resources []runtime.Object
288
+ references []v2.ValuesReference
289
+ values string
290
+ wantErr bool
291
+ }{
292
+ {
293
+ name : "valid ValuesKey" ,
294
+ resources : []runtime.Object {
295
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
296
+ },
297
+ references : []v2.ValuesReference {
298
+ {
299
+ Kind : "Secret" ,
300
+ Name : "values" ,
301
+ ValuesKey : "any-key_na.me" ,
302
+ },
303
+ },
304
+ wantErr : false ,
305
+ },
306
+ {
307
+ name : "valid ValuesKey: empty" ,
308
+ resources : []runtime.Object {
309
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
310
+ },
311
+ references : []v2.ValuesReference {
312
+ {
313
+ Kind : "Secret" ,
314
+ Name : "values" ,
315
+ ValuesKey : "" ,
316
+ },
317
+ },
318
+ wantErr : false ,
319
+ },
320
+ {
321
+ name : "valid ValuesKey: long" ,
322
+ resources : []runtime.Object {
323
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
324
+ },
325
+ references : []v2.ValuesReference {
326
+ {
327
+ Kind : "Secret" ,
328
+ Name : "values" ,
329
+ ValuesKey : func () string { return strings .Repeat ("a" , 253 ) }(),
330
+ },
331
+ },
332
+ wantErr : false ,
333
+ },
334
+ {
335
+ name : "invalid ValuesKey" ,
336
+ resources : []runtime.Object {
337
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
338
+ },
339
+ references : []v2.ValuesReference {
340
+ {
341
+ Kind : "Secret" ,
342
+ Name : "values" ,
343
+ ValuesKey : "a($&^%b" ,
344
+ },
345
+ },
346
+ wantErr : true ,
347
+ },
348
+ {
349
+ name : "invalid ValuesKey: too long" ,
350
+ resources : []runtime.Object {
351
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
352
+ },
353
+ references : []v2.ValuesReference {
354
+ {
355
+ Kind : "Secret" ,
356
+ Name : "values" ,
357
+ ValuesKey : func () string { return strings .Repeat ("a" , 254 ) }(),
358
+ },
359
+ },
360
+ wantErr : true ,
361
+ },
362
+ {
363
+ name : "valid target path: empty" ,
364
+ resources : []runtime.Object {
365
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
366
+ },
367
+ references : []v2.ValuesReference {
368
+ {
369
+ Kind : "Secret" ,
370
+ Name : "values" ,
371
+ TargetPath : "" ,
372
+ },
373
+ },
374
+ wantErr : false ,
375
+ },
376
+ {
377
+ name : "valid target path" ,
378
+ resources : []runtime.Object {
379
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
380
+ },
381
+ references : []v2.ValuesReference {
382
+ {
383
+ Kind : "Secret" ,
384
+ Name : "values" ,
385
+ TargetPath : "list_with.nested-values.and.index[0]" ,
386
+ },
387
+ },
388
+ wantErr : false ,
389
+ },
390
+ {
391
+ name : "valid target path: long" ,
392
+ resources : []runtime.Object {
393
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
394
+ },
395
+ references : []v2.ValuesReference {
396
+ {
397
+ Kind : "Secret" ,
398
+ Name : "values" ,
399
+ TargetPath : func () string { return strings .Repeat ("a" , 250 ) }(),
400
+ },
401
+ },
402
+ wantErr : false ,
403
+ },
404
+ {
405
+ name : "invalid target path: too long" ,
406
+ resources : []runtime.Object {
407
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
408
+ },
409
+ references : []v2.ValuesReference {
410
+ {
411
+ Kind : "Secret" ,
412
+ Name : "values" ,
413
+ TargetPath : func () string { return strings .Repeat ("a" , 251 ) }(),
414
+ },
415
+ },
416
+ wantErr : true ,
417
+ },
418
+ {
419
+ name : "invalid target path: wrong index format" ,
420
+ resources : []runtime.Object {
421
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
422
+ },
423
+ references : []v2.ValuesReference {
424
+ {
425
+ Kind : "Secret" ,
426
+ Name : "values" ,
427
+ ValuesKey : "single" ,
428
+ TargetPath : "a[" ,
429
+ },
430
+ },
431
+ wantErr : true ,
432
+ },
433
+ {
434
+ name : "invalid target path" ,
435
+ resources : []runtime.Object {
436
+ valuesSecret ("values" , map [string ][]byte {"single" : []byte ("true" )}),
437
+ },
438
+ references : []v2.ValuesReference {
439
+ {
440
+ Kind : "Secret" ,
441
+ Name : "values" ,
442
+ ValuesKey : "single" ,
443
+ TargetPath : "a[" ,
444
+ },
445
+ },
446
+ wantErr : true ,
447
+ },
448
+ }
449
+
450
+ for _ , tt := range tests {
451
+ t .Run (tt .name , func (t * testing.T ) {
452
+ var values * apiextensionsv1.JSON
453
+ if tt .values != "" {
454
+ v , _ := yaml .YAMLToJSON ([]byte (tt .values ))
455
+ values = & apiextensionsv1.JSON {Raw : v }
456
+ }
457
+
458
+ hr := v2.HelmRelease {
459
+ ObjectMeta : metav1.ObjectMeta {
460
+ Name : "test" ,
461
+ Namespace : "default" ,
462
+ },
463
+ Spec : v2.HelmReleaseSpec {
464
+ Interval : metav1.Duration {Duration : 5 * time .Minute },
465
+ Chart : v2.HelmChartTemplate {
466
+ Spec : v2.HelmChartTemplateSpec {
467
+ SourceRef : v2.CrossNamespaceObjectReference {
468
+ Name : "something" ,
469
+ },
470
+ },
471
+ },
472
+ ValuesFrom : tt .references ,
473
+ Values : values ,
474
+ },
475
+ }
476
+
477
+ err := k8sClient .Create (context .TODO (), & hr , client .DryRunAll )
478
+ if (err != nil ) != tt .wantErr {
479
+ t .Errorf ("composeValues() error = %v, wantErr %v" , err , tt .wantErr )
480
+ return
481
+ }
482
+ })
483
+ }
484
+ }
485
+
281
486
func valuesSecret (name string , data map [string ][]byte ) * corev1.Secret {
282
487
return & corev1.Secret {
283
488
ObjectMeta : metav1.ObjectMeta {Name : name },
0 commit comments