From c09ebc90d1a705cbd56687592e04b2177bd2f91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sch=C3=BCnemann?= Date: Tue, 21 Oct 2025 15:00:30 +0200 Subject: [PATCH 1/2] feat: add more OCM template functions --- .../testdata/01/component-constructor.yaml | 2 +- .../openmcp/extra/test-configmap.yaml | 6 ++- .../01/extra-manifests/test-configmap.yaml | 10 +++- internal/template/template.go | 53 +++++++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/internal/deployment-repo/testdata/01/component-constructor.yaml b/internal/deployment-repo/testdata/01/component-constructor.yaml index 7a083e7..cc52aa5 100644 --- a/internal/deployment-repo/testdata/01/component-constructor.yaml +++ b/internal/deployment-repo/testdata/01/component-constructor.yaml @@ -131,7 +131,7 @@ components: name: openmcp-project resources: - - name: service-provider-test-image + - name: platform-service-test-image type: ociImage version: v0.3.0 access: diff --git a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/extra/test-configmap.yaml b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/extra/test-configmap.yaml index b1e8168..3695150 100644 --- a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/extra/test-configmap.yaml +++ b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/extra/test-configmap.yaml @@ -12,9 +12,13 @@ data: key2: value2 key: "value" repository: "{{OCM_REPO_URL}}" + rootComponent: "github.com/openmcp-project/openmcp" crossplaneComponentName: "github.com/openmcp-project/openmcp/releasechannel/crossplane" crossplaneComponentVersion: "v0.0.1" crossplaneImage: "ghcr.io/openmcp-project/releasechannel/crossplane" crossplaneVersions: | - v0.0.1 - - v0.0.2 \ No newline at end of file + - v0.0.2 + platformService: | + image: "ghcr.io/openmcp-project/images/platform-service-test" + version: "v0.3.0" \ No newline at end of file diff --git a/internal/deployment-repo/testdata/01/extra-manifests/test-configmap.yaml b/internal/deployment-repo/testdata/01/extra-manifests/test-configmap.yaml index 1b0476b..93d7f43 100644 --- a/internal/deployment-repo/testdata/01/extra-manifests/test-configmap.yaml +++ b/internal/deployment-repo/testdata/01/extra-manifests/test-configmap.yaml @@ -8,6 +8,7 @@ data: {{ toYaml .Values.user | indent 4 }} key: "value" repository: "{{ getOCMRepository }}" + rootComponent: "{{ dig "component" "name" "none" (componentVersionAsMap (getRootComponentVersion)) }}" {{- $releaseChannelCv := getComponentVersionByReference "releasechannel" }} {{- $crossplaneCv := getComponentVersionByReference $releaseChannelCv "crossplane" }} {{- $crossplaneImageResource := getResourceFromComponentVersion $crossplaneCv "image-crossplane" }} @@ -19,4 +20,11 @@ data: crossplaneImage: "{{ dig "image" "none" $parsedImage }}" crossplaneVersions: | {{- $crossplaneVersions := listComponentVersions $crossplaneCv }} -{{ toYaml (sortAlpha $crossplaneVersions) | indent 4 }} \ No newline at end of file +{{ toYaml (sortAlpha $crossplaneVersions) | indent 4 }} + platformService: | + {{- $platformServiceCv := getComponentVersionForResource "platform-service-test-image" }} + {{- $platformServiceImageResource := getResourceFromComponentVersion $platformServiceCv "platform-service-test-image" }} + {{- $platformServiceImageReference := dig "access" "imageReference" "none" $platformServiceImageResource }} + {{- $platformServiceParsedImage := parseImage $platformServiceImageReference }} + image: "{{ dig "image" "none" $platformServiceParsedImage }}" + version: "{{ $platformServiceImageResource.version }}" \ No newline at end of file diff --git a/internal/template/template.go b/internal/template/template.go index c2c6e23..80f0c10 100644 --- a/internal/template/template.go +++ b/internal/template/template.go @@ -30,6 +30,14 @@ func fromYAML(input string) (any, error) { return output, err } +func getRootComponentVersion(compGetter *ocmcli.ComponentGetter) *ocmcli.ComponentVersion { + if compGetter == nil { + panic("ComponentGetter must not be nil") + } + + return compGetter.RootComponentVersion() +} + func getComponentVersionByReference(ctx context.Context, compGetter *ocmcli.ComponentGetter, args ...interface{}) *ocmcli.ComponentVersion { logger := log.GetLogger() @@ -62,6 +70,37 @@ func getComponentVersionByReference(ctx context.Context, compGetter *ocmcli.Comp return cv } +func getComponentVersionForResource(ctx context.Context, compGetter *ocmcli.ComponentGetter, args ...interface{}) *ocmcli.ComponentVersion { + logger := log.GetLogger() + + if compGetter == nil { + panic("ComponentGetter must not be nil") + } + + if len(args) < 1 { + panic("at least 1 argument is expected") + } + + var err error + parentCv := compGetter.RootComponentVersion() + referenceName := args[len(args)-1].(string) + + if len(args) == 2 { + parentCv = args[0].(*ocmcli.ComponentVersion) + } + + logger.Tracef("Template_Func: getComponentVersionForResource called with parent component version: %s and reference name: %s", parentCv.Component.Name, referenceName) + + cv, err := compGetter.GetComponentVersionForResourceRecursive(ctx, parentCv, referenceName) + if err != nil || cv == nil { + if err != nil { + logger.Errorf("Template_Func: getComponentVersionForResource error getting component version for resource %s from parent component version %s: %v", referenceName, parentCv.Component.Name, err) + } + return nil + } + return cv +} + func componentVersionAsMap(cv *ocmcli.ComponentVersion) map[string]interface{} { if cv == nil { return nil @@ -212,6 +251,10 @@ func (t *TemplateExecution) WithOCMComponentGetter(ctx context.Context, compGett "getOCMRepository": func() string { return getOCMRepository(compGetter) }, + // getRootComponentVersion returns the root ComponentVersion from the ComponentGetter. + "getRootComponentVersion": func() *ocmcli.ComponentVersion { + return getRootComponentVersion(compGetter) + }, // getComponentVersionByReference returns a ComponentVersion based on the provided reference name. // It can take either one or two arguments: // - One argument: the reference name (string). The search starts from the root component version. @@ -222,6 +265,16 @@ func (t *TemplateExecution) WithOCMComponentGetter(ctx context.Context, compGett "getComponentVersionByReference": func(args ...interface{}) *ocmcli.ComponentVersion { return getComponentVersionByReference(ctx, compGetter, args...) }, + // getComponentVersionForResource returns a ComponentVersion that contains the specified resource. + // It can take either one or two arguments: + // - One argument: the resource name (string). The search starts from the root component version. + // - Two arguments: the first argument is a ComponentVersion to start the search from, and the second argument is the resource name (string). + // If the ComponentVersion is not found, it returns nil. + // If the ComponentGetter is nil, it panics. + // If the number of arguments is less than 1, it panics. + "getComponentVersionForResource": func(args ...interface{}) *ocmcli.ComponentVersion { + return getComponentVersionForResource(ctx, compGetter, args...) + }, // componentVersionAsMap converts a ComponentVersion to a map[string]interface{}. // If the ComponentVersion is nil, it returns nil. "componentVersionAsMap": func(cv *ocmcli.ComponentVersion) map[string]interface{} { From 4a98a3b5d11f6217fb9cef28249061de8337d389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sch=C3=BCnemann?= Date: Tue, 21 Oct 2025 15:00:54 +0200 Subject: [PATCH 2/2] feat: release v0.4.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2ea2949..01e994d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.3.0-dev \ No newline at end of file +v0.4.0 \ No newline at end of file