From ceb8c2fbf41c128017c959807484cc4935acd8ba Mon Sep 17 00:00:00 2001 From: Damien Grisonnet Date: Fri, 26 Jun 2020 10:12:45 +0200 Subject: [PATCH] Fix v1beta1 events printing in kubectl printers: handle series when printing events printers: handle singleton when printing events Signed-off-by: Damien Grisonnet --- pkg/printers/internalversion/printers.go | 16 +++++- pkg/printers/internalversion/printers_test.go | 56 +++++++++++++++++-- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index ac58d853bbb..1315033f8e6 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -1673,11 +1673,25 @@ func printEvent(obj *api.Event, options printers.GenerateOptions) ([]metav1.Tabl if obj.FirstTimestamp.IsZero() { firstTimestamp = translateMicroTimestampSince(obj.EventTime) } + lastTimestamp := translateTimestampSince(obj.LastTimestamp) if obj.LastTimestamp.IsZero() { lastTimestamp = firstTimestamp } + count := obj.Count + if obj.Series != nil { + lastTimestamp = translateMicroTimestampSince(obj.Series.LastObservedTime) + // When a series is created for the first time, its count is set to 1. + // However, for a series to be created, there needs to be an isomorphic + // singleton event created beforehand. This singleton event is not + // counted in the series count which is why one is added here. + count = obj.Series.Count + 1 + } else if count == 0 { + // Singleton events don't have a count set in the new API. + count = 1 + } + var target string if len(obj.InvolvedObject.Name) > 0 { target = fmt.Sprintf("%s/%s", strings.ToLower(obj.InvolvedObject.Kind), obj.InvolvedObject.Name) @@ -1694,7 +1708,7 @@ func printEvent(obj *api.Event, options printers.GenerateOptions) ([]metav1.Tabl formatEventSource(obj.Source), strings.TrimSpace(obj.Message), firstTimestamp, - int64(obj.Count), + int64(count), obj.Name, ) } else { diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 758b30471bf..31ab7852608 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -178,11 +178,11 @@ func TestPrintEvent(t *testing.T) { FirstTimestamp: metav1.Time{Time: time.Now().UTC().AddDate(0, 0, -3)}, Count: 1, Type: api.EventTypeWarning, - ObjectMeta: metav1.ObjectMeta{Name: "event3"}, + ObjectMeta: metav1.ObjectMeta{Name: "event4"}, }, options: printers.GenerateOptions{Wide: true}, // Columns: Last Seen, Type, Reason, Object, Subobject, Message, First Seen, Count, Name - expected: []metav1.TableRow{{Cells: []interface{}{"3d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(1), "event3"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"3d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(1), "event4"}}}, }, // Basic event, w/o FirstTimestamp and LastTimestamp set { @@ -201,11 +201,59 @@ func TestPrintEvent(t *testing.T) { EventTime: metav1.MicroTime{Time: time.Now().UTC().AddDate(0, 0, -3)}, Count: 1, Type: api.EventTypeWarning, - ObjectMeta: metav1.ObjectMeta{Name: "event3"}, + ObjectMeta: metav1.ObjectMeta{Name: "event5"}, }, options: printers.GenerateOptions{Wide: true}, // Columns: Last Seen, Type, Reason, Object, Subobject, Message, First Seen, Count, Name - expected: []metav1.TableRow{{Cells: []interface{}{"3d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(1), "event3"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"3d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(1), "event5"}}}, + }, + // Basic event serie, w/o FirstTimestamp, LastTimestamp and Count set + { + event: api.Event{ + Source: api.EventSource{ + Component: "kubelet", + Host: "Node1", + }, + InvolvedObject: api.ObjectReference{ + Kind: "Deployment", + Name: "Deployment Name", + FieldPath: "spec.containers{foo}", + }, + Series: &api.EventSeries{ + Count: 1, + LastObservedTime: metav1.MicroTime{Time: time.Now().UTC().AddDate(0, 0, -2)}, + }, + Reason: "Event Reason", + Message: "Message Data", + EventTime: metav1.MicroTime{Time: time.Now().UTC().AddDate(0, 0, -3)}, + Type: api.EventTypeWarning, + ObjectMeta: metav1.ObjectMeta{Name: "event6"}, + }, + options: printers.GenerateOptions{Wide: true}, + // Columns: Last Seen, Type, Reason, Object, Subobject, Message, First Seen, Count, Name + expected: []metav1.TableRow{{Cells: []interface{}{"2d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(2), "event6"}}}, + }, + // Singleton event, w/o FirstTimestamp, LastTimestamp and Count set + { + event: api.Event{ + Source: api.EventSource{ + Component: "kubelet", + Host: "Node1", + }, + InvolvedObject: api.ObjectReference{ + Kind: "Deployment", + Name: "Deployment Name", + FieldPath: "spec.containers{foo}", + }, + Reason: "Event Reason", + Message: "Message Data", + EventTime: metav1.MicroTime{Time: time.Now().UTC().AddDate(0, 0, -3)}, + Type: api.EventTypeWarning, + ObjectMeta: metav1.ObjectMeta{Name: "event7"}, + }, + options: printers.GenerateOptions{Wide: true}, + // Columns: Last Seen, Type, Reason, Object, Subobject, Message, First Seen, Count, Name + expected: []metav1.TableRow{{Cells: []interface{}{"3d", "Warning", "Event Reason", "deployment/Deployment Name", "spec.containers{foo}", "kubelet, Node1", "Message Data", "3d", int64(1), "event7"}}}, }, }