Skip to content

Commit 97b7b0c

Browse files
committed
Enqueue location upon synctarget update
We cannot directly read the logicalcluster path from synctarget to get the related placement, since the value of that path is not unique. Instead, we need to get the location of the related synctarget at first, which always has the path annotation. Signed-off-by: Jian Qiu <jqiu@redhat.com>
1 parent 9358474 commit 97b7b0c

File tree

1 file changed

+34
-49
lines changed

1 file changed

+34
-49
lines changed

pkg/reconciler/workload/placement/placement_controller.go

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737

3838
apisv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/apis/v1alpha1"
3939
"github.com/kcp-dev/kcp/pkg/apis/core"
40-
corev1alpha1 "github.com/kcp-dev/kcp/pkg/apis/core/v1alpha1"
4140
schedulingv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/scheduling/v1alpha1"
4241
workloadv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/workload/v1alpha1"
4342
kcpclientset "github.com/kcp-dev/kcp/pkg/client/clientset/versioned/cluster"
@@ -101,23 +100,25 @@ func NewController(
101100
indexers.ByLogicalClusterPathAndName: indexers.IndexByLogicalClusterPathAndName,
102101
})
103102

103+
logger := logging.WithReconciler(klog.Background(), ControllerName)
104+
104105
locationInformer.Informer().AddEventHandler(
105106
cache.ResourceEventHandlerFuncs{
106-
AddFunc: c.enqueueLocation,
107+
AddFunc: func(obj interface{}) { c.enqueueLocation(obj, logger) },
107108
UpdateFunc: func(old, obj interface{}) {
108109
oldLoc := old.(*schedulingv1alpha1.Location)
109110
newLoc := obj.(*schedulingv1alpha1.Location)
110111
if !reflect.DeepEqual(oldLoc.Spec, newLoc.Spec) || !reflect.DeepEqual(oldLoc.Labels, newLoc.Labels) {
111-
c.enqueueLocation(obj)
112+
c.enqueueLocation(obj, logger)
112113
}
113114
},
114-
DeleteFunc: c.enqueueLocation,
115+
DeleteFunc: func(obj interface{}) { c.enqueueLocation(obj, logger) },
115116
},
116117
)
117118

118119
syncTargetInformer.Informer().AddEventHandler(
119120
cache.ResourceEventHandlerFuncs{
120-
AddFunc: c.enqueueSyncTarget,
121+
AddFunc: func(obj interface{}) { c.enqueueSyncTarget(obj, logger) },
121122
UpdateFunc: func(old, obj interface{}) {
122123
oldCluster := old.(*workloadv1alpha1.SyncTarget)
123124
oldClusterCopy := *oldCluster
@@ -137,24 +138,23 @@ func NewController(
137138

138139
// compare ignoring heart-beat
139140
if !reflect.DeepEqual(oldClusterCopy, newClusterCopy) {
140-
c.enqueueSyncTarget(obj)
141+
c.enqueueSyncTarget(obj, logger)
141142
}
142143
},
143-
DeleteFunc: c.enqueueSyncTarget,
144+
DeleteFunc: func(obj interface{}) { c.enqueueSyncTarget(obj, logger) },
144145
},
145146
)
146147

147-
logger := logging.WithReconciler(klog.Background(), ControllerName)
148148
placementInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
149-
AddFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger, "") },
150-
UpdateFunc: func(_, obj interface{}) { c.enqueuePlacement(obj, logger, "") },
151-
DeleteFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger, "") },
149+
AddFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger) },
150+
UpdateFunc: func(_, obj interface{}) { c.enqueuePlacement(obj, logger) },
151+
DeleteFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger) },
152152
})
153153

154154
apiBindingInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
155-
AddFunc: c.enqueueAPIBinding,
156-
UpdateFunc: func(_, obj interface{}) { c.enqueueAPIBinding(obj) },
157-
DeleteFunc: c.enqueueAPIBinding,
155+
AddFunc: func(obj interface{}) { c.enqueueAPIBinding(obj, logger) },
156+
UpdateFunc: func(_, obj interface{}) { c.enqueueAPIBinding(obj, logger) },
157+
DeleteFunc: func(obj interface{}) { c.enqueueAPIBinding(obj, logger) },
158158
})
159159

160160
return c, nil
@@ -188,7 +188,7 @@ type controller struct {
188188
}
189189

