@@ -18,6 +18,7 @@ package controller
18
18
19
19
import (
20
20
"context"
21
+ "fmt"
21
22
"testing"
22
23
23
24
. "github.com/onsi/gomega"
@@ -26,6 +27,7 @@ import (
26
27
clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3"
27
28
configclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config"
28
29
"sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository"
30
+ "sigs.k8s.io/controller-runtime/pkg/client"
29
31
"sigs.k8s.io/controller-runtime/pkg/client/fake"
30
32
31
33
operatorv1 "sigs.k8s.io/cluster-api-operator/api/v1alpha2"
@@ -412,6 +414,214 @@ metadata:
412
414
}
413
415
}
414
416
417
+ func TestRepositoryProxy (t * testing.T ) {
418
+ coreProvider := configclient .NewProvider ("cluster-api" , "https://github.com/kubernetes-sigs/cluster-api/releases/latest/core-components.yaml" , clusterctlv1 .CoreProviderType )
419
+ awsProvider := configclient .NewProvider ("aws" , "https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/v1.4.1/infrastructure-components.yaml" , clusterctlv1 .InfrastructureProviderType )
420
+
421
+ provider := & operatorv1.InfrastructureProvider {
422
+ ObjectMeta : metav1.ObjectMeta {
423
+ Name : "aws" ,
424
+ Namespace : "ns1" ,
425
+ },
426
+ TypeMeta : metav1.TypeMeta {
427
+ Kind : "InfrastructureProvider" ,
428
+ APIVersion : "operator.cluster.x-k8s.io/v1alpha2" ,
429
+ },
430
+ Spec : operatorv1.InfrastructureProviderSpec {
431
+ ProviderSpec : operatorv1.ProviderSpec {
432
+ Version : "v2.3.5" ,
433
+ FetchConfig : & operatorv1.FetchConfiguration {
434
+ Selector : & metav1.LabelSelector {
435
+ MatchLabels : map [string ]string {"provider-components" : "aws" },
436
+ },
437
+ },
438
+ },
439
+ },
440
+ }
441
+
442
+ core := & operatorv1.CoreProvider {
443
+ ObjectMeta : metav1.ObjectMeta {
444
+ Name : "cluster-api" ,
445
+ Namespace : "default" ,
446
+ },
447
+ Spec : operatorv1.CoreProviderSpec {
448
+ ProviderSpec : operatorv1.ProviderSpec {
449
+ Version : testCurrentVersion ,
450
+ },
451
+ },
452
+ }
453
+
454
+ awsMetadata := `
455
+ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
456
+ releaseSeries:
457
+ - major: 2
458
+ minor: 4
459
+ contract: v1beta1
460
+ - major: 2
461
+ minor: 3
462
+ contract: v1beta1`
463
+
464
+ awsMetaReleaseSeries := []clusterctlv1.ReleaseSeries {
465
+ {
466
+ Major : 2 ,
467
+ Minor : 4 ,
468
+ Contract : "v1beta1" ,
469
+ }, {
470
+ Major : 2 ,
471
+ Minor : 3 ,
472
+ Contract : "v1beta1" ,
473
+ },
474
+ }
475
+
476
+ metadata := `
477
+ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
478
+ releaseSeries:
479
+ - major: 0
480
+ minor: 4
481
+ contract: v1alpha4
482
+ - major: 0
483
+ minor: 3
484
+ contract: v1alpha3`
485
+
486
+ metaReleaseSeries := []clusterctlv1.ReleaseSeries {{
487
+ Major : 0 ,
488
+ Minor : 4 ,
489
+ Contract : "v1alpha4" ,
490
+ }, {
491
+ Major : 0 ,
492
+ Minor : 3 ,
493
+ Contract : "v1alpha3" ,
494
+ }}
495
+
496
+ tests := []struct {
497
+ name string
498
+ configMaps []corev1.ConfigMap
499
+ genericProviders []client.Object
500
+ provider configclient.Provider
501
+ defaultRepository bool
502
+ wantMetadataSeries []clusterctlv1.ReleaseSeries
503
+ wantErr string
504
+ metadataErr string
505
+ wantDefaultVersion string
506
+ }{
507
+ {
508
+ name : "missing configmaps" ,
509
+ provider : coreProvider ,
510
+ wantDefaultVersion : testCurrentVersion ,
511
+ genericProviders : []client.Object {core , provider },
512
+ metadataErr : "failed to read \" metadata.yaml\" from the repository for provider \" cluster-api\" : unable to get files for version v0.4.2" ,
513
+ },
514
+ {
515
+ name : "correct configmap with data" ,
516
+ genericProviders : []client.Object {core , provider },
517
+ provider : coreProvider ,
518
+ defaultRepository : true ,
519
+ wantDefaultVersion : testCurrentVersion ,
520
+ wantMetadataSeries : metaReleaseSeries ,
521
+ configMaps : []corev1.ConfigMap {
522
+ {
523
+ TypeMeta : metav1.TypeMeta {
524
+ Kind : "ConfigMap" ,
525
+ APIVersion : "v1" ,
526
+ },
527
+ ObjectMeta : metav1.ObjectMeta {
528
+ Name : testCurrentVersion ,
529
+ Namespace : "default" ,
530
+ Labels : map [string ]string {
531
+ configMapVersionLabel : testCurrentVersion ,
532
+ configMapTypeLabel : core .GetType (),
533
+ configMapNameLabel : core .GetName (),
534
+ operatorManagedLabel : "true" ,
535
+ },
536
+ },
537
+ Data : map [string ]string {"metadata" : metadata , "components" : "" },
538
+ },
539
+ },
540
+ },
541
+ {
542
+ name : "upgrade required validation of another provider missing config map" ,
543
+ genericProviders : []client.Object {core , provider },
544
+ provider : awsProvider ,
545
+ wantErr : wrapPhaseError (fmt .Errorf ("config map not found" ), "config map repository required for validation does not exist yet for provider ns1/aws" , operatorv1 .ProviderUpgradedCondition ).Error (),
546
+ },
547
+ {
548
+ name : "updgrade requested an unknown provider for the operator" ,
549
+ genericProviders : []client.Object {core },
550
+ provider : awsProvider ,
551
+ wantErr : wrapPhaseError (fmt .Errorf ("unable to find provider manifest with name aws" ), "unable to find generic provider for configclient InfrastructureProvider: aws" , operatorv1 .ProviderUpgradedCondition ).Error (),
552
+ },
553
+ {
554
+ name : "upgrade required validation of another provider metadata succeeds" ,
555
+ genericProviders : []client.Object {core , provider },
556
+ provider : awsProvider ,
557
+ wantDefaultVersion : "v2.3.5" ,
558
+ wantMetadataSeries : awsMetaReleaseSeries ,
559
+ configMaps : []corev1.ConfigMap {
560
+ {
561
+ TypeMeta : metav1.TypeMeta {
562
+ Kind : "ConfigMap" ,
563
+ APIVersion : "v1" ,
564
+ },
565
+ ObjectMeta : metav1.ObjectMeta {
566
+ Name : "v2.3.5" ,
567
+ Namespace : provider .Namespace ,
568
+ Labels : map [string ]string {"provider-components" : "aws" },
569
+ },
570
+ Data : map [string ]string {"metadata" : awsMetadata , "components" : "" },
571
+ },
572
+ },
573
+ },
574
+ }
575
+
576
+ for _ , tt := range tests {
577
+ t .Run (tt .name , func (t * testing.T ) {
578
+ g := NewWithT (t )
579
+
580
+ fakeclient := fake .NewClientBuilder ().WithScheme (setupScheme ()).WithObjects (tt .genericProviders ... ).Build ()
581
+ p := & phaseReconciler {
582
+ ctrlClient : fakeclient ,
583
+ providerConfig : coreProvider ,
584
+ repo : repository .NewMemoryRepository (),
585
+ provider : core ,
586
+ }
587
+
588
+ for i := range tt .configMaps {
589
+ g .Expect (fakeclient .Create (ctx , & tt .configMaps [i ])).To (Succeed ())
590
+ }
591
+ if tt .defaultRepository {
592
+ var err error
593
+ p .repo , err = p .configmapRepository (ctx , & metav1.LabelSelector {
594
+ MatchLabels : map [string ]string {
595
+ operatorManagedLabel : "true" ,
596
+ },
597
+ }, "default" , "" )
598
+ g .Expect (err ).To (Succeed ())
599
+ }
600
+
601
+ cl , err := configclient .New (ctx , "" )
602
+ g .Expect (err ).To (Succeed ())
603
+
604
+ got , err := p .repositoryProxy (ctx , tt .provider , cl )
605
+ if len (tt .wantErr ) > 0 {
606
+ g .Expect (err ).Should (MatchError (tt .wantErr ))
607
+ return
608
+ }
609
+ g .Expect (err ).To (Succeed ())
610
+
611
+ meta := got .Metadata (tt .wantDefaultVersion )
612
+ metadataData , err := meta .Get (ctx )
613
+ if len (tt .metadataErr ) > 0 {
614
+ g .Expect (err ).Should (MatchError (tt .metadataErr ))
615
+ return
616
+ }
617
+ g .Expect (err ).To (Succeed ())
618
+ g .Expect (metadataData .ReleaseSeries ).To (Equal (tt .wantMetadataSeries ))
619
+
620
+ g .Expect (got .DefaultVersion ()).To (Equal (tt .wantDefaultVersion ))
621
+ })
622
+ }
623
+ }
624
+
415
625
func TestRepositoryFactory (t * testing.T ) {
416
626
testCases := []struct {
417
627
name string
0 commit comments