simplify finalizer usage. (#94)

This commit is contained in:
Hongcai Ren 2020-12-30 09:25:00 +08:00 committed by GitHub
parent 5327705f6e
commit e4c7379eb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 56 deletions

View File

@ -9,12 +9,12 @@ import (
"k8s.io/apimachinery/pkg/api/meta"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/record"
"k8s.io/klog/v2"
controllerruntime "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"github.com/karmada-io/karmada/pkg/apis/membercluster/v1alpha1"
propagationstrategy "github.com/karmada-io/karmada/pkg/apis/propagationstrategy/v1alpha1"
@ -260,17 +260,12 @@ func (c *Controller) updateResource(memberClusterDynamicClient *util.DynamicClus
// removeFinalizer remove finalizer from the given propagationWork
func (c *Controller) removeFinalizer(propagationWork *propagationstrategy.PropagationWork) (controllerruntime.Result, error) {
accessor, err := meta.Accessor(propagationWork)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
finalizers := sets.NewString(accessor.GetFinalizers()...)
if !finalizers.Has(util.ExecutionControllerFinalizer) {
if !controllerutil.ContainsFinalizer(propagationWork, util.ExecutionControllerFinalizer) {
return controllerruntime.Result{}, nil
}
finalizers.Delete(util.ExecutionControllerFinalizer)
accessor.SetFinalizers(finalizers.List())
err = c.Client.Update(context.TODO(), propagationWork)
controllerutil.RemoveFinalizer(propagationWork, util.ExecutionControllerFinalizer)
err := c.Client.Update(context.TODO(), propagationWork)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}

View File

@ -7,26 +7,24 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/record"
"k8s.io/klog/v2"
controllerruntime "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"github.com/karmada-io/karmada/pkg/apis/membercluster/v1alpha1"
"github.com/karmada-io/karmada/pkg/util"
"github.com/karmada-io/karmada/pkg/util/names"
)
const (
// ControllerName is the controller name that will be used when reporting events.
ControllerName = "membercluster-controller"
// FinalizerMemberClusterController is the finalizer added by membercluster controller
FinalizerMemberClusterController = "karmada.io/membercluster-controller"
executionSpaceLabelKey = "karmada.io/executionspace"
executionSpaceLabelValue = ""
ControllerName = "membercluster-controller"
executionSpaceLabelKey = "karmada.io/executionspace"
executionSpaceLabelValue = ""
)
// Controller is to sync MemberCluster.
@ -132,38 +130,30 @@ func (c *Controller) ensureRemoveExecutionSpace(memberCluster *v1alpha1.MemberCl
}
func (c *Controller) removeFinalizer(memberCluster *v1alpha1.MemberCluster) (controllerruntime.Result, error) {
accessor, err := meta.Accessor(memberCluster)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
finalizers := sets.NewString(accessor.GetFinalizers()...)
if !finalizers.Has(FinalizerMemberClusterController) {
if !controllerutil.ContainsFinalizer(memberCluster, util.MemberClusterControllerFinalizer) {
return controllerruntime.Result{}, nil
}
finalizers.Delete(FinalizerMemberClusterController)
accessor.SetFinalizers(finalizers.List())
err = c.Client.Update(context.TODO(), memberCluster)
controllerutil.RemoveFinalizer(memberCluster, util.MemberClusterControllerFinalizer)
err := c.Client.Update(context.TODO(), memberCluster)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
return controllerruntime.Result{}, nil
}
func (c *Controller) ensureFinalizer(memberCluster *v1alpha1.MemberCluster) (controllerruntime.Result, error) {
accessor, err := meta.Accessor(memberCluster)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
finalizers := sets.NewString(accessor.GetFinalizers()...)
if finalizers.Has(FinalizerMemberClusterController) {
if controllerutil.ContainsFinalizer(memberCluster, util.MemberClusterControllerFinalizer) {
return controllerruntime.Result{}, nil
}
finalizers.Insert(FinalizerMemberClusterController)
accessor.SetFinalizers(finalizers.List())
err = c.Client.Update(context.TODO(), memberCluster)
controllerutil.AddFinalizer(memberCluster, util.MemberClusterControllerFinalizer)
err := c.Client.Update(context.TODO(), memberCluster)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
}
return controllerruntime.Result{}, nil
}

View File

@ -8,18 +8,16 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/api/resource"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/record"
"k8s.io/klog/v2"
controllerruntime "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"github.com/karmada-io/karmada/pkg/apis/membercluster/v1alpha1"
"github.com/karmada-io/karmada/pkg/controllers/membercluster"
"github.com/karmada-io/karmada/pkg/util"
)
@ -61,12 +59,11 @@ func (c *MemberClusterStatusController) Reconcile(req controllerruntime.Request)
return controllerruntime.Result{}, nil
}
// start syncing status only if the finalizer is present on the given MemberCluster resource to avoid conflict with membercluster controller
exist, err := c.checkFinalizerExist(memberCluster)
if err != nil {
return controllerruntime.Result{Requeue: true}, err
} else if !exist {
return controllerruntime.Result{RequeueAfter: 2 * time.Second}, err
// start syncing status only when the finalizer is present on the given MemberCluster to
// avoid conflict with membercluster controller.
if !controllerutil.ContainsFinalizer(memberCluster, util.MemberClusterControllerFinalizer) {
klog.V(2).Infof("waiting finalizer present for member cluster: %s", memberCluster.Name)
return controllerruntime.Result{Requeue: true}, nil
}
return c.syncMemberClusterStatus(memberCluster)
@ -126,18 +123,6 @@ func (c *MemberClusterStatusController) syncMemberClusterStatus(memberCluster *v
return c.updateStatusIfNeeded(memberCluster, currentClusterStatus)
}
func (c *MemberClusterStatusController) checkFinalizerExist(memberCluster *v1alpha1.MemberCluster) (bool, error) {
accessor, err := meta.Accessor(memberCluster)
if err != nil {
return false, err
}
finalizers := sets.NewString(accessor.GetFinalizers()...)
if finalizers.Has(membercluster.FinalizerMemberClusterController) {
return true, nil
}
return false, nil
}
// updateStatusIfNeeded calls updateStatus only if the status of the member cluster is not the same as the old status
func (c *MemberClusterStatusController) updateStatusIfNeeded(memberCluster *v1alpha1.MemberCluster, currentClusterStatus v1alpha1.MemberClusterStatus) (controllerruntime.Result, error) {
if !equality.Semantic.DeepEqual(memberCluster.Status, currentClusterStatus) {

View File

@ -9,6 +9,14 @@ const (
// example1: set it in propagationBinding, the label value is propagationPolicy.
// example2: set it in propagationWork, the label value is propagationBinding.
OwnerLabel = "karmada.io/created-by"
)
// Define finalizers used by karmada system.
const (
// MemberClusterControllerFinalizer is added to MemberCluster to ensure PropagationWork as well as the
// execution space (namespace) is deleted before itself is deleted.
MemberClusterControllerFinalizer = "karmada.io/membercluster-controller"
// ExecutionControllerFinalizer is added to PropagationWork to ensure manifests propagated to member cluster
// is deleted before PropagationWork itself is deleted.
ExecutionControllerFinalizer = "karmada.io/execution-controller"