Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions internal/controllers/provider/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,20 @@ const (
openmcpFinalizer = constants.OpenMCPGroupName + "/finalizer"
)

func NewProviderReconciler(gvk schema.GroupVersionKind, client client.Client, environment string) *ProviderReconciler {
func NewProviderReconciler(gvk schema.GroupVersionKind, client client.Client, environment, systemNamespace string) *ProviderReconciler {
return &ProviderReconciler{
GroupVersionKind: gvk,
PlatformClient: client,
Environment: environment,
SystemNamespace: systemNamespace,
}
}

type ProviderReconciler struct {
schema.GroupVersionKind
PlatformClient client.Client
Environment string
PlatformClient client.Client
Environment string
SystemNamespace string
}

func (r *ProviderReconciler) ControllerName() string {
Expand Down Expand Up @@ -119,10 +121,11 @@ func (r *ProviderReconciler) install(

log := logging.FromContextOrPanic(ctx)
installer := install.Installer{
PlatformClient: r.PlatformClient,
Provider: provider,
DeploymentSpec: deploymentSpec,
Environment: r.Environment,
PlatformClient: r.PlatformClient,
Provider: provider,
DeploymentSpec: deploymentSpec,
Environment: r.Environment,
SystemNamespace: r.SystemNamespace,
}

// init job
Expand Down Expand Up @@ -171,10 +174,11 @@ func (r *ProviderReconciler) handleDeleteOperation(ctx context.Context, provider
status := newUninstallStatus(provider.GetGeneration())

installer := install.Installer{
PlatformClient: r.PlatformClient,
Provider: provider,
DeploymentSpec: nil,
Environment: r.Environment,
PlatformClient: r.PlatformClient,
Provider: provider,
DeploymentSpec: nil,
Environment: r.Environment,
SystemNamespace: r.SystemNamespace,
}

deleted, err = installer.UninstallProvider(ctx)
Expand Down
9 changes: 5 additions & 4 deletions internal/controllers/provider/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,17 @@ var _ = Describe("Deployment Controller", func() {
Context("Reconcile", func() {

var (
scheme = apiinstall.InstallOperatorAPIs(runtime.NewScheme())
environment = "test-environment"
scheme = apiinstall.InstallOperatorAPIs(runtime.NewScheme())
environment = "test-environment"
systemNamespace = "openmcp-system"
)

buildTestEnvironment := func(testdataDir string, gvk schema.GroupVersionKind) *testutils.Environment {
return testutils.NewEnvironmentBuilder().
WithFakeClient(scheme).
WithInitObjectPath("testdata", testdataDir).
WithReconcilerConstructor(func(c client.Client) reconcile.Reconciler {
return NewProviderReconciler(gvk, c, environment)
return NewProviderReconciler(gvk, c, environment, systemNamespace)
}).
Build()
}
Expand All @@ -57,7 +58,7 @@ var _ = Describe("Deployment Controller", func() {
Expect(deploymentStatus.Phase).To(Equal(phaseProgressing), "Phase should be progressing")
Expect(isInitialized(deploymentStatus)).To(BeFalse(), "Provider should not yet be initialized")
Expect(isProviderInstalledAndReady(deploymentStatus)).To(BeFalse(), "Provider should not yet be ready")
values := install.NewValues(provider, deploymentSpec, environment)
values := install.NewValues(provider, deploymentSpec, environment, systemNamespace)
job := install.NewJobMutator(values, deploymentSpec, nil).Empty()
Expect(env.Client().Get(env.Ctx, client.ObjectKeyFromObject(job), job)).To(Succeed())
Expect(job.Spec.Template.Spec.Containers[0].Image).To(Equal("test-image:v0.1.0"), "Job container image should match the provider spec")
Expand Down
9 changes: 8 additions & 1 deletion internal/controllers/provider/deployment_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package provider

import (
"fmt"
"os"

"github.com/openmcp-project/controller-utils/pkg/logging"
apps "k8s.io/api/apps/v1"
Expand All @@ -28,6 +29,7 @@ import (
"k8s.io/apimachinery/pkg/util/validation/field"
ctrl "sigs.k8s.io/controller-runtime"

"github.com/openmcp-project/openmcp-operator/api/constants"
"github.com/openmcp-project/openmcp-operator/api/provider/v1alpha1"
)

Expand All @@ -47,12 +49,17 @@ func (r *DeploymentController) SetupWithManager(setupLog *logging.Logger, mgr ct
log := setupLog.WithName(ControllerName)
allErrs := field.ErrorList{}

systemNamespace := os.Getenv(constants.EnvVariablePodNamespace)
if systemNamespace == "" {
return fmt.Errorf("environment variable %s not set", constants.EnvVariablePodNamespace)
}

r.Reconcilers = make([]*ProviderReconciler, len(providerGKVList))

for i, gvk := range providerGKVList {
log.Info("Registering deployment controller", "groupVersionKind", gvk.String())

r.Reconcilers[i] = NewProviderReconciler(gvk, mgr.GetClient(), environment)
r.Reconcilers[i] = NewProviderReconciler(gvk, mgr.GetClient(), environment, systemNamespace)

obj := &unstructured.Unstructured{}
obj.SetGroupVersionKind(gvk)
Expand Down
17 changes: 9 additions & 8 deletions internal/controllers/provider/install/installer.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ const (
)

type Installer struct {
PlatformClient client.Client
Provider *unstructured.Unstructured
DeploymentSpec *v1alpha1.DeploymentSpec
Environment string
PlatformClient client.Client
Provider *unstructured.Unstructured
DeploymentSpec *v1alpha1.DeploymentSpec
Environment string
SystemNamespace string
}

// InstallInitJob installs the init job of a provider.
Expand All @@ -37,7 +38,7 @@ type Installer struct {
// Adds provider generation as annotation to the job.
func (a *Installer) InstallInitJob(ctx context.Context) (completed bool, err error) {

values := NewValues(a.Provider, a.DeploymentSpec, a.Environment)
values := NewValues(a.Provider, a.DeploymentSpec, a.Environment, a.SystemNamespace)

if err := resources.CreateOrUpdateResource(ctx, a.PlatformClient, resources.NewNamespaceMutator(values.Namespace())); err != nil {
return false, err
Expand Down Expand Up @@ -105,7 +106,7 @@ func (a *Installer) InstallInitJob(ctx context.Context) (completed bool, err err

func (a *Installer) InstallProvider(ctx context.Context) error {

values := NewValues(a.Provider, a.DeploymentSpec, a.Environment)
values := NewValues(a.Provider, a.DeploymentSpec, a.Environment, a.SystemNamespace)

if err := resources.CreateOrUpdateResource(ctx, a.PlatformClient, newProviderServiceAccountMutator(values)); err != nil {
return err
Expand All @@ -123,7 +124,7 @@ func (a *Installer) InstallProvider(ctx context.Context) error {
}

func (a *Installer) CheckProviderReadiness(ctx context.Context) readiness.CheckResult {
values := NewValues(a.Provider, a.DeploymentSpec, a.Environment)
values := NewValues(a.Provider, a.DeploymentSpec, a.Environment, a.SystemNamespace)

depl, err := resources.GetResource(ctx, a.PlatformClient, NewDeploymentMutator(values))
if err != nil {
Expand All @@ -135,7 +136,7 @@ func (a *Installer) CheckProviderReadiness(ctx context.Context) readiness.CheckR

func (a *Installer) UninstallProvider(ctx context.Context) (deleted bool, err error) {

values := NewValues(a.Provider, a.DeploymentSpec, a.Environment)
values := NewValues(a.Provider, a.DeploymentSpec, a.Environment, a.SystemNamespace)

if err := resources.DeleteResource(ctx, a.PlatformClient, NewDeploymentMutator(values)); err != nil {
return false, err
Expand Down
33 changes: 18 additions & 15 deletions internal/controllers/provider/install/values.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,61 +11,64 @@ import (
"github.com/openmcp-project/openmcp-operator/api/provider/v1alpha1"
)

const initPrefix = "init"
const (
initPrefix = "init"
clusterScopedResourcePrefix = "openmcp.cloud"
)

func NewValues(provider *unstructured.Unstructured, deploymentSpec *v1alpha1.DeploymentSpec, environment string) *Values {
func NewValues(provider *unstructured.Unstructured, deploymentSpec *v1alpha1.DeploymentSpec, environment, namespace string) *Values {
return &Values{
provider: provider,
deploymentSpec: deploymentSpec,
namespace: determineNamespace(provider),
environment: environment,
namespace: namespace,
providerPrefix: getProviderPrefix(provider),
}
}

type Values struct {
provider *unstructured.Unstructured
deploymentSpec *v1alpha1.DeploymentSpec
namespace string
environment string
namespace string
providerPrefix string
}

func (v *Values) Environment() string {
return v.environment
}

func determineNamespace(provider *unstructured.Unstructured) string {
var namespacePrefix string
func getProviderPrefix(provider *unstructured.Unstructured) string {
switch provider.GroupVersionKind().Kind {
case v1alpha1.ServiceProviderGKV().Kind:
namespacePrefix = "sp"
return "sp"
case v1alpha1.ClusterProviderGKV().Kind:
namespacePrefix = "cp"
return "cp"
case v1alpha1.PlatformServiceGKV().Kind:
namespacePrefix = "ps"
return "ps"
default:
namespacePrefix = provider.GroupVersionKind().Kind
return provider.GroupVersionKind().Kind
}
return strings.ToLower(fmt.Sprintf("%s-%s", namespacePrefix, provider.GetName()))
}

func (v *Values) Namespace() string {
return v.namespace
}

func (v *Values) NamespacedDefaultResourceName() string {
return v.provider.GetName()
return strings.ToLower(fmt.Sprintf("%s-%s", v.providerPrefix, v.provider.GetName()))
}

func (v *Values) NamespacedResourceName(suffix string) string {
return fmt.Sprintf("%s-%s", v.provider.GetName(), suffix)
return strings.ToLower(fmt.Sprintf("%s-%s-%s", v.providerPrefix, v.provider.GetName(), suffix))
}

func (v *Values) ClusterScopedDefaultResourceName() string {
return fmt.Sprintf("%s:%s", v.Namespace(), v.NamespacedDefaultResourceName())
return strings.ToLower(fmt.Sprintf("%s:%s-%s", clusterScopedResourcePrefix, v.providerPrefix, v.provider.GetName()))
}

func (v *Values) ClusterScopedResourceName(suffix string) string {
return fmt.Sprintf("%s:%s", v.Namespace(), v.NamespacedResourceName(suffix))
return fmt.Sprintf("%s:%s-%s-%s", clusterScopedResourcePrefix, v.providerPrefix, v.provider.GetName(), suffix)
}

func (v *Values) Image() string {
Expand Down
11 changes: 6 additions & 5 deletions internal/controllers/provider/install/values_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ var _ = Describe("Installer", func() {
Context("Env Variables", func() {

const (
providerName = "test-provider"
envName1 = "NAME_1"
envValue1 = "VALUE_1"
providerName = "test-provider"
systemNamespace = "openmcp-system"
envName1 = "NAME_1"
envValue1 = "VALUE_1"
)

It("should contain provider variables and predefined openmcp variables", func() {
Expand All @@ -29,7 +30,7 @@ var _ = Describe("Installer", func() {
{Name: envName1, Value: envValue1},
},
}
v := NewValues(provider, spec, "test")
v := NewValues(provider, spec, "test", systemNamespace)
env, err := v.EnvironmentVariables()
Expect(err).NotTo(HaveOccurred())
Expect(env).To(ContainElement(corev1.EnvVar{Name: envName1, Value: envValue1}))
Expand All @@ -44,7 +45,7 @@ var _ = Describe("Installer", func() {
{Name: constants.EnvVariablePodNamespace, Value: envValue1},
},
}
v := NewValues(provider, spec, "test")
v := NewValues(provider, spec, "test", systemNamespace)
_, err := v.EnvironmentVariables()
Expect(err).To(HaveOccurred())
})
Expand Down