Skip to content

Commit 000c2c5

Browse files
committed
check that the recorded event is not nil on refreshExistingEventSeries
Signed-off-by: Yassine TIJANI <[email protected]>
1 parent 5df8781 commit 000c2c5

File tree

3 files changed

+64
-39
lines changed

3 files changed

+64
-39
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ go_test(
4242
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
4343
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
4444
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
45+
"//staging/src/k8s.io/client-go/rest:go_default_library",
4546
"//staging/src/k8s.io/client-go/tools/reference:go_default_library",
4647
],
4748
)

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ func (e *eventBroadcasterImpl) refreshExistingEventSeries() {
111111
for isomorphicKey, event := range e.eventCache {
112112
if event.Series != nil {
113113
if recordedEvent, retry := recordEvent(e.sink, event); !retry {
114-
e.eventCache[isomorphicKey] = recordedEvent
114+
if recordedEvent != nil {
115+
e.eventCache[isomorphicKey] = recordedEvent
116+
}
115117
}
116118
}
117119
}

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

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
k8sruntime "k8s.io/apimachinery/pkg/runtime"
3131
"k8s.io/apimachinery/pkg/util/wait"
3232
"k8s.io/client-go/kubernetes/scheme"
33+
restclient "k8s.io/client-go/rest"
3334
ref "k8s.io/client-go/tools/reference"
3435
)
3536

@@ -299,51 +300,72 @@ func TestRefreshExistingEventSeries(t *testing.T) {
299300
t.Fatal(err)
300301
}
301302
LastObservedTime := metav1.MicroTime{Time: time.Now().Add(-9 * time.Minute)}
302-
303303
createEvent := make(chan *v1beta1.Event, 10)
304304
updateEvent := make(chan *v1beta1.Event, 10)
305305
patchEvent := make(chan *v1beta1.Event, 10)
306-
testEvents := testEventSeriesSink{
307-
OnCreate: func(event *v1beta1.Event) (*v1beta1.Event, error) {
308-
createEvent <- event
309-
return event, nil
310-
},
311-
OnUpdate: func(event *v1beta1.Event) (*v1beta1.Event, error) {
312-
updateEvent <- event
313-
return event, nil
306+
307+
table := []struct {
308+
patchFunc func(event *v1beta1.Event, patch []byte) (*v1beta1.Event, error)
309+
}{
310+
{
311+
patchFunc: func(event *v1beta1.Event, patch []byte) (*v1beta1.Event, error) {
312+
// event we receive is already patched, usually the sink uses it
313+
//only to retrieve the name and namespace, here we'll use it directly.
314+
patchEvent <- event
315+
return event, nil
316+
},
314317
},
315-
OnPatch: func(event *v1beta1.Event, patch []byte) (*v1beta1.Event, error) {
316-
// event we receive is already patched, usually the sink uses it
317-
//only to retrieve the name and namespace, here we'll use it directly.
318-
patchEvent <- event
319-
return event, nil
318+
{
319+
patchFunc: func(event *v1beta1.Event, patch []byte) (*v1beta1.Event, error) {
320+
// we simulate an apiserver error here
321+
patchEvent <- nil
322+
return nil, &restclient.RequestConstructionError{}
323+
},
320324
},
321325
}
322-
cache := map[eventKey]*v1beta1.Event{}
323-
eventBroadcaster := newBroadcaster(&testEvents, 0, cache).(*eventBroadcasterImpl)
324-
recorder := eventBroadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-foo").(*recorderImpl)
325-
cachedEvent := recorder.makeEvent(regarding, related, metav1.MicroTime{time.Now()}, v1.EventTypeNormal, "test", "some verbose message: 1", "eventTest", "eventTest-"+hostname, "started")
326-
cachedEvent.Series = &v1beta1.EventSeries{
327-
Count: 10,
328-
LastObservedTime: LastObservedTime,
329-
}
330-
cacheKey := getKey(cachedEvent)
331-
cache[cacheKey] = cachedEvent
332-
333-
eventBroadcaster.refreshExistingEventSeries()
334-
select {
335-
case <-patchEvent:
336-
t.Logf("validating event affected by patch request")
337-
eventBroadcaster.mu.Lock()
338-
defer eventBroadcaster.mu.Unlock()
339-
if len(cache) != 1 {
340-
t.Errorf("cache should be with same size, but instead got a size of %v", len(cache))
326+
for _, item := range table {
327+
testEvents := testEventSeriesSink{
328+
OnCreate: func(event *v1beta1.Event) (*v1beta1.Event, error) {
329+
createEvent <- event
330+
return event, nil
331+
},
332+
OnUpdate: func(event *v1beta1.Event) (*v1beta1.Event, error) {
333+
updateEvent <- event
334+
return event, nil
335+
},
336+
OnPatch: item.patchFunc,
341337
}
342-
// check that we emitted only one event
343-
if len(patchEvent) != 0 || len(createEvent) != 0 || len(updateEvent) != 0 {
344-
t.Errorf("exactly one event should be emitted, but got %v", len(patchEvent))
338+
cache := map[eventKey]*v1beta1.Event{}
339+
eventBroadcaster := newBroadcaster(&testEvents, 0, cache).(*eventBroadcasterImpl)
340+
recorder := eventBroadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-foo").(*recorderImpl)
341+
cachedEvent := recorder.makeEvent(regarding, related, metav1.MicroTime{time.Now()}, v1.EventTypeNormal, "test", "some verbose message: 1", "eventTest", "eventTest-"+hostname, "started")
342+
cachedEvent.Series = &v1beta1.EventSeries{
343+
Count: 10,
344+
LastObservedTime: LastObservedTime,
345+
}
346+
cacheKey := getKey(cachedEvent)
347+
cache[cacheKey] = cachedEvent
348+
349+
eventBroadcaster.refreshExistingEventSeries()
350+
select {
351+
case <-patchEvent:
352+
t.Logf("validating event affected by patch request")
353+
eventBroadcaster.mu.Lock()
354+
defer eventBroadcaster.mu.Unlock()
355+
if len(cache) != 1 {
356+
t.Errorf("cache should be with same size, but instead got a size of %v", len(cache))
357+
}
358+
// check that we emitted only one event
359+
if len(patchEvent) != 0 || len(createEvent) != 0 || len(updateEvent) != 0 {
360+
t.Errorf("exactly one event should be emitted, but got %v", len(patchEvent))
361+
}
362+
cacheEvent, exists := cache[cacheKey]
363+
364+
if cacheEvent == nil || !exists {
365+
t.Errorf("expected event to exist and not being nil, but instead event: %v and exists: %v", cacheEvent, exists)
366+
}
367+
case <-time.After(wait.ForeverTestTimeout):
368+
t.Fatalf("timeout after %v", wait.ForeverTestTimeout)
345369
}
346-
case <-time.After(wait.ForeverTestTimeout):
347-
t.Fatalf("timeout after %v", wait.ForeverTestTimeout)
348370
}
349371
}

0 commit comments

Comments
 (0)