Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛: fix unknown provider errors when using fetchConfigs #730

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
chore: relocate GetCustomProviders to util, fix some naming
  • Loading branch information
w21froster committed Mar 3, 2025
commit 53b604aaf0b014689d590b63f0d23f7bfad25852
43 changes: 4 additions & 39 deletions internal/controller/phases.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,13 @@ func (p *phaseReconciler) initializePhaseReconciler(ctx context.Context) (reconc
return reconcile.Result{}, err
}

customProviders, err := p.getCustomProviders(ctx)
// Get all providers using fetchConfig that aren't the current provider.
customProviders, err := util.GetCustomProviders(ctx, p.ctrlClient, p.provider)
if err != nil {
return reconcile.Result{}, err
}

// Load all custom providers into MemoryReader.
reader, err = loadCustomProviders(customProviders, reader)
if err != nil {
return reconcile.Result{}, err
Expand Down Expand Up @@ -572,44 +574,7 @@ func getProvider(provider operatorv1.GenericProvider, defaultVersion string) clu
return *clusterctlProvider
}

func (p *phaseReconciler) getCustomProviders(ctx context.Context) ([]operatorv1.GenericProvider, error) {
customProviders := []operatorv1.GenericProvider{}
currProviderName := p.provider.GetName()
currProviderType := p.provider.GetType()

providerLists := []client.ObjectList{
&operatorv1.CoreProviderList{},
&operatorv1.BootstrapProviderList{},
&operatorv1.ControlPlaneProviderList{},
&operatorv1.InfrastructureProviderList{},
&operatorv1.AddonProviderList{},
&operatorv1.IPAMProviderList{},
&operatorv1.RuntimeExtensionProviderList{},
}

for _, providerList := range providerLists {
if err := p.ctrlClient.List(ctx, providerList); err != nil {
return nil, fmt.Errorf("cannot get a list of providers from the server: %w", err)
}

genericProviderList, ok := providerList.(operatorv1.GenericProviderList)
if !ok {
return nil, fmt.Errorf("cannot cast providers list to GenericProviderList")
}

genericProviderListItems := genericProviderList.GetItems()
for i, provider := range genericProviderListItems {
if provider.GetName() == currProviderName && provider.GetType() == currProviderType || provider.GetSpec().FetchConfig == nil {
continue
}

customProviders = append(customProviders, genericProviderListItems[i])
}
}

return customProviders, nil
}

