From 0070a4c695feb432e78dbacb09e3ad89d2db213e Mon Sep 17 00:00:00 2001
From: ravineet <rajula.vineet.reddy@cern.ch>
Date: Wed, 22 Sep 2021 15:55:11 +0200
Subject: [PATCH] Add default to ReleaseSpec if empty

---
 api/v1alpha1/drupalsite_types.go                |  3 +--
 .../templates/manager-deploy.yaml               |  1 +
 chart/drupalsite-operator/values.yaml           |  1 +
 .../drupal.webservices.cern.ch_drupalsites.yaml |  2 --
 controllers/drupalsite_controller.go            |  7 +++++++
 controllers/drupalsite_controller_test.go       | 17 ++++++++++-------
 controllers/suite_test.go                       |  1 +
 main.go                                         |  2 +-
 8 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/api/v1alpha1/drupalsite_types.go b/api/v1alpha1/drupalsite_types.go
index d2ef2656..06fbb696 100644
--- a/api/v1alpha1/drupalsite_types.go
+++ b/api/v1alpha1/drupalsite_types.go
@@ -60,8 +60,7 @@ type Version struct {
 	// typically of the format `RELEASE.<timestamp>`.
 	// CERN Drupal image tags take the form `<version.name>-<version.releaseSpec>`,
 	// for example `v8.9-1-RELEASE.2021.05.25T16-00-33Z`
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:MinLength=1
+	// +optional
 	ReleaseSpec string `json:"releaseSpec"`
 }
 
diff --git a/chart/drupalsite-operator/templates/manager-deploy.yaml b/chart/drupalsite-operator/templates/manager-deploy.yaml
index 77737798..049e2a13 100644
--- a/chart/drupalsite-operator/templates/manager-deploy.yaml
+++ b/chart/drupalsite-operator/templates/manager-deploy.yaml
@@ -27,6 +27,7 @@ spec:
         - --nginx-image={{.Values.drupalsiteOperator.nginxImage}}
         - --zap-stacktrace-level={{.Values.drupalsiteOperator.logStacktraceLevel}}
         - --zap-log-level={{.Values.drupalsiteOperator.logLevel}}
+        - --default-release-spec={{.Values.drupalsiteOperator.defaultReleaseSpec}}
         command:
         - /manager
         image: {{ .Values.image | quote }}
diff --git a/chart/drupalsite-operator/values.yaml b/chart/drupalsite-operator/values.yaml
index af0661cf..174e8ca1 100644
--- a/chart/drupalsite-operator/values.yaml
+++ b/chart/drupalsite-operator/values.yaml
@@ -22,3 +22,4 @@ drupalsiteOperator:
   logLevel: "3"
   # Zap Level at and above which stacktraces are captured (one of 'info', 'error')
   logStacktraceLevel: "error"
+  defaultReleaseSpec: "RELEASE-2021.09.13T09-24-02Z"
diff --git a/config/crd/bases/drupal.webservices.cern.ch_drupalsites.yaml b/config/crd/bases/drupal.webservices.cern.ch_drupalsites.yaml
index b4333cfc..3b486bcd 100644
--- a/config/crd/bases/drupal.webservices.cern.ch_drupalsites.yaml
+++ b/config/crd/bases/drupal.webservices.cern.ch_drupalsites.yaml
@@ -111,11 +111,9 @@ spec:
                       version, typically of the format `RELEASE.<timestamp>`. CERN
                       Drupal image tags take the form `<version.name>-<version.releaseSpec>`,
                       for example `v8.9-1-RELEASE.2021.05.25T16-00-33Z`
-                    minLength: 1
                     type: string
                 required:
                 - name
-                - releaseSpec
                 type: object
             required:
             - siteUrl
diff --git a/controllers/drupalsite_controller.go b/controllers/drupalsite_controller.go
index 2830ca59..d605ce15 100644
--- a/controllers/drupalsite_controller.go
+++ b/controllers/drupalsite_controller.go
@@ -67,6 +67,8 @@ var (
 	SMTPHost string
 	// VeleroNamespace refers to the namespace of the velero server to create backups
 	VeleroNamespace string
+	// ReleaseSpec refers to the releaseSpec of the drupalSite to be defaulted incase it is empty
+	DefaultReleaseSpec string
 )
 
 // DrupalSiteReconciler reconciles a DrupalSite object
@@ -493,6 +495,11 @@ func (r *DrupalSiteReconciler) ensureSpecFinalizer(ctx context.Context, drp *web
 			return false, newApplicationError(err, ErrClientK8s)
 		}
 	}
