From 36668bbecc435b8175740caedefa63cd3e433b79 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 24 May 2023 19:56:11 +0800 Subject: [PATCH] support disable cascading deletion of karmada Signed-off-by: calvin --- operator/pkg/controller/karmada/controller.go | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/operator/pkg/controller/karmada/controller.go b/operator/pkg/controller/karmada/controller.go index 7b6012925..a8e4e8da1 100644 --- a/operator/pkg/controller/karmada/controller.go +++ b/operator/pkg/controller/karmada/controller.go @@ -3,9 +3,11 @@ package karmada import ( "context" "reflect" + "strconv" "time" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" @@ -23,6 +25,9 @@ const ( // ControllerFinalizerName is the name of the karmada controller finalizer ControllerFinalizerName = "operator.karmada.io/finalizer" + + // DisableCascadingDeletionLabel is the label that determine whether to perform cascade deletion + DisableCascadingDeletionLabel = "operator.karmada.io/disable-cascading-deletion" ) // Controller controls the Karmada resource. @@ -52,28 +57,33 @@ func (ctrl *Controller) Reconcile(ctx context.Context, req controllerruntime.Req return controllerruntime.Result{}, err } - // examine DeletionTimestamp to determine if object is under deletion - if karmada.DeletionTimestamp.IsZero() { - if err := ctrl.ensureKarmada(ctx, karmada); err != nil { - return controllerruntime.Result{}, err - } - } - - klog.V(2).InfoS("Reconciling karmada", "name", req.Name) - planner, err := NewPlannerFor(karmada, ctrl.Client, ctrl.Config) - if err != nil { - return controllerruntime.Result{}, err - } - if err := planner.Execute(); err != nil { - return controllerruntime.Result{}, err - } - // The object is being deleted if !karmada.DeletionTimestamp.IsZero() { + value, isExist := karmada.Labels[DisableCascadingDeletionLabel] + if !isExist || value == strconv.FormatBool(false) { + if err := ctrl.syncKarmada(karmada); err != nil { + return controllerruntime.Result{}, err + } + } + return ctrl.removeFinalizer(ctx, karmada) } - return controllerruntime.Result{}, nil + if err := ctrl.ensureKarmada(ctx, karmada); err != nil { + return controllerruntime.Result{}, err + } + + return controllerruntime.Result{}, ctrl.syncKarmada(karmada) +} + +func (ctrl *Controller) syncKarmada(karmada *operatorv1alpha1.Karmada) error { + klog.V(2).InfoS("Reconciling karmada", "name", karmada.Name) + planner, err := NewPlannerFor(karmada, ctrl.Client, ctrl.Config) + if err != nil { + return err + } + + return planner.Execute() } func (ctrl *Controller) removeFinalizer(ctx context.Context, karmada *operatorv1alpha1.Karmada) (controllerruntime.Result, error) { @@ -89,6 +99,11 @@ func (ctrl *Controller) ensureKarmada(ctx context.Context, karmada *operatorv1al // then lets add the finalizer and update the object. This is equivalent // registering our finalizer. updated := controllerutil.AddFinalizer(karmada, ControllerFinalizerName) + if _, isExist := karmada.Labels[DisableCascadingDeletionLabel]; !isExist { + karmada.SetLabels(labels.Set{DisableCascadingDeletionLabel: "false"}) + updated = true + } + older := karmada.DeepCopy() // Set the defaults for karmada