@@ -23,6 +23,7 @@ import (
2323 "fmt"
2424 "io"
2525 "net/url"
26+ "os"
2627 "strings"
2728
2829 corev1 "k8s.io/api/core/v1"
@@ -114,18 +115,35 @@ func (p *phaseReconciler) preflightChecks(ctx context.Context) (reconcile.Result
114115
115116// initializePhaseReconciler initializes phase reconciler.
116117func (p * phaseReconciler ) initializePhaseReconciler (ctx context.Context ) (reconcile.Result , error ) {
117- // Load provider's secret and config url.
118- reader , err := p .secretReader (ctx )
119- if err != nil {
120- return reconcile.Result {}, wrapPhaseError (err , "failed to load the secret reader" )
118+ path := configPath
119+ if _ , err := os .Stat (configPath ); os .IsNotExist (err ) {
120+ path = ""
121+ } else if err != nil {
122+ return reconcile.Result {}, err
121123 }
122124
123125 // Initialize a client for interacting with the clusterctl configuration.
124- p .configClient , err = configclient .New (ctx , "" , configclient .InjectReader (reader ))
126+ initConfig , err := configclient .New (ctx , path )
127+ if err != nil {
128+ return reconcile.Result {}, err
129+ }
130+
131+ providers , err := initConfig .Providers ().List ()
125132 if err != nil {
126133 return reconcile.Result {}, err
127134 }
128135
136+ reader , err := p .secretReader (ctx , providers ... )
137+ if err != nil {
138+ return reconcile.Result {}, err
139+ }
140+
141+ // Load provider's secret and config url.
142+ p .configClient , err = configclient .New (ctx , "" , configclient .InjectReader (reader ))
143+ if err != nil {
144+ return reconcile.Result {}, wrapPhaseError (err , "failed to load the secret reader" )
145+ }
146+
129147 // Get returns the configuration for the provider with a given name/type.
130148 // This is done using clusterctl internal API types.
131149 p .providerConfig , err = p .configClient .Providers ().Get (p .provider .GetName (), util .ClusterctlProviderType (p .provider ))
@@ -197,7 +215,7 @@ func (p *phaseReconciler) load(ctx context.Context) (reconcile.Result, error) {
197215
198216// secretReader use clusterctl MemoryReader structure to store the configuration variables
199217// that are obtained from a secret and try to set fetch url config.
200- func (p * phaseReconciler ) secretReader (ctx context.Context ) (configclient.Reader , error ) {
218+ func (p * phaseReconciler ) secretReader (ctx context.Context , providers ... configclient. Provider ) (configclient.Reader , error ) {
201219 log := ctrl .LoggerFrom (ctx )
202220
203221 mr := configclient .NewMemoryReader ()
@@ -222,6 +240,12 @@ func (p *phaseReconciler) secretReader(ctx context.Context) (configclient.Reader
222240 log .Info ("No configuration secret was specified" )
223241 }
224242
243+ for _ , provider := range providers {
244+ if _ , err := mr .AddProvider (provider .Name (), provider .Type (), provider .URL ()); err != nil {
245+ return nil , err
246+ }
247+ }
248+
225249 // If provided store fetch config url in memory reader.
226250 if p .provider .GetSpec ().FetchConfig != nil {
227251 if p .provider .GetSpec ().FetchConfig .URL != "" {
0 commit comments