190190
// enqueueLocation finds placement ref to this location at first, and then namespaces bound to this placement.
191-
func (c *controller) enqueueLocation(obj interface{}) {
191+
func (c *controller) enqueueLocation(obj interface{}, logger logr.Logger) {
192192
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
193193
obj = tombstone.Obj
194194
}
@@ -215,24 +215,24 @@ func (c *controller) enqueueLocation(obj interface{}) {
215215
placements = append(placements, placementsByPath...)
216216
}
217217

218-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), location)
218+
logger = logger.WithValues(logging.FromPrefix("locationReason", location)...)
219219
for _, placement := range placements {
220-
c.enqueuePlacement(placement, logger, " because of Location")
220+
c.enqueuePlacement(placement, logger)
221221
}
222222
}
223223

224-
func (c *controller) enqueuePlacement(obj interface{}, logger logr.Logger, logSuffix string) {
224+
func (c *controller) enqueuePlacement(obj interface{}, logger logr.Logger) {
225225
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
226226
if err != nil {
227227
runtime.HandleError(err)
228228
return
229229
}
230230

231-
logging.WithQueueKey(logger, key).V(2).Info(fmt.Sprintf("queueing Placement%s", logSuffix))
231+
logging.WithQueueKey(logger, key).V(2).Info("queueing Placement")
232232
c.queue.Add(key)
233233
}
234234

235-
func (c *controller) enqueueAPIBinding(obj interface{}) {
235+
func (c *controller) enqueueAPIBinding(obj interface{}, logger logr.Logger) {
236236
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
237237
if err != nil {
238238
runtime.HandleError(err)
@@ -250,50 +250,35 @@ func (c *controller) enqueueAPIBinding(obj interface{}) {
250250
return
251251
}
252252

253-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), obj.(*apisv1alpha1.APIBinding))
253+
logger = logger.WithValues(logging.FromPrefix("apiBindingReason", obj.(*apisv1alpha1.APIBinding))...)
254+
254255
for _, placement := range placements {
255-
c.enqueuePlacement(placement, logger, " because of APIBinding")
256+
c.enqueuePlacement(placement, logger)
256257
}
257258
}
258259

259-
func (c *controller) enqueueSyncTarget(obj interface{}) {
260-
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
261-
if err != nil {
262-
runtime.HandleError(err)
263-
return
260+
func (c *controller) enqueueSyncTarget(obj interface{}, logger logr.Logger) {
261+
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
262+
obj = tombstone.Obj
264263
}
265264

266-
clusterName, _, _, err := kcpcache.SplitMetaClusterNamespaceKey(key)
267-
if err != nil {
268-
runtime.HandleError(err)
265+
syncTarget, ok := obj.(*workloadv1alpha1.SyncTarget)
266+
if !ok {
267+
runtime.HandleError(fmt.Errorf("unexpected object type: %T", obj))
269268
return
270269
}
271270

272-
cluster, err := c.logicalClusterLister.Cluster(clusterName).Get(corev1alpha1.LogicalClusterName)
271+
// Get all locations in the same cluster and enqueue locations.
272+
locations, err := c.locationLister.Cluster(logicalcluster.From(syncTarget)).List(labels.Everything())
273273
if err != nil {
274274
runtime.HandleError(err)
275275
return
276276
}
277277

278-
// placements referencing by cluster name
279-
placements, err := c.placementIndexer.ByIndex(bySelectedLocationPath, logicalcluster.From(cluster).String())
280-
if err != nil {
281-
runtime.HandleError(err)
282-
return
283-
}
284-
if path := cluster.Annotations[core.LogicalClusterPathAnnotationKey]; path != "" {
285-
// placements referencing by path
286-
placementsByPath, err := c.placementIndexer.ByIndex(bySelectedLocationPath, path)
287-
if err != nil {
288-
runtime.HandleError(err)
289-
return
290-
}
291-
placements = append(placements, placementsByPath...)
292-
}
278+
logger = logger.WithValues(logging.FromPrefix("syncTargetReason", syncTarget)...)
293279

294-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), obj.(*workloadv1alpha1.SyncTarget))
295-
for _, placement := range placements {
296-
c.enqueuePlacement(placement, logger, " because of SyncTarget")
280+
for _, location := range locations {
281+
c.enqueueLocation(location, logger)
297282
}
298283
}
299284

0 commit comments

Comments
 (0)