@@ -108,6 +108,35 @@ func newPhaseReconciler(r GenericProviderReconciler, provider genericprovider.Ge
108
108
}
109
109
}
110
110
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
+
111
140
// preflightChecks a wrapper around the preflight checks.
112
141
func (p * phaseReconciler ) preflightChecks (ctx context.Context ) (reconcile.Result , error ) {
113
142
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) {
199
228
return reconcile.Result {}, wrapPhaseError (err , "failed to load additional manifests" , operatorv1 .ProviderInstalledCondition )
200
229
}
201
230
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 ) )
203
232
if err != nil {
204
233
return reconcile.Result {}, wrapPhaseError (err , "failed to load the repository" , operatorv1 .ProviderInstalledCondition )
205
234
}
@@ -299,18 +328,26 @@ func (p *phaseReconciler) secretReader(ctx context.Context, providers ...configc
299
328
300
329
// configmapRepository use clusterctl NewMemoryRepository structure to store the manifests
301
330
// 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 ) {
303
332
mr := repository .NewMemoryRepository ()
304
333
mr .WithPaths ("" , "components.yaml" )
305
334
335
+ settings := & ConfigMapRepositorySettings {
336
+ Repository : mr ,
337
+ }
338
+
339
+ for _ , option := range options {
340
+ option .ApplyToConfigMapRepository (settings )
341
+ }
342
+
306
343
cml := & corev1.ConfigMapList {}
307
344
308
345
selector , err := metav1 .LabelSelectorAsSelector (labelSelector )
309
346
if err != nil {
310
347
return nil , err
311
348
}
312
349
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 {
314
351
return nil , err
315
352
}
316
353
@@ -341,13 +378,22 @@ func (p *phaseReconciler) configmapRepository(ctx context.Context, labelSelector
341
378
342
379
mr .WithFile (version , metadataFile , []byte (metadata ))
343
380
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
+
344
390
components , err := getComponentsData (cm )
345
391
if err != nil {
346
392
return nil , err
347
393
}
348
394
349
- if additionalManifests != "" {
350
- components = components + "\n ---\n " + additionalManifests
395
+ if settings . additionalManifests != "" {
396
+ components = components + "\n ---\n " + settings . additionalManifests
351
397
}
352
398
353
399
mr .WithFile (version , mr .ComponentsPath (), []byte (components ))
@@ -649,7 +695,7 @@ func (p *phaseReconciler) repositoryProxy(ctx context.Context, provider configcl
649
695
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 )
650
696
}
651
697
652
- repo , err := p .configmapRepository (ctx , providerLabelSelector (genericProvider ), genericProvider .GetNamespace (), "" )
698
+ repo , err := p .configmapRepository (ctx , providerLabelSelector (genericProvider ), InNamespace ( genericProvider .GetNamespace ()), SkipComponents {} )
653
699
if err != nil {
654
700
provider := client .ObjectKeyFromObject (genericProvider )
655
701
return nil , wrapPhaseError (err , "failed to load the repository for provider " + provider .String (), operatorv1 .ProviderUpgradedCondition )
0 commit comments