Skip to content

Commit ccc77d3

Browse files
committed
Add cross-version compatibility with client-go 1.27
1 parent e2d8821 commit ccc77d3

File tree

5 files changed

+82
-12
lines changed

5 files changed

+82
-12
lines changed

pkg/cache/multi_namespace_cache.go

+27-6
Original file line numberDiff line numberDiff line change
@@ -305,42 +305,63 @@ type multiNamespaceInformer struct {
305305
namespaceToInformer map[string]Informer
306306
}
307307

308+
type handlerRegistration struct {
309+
handles map[string]toolscache.ResourceEventHandlerRegistration
310+
}
311+
312+
type syncer interface {
313+
HasSynced() bool
314+
}
315+
316+
// HasSynced asserts that the handler has been called for the full initial state of the informer.
317+
// This uses syncer to be compatible between client-go 1.27+ and older versions when the interface changed.
318+
func (h handlerRegistration) HasSynced() bool {
319+
for _, reg := range h.handles {
320+
if s, ok := reg.(syncer); ok {
321+
if !s.HasSynced() {
322+
return false
323+
}
324+
}
325+
}
326+
return true
327+
}
328+
308329
var _ Informer = &multiNamespaceInformer{}
309330

310331
// AddEventHandler adds the handler to each namespaced informer.
311332
func (i *multiNamespaceInformer) AddEventHandler(handler toolscache.ResourceEventHandler) (toolscache.ResourceEventHandlerRegistration, error) {
312-
handles := make(map[string]toolscache.ResourceEventHandlerRegistration, len(i.namespaceToInformer))
333+
handles := handlerRegistration{handles: make(map[string]toolscache.ResourceEventHandlerRegistration, len(i.namespaceToInformer))}
313334
for ns, informer := range i.namespaceToInformer {
314335
registration, err := informer.AddEventHandler(handler)
315336
if err != nil {
316337
return nil, err
317338
}
318-
handles[ns] = registration
339+
handles.handles[ns] = registration
319340
}
320341
return handles, nil
321342
}
322343

323344
// AddEventHandlerWithResyncPeriod adds the handler with a resync period to each namespaced informer.
324345
func (i *multiNamespaceInformer) AddEventHandlerWithResyncPeriod(handler toolscache.ResourceEventHandler, resyncPeriod time.Duration) (toolscache.ResourceEventHandlerRegistration, error) {
325-
handles := make(map[string]toolscache.ResourceEventHandlerRegistration, len(i.namespaceToInformer))
346+
handles := handlerRegistration{handles: make(map[string]toolscache.ResourceEventHandlerRegistration, len(i.namespaceToInformer))}
326347
for ns, informer := range i.namespaceToInformer {
327348
registration, err := informer.AddEventHandlerWithResyncPeriod(handler, resyncPeriod)
328349
if err != nil {
329350
return nil, err
330351
}
331-
handles[ns] = registration
352+
handles.handles[ns] = registration
332353
}
333354
return handles, nil
334355
}
335356

