@@ -22,6 +22,9 @@ import (
22
22
"testing"
23
23
"time"
24
24
25
+ "github.com/google/go-cmp/cmp"
26
+
27
+ "k8s.io/apimachinery/pkg/util/errors"
25
28
utiltesting "k8s.io/client-go/util/testing"
26
29
27
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -369,14 +372,15 @@ providers:
369
372
370
373
func Test_validateCredentialProviderConfig (t * testing.T ) {
371
374
testcases := []struct {
372
- name string
373
- config * kubeletconfig.CredentialProviderConfig
374
- shouldErr bool
375
+ name string
376
+ config * kubeletconfig.CredentialProviderConfig
377
+ saTokenForCredentialProviders bool
378
+ expectErr string
375
379
}{
376
380
{
377
381
name : "no providers provided" ,
378
382
config : & kubeletconfig.CredentialProviderConfig {},
379
- shouldErr : true ,
383
+ expectErr : `providers: Required value: at least 1 item in plugins is required` ,
380
384
},
381
385
{
382
386
name : "no matchImages provided" ,
@@ -390,7 +394,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
390
394
},
391
395
},
392
396
},
393
- shouldErr : true ,
397
+ expectErr : `providers.matchImages: Required value: at least 1 item in matchImages is required` ,
394
398
},
395
399
{
396
400
name : "no default cache duration provided" ,
@@ -403,7 +407,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
403
407
},
404
408
},
405
409
},
406
- shouldErr : true ,
410
+ expectErr : `providers.defaultCacheDuration: Required value: defaultCacheDuration is required` ,
407
411
},
408
412
{
409
413
name : "name contains '/'" ,
@@ -417,7 +421,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
417
421
},
418
422
},
419
423
},
420
- shouldErr : true ,
424
+ expectErr : `providers.name: Invalid value: "foo/../bar": provider name cannot contain '/'` ,
421
425
},
422
426
{
423
427
name : "name is '.'" ,
@@ -431,7 +435,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
431
435
},
432
436
},
433
437
},
434
- shouldErr : true ,
438
+ expectErr : `providers.name: Invalid value: ".": provider name cannot be '.'` ,
435
439
},
436
440
{
437
441
name : "name is '..'" ,
@@ -445,7 +449,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
445
449
},
446
450
},
447
451
},
448
- shouldErr : true ,
452
+ expectErr : `providers.name: Invalid value: "..": provider name cannot be '..'` ,
449
453
},
450
454
{
451
455
name : "name contains spaces" ,
@@ -459,7 +463,27 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
459
463
},
460
464
},
461
465
},
462
- shouldErr : true ,
466
+ expectErr : `providers.name: Invalid value: "foo bar": provider name cannot contain spaces` ,
467
+ },
468
+ {
469
+ name : "duplicate names" ,
470
+ config : & kubeletconfig.CredentialProviderConfig {
471
+ Providers : []kubeletconfig.CredentialProvider {
472
+ {
473
+ Name : "foobar" ,
474
+ MatchImages : []string {"foobar.registry.io" },
475
+ DefaultCacheDuration : & metav1.Duration {Duration : time .Minute },
476
+ APIVersion : "credentialprovider.kubelet.k8s.io/v1alpha1" ,
477
+ },
478
+ {
479
+ Name : "foobar" ,
480
+ MatchImages : []string {"bar.registry.io" },
481
+ DefaultCacheDuration : & metav1.Duration {Duration : time .Minute },
482
+ APIVersion : "credentialprovider.kubelet.k8s.io/v1alpha1" ,
483
+ },
484
+ },
485
+ },
486
+ expectErr : `providers.name: Duplicate value: "foobar"` ,
463
487
},
464
488
{
465
489
name : "no apiVersion" ,
@@ -473,7 +497,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
473
497
},
474
498
},
475
499
},
476
- shouldErr : true ,
500
+ expectErr : "providers.apiVersion: Required value: apiVersion is required" ,
477
501
},
478
502
{
479
503
name : "invalid apiVersion" ,
@@ -487,7 +511,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
487
511
},
488
512
},
489
513
},
490
- shouldErr : true ,
514
+ expectErr : `providers.apiVersion: Unsupported value: "credentialprovider.kubelet.k8s.io/v1alpha0": supported values: "credentialprovider.kubelet.k8s.io/v1", "credentialprovider.kubelet.k8s.io/v1alpha1", "credentialprovider.kubelet.k8s.io/v1beta1"` ,
491
515
},
492
516
{
493
517
name : "negative default cache duration" ,
@@ -501,7 +525,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
501
525
},
502
526
},
503
527
},
504
- shouldErr : true ,
528
+ expectErr : "providers.defaultCacheDuration: Invalid value: -1m0s: defaultCacheDuration must be greater than or equal to 0" ,
505
529
},
506
530
{
507
531
name : "invalid match image" ,
@@ -515,7 +539,7 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
515
539
},
516
540
},
517
541
},
518
- shouldErr : true ,
542
+ expectErr : `providers.matchImages: Invalid value: "%invalid%": match image is invalid: parse "https://%invalid%": invalid URL escape "%in"` ,
519
543
},
520
544
{
521
545
name : "valid config" ,
@@ -529,19 +553,22 @@ func Test_validateCredentialProviderConfig(t *testing.T) {
529
553
},
530
554
},
531
555
},
532
- shouldErr : false ,
533
556
},
534
557
}
535
558
536
559
for _ , testcase := range testcases {
537
560
t .Run (testcase .name , func (t * testing.T ) {
538
- errs := validateCredentialProviderConfig (testcase .config )
539
-
540
- if testcase .shouldErr && len (errs ) == 0 {
541
- t .Errorf ("expected error but got none" )
542
- } else if ! testcase .shouldErr && len (errs ) > 0 {
543
- t .Errorf ("expected no error but received errors: %v" , errs .ToAggregate ())
561
+ errs := validateCredentialProviderConfig (testcase .config ).ToAggregate ()
562
+ if d := cmp .Diff (testcase .expectErr , errString (errs )); d != "" {
563
+ t .Fatalf ("CredentialProviderConfig validation mismatch (-want +got):\n %s" , d )
544
564
}
545
565
})
546
566
}
547
567
}
568
+
569
+ func errString (errs errors.Aggregate ) string {
570
+ if errs != nil {
571
+ return errs .Error ()
572
+ }
573
+ return ""
574
+ }
0 commit comments