+	// Initialize 'spec.version.releaseSpec' if empty
+	if len(drp.Spec.Version.ReleaseSpec) == 0 {
+		drp.Spec.Version.ReleaseSpec = DefaultReleaseSpec
+		update = true || update
+	}
 	return update, nil
 }
 
diff --git a/controllers/drupalsite_controller_test.go b/controllers/drupalsite_controller_test.go
index 4b6aa896..a3d1143b 100644
--- a/controllers/drupalsite_controller_test.go
+++ b/controllers/drupalsite_controller_test.go
@@ -1136,7 +1136,7 @@ var _ = Describe("DrupalSite controller", func() {
 	})
 
 	Describe("Creating a drupalSite object", func() {
-		Context("Without 'configuration' field", func() {
+		Context("Without 'configuration' & 'releaseSpec' field", func() {
 			It("Default values should be used and the site should be created", func() {
 				key = types.NamespacedName{
 					Name:      Name + "-defaults",
@@ -1153,8 +1153,7 @@ var _ = Describe("DrupalSite controller", func() {
 					},
 					Spec: drupalwebservicesv1alpha1.DrupalSiteSpec{
 						Version: drupalwebservicesv1alpha1.Version{
-							Name:        "v8.9-1",
-							ReleaseSpec: "stable",
+							Name: "v8.9-1",
 						},
 						SiteURL: []drupalwebservicesv1alpha1.Url{dummySiteUrl},
 					},
@@ -1190,6 +1189,12 @@ var _ = Describe("DrupalSite controller", func() {
 					return string(cr.Spec.Configuration.DiskSize) == "2000Mi"
 				}, timeout, interval).Should(BeTrue())
 
+				By("Expecting the default configuration values to be set")
+				Eventually(func() bool {
+					k8sClient.Get(ctx, key, &cr)
+					return cr.Spec.Version.ReleaseSpec != DefaultReleaseSpec
+				}, timeout, interval).Should(BeTrue())
+
 				trueVar := true
 				expectedOwnerReference := metav1.OwnerReference{
 					APIVersion: "drupal.webservices.cern.ch/v1alpha1",
@@ -1332,8 +1337,7 @@ var _ = Describe("DrupalSite controller", func() {
 					},
 					Spec: drupalwebservicesv1alpha1.DrupalSiteSpec{
 						Version: drupalwebservicesv1alpha1.Version{
-							Name:        "v8.9-1",
-							ReleaseSpec: "stable",
+							Name: "v8.9-1",
 						},
 						Configuration: drupalwebservicesv1alpha1.Configuration{
 							DatabaseClass: drupalwebservicesv1alpha1.DBODStandard,
@@ -1387,8 +1391,7 @@ var _ = Describe("DrupalSite controller", func() {
 					},
 					Spec: drupalwebservicesv1alpha1.DrupalSiteSpec{
 						Version: drupalwebservicesv1alpha1.Version{
-							Name:        "v8.9-1",
-							ReleaseSpec: "stable",
+							Name: "v8.9-1",
 						},
 						Configuration: drupalwebservicesv1alpha1.Configuration{
 							QoSClass: "randomval",
diff --git a/controllers/suite_test.go b/controllers/suite_test.go
index 2ecbf2ef..da6c19d4 100644
--- a/controllers/suite_test.go
+++ b/controllers/suite_test.go
@@ -78,6 +78,7 @@ var _ = BeforeSuite(func(done Done) {
 	VeleroNamespace = "openshift-cern-drupal"
 	PhpFpmExporterImage = "test-phpfpmexporter"
 	WebDAVImage = "test-webdav"
+	DefaultReleaseSpec = "test-spec"
 
 	By("bootstrapping test environment")
 	testEnv = &envtest.Environment{
diff --git a/main.go b/main.go
index a0a64850..07510e3a 100644
--- a/main.go
+++ b/main.go
@@ -77,7 +77,7 @@ func main() {
 	flag.StringVar(&controllers.WebDAVImage, "webdav-image", "gitlab-registry.cern.ch/drupal/paas/sabredav/webdav:RELEASE-2021.07.28T17-19-49Z", "The webdav source image name.")
 	flag.StringVar(&controllers.SMTPHost, "smtp-host", "cernmx.cern.ch", "SMTP host used by Drupal server pods to send emails.")
 	flag.StringVar(&controllers.VeleroNamespace, "velero-namespace", "openshift-cern-drupal", "The namespace of the Velero server to create backups")
-
+	flag.StringVar(&controllers.DefaultReleaseSpec, "default-release-spec", "RELEASE-2021.09.13T09-24-02Z", "The default releaseSpec value to be passed to the DrupalSites")
 	opts := zap.Options{
 		Development: false,
 	}
-- 
GitLab