From b40b66f008932b881badce37ef18f1ffa8ace43d Mon Sep 17 00:00:00 2001
From: Michal Kolodziejski <michal.kolodziejski@cern.ch>
Date: Tue, 13 Jul 2021 15:01:51 +0200
Subject: [PATCH] Reconcile GitlabPagesSite if its Route changes

---
 controllers/operator_methods.go      | 10 +++-----
 controllers/staticsite_controller.go | 34 ++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/controllers/operator_methods.go b/controllers/operator_methods.go
index 80a9ff8..f952082 100644
--- a/controllers/operator_methods.go
+++ b/controllers/operator_methods.go
@@ -97,6 +97,9 @@ func (r *GitlabPagesSiteReconciler) newRouteForGitlabPagesSite(gitlabPagesSite *
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      gitlabPagesSite.Name,
 			Namespace: r.Namespace,
+			Annotations: map[string]string{
+				"webservices.cern.ch/static-site-owner": types.NamespacedName{Name: gitlabPagesSite.Name, Namespace: gitlabPagesSite.Namespace}.String(),
+			},
 		},
 		Spec: routev1.RouteSpec{
 			TLS: &routev1.TLSConfig{
@@ -114,13 +117,6 @@ func (r *GitlabPagesSiteReconciler) newRouteForGitlabPagesSite(gitlabPagesSite *
 		},
 	}
 
-	// Set GitlabPagesSite instance as the owner and controller. This will set
-	// the OwnerReferences to the route, and will trigger a deletion of the
-	// route when the GitlabPagesSite parent gets deleted.
-	// if err := controllerutil.SetControllerReference(gitlabPagesSite, route, r.Scheme); err != nil {
-	// 	return nil, fmt.Errorf("failed to set controller reference for route creation with err: %v", err)
-	// }
-
 	return route, nil
 }
 
diff --git a/controllers/staticsite_controller.go b/controllers/staticsite_controller.go
index 9114e12..786cbfd 100644
--- a/controllers/staticsite_controller.go
+++ b/controllers/staticsite_controller.go
@@ -20,6 +20,7 @@ import (
 	"context"
 	"fmt"
 	"reflect"
+	"strings"
 	"time"
 
 	"github.com/go-logr/logr"
@@ -32,7 +33,10 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
+	"sigs.k8s.io/controller-runtime/pkg/handler"
 	"sigs.k8s.io/controller-runtime/pkg/log"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	authzalpha1 "gitlab.cern.ch/paas-tools/operators/authz-operator/api/v1alpha1"
 	webservicescernchv1alpha1 "gitlab.cern.ch/paas-tools/operators/static-site-operator/api/v1alpha1"
@@ -109,6 +113,16 @@ func (r *GitlabPagesSiteReconciler) Reconcile(ctx context.Context, req ctrl.Requ
 			if err != nil {
 				return ctrl.Result{}, err
 			}
+
+			route, err := r.getRoute(gitlabPagesSite)
+			if err != nil {
+				return ctrl.Result{}, err
+			}
+
+			err = r.Delete(context.TODO(), route, &client.DeleteOptions{})
+			if err != nil {
+				return ctrl.Result{}, err
+			}
 		}
 
 		r.logger.Info("GitlabPagesSite has been deleted")
@@ -166,7 +180,23 @@ func (r *GitlabPagesSiteReconciler) Reconcile(ctx context.Context, req ctrl.Requ
 func (r *GitlabPagesSiteReconciler) SetupWithManager(mgr ctrl.Manager) error {
 	return ctrl.NewControllerManagedBy(mgr).
 		For(&webservicescernchv1alpha1.GitlabPagesSite{}).
-		// TODO: We can't set the controller reference for now since the `Route` and `GitlabPagesSite` live in different namespaces
-		Owns(&routev1.Route{}).
+		Watches(&source.Kind{Type: &routev1.Route{}}, handler.EnqueueRequestsFromMapFunc(
+			func(a client.Object) []reconcile.Request {
+				namespace := a.GetNamespace()
+
+				// we only care about the `Route`s within the namespace specified by r.Namespace
+				if namespace != r.Namespace {
+					return []reconcile.Request{}
+				}
+
+				annotations := a.GetAnnotations()
+				if annotations != nil && annotations["webservices.cern.ch/static-site-owner"] != "" {
+					parts := strings.Split(annotations["webservices.cern.ch/static-site-owner"], "/")
+					return []reconcile.Request{{NamespacedName: types.NamespacedName{Name: parts[1], Namespace: parts[0]}}}
+				}
+
+				return []reconcile.Request{}
+			}),
+		).
 		Complete(r)
 }
-- 
GitLab