Skip to content

Commit 543c850

Browse files
authored
feat: retrieve all component version references by name (#98)
1 parent c9d1e4d commit 543c850

File tree

12 files changed

+148
-102
lines changed

12 files changed

+148
-102
lines changed

internal/component/component_manager.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
// ComponentManager bundles the OCM logic required by the FluxDeployer.
1111
type ComponentManager interface {
12-
GetComponentWithImageResources(ctx context.Context, resourceName string) (*ocm_cli.ComponentVersion, error)
12+
GetComponentsWithImageResources(ctx context.Context, resourceName string) ([]ocm_cli.ComponentVersion, error)
1313
DownloadTemplatesResource(ctx context.Context, downloadDir string) error
1414
}
1515

@@ -35,8 +35,8 @@ func NewComponentManager(ctx context.Context, config *cfg.BootstrapperConfig, oc
3535
return m, nil
3636
}
3737

38-
func (m *ComponentManagerImpl) GetComponentWithImageResources(ctx context.Context, resourceName string) (*ocm_cli.ComponentVersion, error) {
39-
return m.ComponentGetter.GetComponentVersionForResourceRecursive(ctx, m.ComponentGetter.RootComponentVersion(), resourceName)
38+
func (m *ComponentManagerImpl) GetComponentsWithImageResources(ctx context.Context, resourceName string) ([]ocm_cli.ComponentVersion, error) {
39+
return m.ComponentGetter.GetComponentVersionsForResourceRecursive(ctx, m.ComponentGetter.RootComponentVersion(), resourceName)
4040
}
4141

4242
func (m *ComponentManagerImpl) DownloadTemplatesResource(ctx context.Context, downloadDir string) error {

internal/component/component_manager_mock.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ type MockComponentManager struct {
1919

2020
var _ ComponentManager = (*MockComponentManager)(nil)
2121

22-
func (m MockComponentManager) GetComponentWithImageResources(_ context.Context, _ string) (*ocmcli.ComponentVersion, error) {
23-
return loadComponentVersion(m.ComponentPath)
22+
func (m MockComponentManager) GetComponentsWithImageResources(_ context.Context, _ string) ([]ocmcli.ComponentVersion, error) {
23+
cv, err := loadComponentVersion(m.ComponentPath)
24+
if err != nil {
25+
return nil, err
26+
}
27+
return []ocmcli.ComponentVersion{*cv}, nil
2428
}
2529

2630
func (m MockComponentManager) DownloadTemplatesResource(_ context.Context, downloadDir string) error {

internal/deployment-repo/deploymentRepoManager.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,23 @@ func (m *DeploymentRepoManager) Initialize(ctx context.Context) (*DeploymentRepo
147147

148148
logger.Infof("Fetching openmcp-operator component version")
149149

150-
m.openMCPOperatorCV, err = m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), OpenMCPOperatorComponentName)
150+
openMCPOperatorCVs, err := m.compGetter.GetReferencedComponentVersionsRecursive(ctx, m.compGetter.RootComponentVersion(), OpenMCPOperatorComponentName)
151151
if err != nil {
152152
return m, fmt.Errorf("failed to get openmcp-operator component version: %w", err)
153153
}
154+
if len(openMCPOperatorCVs) != 1 {
155+
return m, fmt.Errorf("expected exactly one openmcp-operator component version, got %d", len(openMCPOperatorCVs))
156+
}
157+
m.openMCPOperatorCV = &openMCPOperatorCVs[0]
154158

155-
m.fluxcdCV, err = m.compGetter.GetComponentVersionForResourceRecursive(ctx, m.compGetter.RootComponentVersion(), FluxCDSourceControllerResourceName)
159+
fluxcdCVs, err := m.compGetter.GetComponentVersionsForResourceRecursive(ctx, m.compGetter.RootComponentVersion(), FluxCDSourceControllerResourceName)
156160
if err != nil {
157161
return m, fmt.Errorf("failed to get fluxcd source controller component version: %w", err)
158162
}
163+
if len(fluxcdCVs) != 1 {
164+
return m, fmt.Errorf("expected exactly one fluxcd source controller component version, got %d", len(fluxcdCVs))
165+
}
166+
m.fluxcdCV = &fluxcdCVs[0]
159167

160168
m.gitConfig, err = gitconfig.ParseConfig(m.GitConfigPath)
161169
if err != nil {
@@ -339,34 +347,42 @@ func (m *DeploymentRepoManager) ApplyCustomResourceDefinitions(ctx context.Conte
339347
}
340348

341349
for _, clusterProvider := range m.Config.Providers.ClusterProviders {
342-
clusterProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "cluster-provider-"+clusterProvider.Name)
350+
clusterProviderCVs, err := m.compGetter.GetReferencedComponentVersionsRecursive(ctx, m.compGetter.RootComponentVersion(), "cluster-provider-"+clusterProvider.Name)
343351
if err != nil {
344352
return fmt.Errorf("failed to get component version for cluster provider %s: %w", clusterProvider, err)
345353
}
346-
347-
err = m.applyCRDsForComponentVersion(ctx, clusterProviderCV, crdDirectory)
354+
if len(clusterProviderCVs) != 1 {
355+
return fmt.Errorf("expected exactly one component version for cluster provider %s, got %d", clusterProvider, len(clusterProviderCVs))
356+
}
357+
err = m.applyCRDsForComponentVersion(ctx, &clusterProviderCVs[0], crdDirectory)
348358
if err != nil {
349359
logger.Warnf("Failed to apply CRDs for cluster provider %s: %v", clusterProvider, err)
350360
}
351361
}
352362

353363
for _, serviceProvider := range m.Config.Providers.ServiceProviders {
354-
serviceProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "service-provider-"+serviceProvider.Name)
364+
serviceProviderCVs, err := m.compGetter.GetReferencedComponentVersionsRecursive(ctx, m.compGetter.RootComponentVersion(), "service-provider-"+serviceProvider.Name)
355365
if err != nil {
356366
return fmt.Errorf("failed to get component version for service provider %s: %w", serviceProvider, err)
357367
}
358-
err = m.applyCRDsForComponentVersion(ctx, serviceProviderCV, crdDirectory)
368+
if len(serviceProviderCVs) != 1 {
369+
return fmt.Errorf("expected exactly one component version for service provider %s, got %d", serviceProvider, len(serviceProviderCVs))
370+
}
371+
err = m.applyCRDsForComponentVersion(ctx, &serviceProviderCVs[0], crdDirectory)
359372
if err != nil {
360373
logger.Warnf("Failed to apply CRDs for service provider %s: %v", serviceProvider, err)
361374
}
362375
}
363376

364377
for _, platformService := range m.Config.Providers.PlatformServices {
365-
platformServiceCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "platform-service-"+platformService.Name)
378+
platformServiceCVs, err := m.compGetter.GetReferencedComponentVersionsRecursive(ctx, m.compGetter.RootComponentVersion(), "platform-service-"+platformService.Name)
366379
if err != nil {
367380
return fmt.Errorf("failed to get component version for platform service %s: %w", platformService, err)
368381
}
369-
err = m.applyCRDsForComponentVersion(ctx, platformServiceCV, crdDirectory)
382+
if len(platformServiceCVs) != 1 {
383+
return fmt.Errorf("expected exactly one component version for platform service %s, got %d", platformService, len(platformServiceCVs))
384+
}
385+
err = m.applyCRDsForComponentVersion(ctx, &platformServiceCVs[0], crdDirectory)
370386
if err != nil {
371387
logger.Warnf("Failed to apply CRDs for platform service %s: %v", platformService, err)
372388
}

internal/deployment-repo/templater.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,15 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders,
153153
}
154154

155155
for _, cp := range clusterProviders {
156-
componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "cluster-provider-"+cp.Name)
156+
componentVersions, err := ocmGetter.GetReferencedComponentVersionsRecursive(ctx, ocmGetter.RootComponentVersion(), "cluster-provider-"+cp.Name)
157157
if err != nil {
158158
return fmt.Errorf("failed to get component version for cluster provider %s: %w", cp, err)
159159
}
160+
if len(componentVersions) != 1 {
161+
return fmt.Errorf("expected exactly one component version for cluster provider %s, got %d", cp, len(componentVersions))
162+
}
160163

161-
imageResource, err := getImageResource(componentVersion)
164+
imageResource, err := getImageResource(&componentVersions[0])
162165
if err != nil {
163166
return fmt.Errorf("failed to get image resource for cluster provider %s: %w", cp, err)
164167
}
@@ -177,12 +180,15 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders,
177180
}
178181

179182
for _, sp := range serviceProviders {
180-
componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "service-provider-"+sp.Name)
183+
componentVersions, err := ocmGetter.GetReferencedComponentVersionsRecursive(ctx, ocmGetter.RootComponentVersion(), "service-provider-"+sp.Name)
181184
if err != nil {
182185
return fmt.Errorf("failed to get component version for service provider %s: %w", sp, err)
183186
}
187+
if len(componentVersions) != 1 {
188+
return fmt.Errorf("expected exactly one component version for service provider %s, got %d", sp, len(componentVersions))
189+
}
184190

185-
imageResource, err := getImageResource(componentVersion)
191+
imageResource, err := getImageResource(&componentVersions[0])
186192
if err != nil {
187193
return fmt.Errorf("failed to get image resource for service provider %s: %w", sp, err)
188194
}
@@ -201,12 +207,15 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders,
201207
}
202208

203209
for _, ps := range platformServices {
204-
componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "platform-service-"+ps.Name)
210+
componentVersions, err := ocmGetter.GetReferencedComponentVersionsRecursive(ctx, ocmGetter.RootComponentVersion(), "platform-service-"+ps.Name)
205211
if err != nil {
206212
return fmt.Errorf("failed to get component version for platform service %s: %w", ps, err)
207213
}
214+
if len(componentVersions) != 1 {
215+
return fmt.Errorf("expected exactly one component version for platform service %s, got %d", ps, len(componentVersions))
216+
}
208217

209-
imageResource, err := getImageResource(componentVersion)
218+
imageResource, err := getImageResource(&componentVersions[0])
210219
if err != nil {
211220
return fmt.Errorf("failed to get image resource for platform service %s: %w", ps, err)
212221
}

internal/deployment-repo/testdata/01/component-constructor.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,10 @@ components:
180180
resources:
181181
- name: image-crossplane
182182
type: ociImage
183-
version: v0.0.2
183+
version: v0.0.1
184184
access:
185185
type: ociArtifact
186-
imageReference: ghcr.io/openmcp-project/releasechannel/crossplane:v0.0.2
186+
imageReference: ghcr.io/openmcp-project/releasechannel/crossplane:v0.0.1
187187

188188
- name: github.com/openmcp-project/openmcp/releasechannel/crossplane
189189
version: v0.0.2

internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/extra/test-configmap.yaml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ data:
1313
key: "value"
1414
repository: "{{OCM_REPO_URL}}"
1515
rootComponent: "github.com/openmcp-project/openmcp"
16-
crossplaneComponentName: "github.com/openmcp-project/openmcp/releasechannel/crossplane"
17-
crossplaneComponentVersion: "v0.0.1"
18-
crossplaneImage: "ghcr.io/openmcp-project/releasechannel/crossplane"
19-
crossplaneVersions: |
20-
- v0.0.1
21-
- v0.0.2
16+
crossplane: |
17+
- crossplaneComponentName: "github.com/openmcp-project/openmcp/releasechannel/crossplane"
18+
crossplaneComponentVersion: "v0.0.1"
19+
crossplaneImage: "ghcr.io/openmcp-project/releasechannel/crossplane:v0.0.1"
20+
- crossplaneComponentName: "github.com/openmcp-project/openmcp/releasechannel/crossplane"
21+
crossplaneComponentVersion: "v0.0.2"
22+
crossplaneImage: "ghcr.io/openmcp-project/releasechannel/crossplane:v0.0.2"
2223
platformService: |
2324
image: "ghcr.io/openmcp-project/images/platform-service-test"
2425
version: "v0.3.0"

internal/deployment-repo/testdata/01/extra-manifests/test-configmap.yaml

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ data:
99
key: "value"
1010
repository: "{{ getOCMRepository }}"
1111
rootComponent: "{{ dig "component" "name" "none" (componentVersionAsMap (getRootComponentVersion)) }}"
12-
{{- $releaseChannelCv := getComponentVersionByReference "releasechannel" }}
13-
{{- $crossplaneCv := getComponentVersionByReference $releaseChannelCv "crossplane" }}
14-
{{- $crossplaneImageResource := getResourceFromComponentVersion $crossplaneCv "image-crossplane" }}
15-
{{- $imageReference := dig "access" "imageReference" "none" $crossplaneImageResource }}
16-
{{- $parsedImage := parseImage $imageReference }}
17-
{{- $crossplaneCvMap := componentVersionAsMap $crossplaneCv }}
18-
crossplaneComponentName: "{{ dig "component" "name" "none" $crossplaneCvMap }}"
19-
crossplaneComponentVersion: "{{ dig "component" "version" "none" $crossplaneCvMap }}"
20-
crossplaneImage: "{{ dig "image" "none" $parsedImage }}"
21-
crossplaneVersions: |
22-
{{- $crossplaneVersions := listComponentVersions $crossplaneCv }}
23-
{{ toYaml (sortAlpha $crossplaneVersions) | indent 4 }}
12+
{{- $releaseChannelCvs := getComponentVersionsByReference "releasechannel" }}
13+
{{- $releaseChannelCv := index $releaseChannelCvs 0 }}
14+
{{- $crossplaneCvs := getComponentVersionsByReference $releaseChannelCv "crossplane" }}
15+
crossplane: |
16+
{{- range $crossplaneCv := $crossplaneCvs }}
17+
{{- $crossplaneImageResource := getResourceFromComponentVersion $crossplaneCv "image-crossplane" }}
18+
{{- $imageReference := dig "access" "imageReference" "none" $crossplaneImageResource }}
19+
{{- $parsedImage := parseImage $imageReference }}
20+
{{- $crossplaneCvMap := componentVersionAsMap $crossplaneCv }}
21+
- crossplaneComponentName: "{{ dig "component" "name" "none" $crossplaneCvMap }}"
22+
crossplaneComponentVersion: "{{ dig "component" "version" "none" $crossplaneCvMap }}"
23+
crossplaneImage: "{{ dig "image" "none" $parsedImage }}:{{ dig "tag" "none" $parsedImage }}"
24+
{{- end }}
2425
platformService: |
25-
{{- $platformServiceCv := getComponentVersionForResource "platform-service-test-image" }}
26+
{{- $platformServiceCvs := getComponentVersionsForResource "platform-service-test-image" }}
27+
{{- $platformServiceCv := index $platformServiceCvs 0 }}
2628
{{- $platformServiceImageResource := getResourceFromComponentVersion $platformServiceCv "platform-service-test-image" }}
2729
{{- $platformServiceImageReference := dig "access" "imageReference" "none" $platformServiceImageResource }}
2830
{{- $platformServiceParsedImage := parseImage $platformServiceImageReference }}

internal/eso-deployer/deployer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,14 @@ func (d *EsoDeployer) Deploy(ctx context.Context) error {
5050

5151
func (d *EsoDeployer) DeployWithComponentManager(ctx context.Context, componentManager component.ComponentManager) error {
5252
d.log.Info("Getting OCM component containing ESO resources.")
53-
esoComponent, err := componentManager.GetComponentWithImageResources(ctx, "external-secrets-operator-image")
53+
esoComponents, err := componentManager.GetComponentsWithImageResources(ctx, "external-secrets-operator-image")
5454
if err != nil {
5555
return fmt.Errorf("failed to get external-secrets-operator-image component: %w", err)
5656
}
57+
if len(esoComponents) != 1 {
58+
return fmt.Errorf("expected exactly one component with external-secrets-operator-image resource, got %d", len(esoComponents))
59+
}
60+
esoComponent := &esoComponents[0]
5761

5862
esoChartRes, err := esoComponent.GetResource("external-secrets-operator-chart")
5963
if err != nil {

internal/flux_deployer/deployer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,14 @@ func (d *FluxDeployer) DeployWithComponentManager(ctx context.Context, component
109109
d.log.Tracef("Created repo directory: %s", d.repoDir)
110110

111111
// Get component which contains the fluxcd images as resources
112-
d.fluxcdCV, err = componentManager.GetComponentWithImageResources(ctx, FluxCDSourceControllerResourceName)
112+
fluxcdCVs, err := componentManager.GetComponentsWithImageResources(ctx, FluxCDSourceControllerResourceName)
113113
if err != nil {
114114
return fmt.Errorf("failed to get fluxcd source controller component version: %w", err)
115115
}
116+
if len(fluxcdCVs) != 1 {
117+
return fmt.Errorf("expected exactly one fluxcd component version with resource %s, got %d", FluxCDSourceControllerResourceName, len(fluxcdCVs))
118+
}
119+
d.fluxcdCV = &fluxcdCVs[0]
116120

117121
// Download resource from gitops-templates component into the download directory
118122
d.log.Info("Downloading templates")

0 commit comments

Comments
 (0)