From db0e05091305aef79b9101abc28f9fccd0340e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sch=C3=BCnemann?= Date: Thu, 11 Sep 2025 17:16:35 +0200 Subject: [PATCH] updates --- internal/config/config.go | 51 +++++++++++++++++-- .../deployment-repo/deploymentRepoManager.go | 12 ++--- .../deploymentRepoManager_test.go | 19 +++++-- internal/deployment-repo/templater.go | 22 +++++--- .../templates/clusterProvider.yaml | 10 +--- .../templates/platformService.yaml | 10 +--- .../templates/serviceProvider.yaml | 10 +--- .../openmcp/cluster-providers/test.yaml | 1 + .../resources/openmcp/kustomization.yaml | 14 +++++ .../templates/resources/kustomization.yaml | 16 ++++++ 10 files changed, 122 insertions(+), 43 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 90f878d..e95513d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -33,9 +33,15 @@ type TargetCluster struct { } type Providers struct { - ClusterProviders []string `json:"clusterProviders"` - ServiceProviders []string `json:"serviceProviders"` - PlatformServices []string `json:"platformServices"` + ClusterProviders []Provider `json:"clusterProviders"` + ServiceProviders []Provider `json:"serviceProviders"` + PlatformServices []Provider `json:"platformServices"` +} + +type Provider struct { + Name string `json:"name"` + Config json.RawMessage `json:"config"` + ConfigParsed map[string]interface{} } type OpenMCPOperator struct { @@ -96,5 +102,44 @@ func (c *BootstrapperConfig) Validate() error { errs = append(errs, field.Invalid(field.NewPath("openmcpOperator.config"), string(c.OpenMCPOperator.Config), "openmcp operator config is not valid yaml")) } + for i, cp := range c.Providers.ClusterProviders { + if len(cp.Name) == 0 { + errs = append(errs, field.Required(field.NewPath("providers.clusterProviders").Index(i).Child("name"), "cluster provider name is required")) + } + + if cp.Config != nil { + err := yaml.Unmarshal(cp.Config, &c.Providers.ClusterProviders[i].ConfigParsed) + if err != nil { + errs = append(errs, field.Invalid(field.NewPath("providers.clusterProviders").Index(i).Child("config"), string(cp.Config), "cluster provider config is not valid yaml")) + } + } + } + + for i, sp := range c.Providers.ServiceProviders { + if len(sp.Name) == 0 { + errs = append(errs, field.Required(field.NewPath("providers.serviceProviders").Index(i).Child("name"), "service provider name is required")) + } + + if sp.Config != nil { + err := yaml.Unmarshal(sp.Config, &c.Providers.ServiceProviders[i].ConfigParsed) + if err != nil { + errs = append(errs, field.Invalid(field.NewPath("providers.serviceProviders").Index(i).Child("config"), string(sp.Config), "service provider config is not valid yaml")) + } + } + } + + for i, ps := range c.Providers.PlatformServices { + if len(ps.Name) == 0 { + errs = append(errs, field.Required(field.NewPath("providers.platformServices").Index(i).Child("name"), "platform service name is required")) + } + + if ps.Config != nil { + err := yaml.Unmarshal(ps.Config, &c.Providers.PlatformServices[i].ConfigParsed) + if err != nil { + errs = append(errs, field.Invalid(field.NewPath("providers.platformServices").Index(i).Child("config"), string(ps.Config), "platform service config is not valid yaml")) + } + } + } + return errs.ToAggregate() } diff --git a/internal/deployment-repo/deploymentRepoManager.go b/internal/deployment-repo/deploymentRepoManager.go index 6d8b9e1..5090937 100644 --- a/internal/deployment-repo/deploymentRepoManager.go +++ b/internal/deployment-repo/deploymentRepoManager.go @@ -312,7 +312,7 @@ func (m *DeploymentRepoManager) ApplyCustomResourceDefinitions(ctx context.Conte } for _, clusterProvider := range m.Config.Providers.ClusterProviders { - clusterProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "cluster-provider-"+clusterProvider) + clusterProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "cluster-provider-"+clusterProvider.Name) if err != nil { return fmt.Errorf("failed to get component version for cluster provider %s: %w", clusterProvider, err) } @@ -324,7 +324,7 @@ func (m *DeploymentRepoManager) ApplyCustomResourceDefinitions(ctx context.Conte } for _, serviceProvider := range m.Config.Providers.ServiceProviders { - serviceProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "service-provider-"+serviceProvider) + serviceProviderCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "service-provider-"+serviceProvider.Name) if err != nil { return fmt.Errorf("failed to get component version for service provider %s: %w", serviceProvider, err) } @@ -335,7 +335,7 @@ func (m *DeploymentRepoManager) ApplyCustomResourceDefinitions(ctx context.Conte } for _, platformService := range m.Config.Providers.PlatformServices { - platformServiceCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "platform-service-"+platformService) + platformServiceCV, err := m.compGetter.GetReferencedComponentVersionRecursive(ctx, m.compGetter.RootComponentVersion(), "platform-service-"+platformService.Name) if err != nil { return fmt.Errorf("failed to get component version for platform service %s: %w", platformService, err) } @@ -496,15 +496,15 @@ func (m *DeploymentRepoManager) UpdateResourcesKustomization() error { } for _, clusterProvider := range m.Config.Providers.ClusterProviders { - files = append(files, filepath.Join("cluster-providers", clusterProvider+".yaml")) + files = append(files, filepath.Join("cluster-providers", clusterProvider.Name+".yaml")) } for _, serviceProvider := range m.Config.Providers.ServiceProviders { - files = append(files, filepath.Join("service-providers", serviceProvider+".yaml")) + files = append(files, filepath.Join("service-providers", serviceProvider.Name+".yaml")) } for _, platformService := range m.Config.Providers.PlatformServices { - files = append(files, filepath.Join("platform-services", platformService+".yaml")) + files = append(files, filepath.Join("platform-services", platformService.Name+".yaml")) } for _, manifest := range m.extraManifests { diff --git a/internal/deployment-repo/deploymentRepoManager_test.go b/internal/deployment-repo/deploymentRepoManager_test.go index 6a84ac2..dd7a0a7 100644 --- a/internal/deployment-repo/deploymentRepoManager_test.go +++ b/internal/deployment-repo/deploymentRepoManager_test.go @@ -56,9 +56,22 @@ func TestDeploymentRepoManager(t *testing.T) { Config: json.RawMessage(`{"someKey": "someValue"}`), }, Providers: config.Providers{ - ClusterProviders: []string{"test"}, - ServiceProviders: []string{"test"}, - PlatformServices: []string{"test"}, + ClusterProviders: []config.Provider{ + { + Name: "test", + Config: json.RawMessage(`{"verbosity": "info"}`), + }, + }, + ServiceProviders: []config.Provider{ + { + Name: "test", + }, + }, + PlatformServices: []config.Provider{ + { + Name: "test", + }, + }, }, ImagePullSecrets: []string{"imgpull-a", "imgpull-b"}, } diff --git a/internal/deployment-repo/templater.go b/internal/deployment-repo/templater.go index 4159e22..4e843f0 100644 --- a/internal/deployment-repo/templater.go +++ b/internal/deployment-repo/templater.go @@ -10,6 +10,8 @@ import ( "github.com/go-git/go-billy/v5" "github.com/go-git/go-git/v5" + "github.com/openmcp-project/bootstrapper/internal/config" + "github.com/openmcp-project/bootstrapper/internal/log" ocmcli "github.com/openmcp-project/bootstrapper/internal/ocm-cli" "github.com/openmcp-project/bootstrapper/internal/template" @@ -119,10 +121,11 @@ type ProviderOptions struct { Name string Image string ImagePullSecrets []string + Config map[string]interface{} } // TemplateProviders templates the specified cluster providers, service providers, and platform services -func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, platformServices, imagePullSecrets []string, ocmGetter *ocmcli.ComponentGetter, repo *git.Repository) error { +func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, platformServices []config.Provider, imagePullSecrets []string, ocmGetter *ocmcli.ComponentGetter, repo *git.Repository) error { basePath := filepath.Join("resources", "openmcp") clusterProvidersDir := filepath.Join(basePath, "cluster-providers") serviceProvidersDir := filepath.Join(basePath, "service-providers") @@ -150,7 +153,7 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } for _, cp := range clusterProviders { - componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "cluster-provider-"+cp) + componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "cluster-provider-"+cp.Name) if err != nil { return fmt.Errorf("failed to get component version for cluster provider %s: %w", cp, err) } @@ -161,9 +164,10 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } opts := &ProviderOptions{ - Name: cp, + Name: cp.Name, Image: *imageResource.Access.ImageReference, ImagePullSecrets: imagePullSecrets, + Config: cp.ConfigParsed, } err = templateProvider(opts, clusterProviderTemplate, clusterProvidersDir, repo) @@ -173,7 +177,7 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } for _, sp := range serviceProviders { - componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "service-provider-"+sp) + componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "service-provider-"+sp.Name) if err != nil { return fmt.Errorf("failed to get component version for service provider %s: %w", sp, err) } @@ -184,9 +188,10 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } opts := &ProviderOptions{ - Name: sp, + Name: sp.Name, Image: *imageResource.Access.ImageReference, ImagePullSecrets: imagePullSecrets, + Config: sp.ConfigParsed, } err = templateProvider(opts, serviceProviderTemplate, serviceProvidersDir, repo) @@ -196,7 +201,7 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } for _, ps := range platformServices { - componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "platform-service-"+ps) + componentVersion, err := ocmGetter.GetReferencedComponentVersionRecursive(ctx, ocmGetter.RootComponentVersion(), "platform-service-"+ps.Name) if err != nil { return fmt.Errorf("failed to get component version for platform service %s: %w", ps, err) } @@ -207,9 +212,10 @@ func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, } opts := &ProviderOptions{ - Name: ps, + Name: ps.Name, Image: *imageResource.Access.ImageReference, ImagePullSecrets: imagePullSecrets, + Config: ps.ConfigParsed, } err = templateProvider(opts, platformServiceTemplate, platformServicesDir, repo) @@ -238,6 +244,7 @@ func templateProvider(options *ProviderOptions, templateSource, dir string, repo logger.Debugf("Creating provider %s with image %s in path %s", options.Name, options.Image, providerPath) te := template.NewTemplateExecution() + templateInput := map[string]interface{}{ "values": map[string]interface{}{ "name": options.Name, @@ -245,6 +252,7 @@ func templateProvider(options *ProviderOptions, templateSource, dir string, repo "location": options.Image, "imagePullSecrets": options.ImagePullSecrets, }, + "config": options.Config, }, } diff --git a/internal/deployment-repo/templates/clusterProvider.yaml b/internal/deployment-repo/templates/clusterProvider.yaml index 184b399..12d4c91 100644 --- a/internal/deployment-repo/templates/clusterProvider.yaml +++ b/internal/deployment-repo/templates/clusterProvider.yaml @@ -10,12 +10,6 @@ spec: - name: "{{ $value }}" {{- end }} {{- end }} -{{- if dig "env" "" .values }} - env: -{{- range $key, $value := .values.env }} - {{ $key }}: {{ $value }} -{{- end }} -{{- end }} -{{- if dig "verbosity" "" .values }} - verbosity: {{ .values.verbosity }} +{{- if dig "config" "" .values }} +{{ toYaml .values.config | indent 2 }} {{- end }} diff --git a/internal/deployment-repo/templates/platformService.yaml b/internal/deployment-repo/templates/platformService.yaml index 04e2e5e..e661a43 100644 --- a/internal/deployment-repo/templates/platformService.yaml +++ b/internal/deployment-repo/templates/platformService.yaml @@ -10,12 +10,6 @@ spec: - name: "{{ $value }}" {{- end }} {{- end }} -{{- if dig "env" "" .values }} - env: -{{- range $key, $value := .values.env }} - {{ $key }}: {{ $value }} -{{- end }} -{{- end }} -{{- if dig "verbosity" "" .values }} - verbosity: {{ .values.verbosity }} +{{- if dig "config" "" .values }} +{{ toYaml .values.config | indent 2 }} {{- end }} diff --git a/internal/deployment-repo/templates/serviceProvider.yaml b/internal/deployment-repo/templates/serviceProvider.yaml index 8b4857e..0e2786f 100644 --- a/internal/deployment-repo/templates/serviceProvider.yaml +++ b/internal/deployment-repo/templates/serviceProvider.yaml @@ -10,12 +10,6 @@ spec: - name: "{{ $value }}" {{- end }} {{- end }} -{{- if dig "env" "" .values }} - env: -{{- range $key, $value := .values.env }} - {{ $key }}: {{ $value }} -{{- end }} -{{- end }} -{{- if dig "verbosity" "" .values }} - verbosity: {{ .values.verbosity }} +{{- if dig "config" "" .values }} +{{ toYaml .values.config | indent 2 }} {{- end }} diff --git a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/cluster-providers/test.yaml b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/cluster-providers/test.yaml index a52cbc3..0daf0fa 100644 --- a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/cluster-providers/test.yaml +++ b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/cluster-providers/test.yaml @@ -7,3 +7,4 @@ spec: imagePullSecrets: - name: "imgpull-a" - name: "imgpull-b" + verbosity: info diff --git a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/kustomization.yaml b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/kustomization.yaml index e372a3f..5d29fe5 100644 --- a/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/kustomization.yaml +++ b/internal/deployment-repo/testdata/01/expected-repo/resources/openmcp/kustomization.yaml @@ -1,5 +1,19 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization +patches: +- patch: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: this_value_is_ignored + spec: + template: + spec: + imagePullSecrets: + - name: imgpull-a + - name: imgpull-b + target: + kind: Deployment resources: - rbac.yaml - namespace.yaml diff --git a/internal/deployment-repo/testdata/01/templates/openmcp/templates/resources/kustomization.yaml b/internal/deployment-repo/testdata/01/templates/openmcp/templates/resources/kustomization.yaml index 06b70b4..b7d2b03 100644 --- a/internal/deployment-repo/testdata/01/templates/openmcp/templates/resources/kustomization.yaml +++ b/internal/deployment-repo/testdata/01/templates/openmcp/templates/resources/kustomization.yaml @@ -5,3 +5,19 @@ resources: - rbac.yaml - namespace.yaml - deployment.yaml + +{{- if .Values.imagePullSecrets }} +patches: + - target: + kind: Deployment + patch: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: this_value_is_ignored + spec: + template: + spec: + imagePullSecrets: +{{ toYaml .Values.imagePullSecrets | indent 14 }} +{{- end }}