Skip to content

Commit

Permalink
Merge pull request #3778 from calvin0327/fixed-karmada-reconclie
Browse files Browse the repository at this point in the history
karmada operator: avoid invalid reconclie for karmada cr
  • Loading branch information
karmada-bot authored Jul 12, 2023
2 parents ccd8c3f + 25bc836 commit 0b5106f
Showing 1 changed file with 36 additions and 5 deletions.
41 changes: 36 additions & 5 deletions operator/pkg/controller/karmada/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@ import (
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/record"
"k8s.io/client-go/util/retry"
"k8s.io/klog/v2"
controllerruntime "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"

operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
operatorscheme "github.com/karmada-io/karmada/operator/pkg/scheme"
Expand Down Expand Up @@ -87,11 +91,18 @@ func (ctrl *Controller) syncKarmada(karmada *operatorv1alpha1.Karmada) error {
}

func (ctrl *Controller) removeFinalizer(ctx context.Context, karmada *operatorv1alpha1.Karmada) (controllerruntime.Result, error) {
if controllerutil.RemoveFinalizer(karmada, ControllerFinalizerName) {
return controllerruntime.Result{}, ctrl.Update(ctx, karmada)
}
return controllerruntime.Result{}, retry.RetryOnConflict(retry.DefaultBackoff, func() error {
newer := &operatorv1alpha1.Karmada{}
if err := ctrl.Get(ctx, client.ObjectKeyFromObject(karmada), newer); err != nil {
return err
}

return controllerruntime.Result{}, nil
if controllerutil.RemoveFinalizer(newer, ControllerFinalizerName) {
return ctrl.Update(ctx, newer)
}

return nil
})
}

func (ctrl *Controller) ensureKarmada(ctx context.Context, karmada *operatorv1alpha1.Karmada) error {
Expand All @@ -118,5 +129,25 @@ func (ctrl *Controller) ensureKarmada(ctx context.Context, karmada *operatorv1al

// SetupWithManager creates a controller and register to controller manager.
func (ctrl *Controller) SetupWithManager(mgr controllerruntime.Manager) error {
return controllerruntime.NewControllerManagedBy(mgr).For(&operatorv1alpha1.Karmada{}).Complete(ctrl)
return controllerruntime.NewControllerManagedBy(mgr).
For(&operatorv1alpha1.Karmada{},
builder.WithPredicates(predicate.Funcs{
UpdateFunc: ctrl.onKarmadaUpdate,
})).
Complete(ctrl)
}

// onKarmadaUpdate returns a bool which represents whether the karmada events need to entry the queue.
// In order to avoid invalid reconcile, we just focus on these two cases:
// 1. when the karmada cr is deleted.
// 2. when the spec of karmada cr is updated.
func (ctrl *Controller) onKarmadaUpdate(updateEvent event.UpdateEvent) bool {
newObj := updateEvent.ObjectNew.(*operatorv1alpha1.Karmada)
oldObj := updateEvent.ObjectOld.(*operatorv1alpha1.Karmada)

if !newObj.DeletionTimestamp.IsZero() {
return true
}

return !reflect.DeepEqual(newObj.Spec, oldObj.Spec)
}

0 comments on commit 0b5106f

Please sign in to comment.