@@ -23,17 +23,16 @@ import (
23
23
"sync"
24
24
25
25
"github.com/go-logr/logr"
26
- corev1 "k8s.io/api/core/v1"
27
26
"k8s.io/apimachinery/pkg/runtime"
28
- corev1client "k8s.io/client-go/kubernetes/typed/core /v1"
27
+ eventsv1client "k8s.io/client-go/kubernetes/typed/events /v1"
29
28
"k8s.io/client-go/rest"
30
- "k8s.io/client-go/tools/record "
29
+ "k8s.io/client-go/tools/events "
31
30
)
32
31
33
32
// EventBroadcasterProducer makes an event broadcaster, returning
34
33
// whether or not the broadcaster should be stopped with the Provider,
35
34
// or not (e.g. if it's shared, it shouldn't be stopped with the Provider).
36
- type EventBroadcasterProducer func () (caster record .EventBroadcaster , stopWithProvider bool )
35
+ type EventBroadcasterProducer func () (caster events .EventBroadcaster , stopWithProvider bool )
37
36
38
37
// Provider is a recorder.Provider that records events to the k8s API server
39
38
// and to a logr Logger.
@@ -45,11 +44,11 @@ type Provider struct {
45
44
scheme * runtime.Scheme
46
45
// logger is the logger to use when logging diagnostic event info
47
46
logger logr.Logger
48
- evtClient corev1client. EventInterface
47
+ evtClient eventsv1client. EventsV1Interface
49
48
makeBroadcaster EventBroadcasterProducer
50
49
51
50
broadcasterOnce sync.Once
52
- broadcaster record .EventBroadcaster
51
+ broadcaster events .EventBroadcaster
53
52
stopBroadcaster bool
54
53
}
55
54
@@ -89,45 +88,48 @@ func (p *Provider) Stop(shutdownCtx context.Context) {
89
88
90
89
// getBroadcaster ensures that a broadcaster is started for this
91
90
// provider, and returns it. It's threadsafe.
92
- func (p * Provider ) getBroadcaster () record .EventBroadcaster {
91
+ func (p * Provider ) getBroadcaster () events .EventBroadcaster {
93
92
// NB(directxman12): this can technically still leak if something calls
94
93
// "getBroadcaster" (i.e. Emits an Event) but never calls Start, but if we
95
94
// create the broadcaster in start, we could race with other things that
96
95
// are started at the same time & want to emit events. The alternative is
97
96
// silently swallowing events and more locking, but that seems suboptimal.
98
97
99
98
p .broadcasterOnce .Do (func () {
100
- broadcaster , stop := p .makeBroadcaster ()
101
- broadcaster .StartRecordingToSink (& corev1client.EventSinkImpl {Interface : p .evtClient })
102
- broadcaster .StartEventWatcher (
103
- func (e * corev1.Event ) {
99
+ if p .broadcaster == nil {
100
+ p .broadcaster = events .NewBroadcaster (& events.EventSinkImpl {Interface : p .evtClient })
101
+ }
102
+ // TODO(clebs): figure out how to manage the context/channel that StartRecordingToSink needs inside the provider.
103
+ p .broadcaster .StartRecordingToSink (nil )
104
+
105
+ // TODO(clebs): figure out if we still need this and how the change would make sense.
106
+ p .broadcaster .StartEventWatcher (
107
+ func (e runtime.Object ) {
104
108
p .logger .V (1 ).Info (e .Message , "type" , e .Type , "object" , e .InvolvedObject , "reason" , e .Reason )
105
109
})
106
- p .broadcaster = broadcaster
107
- p .stopBroadcaster = stop
108
110
})
109
111
110
112
return p .broadcaster
111
113
}
112
114
113
115
// NewProvider create a new Provider instance.
114
- func NewProvider (config * rest.Config , httpClient * http.Client , scheme * runtime.Scheme , logger logr.Logger , makeBroadcaster EventBroadcasterProducer ) (* Provider , error ) {
116
+ func NewProvider (config * rest.Config , httpClient * http.Client , scheme * runtime.Scheme , logger logr.Logger , broadcaster events. EventBroadcaster , stopWithProvider bool ) (* Provider , error ) {
115
117
if httpClient == nil {
116
118
panic ("httpClient must not be nil" )
117
119
}
118
120
119
- corev1Client , err := corev1client .NewForConfigAndClient (config , httpClient )
121
+ eventsv1Client , err := eventsv1client .NewForConfigAndClient (config , httpClient )
120
122
if err != nil {
121
123
return nil , fmt .Errorf ("failed to init client: %w" , err )
122
124
}
123
125
124
- p := & Provider {scheme : scheme , logger : logger , makeBroadcaster : makeBroadcaster , evtClient : corev1Client . Events ( "" ) }
126
+ p := & Provider {scheme : scheme , logger : logger , broadcaster : broadcaster , stopBroadcaster : stopWithProvider , evtClient : eventsv1Client }
125
127
return p , nil
126
128
}
127
129
128
- // GetEventRecorderFor returns an event recorder that broadcasts to this provider's
130
+ // GetEventRecorder returns an event recorder that broadcasts to this provider's
129
131
// broadcaster. All events will be associated with a component of the given name.
130
- func (p * Provider ) GetEventRecorderFor (name string ) record .EventRecorder {
132
+ func (p * Provider ) GetEventRecorder (name string ) events .EventRecorder {
131
133
return & lazyRecorder {
132
134
prov : p ,
133
135
name : name ,
@@ -141,41 +143,23 @@ type lazyRecorder struct {
141
143
name string
142
144
143
145
recOnce sync.Once
144
- rec record .EventRecorder
146
+ rec events .EventRecorder
145
147
}
146
148
147
149
// ensureRecording ensures that a concrete recorder is populated for this recorder.
148
150
func (l * lazyRecorder ) ensureRecording () {
149
151
l .recOnce .Do (func () {
150
152
broadcaster := l .prov .getBroadcaster ()
151
- l .rec = broadcaster .NewRecorder (l .prov .scheme , corev1. EventSource { Component : l .name } )
153
+ l .rec = broadcaster .NewRecorder (l .prov .scheme , l .name )
152
154
})
153
155
}
154
156
155
- func (l * lazyRecorder ) Event (object runtime.Object , eventtype , reason , message string ) {
156
- l .ensureRecording ()
157
-
158
- l .prov .lock .RLock ()
159
- if ! l .prov .stopped {
160
- l .rec .Event (object , eventtype , reason , message )
161
- }
162
- l .prov .lock .RUnlock ()
163
- }
164
- func (l * lazyRecorder ) Eventf (object runtime.Object , eventtype , reason , messageFmt string , args ... interface {}) {
165
- l .ensureRecording ()
166
-
167
- l .prov .lock .RLock ()
168
- if ! l .prov .stopped {
169
- l .rec .Eventf (object , eventtype , reason , messageFmt , args ... )
170
- }
171
- l .prov .lock .RUnlock ()
172
- }
173
- func (l * lazyRecorder ) AnnotatedEventf (object runtime.Object , annotations map [string ]string , eventtype , reason , messageFmt string , args ... interface {}) {
157
+ func (l * lazyRecorder ) Eventf (regarding runtime.Object , related runtime.Object , eventtype , reason , action , note string , args ... interface {}) {
174
158
l .ensureRecording ()
175
159
176
160
l .prov .lock .RLock ()
177
161
if ! l .prov .stopped {
178
- l .rec .AnnotatedEventf ( object , annotations , eventtype , reason , messageFmt , args ... )
162
+ l .rec .Eventf ( regarding , related , eventtype , reason , action , note , args ... )
179
163
}
180
164
l .prov .lock .RUnlock ()
181
165
}
0 commit comments