diff --git a/internal/controller/helpers.go b/internal/controller/helpers.go index 1b048d5..536af28 100644 --- a/internal/controller/helpers.go +++ b/internal/controller/helpers.go @@ -98,15 +98,18 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques for _, route := range routes.Items { logger.Info("Found Route", "Name", route.Name) if route.Spec.Gateway == gateway.Name { - rt := Route{} - err := copier.Copy(&rt, &route.Spec) - if err != nil { - logger.Error(err, "Failed to deep copy Route", "Name", route.Name) - return false, err + if route.ObjectMeta.DeletionTimestamp.IsZero() { + rt := Route{} + err := copier.Copy(&rt, &route.Spec) + if err != nil { + logger.Error(err, "Failed to deep copy Route", "Name", route.Name) + return false, err + } + rt.Name = route.Name + gomaConfig.Gateway.Routes = append(gomaConfig.Gateway.Routes, rt) + middlewareNames = append(middlewareNames, rt.Middlewares...) + } - rt.Name = route.Name - gomaConfig.Gateway.Routes = append(gomaConfig.Gateway.Routes, rt) - middlewareNames = append(middlewareNames, rt.Middlewares...) } } for _, mid := range middlewares.Items { diff --git a/internal/controller/route_controller.go b/internal/controller/route_controller.go index ae3f3b3..e71f789 100644 --- a/internal/controller/route_controller.go +++ b/internal/controller/route_controller.go @@ -18,6 +18,7 @@ package controller import ( "context" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" gomaprojv1beta1 "github.com/jkaninda/goma-operator/api/v1beta1" "k8s.io/apimachinery/pkg/types" @@ -55,8 +56,8 @@ type RouteReconciler struct { func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) // Fetch the custom resource - var route gomaprojv1beta1.Route - if err := r.Get(ctx, req.NamespacedName, &route); err != nil { + route := &gomaprojv1beta1.Route{} + if err := r.Get(ctx, req.NamespacedName, route); err != nil { logger.Error(err, "Unable to fetch CustomResource") return ctrl.Result{}, client.IgnoreNotFound(err) } @@ -65,6 +66,38 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl logger.Error(err, "Failed to fetch Gateway") return ctrl.Result{}, err } + + // Check if the object is being deleted and if so, handle it + if route.ObjectMeta.DeletionTimestamp.IsZero() { + if !controllerutil.ContainsFinalizer(route, FinalizerName) { + controllerutil.AddFinalizer(route, FinalizerName) + err := r.Update(ctx, route) + if err != nil { + return ctrl.Result{}, err + } + } + } else { + if controllerutil.ContainsFinalizer(route, FinalizerName) { + // Once finalization is done, remove the finalizer + ok, err := updateGatewayConfig(*r, ctx, req, gateway) + if err != nil { + return ctrl.Result{}, err + } + if ok { + if err = restartDeployment(r.Client, ctx, req, &gateway); err != nil { + return ctrl.Result{}, err + } + } + // Remove the finalizer + controllerutil.RemoveFinalizer(route, FinalizerName) + err = r.Update(ctx, route) + if err != nil { + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil + } + ok, err := updateGatewayConfig(*r, ctx, req, gateway) if err != nil { return ctrl.Result{}, err