@@ -29,10 +29,7 @@ import (
2929 "github.com/karmada-io/karmada/pkg/util/names"
3030)
3131
32- // WorkWithinPushClusterPredicate generates the event filter function to skip events that the controllers are uninterested.
33- // Used by controllers:
34- // - execution controller working in karmada-controller-manager
35- // - work status controller working in karmada-controller-manager
32+ // WorkWithinPushClusterPredicate generates the event filter function for execution-controller in karmada-controller-manager
3633func WorkWithinPushClusterPredicate (mgr controllerruntime.Manager ) predicate.Funcs {
3734 predFunc := func (object client.Object ) bool {
3835 obj := object .(* workv1alpha1.Work )
@@ -68,6 +65,65 @@ func WorkWithinPushClusterPredicate(mgr controllerruntime.Manager) predicate.Fun
6865 }
6966}
7067
68+ func newWorkStatusPredicate (predFunc func (object client.Object ) bool ) predicate.Funcs {
69+ return predicate.Funcs {
70+ CreateFunc : func (createEvent event.CreateEvent ) bool {
71+ return predFunc (createEvent .Object )
72+ },
73+ UpdateFunc : func (updateEvent event.UpdateEvent ) bool {
74+ workOld := updateEvent .ObjectOld .(* workv1alpha1.Work )
75+ workNew := updateEvent .ObjectNew .(* workv1alpha1.Work )
76+ workOldApplied := IsResourceApplied (& workOld .Status )
77+ workNewApplied := IsResourceApplied (& workNew .Status )
78+ if ! workOldApplied && workNewApplied {
79+ return predFunc (updateEvent .ObjectNew )
80+ }
81+ return false
82+ },
83+ DeleteFunc : func (event.DeleteEvent ) bool {
84+ return false
85+ },
86+ GenericFunc : func (event.GenericEvent ) bool {
87+ return false
88+ },
89+ }
90+ }
91+
92+ // NewWorkStatusPredicate generates the event filter function for work-status-controller in karmada-controller-manager
93+ func NewWorkStatusPredicate (mgr controllerruntime.Manager ) predicate.Funcs {
94+ predFunc := func (object client.Object ) bool {
95+ obj := object .(* workv1alpha1.Work )
96+
97+ clusterName , err := names .GetClusterName (obj .Namespace )
98+ if err != nil {
99+ klog .Errorf ("Failed to get member cluster name for work %s/%s" , obj .Namespace , obj .Name )
100+ return false
101+ }
102+
103+ clusterObj , err := util .GetCluster (mgr .GetClient (), clusterName )
104+ if err != nil {
105+ klog .Errorf ("Failed to get the given member cluster %s" , clusterName )
106+ return false
107+ }
108+
109+ return clusterObj .Spec .SyncMode == clusterv1alpha1 .Push
110+ }
111+ return newWorkStatusPredicate (predFunc )
112+ }
113+
114+ // NewWorkStatusPredicateOnAgent generates the event filter function for work-status-controller in karmada-agent
115+ func NewWorkStatusPredicateOnAgent (curClusterName string ) predicate.Funcs {
116+ predFunc := func (object client.Object ) bool {
117+ clusterName , err := names .GetClusterName (object .GetNamespace ())
118+ if err != nil {
119+ klog .Errorf ("Failed to get member cluster name for work %s/%s" , object .GetNamespace (), object .GetName ())
120+ return false
121+ }
122+ return clusterName == curClusterName
123+ }
124+ return newWorkStatusPredicate (predFunc )
125+ }
126+
71127// NewPredicateForServiceExportController generates an event filter function for ServiceExport controller running by karmada-controller-manager.
72128func NewPredicateForServiceExportController (mgr controllerruntime.Manager ) predicate.Funcs {
73129 predFunc := func (eventType string , object client.Object ) bool {
0 commit comments