Skip to content

Commit 7e69068

Browse files
authored
Merge pull request kubernetes#91798 from chelseychen/event-fallback
Move fallback of Event API into new event lib
2 parents f496b9f + e0e12f2 commit 7e69068

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

staging/src/k8s.io/client-go/tools/events/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ go_library(
2424
"//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
2525
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
2626
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
27+
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
28+
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
29+
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
2730
"//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library",
2831
"//staging/src/k8s.io/client-go/rest:go_default_library",
32+
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
2933
"//staging/src/k8s.io/client-go/tools/record/util:go_default_library",
3034
"//staging/src/k8s.io/client-go/tools/reference:go_default_library",
3135
"//vendor/k8s.io/klog/v2:go_default_library",

staging/src/k8s.io/client-go/tools/events/event_broadcaster.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ import (
3434
"k8s.io/apimachinery/pkg/util/json"
3535
"k8s.io/apimachinery/pkg/util/strategicpatch"
3636
"k8s.io/apimachinery/pkg/util/wait"
37+
clientset "k8s.io/client-go/kubernetes"
38+
"k8s.io/client-go/kubernetes/scheme"
39+
typedv1core "k8s.io/client-go/kubernetes/typed/core/v1"
3740
typedv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1"
41+
"k8s.io/client-go/tools/record"
3842
"k8s.io/client-go/tools/record/util"
3943
"k8s.io/klog/v2"
4044
)
@@ -314,3 +318,56 @@ func (e *eventBroadcasterImpl) StartRecordingToSink(stopCh <-chan struct{}) {
314318
stopWatcher()
315319
}()
316320
}
321+
322+
type eventBroadcasterAdapterImpl struct {
323+
coreClient typedv1core.EventsGetter
324+
coreBroadcaster record.EventBroadcaster
325+
v1beta1Client typedv1beta1.EventsGetter
326+
v1beta1Broadcaster EventBroadcaster
327+
}
328+
329+
// NewEventBroadcasterAdapter creates a wrapper around new and legacy broadcasters to simplify
330+
// migration of individual components to the new Event API.
331+
func NewEventBroadcasterAdapter(client clientset.Interface) EventBroadcasterAdapter {
332+
eventClient := &eventBroadcasterAdapterImpl{}
333+
if _, err := client.Discovery().ServerResourcesForGroupVersion(v1beta1.SchemeGroupVersion.String()); err == nil {
334+
eventClient.v1beta1Client = client.EventsV1beta1()
335+
eventClient.v1beta1Broadcaster = NewBroadcaster(&EventSinkImpl{Interface: eventClient.v1beta1Client.Events("")})
336+
}
337+
// Even though there can soon exist cases when coreBroadcaster won't really be needed,
338+
// we create it unconditionally because its overhead is minor and will simplify using usage
339+
// patterns of this library in all components.
340+
eventClient.coreClient = client.CoreV1()
341+
eventClient.coreBroadcaster = record.NewBroadcaster()
342+
return eventClient
343+
}
344+
345+
// StartRecordingToSink starts sending events received from the specified eventBroadcaster to the given sink.
346+
func (e *eventBroadcasterAdapterImpl) StartRecordingToSink(stopCh <-chan struct{}) {
347+
if e.v1beta1Broadcaster != nil && e.v1beta1Client != nil {
348+
e.v1beta1Broadcaster.StartRecordingToSink(stopCh)
349+
}
350+
if e.coreBroadcaster != nil && e.coreClient != nil {
351+
e.coreBroadcaster.StartRecordingToSink(&typedv1core.EventSinkImpl{Interface: e.coreClient.Events("")})
352+
}
353+
}
354+
355+
func (e *eventBroadcasterAdapterImpl) NewRecorder(name string) EventRecorder {
356+
if e.v1beta1Broadcaster != nil && e.v1beta1Client != nil {
357+
return e.v1beta1Broadcaster.NewRecorder(scheme.Scheme, name)
358+
}
359+
return record.NewEventRecorderAdapter(e.DeprecatedNewLegacyRecorder(name))
360+
}
361+
362+
func (e *eventBroadcasterAdapterImpl) DeprecatedNewLegacyRecorder(name string) record.EventRecorder {
363+
return e.coreBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: name})
364+
}
365+
366+
func (e *eventBroadcasterAdapterImpl) Shutdown() {
367+
if e.coreBroadcaster != nil {
368+
e.coreBroadcaster.Shutdown()
369+
}
370+
if e.v1beta1Broadcaster != nil {
371+
e.v1beta1Broadcaster.Shutdown()
372+
}
373+
}

staging/src/k8s.io/client-go/tools/events/interfaces.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package events
1919
import (
2020
"k8s.io/api/events/v1beta1"
2121
"k8s.io/apimachinery/pkg/runtime"
22+
"k8s.io/client-go/tools/record"
2223
)
2324

2425
// EventRecorder knows how to record events on behalf of an EventSource.
@@ -68,3 +69,22 @@ type EventSink interface {
6869
Update(event *v1beta1.Event) (*v1beta1.Event, error)
6970
Patch(oldEvent *v1beta1.Event, data []byte) (*v1beta1.Event, error)
7071
}
72+
73+
// EventBroadcasterAdapter is a auxiliary interface to simplify migration to
74+
// the new events API. It is a wrapper around new and legacy broadcasters
75+
// that smartly chooses which one to use.
76+
//
77+
// Deprecated: This interface will be removed once migration is completed.
78+
type EventBroadcasterAdapter interface {
79+
// StartRecordingToSink starts sending events received from the specified eventBroadcaster.
80+
StartRecordingToSink(stopCh <-chan struct{})
81+
82+
// NewRecorder creates a new Event Recorder with specified name.
83+
NewRecorder(name string) EventRecorder
84+
85+
// DeprecatedNewLegacyRecorder creates a legacy Event Recorder with specific name.
86+
DeprecatedNewLegacyRecorder(name string) record.EventRecorder
87+
88+
// Shutdown shuts down the broadcaster.
89+
Shutdown()
90+
}

0 commit comments

Comments
 (0)