// loadCustomProviders loads the passed providers list into the clusterctl configuration via the MemoryReader.
func loadCustomProviders(providers []operatorv1.GenericProvider, reader configclient.Reader) (configclient.Reader, error) {
mr, ok := reader.(*configclient.MemoryReader)
if !ok {
Expand Down
32 changes: 16 additions & 16 deletions test/e2e/air_gapped_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import (
)

var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapped environment", func() {
It("should successfully create config maps with Core and Bootstrap Provider manifests", func() {
It("should successfully create config maps with Controlplane, Core, and Bootstrap Provider manifests", func() {
// Ensure that there are no Cluster API installed
deleteClusterAPICRDs(bootstrapClusterProxy)

Expand All @@ -62,7 +62,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
}

By("Creating provider namespaces")
for _, namespaceName := range []string{capkbSystemNamespace, capkcpSystemNamespace, capiSystemNamespace} {
for _, namespaceName := range []string{cabpkSystemNamespace, cacpkSystemNamespace, capiSystemNamespace} {
namespace := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: namespaceName,
Expand All @@ -82,7 +82,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
bootstrapProvider := &operatorv1.BootstrapProvider{
ObjectMeta: metav1.ObjectMeta{
Name: customProviderName,
Namespace: capkbSystemNamespace,
Namespace: cabpkSystemNamespace,
},
Spec: operatorv1.BootstrapProviderSpec{
ProviderSpec: operatorv1.ProviderSpec{
Expand All @@ -105,7 +105,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Waiting for the bootstrap provider deployment to be ready")
framework.WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{
Getter: bootstrapClusterProxy.GetClient(),
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: bootstrapProviderDeploymentName, Namespace: capkbSystemNamespace}},
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: bootstrapProviderDeploymentName, Namespace: cabpkSystemNamespace}},
}, e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for bootstrap provider to be ready")
Expand Down Expand Up @@ -166,7 +166,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
controlPlaneProvider := &operatorv1.ControlPlaneProvider{
ObjectMeta: metav1.ObjectMeta{
Name: customProviderName,
Namespace: capkcpSystemNamespace,
Namespace: cacpkSystemNamespace,
},
Spec: operatorv1.ControlPlaneProviderSpec{
ProviderSpec: operatorv1.ProviderSpec{
Expand All @@ -189,7 +189,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Waiting for the controlplane provider deployment to be ready")
framework.WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{
Getter: bootstrapClusterProxy.GetClient(),
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: cpProviderDeploymentName, Namespace: capkcpSystemNamespace}},
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: cpProviderDeploymentName, Namespace: cacpkSystemNamespace}},
}, e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for controlplane provider to be ready")
Expand All @@ -210,13 +210,13 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
coreProvider := &operatorv1.CoreProvider{}
controlPlaneProvider := &operatorv1.ControlPlaneProvider{}

bootstrapKey := client.ObjectKey{Namespace: capkbSystemNamespace, Name: customProviderName}
bootstrapKey := client.ObjectKey{Namespace: cabpkSystemNamespace, Name: customProviderName}
Expect(bootstrapCluster.Get(ctx, bootstrapKey, bootstrapProvider)).To(Succeed())

coreKey := client.ObjectKey{Namespace: capiSystemNamespace, Name: coreProviderName}
Expect(bootstrapCluster.Get(ctx, coreKey, coreProvider)).To(Succeed())

cpKey := client.ObjectKey{Namespace: capkcpSystemNamespace, Name: customProviderName}
cpKey := client.ObjectKey{Namespace: cacpkSystemNamespace, Name: customProviderName}
Expect(bootstrapCluster.Get(ctx, cpKey, controlPlaneProvider)).To(Succeed())

bootstrapProvider.Spec.Version = nextCAPIVersion
Expand All @@ -233,7 +233,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Waiting for the bootstrap provider deployment to be ready")
framework.WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{
Getter: bootstrapClusterProxy.GetClient(),
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: bootstrapProviderDeploymentName, Namespace: capkbSystemNamespace}},
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: bootstrapProviderDeploymentName, Namespace: cabpkSystemNamespace}},
}, e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for bootstrap provider to be ready")
Expand Down Expand Up @@ -265,7 +265,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Waiting for the controlplane provider deployment to be ready")
framework.WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{
Getter: bootstrapClusterProxy.GetClient(),
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: cpProviderDeploymentName, Namespace: capkcpSystemNamespace}},
Deployment: &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: cpProviderDeploymentName, Namespace: cacpkSystemNamespace}},
}, e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for controlplane provider to be ready")
Expand All @@ -283,15 +283,15 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
bootstrapCluster := bootstrapClusterProxy.GetClient()
bootstrapProvider := &operatorv1.BootstrapProvider{ObjectMeta: metav1.ObjectMeta{
Name: customProviderName,
Namespace: capkbSystemNamespace,
Namespace: cabpkSystemNamespace,
}}

Expect(bootstrapCluster.Delete(ctx, bootstrapProvider)).To(Succeed())

By("Waiting for the bootstrap provider deployment to be deleted")
WaitForDelete(ctx, For(&appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{
Name: bootstrapProviderDeploymentName,
Namespace: capkbSystemNamespace,
Namespace: cabpkSystemNamespace,
}}).In(bootstrapCluster), e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for the bootstrap provider object to be deleted")
Expand Down Expand Up @@ -323,7 +323,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Deleting capkb-system namespace")
namespace := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: capkbSystemNamespace,
Name: cabpkSystemNamespace,
},
}
Expect(bootstrapCluster.Delete(ctx, namespace)).To(Succeed())
Expand Down Expand Up @@ -383,15 +383,15 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
bootstrapCluster := bootstrapClusterProxy.GetClient()
ControlPlaneProvider := &operatorv1.ControlPlaneProvider{ObjectMeta: metav1.ObjectMeta{
Name: customProviderName,
Namespace: capkcpSystemNamespace,
Namespace: cacpkSystemNamespace,
}}

