Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/agent/app/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,7 @@ func startWorkStatusController(ctx controllerscontext.Context) (bool, error) {
InformerManager: genericmanager.GetInstance(),
Context: ctx.Context,
ObjectWatcher: ctx.ObjectWatcher,
WorkPredicateFunc: helper.NewWorkStatusPredicateOnAgent(ctx.Opts.ClusterName),
ClusterDynamicClientSetFunc: util.NewClusterDynamicClientSetForAgent,
ClusterCacheSyncTimeout: ctx.Opts.ClusterCacheSyncTimeout,
ConcurrentWorkStatusSyncs: ctx.Opts.ConcurrentWorkSyncs,
Expand Down
2 changes: 1 addition & 1 deletion cmd/controller-manager/app/controllermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ func startWorkStatusController(ctx controllerscontext.Context) (enabled bool, er
InformerManager: genericmanager.GetInstance(),
Context: ctx.Context,
ObjectWatcher: ctx.ObjectWatcher,
WorkPredicateFunc: helper.WorkWithinPushClusterPredicate(ctx.Mgr),
WorkPredicateFunc: helper.NewWorkStatusPredicate(ctx.Mgr),
ClusterDynamicClientSetFunc: util.NewClusterDynamicClientSet,
ClusterClientOption: ctx.ClusterClientOption,
ClusterCacheSyncTimeout: opts.ClusterCacheSyncTimeout,
Expand Down
15 changes: 5 additions & 10 deletions pkg/controllers/status/work_status_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -543,18 +543,13 @@ func (c *WorkStatusController) getSingleClusterManager(cluster *clusterv1alpha1.

// SetupWithManager creates a controller and register to controller manager.
func (c *WorkStatusController) SetupWithManager(mgr controllerruntime.Manager) error {
ctrlBuilder := controllerruntime.NewControllerManagedBy(mgr).Named(WorkStatusControllerName).
return controllerruntime.NewControllerManagedBy(mgr).
Named(WorkStatusControllerName).
For(&workv1alpha1.Work{}, builder.WithPredicates(c.WorkPredicateFunc)).
WithOptions(controller.Options{
RateLimiter: ratelimiterflag.DefaultControllerRateLimiter[controllerruntime.Request](c.RateLimiterOptions),
})

if c.WorkPredicateFunc != nil {
ctrlBuilder.For(&workv1alpha1.Work{}, builder.WithPredicates(c.WorkPredicateFunc))
} else {
ctrlBuilder.For(&workv1alpha1.Work{})
}

return ctrlBuilder.Complete(c)
}).
Complete(c)
}

func (c *WorkStatusController) eventf(object *unstructured.Unstructured, eventType, reason, messageFmt string, args ...interface{}) {
Expand Down
64 changes: 60 additions & 4 deletions pkg/util/helper/predicate.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@ import (
"github.com/karmada-io/karmada/pkg/util/names"
)

// WorkWithinPushClusterPredicate generates the event filter function to skip events that the controllers are uninterested.
// Used by controllers:
// - execution controller working in karmada-controller-manager
// - work status controller working in karmada-controller-manager
// WorkWithinPushClusterPredicate generates the event filter function for execution-controller in karmada-controller-manager
func WorkWithinPushClusterPredicate(mgr controllerruntime.Manager) predicate.Funcs {
predFunc := func(object client.Object) bool {
obj := object.(*workv1alpha1.Work)
Expand Down Expand Up @@ -68,6 +65,65 @@ func WorkWithinPushClusterPredicate(mgr controllerruntime.Manager) predicate.Fun
}
}

func newWorkStatusPredicate(predFunc func(object client.Object) bool) predicate.Funcs {
return predicate.Funcs{
CreateFunc: func(createEvent event.CreateEvent) bool {
return predFunc(createEvent.Object)
},
UpdateFunc: func(updateEvent event.UpdateEvent) bool {
workOld := updateEvent.ObjectOld.(*workv1alpha1.Work)
workNew := updateEvent.ObjectNew.(*workv1alpha1.Work)
workOldApplied := IsResourceApplied(&workOld.Status)
workNewApplied := IsResourceApplied(&workNew.Status)
if !workOldApplied && workNewApplied {
return predFunc(updateEvent.ObjectNew)
}
return false
},
DeleteFunc: func(event.DeleteEvent) bool {
return false
},
GenericFunc: func(event.GenericEvent) bool {
return false
},
}
}

// NewWorkStatusPredicate generates the event filter function for work-status-controller in karmada-controller-manager
func NewWorkStatusPredicate(mgr controllerruntime.Manager) predicate.Funcs {
predFunc := func(object client.Object) bool {
obj := object.(*workv1alpha1.Work)

clusterName, err := names.GetClusterName(obj.Namespace)
if err != nil {
klog.Errorf("Failed to get member cluster name for work %s/%s", obj.Namespace, obj.Name)
return false
}

clusterObj, err := util.GetCluster(mgr.GetClient(), clusterName)
if err != nil {
klog.Errorf("Failed to get the given member cluster %s", clusterName)
return false
}

return clusterObj.Spec.SyncMode == clusterv1alpha1.Push
}
return newWorkStatusPredicate(predFunc)
}

// NewWorkStatusPredicateOnAgent generates the event filter function for work-status-controller in karmada-agent
func NewWorkStatusPredicateOnAgent(curClusterName string) predicate.Funcs {
predFunc := func(object client.Object) bool {
clusterName, err := names.GetClusterName(object.GetNamespace())
if err != nil {
klog.Errorf("Failed to get member cluster name for work %s/%s", object.GetNamespace(), object.GetName())
return false
}
return clusterName == curClusterName
}
return newWorkStatusPredicate(predFunc)
}

// NewPredicateForServiceExportController generates an event filter function for ServiceExport controller running by karmada-controller-manager.
func NewPredicateForServiceExportController(mgr controllerruntime.Manager) predicate.Funcs {
predFunc := func(eventType string, object client.Object) bool {
Expand Down
Loading