diff --git a/go.mod b/go.mod index 42133bd6b..a4307600e 100644 --- a/go.mod +++ b/go.mod @@ -31,10 +31,10 @@ require ( github.com/stretchr/testify v1.7.0 golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.0.0-20210910033053-f745d22351a7 + k8s.io/api v0.0.0-20210913233208-5c8efac7a372 k8s.io/apimachinery v0.0.0-20210910032850-71bf7ba06cd4 - k8s.io/cli-runtime v0.0.0-20210909235447-7c51b598b842 - k8s.io/client-go v0.0.0-20210910114230-9026029b9a9b + k8s.io/cli-runtime v0.0.0-20210910202839-27e21c984482 + k8s.io/client-go v0.0.0-20210913233538-29730ab4f5aa k8s.io/component-base v0.0.0-20210909233903-eae60e423670 k8s.io/component-helpers v0.0.0-20210909234013-3b406f5c0560 k8s.io/klog/v2 v2.20.0 @@ -47,10 +47,10 @@ require ( ) replace ( - k8s.io/api => k8s.io/api v0.0.0-20210910033053-f745d22351a7 + k8s.io/api => k8s.io/api v0.0.0-20210913233208-5c8efac7a372 k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210910032850-71bf7ba06cd4 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20210909235447-7c51b598b842 - k8s.io/client-go => k8s.io/client-go v0.0.0-20210910114230-9026029b9a9b + k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20210910202839-27e21c984482 + k8s.io/client-go => k8s.io/client-go v0.0.0-20210913233538-29730ab4f5aa k8s.io/code-generator => k8s.io/code-generator v0.0.0-20210910032656-cefb511e9417 k8s.io/component-base => k8s.io/component-base v0.0.0-20210909233903-eae60e423670 k8s.io/component-helpers => k8s.io/component-helpers v0.0.0-20210909234013-3b406f5c0560 diff --git a/go.sum b/go.sum index b9e761afa..3497621a5 100644 --- a/go.sum +++ b/go.sum @@ -900,14 +900,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.0.0-20210910033053-f745d22351a7 h1:ZO1tBSKR6YKwn6ZMmnrcY1aaJtFyWPHRm0OINamcsX4= -k8s.io/api v0.0.0-20210910033053-f745d22351a7/go.mod h1:sQuJwpcAhgOCSGReco17GgtkSflhybK6puoB8WhPIzg= +k8s.io/api v0.0.0-20210913233208-5c8efac7a372 h1:JzwsOgwSlkfdNB3Cl/AkYoGr8rEgDASJtuWTRF5mrXQ= +k8s.io/api v0.0.0-20210913233208-5c8efac7a372/go.mod h1:sQuJwpcAhgOCSGReco17GgtkSflhybK6puoB8WhPIzg= k8s.io/apimachinery v0.0.0-20210910032850-71bf7ba06cd4 h1:ST56tx94/5d19mi/fkKMHIm+Q3o1M6YMChuDA4Br4ho= k8s.io/apimachinery v0.0.0-20210910032850-71bf7ba06cd4/go.mod h1:ZPgmwNP53+C5GcWxpp1Nk2UcdC35zmuEjgRliNyZqgw= -k8s.io/cli-runtime v0.0.0-20210909235447-7c51b598b842 h1:iGLUCbhGWkfottQ3u43bT8bZsscDxCwLYJTUVez3Zjs= -k8s.io/cli-runtime v0.0.0-20210909235447-7c51b598b842/go.mod h1:Hh5+c+fVi62IfTy8tMmxSuq8Ny6pLW3DAeGqg0Bad2o= -k8s.io/client-go v0.0.0-20210910114230-9026029b9a9b h1:GXBby62fSVme/q4JrEwO4qGteHUCVHGQUjVkRiVS9aA= -k8s.io/client-go v0.0.0-20210910114230-9026029b9a9b/go.mod h1:vUi6b26+Y/8jilD6zK66eZexCW+hwnjHSsYYZAO/iqE= +k8s.io/cli-runtime v0.0.0-20210910202839-27e21c984482 h1:iODIArPHSXHCYDl+vjvDNEE+5xcC2UPpYjbw5EsRGOw= +k8s.io/cli-runtime v0.0.0-20210910202839-27e21c984482/go.mod h1:9YtXNNrQl0s1OjkfypqtFYoGbM5wobgFIjNQ9MeQxxY= +k8s.io/client-go v0.0.0-20210913233538-29730ab4f5aa h1:svFLtujJNvMveDcJq68jx1wWWrohNgg5nBnwNGyymOU= +k8s.io/client-go v0.0.0-20210913233538-29730ab4f5aa/go.mod h1:C+/QdDoft+q738Z6s8Coyy3F0YEZqTfAbQ59vwIf+LM= k8s.io/code-generator v0.0.0-20210910032656-cefb511e9417/go.mod h1:7e+hwbxwCTSDTAarEUgfWyobZsUnHWWlYarT2jgNiNM= k8s.io/component-base v0.0.0-20210909233903-eae60e423670 h1:Q9PMSBver8seWekbtkqcKrrjncscm1AYjWoBl6+/bdA= k8s.io/component-base v0.0.0-20210909233903-eae60e423670/go.mod h1:k++RedPnodUZvaB0SFPAdAljhOmueulpyr9wDkx1M+A= diff --git a/pkg/describe/describe.go b/pkg/describe/describe.go index 038a7d37b..d7901926c 100644 --- a/pkg/describe/describe.go +++ b/pkg/describe/describe.go @@ -4140,13 +4140,16 @@ func DescribeEvents(el *corev1.EventList, w PrefixWriter) { w.Write(LEVEL_1, "----\t------\t----\t----\t-------\n") for _, e := range el.Items { var interval string - if e.Count > 1 { - interval = fmt.Sprintf("%s (x%d over %s)", translateTimestampSince(e.LastTimestamp), e.Count, translateTimestampSince(e.FirstTimestamp)) + firstTimestampSince := translateMicroTimestampSince(e.EventTime) + if e.EventTime.IsZero() { + firstTimestampSince = translateTimestampSince(e.FirstTimestamp) + } + if e.Series != nil { + interval = fmt.Sprintf("%s (x%d over %s)", translateMicroTimestampSince(e.Series.LastObservedTime), e.Series.Count, firstTimestampSince) + } else if e.Count > 1 { + interval = fmt.Sprintf("%s (x%d over %s)", translateTimestampSince(e.LastTimestamp), e.Count, firstTimestampSince) } else { - interval = translateTimestampSince(e.FirstTimestamp) - if e.FirstTimestamp.IsZero() { - interval = translateMicroTimestampSince(e.EventTime) - } + interval = firstTimestampSince } source := e.Source.Component if source == "" { diff --git a/pkg/describe/describe_test.go b/pkg/describe/describe_test.go index 468bdc512..97b08a411 100644 --- a/pkg/describe/describe_test.go +++ b/pkg/describe/describe_test.go @@ -2004,6 +2004,27 @@ func TestDescribeDeployment(t *testing.T) { ReadyReplicas: 0, AvailableReplicas: 1, }, + }, &corev1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "bar-000", + Namespace: "foo", + }, + InvolvedObject: corev1.ObjectReference{ + APIVersion: "apps/v1", + Kind: "Deployment", + Name: "bar", + Namespace: "foo", + UID: "00000000-0000-0000-0000-000000000001", + }, + Type: corev1.EventTypeNormal, + Reason: "ScalingReplicaSet", + Message: "Scaled up replica set bar-002 to 1", + ReportingController: "deployment-controller", + EventTime: metav1.NewMicroTime(time.Now().Add(-20 * time.Minute)), + Series: &corev1.EventSeries{ + Count: 3, + LastObservedTime: metav1.NewMicroTime(time.Now().Add(-12 * time.Minute)), + }, }, &corev1.Event{ ObjectMeta: metav1.ObjectMeta{ Name: "bar-001", @@ -2042,6 +2063,23 @@ func TestDescribeDeployment(t *testing.T) { Component: "deployment-controller", }, FirstTimestamp: metav1.NewTime(time.Now().Add(-2 * time.Minute)), + }, &corev1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "bar-003", + Namespace: "foo", + }, + InvolvedObject: corev1.ObjectReference{ + APIVersion: "apps/v1", + Kind: "Deployment", + Name: "bar", + Namespace: "foo", + UID: "00000000-0000-0000-0000-000000000001", + }, + Type: corev1.EventTypeNormal, + Reason: "ScalingReplicaSet", + Message: "Scaled down replica set bar-002 to 1", + ReportingController: "deployment-controller", + EventTime: metav1.NewMicroTime(time.Now().Add(-1 * time.Minute)), }, }, expects: []string{ @@ -2050,8 +2088,10 @@ func TestDescribeDeployment(t *testing.T) { "OldReplicaSets: bar-001 (2/2 replicas created)", "NewReplicaSet: bar-002 (1/1 replicas created)", "Events:\n", - "Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set bar-001 to 2", - "Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set bar-002 to 1", + "Normal ScalingReplicaSet 12m (x3 over 20m) deployment-controller Scaled up replica set bar-002 to 1", + "Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set bar-001 to 2", + "Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set bar-002 to 1", + "Normal ScalingReplicaSet 60s deployment-controller Scaled down replica set bar-002 to 1", }, }, } @@ -3694,6 +3734,7 @@ func TestDescribeEvents(t *testing.T) { Items: []corev1.Event{ { ObjectMeta: metav1.ObjectMeta{ + Name: "event-1", Namespace: "foo", }, Source: corev1.EventSource{Component: "kubelet"}, @@ -3703,6 +3744,20 @@ func TestDescribeEvents(t *testing.T) { Count: 1, Type: corev1.EventTypeNormal, }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "event-2", + Namespace: "foo", + }, + Source: corev1.EventSource{Component: "kubelet"}, + Message: "Item 1", + EventTime: metav1.NewMicroTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + Series: &corev1.EventSeries{ + Count: 1, + LastObservedTime: metav1.NewMicroTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + }, + Type: corev1.EventTypeNormal, + }, }, }