Skip to content

Commit be0efd3

Browse files
author
Danil-Grigorev
committed
Exclude provider components for different providers from reconciled
Signed-off-by: Danil-Grigorev <[email protected]>
1 parent 99b8bf9 commit be0efd3

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed

internal/controller/phases.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
112141
func (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)

internal/controller/phases_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ metadata:
389389
g.Expect(fakeclient.Create(ctx, &tt.configMaps[i])).To(Succeed())
390390
}
391391

392-
got, err := p.configmapRepository(context.TODO(), p.provider.GetSpec().FetchConfig.Selector, "ns1", tt.additionalManifests)
392+
got, err := p.configmapRepository(context.TODO(), p.provider.GetSpec().FetchConfig.Selector, InNamespace("ns1"), WithAdditionalManifests(tt.additionalManifests))
393393

394394
if len(tt.wantErr) > 0 {
395395
g.Expect(err).Should(MatchError(tt.wantErr))
@@ -596,7 +596,7 @@ releaseSeries:
596596
MatchLabels: map[string]string{
597597
operatorManagedLabel: "true",
598598
},
599-
}, "default", "")
599+
}, InNamespace("default"))
600600
g.Expect(err).To(Succeed())
601601
}
602602

0 commit comments

Comments
 (0)