diff --git a/internal/controllers/provider/controller.go b/internal/controllers/provider/controller.go index 9665626..11acec9 100644 --- a/internal/controllers/provider/controller.go +++ b/internal/controllers/provider/controller.go @@ -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 { @@ -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 @@ -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) diff --git a/internal/controllers/provider/controller_test.go b/internal/controllers/provider/controller_test.go index 51cc80c..f9bfc49 100644 --- a/internal/controllers/provider/controller_test.go +++ b/internal/controllers/provider/controller_test.go @@ -21,8 +21,9 @@ 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 { @@ -30,7 +31,7 @@ var _ = Describe("Deployment Controller", func() { WithFakeClient(scheme). WithInitObjectPath("testdata", testdataDir). WithReconcilerConstructor(func(c client.Client) reconcile.Reconciler { - return NewProviderReconciler(gvk, c, environment) + return NewProviderReconciler(gvk, c, environment, systemNamespace) }). Build() } @@ -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") diff --git a/internal/controllers/provider/deployment_controller.go b/internal/controllers/provider/deployment_controller.go index de73d1f..d500de7 100644 --- a/internal/controllers/provider/deployment_controller.go +++ b/internal/controllers/provider/deployment_controller.go @@ -18,6 +18,7 @@ package provider import ( "fmt" + "os" "github.com/openmcp-project/controller-utils/pkg/logging" apps "k8s.io/api/apps/v1" @@ -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" ) @@ -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) diff --git a/internal/controllers/provider/install/installer.go b/internal/controllers/provider/install/installer.go index ee6b6dc..27b5158 100644 --- a/internal/controllers/provider/install/installer.go +++ b/internal/controllers/provider/install/installer.go @@ -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. @@ -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 @@ -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 @@ -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 { @@ -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 diff --git a/internal/controllers/provider/install/values.go b/internal/controllers/provider/install/values.go index b665bda..2056603 100644 --- a/internal/controllers/provider/install/values.go +++ b/internal/controllers/provider/install/values.go @@ -11,41 +11,44 @@ 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 { @@ -53,19 +56,19 @@ func (v *Values) Namespace() string { } 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 { diff --git a/internal/controllers/provider/install/values_test.go b/internal/controllers/provider/install/values_test.go index 69d8356..833c0f8 100644 --- a/internal/controllers/provider/install/values_test.go +++ b/internal/controllers/provider/install/values_test.go @@ -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() { @@ -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})) @@ -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()) })