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