simplify finalizer usage. (#94)
This commit is contained in:
parent
5327705f6e
commit
e4c7379eb5
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue