@@ -147,6 +147,16 @@ func (p *phaseReconciler) initializePhaseReconciler(ctx context.Context) (reconc
147
147
return reconcile.Result {}, err
148
148
}
149
149
150
+ customProviders , err := p .getCustomProviders (ctx )
151
+ if err != nil {
152
+ return reconcile.Result {}, err
153
+ }
154
+
155
+ reader , err = loadCustomProviders (customProviders , reader )
156
+ if err != nil {
157
+ return reconcile.Result {}, err
158
+ }
159
+
150
160
// Load provider's secret and config url.
151
161
p .configClient , err = configclient .New (ctx , "" , configclient .InjectReader (reader ))
152
162
if err != nil {
@@ -562,6 +572,69 @@ func getProvider(provider operatorv1.GenericProvider, defaultVersion string) clu
562
572
return * clusterctlProvider
563
573
}
564
574
575
+ func (p * phaseReconciler ) getCustomProviders (ctx context.Context ) ([]operatorv1.GenericProvider , error ) {
576
+ log := ctrl .LoggerFrom (ctx )
577
+
578
+ customProviders := []operatorv1.GenericProvider {}
579
+ currProviderName := p .provider .GetName ()
580
+ currProviderType := p .provider .GetType ()
581
+
582
+ providerLists := []client.ObjectList {
583
+ & operatorv1.CoreProviderList {},
584
+ & operatorv1.BootstrapProviderList {},
585
+ & operatorv1.ControlPlaneProviderList {},
586
+ & operatorv1.InfrastructureProviderList {},
587
+ & operatorv1.AddonProviderList {},
588
+ & operatorv1.IPAMProviderList {},
589
+ & operatorv1.RuntimeExtensionProviderList {},
590
+ }
591
+
592
+ for _ , providerList := range providerLists {
593
+ if err := p .ctrlClient .List (ctx , providerList ); err != nil {
594
+ return nil , fmt .Errorf ("cannot get a list of providers from the server: %w" , err )
595
+ }
596
+
597
+ genericProviderList , ok := providerList .(operatorv1.GenericProviderList )
598
+ if ! ok {
599
+ return nil , fmt .Errorf ("cannot cast providers list to GenericProviderList" )
600
+ }
601
+
602
+ genericProviderListItems := genericProviderList .GetItems ()
603
+ for i , provider := range genericProviderListItems {
604
+ if provider .GetName () == currProviderName && provider .GetType () == currProviderType || provider .GetSpec ().FetchConfig == nil {
605
+ continue
606
+ }
607
+
608
+ log .Info ("custom provider found" , provider .GetName (), provider .GetType (), provider .GetNamespace ())
609
+
610
+ customProviders = append (customProviders , genericProviderListItems [i ])
611
+ }
612
+ }
613
+
614
+ return customProviders , nil
615
+ }
616
+
617
+ func loadCustomProviders (providers []operatorv1.GenericProvider , reader configclient.Reader ) (configclient.Reader , error ) {
618
+ mr , ok := reader .(* configclient.MemoryReader )
619
+ if ! ok {
620
+ return nil , fmt .Errorf ("unable to load custom providers, invalid reader passed" )
621
+ }
622
+
623
+ for _ , provider := range providers {
624
+ if provider .GetSpec ().FetchConfig .URL == "" {
625
+ if _ , err := mr .AddProvider (provider .GetName (), util .ClusterctlProviderType (provider ), fakeURL ); err != nil {
626
+ return nil , err
627
+ }
628
+ } else {
629
+ if _ , err := mr .AddProvider (provider .GetName (), util .ClusterctlProviderType (provider ), provider .GetSpec ().FetchConfig .URL ); err != nil {
630
+ return nil , err
631
+ }
632
+ }
633
+ }
634
+
635
+ return mr , nil
636
+ }
637
+
565
638
// delete deletes the provider components using clusterctl library.
566
639
func (p * phaseReconciler ) delete (ctx context.Context ) (reconcile.Result , error ) {
567
640
log := ctrl .LoggerFrom (ctx )
0 commit comments