336357
// RemoveEventHandler removes a formerly added event handler given by its registration handle.
337358
func (i *multiNamespaceInformer) RemoveEventHandler(h toolscache.ResourceEventHandlerRegistration) error {
338-
handles, ok := h.(map[string]toolscache.ResourceEventHandlerRegistration)
359+
handles, ok := h.(handlerRegistration)
339360
if !ok {
340361
return fmt.Errorf("it is not the registration returned by multiNamespaceInformer")
341362
}
342363
for ns, informer := range i.namespaceToInformer {
343-
registration, ok := handles[ns]
364+
registration, ok := handles.handles[ns]
344365
if !ok {
345366
continue
346367
}

pkg/controller/controllertest/util.go

+44-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,49 @@ type FakeInformer struct {
3333
// RunCount is incremented each time RunInformersAndControllers is called
3434
RunCount int
3535

36-
handlers []cache.ResourceEventHandler
36+
handlers []eventHandlerWrapper
37+
}
38+
39+
type modernResourceEventHandler interface {
40+
OnAdd(obj interface{}, isInInitialList bool)
41+
OnUpdate(oldObj, newObj interface{})
42+
OnDelete(obj interface{})
43+
}
44+
45+
type legacyResourceEventHandler interface {
46+
OnAdd(obj interface{})
47+
OnUpdate(oldObj, newObj interface{})
48+
OnDelete(obj interface{})
49+
}
50+
51+
// eventHandlerWrapper wraps a ResourceEventHandler in a manner that is compatible with client-go 1.27+ and older.
52+
// The interface was changed in these versions.
53+
type eventHandlerWrapper struct {
54+
handler any
55+
}
56+
57+
func (e eventHandlerWrapper) OnAdd(obj interface{}) {
58+
if m, ok := e.handler.(modernResourceEventHandler); ok {
59+
m.OnAdd(obj, false)
60+
return
61+
}
62+
e.handler.(legacyResourceEventHandler).OnAdd(obj)
63+
}
64+
65+
func (e eventHandlerWrapper) OnUpdate(oldObj, newObj interface{}) {
66+
if m, ok := e.handler.(modernResourceEventHandler); ok {
67+
m.OnUpdate(oldObj, newObj)
68+
return
69+
}
70+
e.handler.(legacyResourceEventHandler).OnUpdate(oldObj, newObj)
71+
}
72+
73+
func (e eventHandlerWrapper) OnDelete(obj interface{}) {
74+
if m, ok := e.handler.(modernResourceEventHandler); ok {
75+
m.OnDelete(obj)
76+
return
77+
}
78+
e.handler.(legacyResourceEventHandler).OnDelete(obj)
3779
}
3880

3981
// AddIndexers does nothing. TODO(community): Implement this.
@@ -58,7 +100,7 @@ func (f *FakeInformer) HasSynced() bool {
58100

59101
// AddEventHandler implements the Informer interface. Adds an EventHandler to the fake Informers. TODO(community): Implement Registration.
60102
func (f *FakeInformer) AddEventHandler(handler cache.ResourceEventHandler) (cache.ResourceEventHandlerRegistration, error) {
61-
f.handlers = append(f.handlers, handler)
103+
f.handlers = append(f.handlers, eventHandlerWrapper{handler})
62104
return nil, nil
63105
}
64106

pkg/internal/source/event_handler.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ import (
3232

3333
var log = logf.RuntimeLog.WithName("source").WithName("EventHandler")
3434

35-
var _ cache.ResourceEventHandler = &EventHandler{}
36-
3735
// NewEventHandler creates a new EventHandler.
3836
func NewEventHandler(ctx context.Context, queue workqueue.RateLimitingInterface, handler handler.EventHandler, predicates []predicate.Predicate) *EventHandler {
3937
return &EventHandler{
@@ -55,6 +53,15 @@ type EventHandler struct {
5553
predicates []predicate.Predicate
5654
}
5755

56+
// HandlerFuncs converts EventHandler to a ResourceEventHandlerFuncs
57+
func (e *EventHandler) HandlerFuncs() cache.ResourceEventHandlerFuncs {
58+
return cache.ResourceEventHandlerFuncs{
59+
AddFunc: e.OnAdd,
60+
UpdateFunc: e.OnUpdate,
61+
DeleteFunc: e.OnDelete,
62+
}
63+
}
64+
5865
// OnAdd creates CreateEvent and calls Create on EventHandler.
5966
func (e *EventHandler) OnAdd(obj interface{}) {
6067
c := event.CreateEvent{}

pkg/internal/source/kind.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (ks *Kind) Start(ctx context.Context, handler handler.EventHandler, queue w
7979
return
8080
}
8181

82-
_, err := i.AddEventHandler(NewEventHandler(ctx, queue, handler, prct))
82+
_, err := i.AddEventHandler(NewEventHandler(ctx, queue, handler, prct).HandlerFuncs())
8383
if err != nil {
8484
ks.started <- err
8585
return

pkg/source/source.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func (is *Informer) Start(ctx context.Context, handler handler.EventHandler, que
204204
return fmt.Errorf("must specify Informer.Informer")
205205
}
206206

207-
_, err := is.Informer.AddEventHandler(internal.NewEventHandler(ctx, queue, handler, prct))
207+
_, err := is.Informer.AddEventHandler(internal.NewEventHandler(ctx, queue, handler, prct).HandlerFuncs())
208208
if err != nil {
209209
return err
210210
}

0 commit comments

Comments
 (0)