Expect(bootstrapCluster.Delete(ctx, ControlPlaneProvider)).To(Succeed())

By("Waiting for the controlplane provider deployment to be deleted")
WaitForDelete(ctx, For(&appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{
Name: cpProviderDeploymentName,
Namespace: capkcpSystemNamespace,
Namespace: cacpkSystemNamespace,
}}).In(bootstrapCluster), e2eConfig.GetIntervals(bootstrapClusterProxy.GetName(), "wait-controllers")...)

By("Waiting for the controlplane provider object to be deleted")
Expand Down Expand Up @@ -423,7 +423,7 @@ var _ = Describe("Install Controlplane, Core, Bootstrap Providers in an air-gapp
By("Deleting capkcp-system namespace")
namespace := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: capkcpSystemNamespace,
Name: cacpkSystemNamespace,
},
}
Expect(bootstrapCluster.Delete(ctx, namespace)).To(Succeed())
Expand Down
10 changes: 5 additions & 5 deletions test/e2e/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ import (
var ctx = context.Background()

const (
operatorNamespace = "capi-operator-system"
capkbSystemNamespace = "capi-kubeadm-bootstrap-system"
capkcpSystemNamespace = "capi-kubeadm-control-plane-system"
capiSystemNamespace = "capi-system"
capiOperatorRelease = "capi-operator"
operatorNamespace = "capi-operator-system"
cabpkSystemNamespace = "capi-kubeadm-bootstrap-system"
cacpkSystemNamespace = "capi-kubeadm-control-plane-system"
capiSystemNamespace = "capi-system"
capiOperatorRelease = "capi-operator"

previousCAPIVersion = "v1.7.7"
nextCAPIVersion = "v1.8.0"
Expand Down
34 changes: 34 additions & 0 deletions util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,40 @@ func ClusterctlProviderType(genericProvider operatorv1.GenericProvider) clusterc
return clusterctlv1.ProviderTypeUnknown
}

// GetCustomProviders retrieves all custom providers using `FetchConfig` that aren't the current provider name / type.
func GetCustomProviders(ctx context.Context, cl ctrlclient.Client, currProvider genericprovider.GenericProvider) ([]operatorv1.GenericProvider, error) {
customProviders := []operatorv1.GenericProvider{}
currProviderName := currProvider.GetName()
currProviderType := currProvider.GetType()

for _, providerList := range operatorv1.ProviderLists {
providerList, ok := providerList.(ctrlclient.ObjectList)
if !ok {
return nil, fmt.Errorf("cannot cast providers list to ObjectList")
}

if err := cl.List(ctx, providerList); err != nil {
return nil, fmt.Errorf("cannot get a list of providers from the server: %w", err)
}

genericProviderList, ok := providerList.(operatorv1.GenericProviderList)
if !ok {
return nil, fmt.Errorf("cannot cast providers list to GenericProviderList")
}

genericProviderListItems := genericProviderList.GetItems()
for i, provider := range genericProviderListItems {
if provider.GetName() == currProviderName && provider.GetType() == currProviderType || provider.GetSpec().FetchConfig == nil {
continue
}

customProviders = append(customProviders, genericProviderListItems[i])
}
}

return customProviders, nil
}

// GetGenericProvider returns the first of generic providers matching the type and the name from the configclient.Provider.
func GetGenericProvider(ctx context.Context, cl ctrlclient.Client, provider configclient.Provider) (operatorv1.GenericProvider, error) {
var list genericProviderList
Expand Down