Skip to content

Commit 5eccd0d

Browse files
Add tests for other provider metadata check during upgrade
Signed-off-by: Danil Grigorev <[email protected]>
1 parent eb267f4 commit 5eccd0d

File tree

2 files changed

+211
-1
lines changed

2 files changed

+211
-1
lines changed

internal/controller/manifests_downloader_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func TestManifestsDownloader(t *testing.T) {
6262
MatchLabels: p.prepareConfigMapLabels(),
6363
}
6464

65-
exists, err := p.checkConfigMapExists(ctx, labelSelector)
65+
exists, err := p.checkConfigMapExists(ctx, labelSelector, p.provider.GetNamespace())
6666
g.Expect(err).ToNot(HaveOccurred())
6767

6868
g.Expect(exists).To(BeTrue())

internal/controller/phases_test.go

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controller
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"testing"
2223

2324
. "github.com/onsi/gomega"
@@ -26,6 +27,7 @@ import (
2627
clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3"
2728
configclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config"
2829
"sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository"
30+
"sigs.k8s.io/controller-runtime/pkg/client"
2931
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3032

3133
operatorv1 "sigs.k8s.io/cluster-api-operator/api/v1alpha2"
@@ -412,6 +414,214 @@ metadata:
412414
}
413415
}
414416

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+
415625
func TestRepositoryFactory(t *testing.T) {
416626
testCases := []struct {
417627
name string

0 commit comments

Comments
 (0)