From 8baac2ec951eba0669436d382752bfb3a38ff454 Mon Sep 17 00:00:00 2001 From: aimuz Date: Wed, 17 Nov 2021 16:24:26 +0800 Subject: [PATCH] fix Kubectl describe node missing event Kubectl describe node ignores the node events created by the controller https://github.com/kubernetes/kubernetes/issues/106475 --- .../k8s.io/kubectl/pkg/describe/describe.go | 11 ++++- .../kubectl/pkg/describe/describe_test.go | 41 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe.go b/staging/src/k8s.io/kubectl/pkg/describe/describe.go index 2a8277d18b0..d48104faa22 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe.go @@ -3533,8 +3533,17 @@ func (d *NodeDescriber) Describe(namespace, name string, describerSettings Descr klog.Errorf("Unable to construct reference to '%#v': %v", node, err) } else { // TODO: We haven't decided the namespace for Node object yet. - ref.UID = types.UID(ref.Name) + // there are two UIDs for host events: + // controller use node.uid + // kubelet use node.name + // TODO: Uniform use of UID events, _ = searchEvents(d.CoreV1(), ref, describerSettings.ChunkSize) + + ref.UID = types.UID(ref.Name) + eventsInvName, _ := searchEvents(d.CoreV1(), ref, describerSettings.ChunkSize) + + // Merge the results of two queries + events.Items = append(events.Items, eventsInvName.Items...) } } diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go index 63c090718d5..e0974ea65f4 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go @@ -4865,6 +4865,7 @@ func TestDescribeNode(t *testing.T) { &corev1.Node{ ObjectMeta: metav1.ObjectMeta{ Name: "bar", + UID: "uid", }, Spec: corev1.NodeSpec{ Unschedulable: true, @@ -4917,6 +4918,42 @@ func TestDescribeNode(t *testing.T) { Phase: corev1.PodRunning, }, }, + &corev1.EventList{ + Items: []corev1.Event{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "event-1", + Namespace: "default", + }, + InvolvedObject: corev1.ObjectReference{ + Kind: "Node", + Name: "bar", + UID: "bar", + }, + Message: "Node bar status is now: NodeHasNoDiskPressure", + FirstTimestamp: metav1.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + LastTimestamp: metav1.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + Count: 1, + Type: corev1.EventTypeNormal, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "event-2", + Namespace: "default", + }, + InvolvedObject: corev1.ObjectReference{ + Kind: "Node", + Name: "bar", + UID: "0ceac5fb-a393-49d7-b04f-9ea5f18de5e9", + }, + Message: "Node bar status is now: NodeReady", + FirstTimestamp: metav1.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + LastTimestamp: metav1.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), + Count: 2, + Type: corev1.EventTypeNormal, + }, + }, + }, ) c := &describeClient{T: t, Namespace: "foo", Interface: fake} d := NodeDescriber{c} @@ -4934,7 +4971,9 @@ func TestDescribeNode(t *testing.T) { memory 1Gi (8%) 2Gi (16%) ephemeral-storage 0 (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) - hugepages-2Mi 512Mi (25%) 512Mi (25%)`} + hugepages-2Mi 512Mi (25%) 512Mi (25%)`, + `Node bar status is now: NodeHasNoDiskPressure`, + `Node bar status is now: NodeReady`} for _, expected := range expectedOut { if !strings.Contains(out, expected) { t.Errorf("expected to find %q in output: %q", expected, out)