diff --git a/staging/src/k8s.io/client-go/tools/events/event_broadcaster.go b/staging/src/k8s.io/client-go/tools/events/event_broadcaster.go index 9f18ce45db1..e3000bf6ec1 100644 --- a/staging/src/k8s.io/client-go/tools/events/event_broadcaster.go +++ b/staging/src/k8s.io/client-go/tools/events/event_broadcaster.go @@ -183,7 +183,7 @@ func (e *eventBroadcasterImpl) recordToSink(event *eventsv1.Event, clock clock.C return nil } isomorphicEvent.Series = &eventsv1.EventSeries{ - Count: 1, + Count: 2, LastObservedTime: metav1.MicroTime{Time: clock.Now()}, } // Make a copy of the Event to make sure that recording it diff --git a/staging/src/k8s.io/client-go/tools/events/eventseries_test.go b/staging/src/k8s.io/client-go/tools/events/eventseries_test.go index 401865f88f5..2b9be92a69e 100644 --- a/staging/src/k8s.io/client-go/tools/events/eventseries_test.go +++ b/staging/src/k8s.io/client-go/tools/events/eventseries_test.go @@ -108,7 +108,7 @@ func TestEventSeriesf(t *testing.T) { nonIsomorphicEvent := expectedEvent.DeepCopy() nonIsomorphicEvent.Action = "stopped" - expectedEvent.Series = &eventsv1.EventSeries{Count: 1} + expectedEvent.Series = &eventsv1.EventSeries{Count: 2} table := []struct { regarding k8sruntime.Object related k8sruntime.Object diff --git a/test/integration/events/events_test.go b/test/integration/events/events_test.go index 9a6f3c18f11..904d1ac047e 100644 --- a/test/integration/events/events_test.go +++ b/test/integration/events/events_test.go @@ -18,6 +18,7 @@ package events import ( "context" + "fmt" "testing" "time" @@ -96,3 +97,62 @@ func TestEventCompatibility(t *testing.T) { t.Fatalf("unexpected err: %v", err) } } + +func TestEventSeries(t *testing.T) { + result := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins", "ServiceAccount"}, framework.SharedEtcd()) + defer result.TearDownFn() + + client := clientset.NewForConfigOrDie(result.ClientConfig) + + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + UID: "bar", + }, + } + + regarding, err := ref.GetReference(scheme.Scheme, testPod) + if err != nil { + t.Fatal(err) + } + + related, err := ref.GetPartialReference(scheme.Scheme, testPod, ".spec.containers[0]") + if err != nil { + t.Fatal(err) + } + + stopCh := make(chan struct{}) + defer close(stopCh) + + broadcaster := events.NewBroadcaster(&events.EventSinkImpl{Interface: client.EventsV1()}) + defer broadcaster.Shutdown() + recorder := broadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-scheduler") + broadcaster.StartRecordingToSink(stopCh) + recorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure") + recorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure") + err = wait.PollImmediate(100*time.Millisecond, 20*time.Second, func() (done bool, err error) { + events, err := client.EventsV1().Events("").List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return false, err + } + + if len(events.Items) != 1 { + return false, nil + } + + if events.Items[0].Series == nil { + return false, nil + } + + if events.Items[0].Series.Count != 2 { + return false, fmt.Errorf("expected EventSeries to have a starting count of 2, got: %d", events.Items[0].Series.Count) + } + + return true, nil + }) + if err != nil { + t.Fatalf("error waiting for an Event with a non nil Series to be created: %v", err) + } + +}