@@ -108,6 +108,35 @@ func newPhaseReconciler(r GenericProviderReconciler, provider genericprovider.Ge
108108 }
109109}
110110
111+ type ConfigMapRepositorySettings struct {
112+ repository.Repository
113+ additionalManifests string
114+ skipComponents bool
115+ namespace string
116+ }
117+
118+ type ConfigMapRepositoryOption interface {
119+ ApplyToConfigMapRepository (* ConfigMapRepositorySettings )
120+ }
121+
122+ type WithAdditionalManifests string
123+
124+ func (w WithAdditionalManifests ) ApplyToConfigMapRepository (settings * ConfigMapRepositorySettings ) {
125+ settings .additionalManifests = string (w )
126+ }
127+
128+ type SkipComponents struct {}
129+
130+ func (s SkipComponents ) ApplyToConfigMapRepository (settings * ConfigMapRepositorySettings ) {
131+ settings .skipComponents = true
132+ }
133+
134+ type InNamespace string
135+
136+ func (i InNamespace ) ApplyToConfigMapRepository (settings * ConfigMapRepositorySettings ) {
137+ settings .namespace = string (i )
138+ }
139+
111140// preflightChecks a wrapper around the preflight checks.
112141func (p * phaseReconciler ) preflightChecks (ctx context.Context ) (reconcile.Result , error ) {
113142 return reconcile.Result {}, preflightChecks (ctx , p .ctrlClient , p .provider , p .providerList )
@@ -199,7 +228,7 @@ func (p *phaseReconciler) load(ctx context.Context) (reconcile.Result, error) {
199228 return reconcile.Result {}, wrapPhaseError (err , "failed to load additional manifests" , operatorv1 .ProviderInstalledCondition )
200229 }
201230
202- p .repo , err = p .configmapRepository (ctx , labelSelector , p .provider .GetNamespace (), additionalManifests )
231+ p .repo , err = p .configmapRepository (ctx , labelSelector , InNamespace ( p .provider .GetNamespace ()), WithAdditionalManifests ( additionalManifests ) )
203232 if err != nil {
204233 return reconcile.Result {}, wrapPhaseError (err , "failed to load the repository" , operatorv1 .ProviderInstalledCondition )
205234 }
@@ -299,18 +328,26 @@ func (p *phaseReconciler) secretReader(ctx context.Context, providers ...configc
299328
300329// configmapRepository use clusterctl NewMemoryRepository structure to store the manifests
301330// and metadata from a given configmap.
302- func (p * phaseReconciler ) configmapRepository (ctx context.Context , labelSelector * metav1.LabelSelector , namespace , additionalManifests string ) (repository.Repository , error ) {
331+ func (p * phaseReconciler ) configmapRepository (ctx context.Context , labelSelector * metav1.LabelSelector , options ... ConfigMapRepositoryOption ) (repository.Repository , error ) {
303332 mr := repository .NewMemoryRepository ()
304333 mr .WithPaths ("" , "components.yaml" )
305334
335+ settings := & ConfigMapRepositorySettings {
336+ Repository : mr ,
337+ }
338+
339+ for _ , option := range options {
340+ option .ApplyToConfigMapRepository (settings )
341+ }
342+
306343 cml := & corev1.ConfigMapList {}
307344
308345 selector , err := metav1 .LabelSelectorAsSelector (labelSelector )
309346 if err != nil {
310347 return nil , err
311348 }
312349
313- if err = p .ctrlClient .List (ctx , cml , & client.ListOptions {LabelSelector : selector , Namespace : namespace }); err != nil {
350+ if err = p .ctrlClient .List (ctx , cml , & client.ListOptions {LabelSelector : selector , Namespace : settings . namespace }); err != nil {
314351 return nil , err
315352 }
316353
@@ -341,13 +378,22 @@ func (p *phaseReconciler) configmapRepository(ctx context.Context, labelSelector
341378
342379 mr .WithFile (version , metadataFile , []byte (metadata ))
343380
381+ // Exclude components from the repository if only metadata is needed.
382+ // Used for provider upgrades, when compatibility with other providers is
383+ // established based on the metadata only.
384+ if settings .skipComponents {
385+ mr .WithFile (version , mr .ComponentsPath (), []byte {})
386+
387+ continue
388+ }
389+
344390 components , err := getComponentsData (cm )
345391 if err != nil {
346392 return nil , err
347393 }
348394
349- if additionalManifests != "" {
350- components = components + "\n ---\n " + additionalManifests
395+ if settings . additionalManifests != "" {
396+ components = components + "\n ---\n " + settings . additionalManifests
351397 }
352398
353399 mr .WithFile (version , mr .ComponentsPath (), []byte (components ))
@@ -649,7 +695,7 @@ func (p *phaseReconciler) repositoryProxy(ctx context.Context, provider configcl
649695 return nil , wrapPhaseError (fmt .Errorf ("config map not found" ), "config map repository required for validation does not exist yet for provider " + provider .String (), operatorv1 .ProviderUpgradedCondition )
650696 }
651697
652- repo , err := p .configmapRepository (ctx , providerLabelSelector (genericProvider ), genericProvider .GetNamespace (), "" )
698+ repo , err := p .configmapRepository (ctx , providerLabelSelector (genericProvider ), InNamespace ( genericProvider .GetNamespace ()), SkipComponents {} )
653699 if err != nil {
654700 provider := client .ObjectKeyFromObject (genericProvider )
655701 return nil , wrapPhaseError (err , "failed to load the repository for provider " + provider .String (), operatorv1 .ProviderUpgradedCondition )
0 commit comments