1
16
17 package events
18
19 import (
20 "io"
21 "net/http"
22 "testing"
23 "time"
24
25 corev1 "k8s.io/api/core/v1"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 "k8s.io/apimachinery/pkg/runtime"
28 "k8s.io/cli-runtime/pkg/genericiooptions"
29 "k8s.io/client-go/kubernetes"
30 "k8s.io/client-go/kubernetes/scheme"
31 restclient "k8s.io/client-go/rest"
32 "k8s.io/client-go/rest/fake"
33 cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
34 )
35
36 func getFakeEvents() *corev1.EventList {
37 return &corev1.EventList{
38 Items: []corev1.Event{
39 {
40 ObjectMeta: metav1.ObjectMeta{
41 Name: "bar-000",
42 Namespace: "foo",
43 },
44 InvolvedObject: corev1.ObjectReference{
45 APIVersion: "apps/v1",
46 Kind: "Deployment",
47 Name: "bar",
48 Namespace: "foo",
49 UID: "00000000-0000-0000-0000-000000000001",
50 },
51 Type: corev1.EventTypeNormal,
52 Reason: "ScalingReplicaSet",
53 Message: "Scaled up replica set bar-002 to 1",
54 ReportingController: "deployment-controller",
55 EventTime: metav1.NewMicroTime(time.Now().Add(-30 * time.Minute)),
56 Series: &corev1.EventSeries{
57 Count: 3,
58 LastObservedTime: metav1.NewMicroTime(time.Now().Add(-20 * time.Minute)),
59 },
60 },
61 {
62 ObjectMeta: metav1.ObjectMeta{
63 Name: "bar-001",
64 Namespace: "foo",
65 },
66 InvolvedObject: corev1.ObjectReference{
67 APIVersion: "apps/v1",
68 Kind: "Deployment",
69 Name: "bar",
70 Namespace: "foo",
71 UID: "00000000-0000-0000-0000-000000000001",
72 },
73 Type: corev1.EventTypeWarning,
74 Reason: "ScalingReplicaSet",
75 Message: "Scaled up replica set bar-002 to 1",
76 ReportingController: "deployment-controller",
77 EventTime: metav1.NewMicroTime(time.Now().Add(-28 * time.Minute)),
78 Series: &corev1.EventSeries{
79 Count: 3,
80 LastObservedTime: metav1.NewMicroTime(time.Now().Add(-18 * time.Minute)),
81 },
82 },
83 {
84 ObjectMeta: metav1.ObjectMeta{
85 Name: "bar-002",
86 Namespace: "otherfoo",
87 },
88 InvolvedObject: corev1.ObjectReference{
89 APIVersion: "apps/v1",
90 Kind: "Deployment",
91 Name: "bar",
92 Namespace: "otherfoo",
93 UID: "00000000-0000-0000-0000-000000000001",
94 },
95 Type: corev1.EventTypeNormal,
96 Reason: "ScalingReplicaSet",
97 Message: "Scaled up replica set bar-002 to 1",
98 ReportingController: "deployment-controller",
99 EventTime: metav1.NewMicroTime(time.Now().Add(-25 * time.Minute)),
100 Series: &corev1.EventSeries{
101 Count: 3,
102 LastObservedTime: metav1.NewMicroTime(time.Now().Add(-15 * time.Minute)),
103 },
104 },
105 },
106 }
107 }
108
109 func TestEventIsSorted(t *testing.T) {
110 codec := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...)
111 streams, _, buf, _ := genericiooptions.NewTestIOStreams()
112 clientset, err := kubernetes.NewForConfig(cmdtesting.DefaultClientConfig())
113 if err != nil {
114 t.Fatal(err)
115 }
116
117 clientset.CoreV1().RESTClient().(*restclient.RESTClient).Client = fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
118 return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, getFakeEvents())}, nil
119 })
120
121 printer := NewEventPrinter(false, true)
122
123 options := &EventsOptions{
124 AllNamespaces: true,
125 client: clientset,
126 PrintObj: func(object runtime.Object, writer io.Writer) error {
127 return printer.PrintObj(object, writer)
128 },
129 IOStreams: streams,
130 }
131
132 err = options.Run()
133 if err != nil {
134 t.Fatal(err)
135 }
136
137 expected := `NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
138 foo 20m (x3 over 30m) Normal ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
139 foo 18m (x3 over 28m) Warning ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
140 otherfoo 15m (x3 over 25m) Normal ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
141 `
142 if e, a := expected, buf.String(); e != a {
143 t.Errorf("expected\n%v\ngot\n%v", e, a)
144 }
145 }
146
147 func TestEventNoHeaders(t *testing.T) {
148 codec := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...)
149 streams, _, buf, _ := genericiooptions.NewTestIOStreams()
150 clientset, err := kubernetes.NewForConfig(cmdtesting.DefaultClientConfig())
151 if err != nil {
152 t.Fatal(err)
153 }
154
155 clientset.CoreV1().RESTClient().(*restclient.RESTClient).Client = fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
156 return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, getFakeEvents())}, nil
157 })
158
159 printer := NewEventPrinter(true, true)
160
161 options := &EventsOptions{
162 AllNamespaces: true,
163 client: clientset,
164 PrintObj: func(object runtime.Object, writer io.Writer) error {
165 return printer.PrintObj(object, writer)
166 },
167 IOStreams: streams,
168 }
169
170 err = options.Run()
171 if err != nil {
172 t.Fatal(err)
173 }
174
175 expected := `foo 20m (x3 over 30m) Normal ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
176 foo 18m (x3 over 28m) Warning ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
177 otherfoo 15m (x3 over 25m) Normal ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
178 `
179 if e, a := expected, buf.String(); e != a {
180 t.Errorf("expected\n%v\ngot\n%v", e, a)
181 }
182 }
183
184 func TestEventFiltered(t *testing.T) {
185 codec := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...)
186 streams, _, buf, _ := genericiooptions.NewTestIOStreams()
187 clientset, err := kubernetes.NewForConfig(cmdtesting.DefaultClientConfig())
188 if err != nil {
189 t.Fatal(err)
190 }
191
192 clientset.CoreV1().RESTClient().(*restclient.RESTClient).Client = fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
193 return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, getFakeEvents())}, nil
194 })
195
196 printer := NewEventPrinter(false, true)
197
198 options := &EventsOptions{
199 AllNamespaces: true,
200 client: clientset,
201 FilterTypes: []string{"WARNING"},
202 PrintObj: func(object runtime.Object, writer io.Writer) error {
203 return printer.PrintObj(object, writer)
204 },
205 IOStreams: streams,
206 }
207
208 err = options.Run()
209 if err != nil {
210 t.Fatal(err)
211 }
212
213 expected := `NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
214 foo 18m (x3 over 28m) Warning ScalingReplicaSet Deployment/bar Scaled up replica set bar-002 to 1
215 `
216 if e, a := expected, buf.String(); e != a {
217 t.Errorf("expected\n%v\ngot\n%v", e, a)
218 }
219 }
220
View as plain text