1
16
17 package validation
18
19 import (
20 "testing"
21 "time"
22
23 v1 "k8s.io/api/core/v1"
24 eventsv1 "k8s.io/api/events/v1"
25 eventsv1beta1 "k8s.io/api/events/v1beta1"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 "k8s.io/kubernetes/pkg/apis/core"
28 )
29
30 func TestValidateEventForCoreV1Events(t *testing.T) {
31 table := []struct {
32 *core.Event
33 valid bool
34 }{
35 {
36 &core.Event{
37 ObjectMeta: metav1.ObjectMeta{
38 Name: "test1",
39 Namespace: "foo",
40 },
41 InvolvedObject: core.ObjectReference{
42 Namespace: "bar",
43 Kind: "Pod",
44 },
45 },
46 false,
47 }, {
48 &core.Event{
49 ObjectMeta: metav1.ObjectMeta{
50 Name: "test2",
51 Namespace: "aoeu-_-aoeu",
52 },
53 InvolvedObject: core.ObjectReference{
54 Namespace: "aoeu-_-aoeu",
55 Kind: "Pod",
56 },
57 },
58 false,
59 }, {
60 &core.Event{
61 ObjectMeta: metav1.ObjectMeta{
62 Name: "test3",
63 Namespace: metav1.NamespaceDefault,
64 },
65 InvolvedObject: core.ObjectReference{
66 APIVersion: "v1",
67 Kind: "Node",
68 },
69 },
70 true,
71 }, {
72 &core.Event{
73 ObjectMeta: metav1.ObjectMeta{
74 Name: "test4",
75 Namespace: metav1.NamespaceDefault,
76 },
77 InvolvedObject: core.ObjectReference{
78 APIVersion: "v1",
79 Kind: "Namespace",
80 },
81 },
82 true,
83 }, {
84 &core.Event{
85 ObjectMeta: metav1.ObjectMeta{
86 Name: "test5",
87 Namespace: metav1.NamespaceDefault,
88 },
89 InvolvedObject: core.ObjectReference{
90 APIVersion: "apps/v1",
91 Kind: "NoKind",
92 Namespace: metav1.NamespaceDefault,
93 },
94 },
95 true,
96 }, {
97 &core.Event{
98 ObjectMeta: metav1.ObjectMeta{
99 Name: "test6",
100 Namespace: metav1.NamespaceDefault,
101 },
102 InvolvedObject: core.ObjectReference{
103 APIVersion: "batch/v1",
104 Kind: "Job",
105 Namespace: "foo",
106 },
107 },
108 false,
109 }, {
110 &core.Event{
111 ObjectMeta: metav1.ObjectMeta{
112 Name: "test7",
113 Namespace: metav1.NamespaceDefault,
114 },
115 InvolvedObject: core.ObjectReference{
116 APIVersion: "batch/v1",
117 Kind: "Job",
118 Namespace: metav1.NamespaceDefault,
119 },
120 },
121 true,
122 }, {
123 &core.Event{
124 ObjectMeta: metav1.ObjectMeta{
125 Name: "test8",
126 Namespace: metav1.NamespaceDefault,
127 },
128 InvolvedObject: core.ObjectReference{
129 APIVersion: "other/v1beta1",
130 Kind: "Job",
131 Namespace: "foo",
132 },
133 },
134 false,
135 }, {
136 &core.Event{
137 ObjectMeta: metav1.ObjectMeta{
138 Name: "test9",
139 Namespace: "foo",
140 },
141 InvolvedObject: core.ObjectReference{
142 APIVersion: "other/v1beta1",
143 Kind: "Job",
144 Namespace: "foo",
145 },
146 },
147 true,
148 }, {
149 &core.Event{
150 ObjectMeta: metav1.ObjectMeta{
151 Name: "test10",
152 Namespace: metav1.NamespaceDefault,
153 },
154 InvolvedObject: core.ObjectReference{
155 APIVersion: "batch",
156 Kind: "Job",
157 Namespace: "foo",
158 },
159 },
160 false,
161 }, {
162 &core.Event{
163 ObjectMeta: metav1.ObjectMeta{
164 Name: "test11",
165 Namespace: "foo",
166 },
167 InvolvedObject: core.ObjectReference{
168 APIVersion: "batch/v1",
169 Kind: "Job",
170 Namespace: "foo",
171 },
172 },
173 true,
174 },
175 {
176 &core.Event{
177 ObjectMeta: metav1.ObjectMeta{
178 Name: "test12",
179 Namespace: "foo",
180 },
181 InvolvedObject: core.ObjectReference{
182 APIVersion: "other/v1beta1",
183 Kind: "FooBar",
184 Namespace: "bar",
185 },
186 },
187 false,
188 },
189 {
190 &core.Event{
191 ObjectMeta: metav1.ObjectMeta{
192 Name: "test13",
193 Namespace: "",
194 },
195 InvolvedObject: core.ObjectReference{
196 APIVersion: "other/v1beta1",
197 Kind: "FooBar",
198 Namespace: "bar",
199 },
200 },
201 false,
202 },
203 {
204 &core.Event{
205 ObjectMeta: metav1.ObjectMeta{
206 Name: "test14",
207 Namespace: "foo",
208 },
209 InvolvedObject: core.ObjectReference{
210 APIVersion: "other/v1beta1",
211 Kind: "FooBar",
212 Namespace: "",
213 },
214 },
215 false,
216 },
217 }
218
219 for _, item := range table {
220 createErrs := ValidateEventCreate(item.Event, v1.SchemeGroupVersion)
221 if e, a := item.valid, len(createErrs) == 0; e != a {
222 t.Errorf("%v: expected %v, got %v: %v", item.Event.Name, e, a, createErrs)
223 }
224 updateErrs := ValidateEventUpdate(item.Event, &core.Event{}, v1.SchemeGroupVersion)
225 if e, a := item.valid, len(updateErrs) == 0; e != a {
226 t.Errorf("%v: expected %v, got %v: %v", item.Event.Name, e, a, updateErrs)
227 }
228 }
229 }
230
231 func TestValidateEventForNewV1beta1Events(t *testing.T) {
232 someTime := metav1.MicroTime{Time: time.Unix(1505828956, 0)}
233 table := []struct {
234 *core.Event
235 valid bool
236 msg string
237 }{
238 {
239 Event: &core.Event{
240 ObjectMeta: metav1.ObjectMeta{
241 Name: "test",
242 Namespace: metav1.NamespaceDefault,
243 },
244 InvolvedObject: core.ObjectReference{
245 APIVersion: "v1",
246 Kind: "Node",
247 },
248 EventTime: someTime,
249 },
250 valid: false,
251 msg: "Old Event with EventTime should trigger new validation and fail",
252 },
253 {
254 Event: &core.Event{
255 ObjectMeta: metav1.ObjectMeta{
256 Name: "test",
257 Namespace: metav1.NamespaceSystem,
258 },
259 InvolvedObject: core.ObjectReference{
260 APIVersion: "v1",
261 Kind: "Node",
262 },
263 EventTime: someTime,
264 ReportingController: "k8s.io/my-controller",
265 ReportingInstance: "node-xyz",
266 Action: "Do",
267 Reason: "Because",
268 },
269 valid: true,
270 msg: "Valid new Event",
271 },
272 {
273 Event: &core.Event{
274 ObjectMeta: metav1.ObjectMeta{
275 Name: "test",
276 Namespace: metav1.NamespaceSystem,
277 },
278 InvolvedObject: core.ObjectReference{
279 APIVersion: "v1",
280 Kind: "Node",
281 },
282 EventTime: someTime,
283 ReportingController: "my-contr@ller",
284 ReportingInstance: "node-xyz",
285 Action: "Do",
286 Reason: "Because",
287 },
288 valid: false,
289 msg: "not qualified reportingController",
290 },
291 {
292 Event: &core.Event{
293 ObjectMeta: metav1.ObjectMeta{
294 Name: "test",
295 Namespace: metav1.NamespaceSystem,
296 },
297 InvolvedObject: core.ObjectReference{
298 APIVersion: "v1",
299 Kind: "Node",
300 },
301 EventTime: someTime,
302 ReportingController: "k8s.io/my-controller",
303 ReportingInstance: "node-xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
304 Action: "Do",
305 Reason: "Because",
306 },
307 valid: false,
308 msg: "too long reporting instance",
309 },
310 {
311 Event: &core.Event{
312 ObjectMeta: metav1.ObjectMeta{
313 Name: "test",
314 Namespace: metav1.NamespaceSystem,
315 },
316 InvolvedObject: core.ObjectReference{
317 APIVersion: "v1",
318 Kind: "Node",
319 },
320 EventTime: someTime,
321 ReportingController: "k8s.io/my-controller",
322 ReportingInstance: "node-xyz",
323 Action: "Do",
324 },
325 valid: false,
326 msg: "missing reason",
327 },
328 {
329 Event: &core.Event{
330 ObjectMeta: metav1.ObjectMeta{
331 Name: "test",
332 Namespace: metav1.NamespaceSystem,
333 },
334 InvolvedObject: core.ObjectReference{
335 APIVersion: "v1",
336 Kind: "Node",
337 },
338 EventTime: someTime,
339 ReportingController: "k8s.io/my-controller",
340 ReportingInstance: "node-xyz",
341 Reason: "Because",
342 },
343 valid: false,
344 msg: "missing action",
345 },
346 {
347 Event: &core.Event{
348 ObjectMeta: metav1.ObjectMeta{
349 Name: "test",
350 },
351 InvolvedObject: core.ObjectReference{
352 APIVersion: "v1",
353 Kind: "Node",
354 },
355 EventTime: someTime,
356 ReportingController: "k8s.io/my-controller",
357 ReportingInstance: "node-xyz",
358 Reason: "Because",
359 },
360 valid: false,
361 msg: "missing namespace",
362 },
363 {
364 Event: &core.Event{
365 ObjectMeta: metav1.ObjectMeta{
366 Name: "test",
367 },
368 InvolvedObject: core.ObjectReference{
369 APIVersion: "v1",
370 Kind: "Node",
371 },
372 EventTime: someTime,
373 ReportingController: "k8s.io/my-controller",
374 ReportingInstance: "node-xyz",
375 Action: "Do",
376 Reason: "Because",
377 Message: `zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
378 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
379 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
380 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
381 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
382 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
383 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
384 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
385 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
386 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
387 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz`,
388 },
389 valid: false,
390 msg: "too long message",
391 },
392 }
393
394 for _, item := range table {
395 createErrs := ValidateEventCreate(item.Event, eventsv1beta1.SchemeGroupVersion)
396 if e, a := item.valid, len(createErrs) == 0; e != a {
397 t.Errorf("%v: expected %v, got %v: %v", item.msg, e, a, createErrs)
398 }
399 updateErrs := ValidateEventUpdate(item.Event, &core.Event{}, eventsv1beta1.SchemeGroupVersion)
400 if e, a := item.valid, len(updateErrs) == 0; e != a {
401 t.Errorf("%v: expected %v, got %v: %v", item.msg, e, a, updateErrs)
402 }
403 }
404 }
405
406 func TestValidateEventCreateForNewV1Events(t *testing.T) {
407 someTime := metav1.MicroTime{Time: time.Unix(1505828956, 0)}
408 table := []struct {
409 *core.Event
410 valid bool
411 msg string
412 }{
413 {
414 Event: &core.Event{
415 ObjectMeta: metav1.ObjectMeta{
416 Name: "test",
417 Namespace: metav1.NamespaceSystem,
418 },
419 InvolvedObject: core.ObjectReference{
420 APIVersion: "v1",
421 Kind: "Node",
422 },
423 EventTime: someTime,
424 ReportingController: "k8s.io/my-controller",
425 ReportingInstance: "node-xyz",
426 Action: "Do",
427 Reason: "Because",
428 Type: "Normal",
429 },
430 valid: true,
431 msg: "valid new event",
432 },
433 {
434 Event: &core.Event{
435 ObjectMeta: metav1.ObjectMeta{
436 Namespace: metav1.NamespaceSystem,
437 },
438 InvolvedObject: core.ObjectReference{
439 APIVersion: "v1",
440 Kind: "Node",
441 },
442 EventTime: someTime,
443 ReportingController: "k8s.io/my-controller",
444 ReportingInstance: "node-xyz",
445 Reason: "Because",
446 },
447 valid: false,
448 msg: "missing name in objectMeta",
449 },
450 {
451 Event: &core.Event{
452 ObjectMeta: metav1.ObjectMeta{
453 Name: "test",
454 },
455 InvolvedObject: core.ObjectReference{
456 APIVersion: "v1",
457 Kind: "Node",
458 },
459 EventTime: someTime,
460 ReportingController: "k8s.io/my-controller",
461 ReportingInstance: "node-xyz",
462 Reason: "Because",
463 },
464 valid: false,
465 msg: "missing namespace in objectMeta",
466 },
467 {
468 Event: &core.Event{
469 ObjectMeta: metav1.ObjectMeta{
470 Name: "test",
471 Namespace: metav1.NamespaceDefault,
472 },
473 InvolvedObject: core.ObjectReference{
474 APIVersion: "v1",
475 Kind: "Node",
476 },
477 },
478 valid: false,
479 msg: "missing EventTime",
480 },
481 {
482 Event: &core.Event{
483 ObjectMeta: metav1.ObjectMeta{
484 Name: "test",
485 Namespace: metav1.NamespaceSystem,
486 },
487 InvolvedObject: core.ObjectReference{
488 APIVersion: "v1",
489 Kind: "Node",
490 },
491 EventTime: someTime,
492 ReportingController: "my-contr@ller",
493 ReportingInstance: "node-xyz",
494 Action: "Do",
495 Reason: "Because",
496 },
497 valid: false,
498 msg: "not qualified reportingController",
499 },
500 {
501 Event: &core.Event{
502 ObjectMeta: metav1.ObjectMeta{
503 Name: "test",
504 Namespace: metav1.NamespaceSystem,
505 },
506 InvolvedObject: core.ObjectReference{
507 APIVersion: "v1",
508 Kind: "Node",
509 },
510 EventTime: someTime,
511 ReportingController: "k8s.io/my-controller",
512 ReportingInstance: "node-xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
513 Action: "Do",
514 Reason: "Because",
515 },
516 valid: false,
517 msg: "too long reporting instance",
518 },
519 {
520 Event: &core.Event{
521 ObjectMeta: metav1.ObjectMeta{
522 Name: "test",
523 Namespace: metav1.NamespaceSystem,
524 },
525 InvolvedObject: core.ObjectReference{
526 APIVersion: "v1",
527 Kind: "Node",
528 },
529 EventTime: someTime,
530 ReportingController: "k8s.io/my-controller",
531 ReportingInstance: "node-xyz",
532 Action: "Do",
533 },
534 valid: false,
535 msg: "missing reason",
536 },
537 {
538 Event: &core.Event{
539 ObjectMeta: metav1.ObjectMeta{
540 Name: "test",
541 Namespace: metav1.NamespaceSystem,
542 },
543 InvolvedObject: core.ObjectReference{
544 APIVersion: "v1",
545 Kind: "Node",
546 },
547 EventTime: someTime,
548 ReportingController: "k8s.io/my-controller",
549 ReportingInstance: "node-xyz",
550 Reason: "Because",
551 },
552 valid: false,
553 msg: "missing action",
554 },
555 {
556 Event: &core.Event{
557 ObjectMeta: metav1.ObjectMeta{
558 Name: "test",
559 },
560 InvolvedObject: core.ObjectReference{
561 APIVersion: "v1",
562 Kind: "Node",
563 },
564 EventTime: someTime,
565 ReportingController: "k8s.io/my-controller",
566 ReportingInstance: "node-xyz",
567 Action: "Do",
568 Reason: "Because",
569 Message: `zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
570 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
571 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
572 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
573 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
574 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
575 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
576 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
577 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
578 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
579 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz`,
580 },
581 valid: false,
582 msg: "too long message",
583 },
584 {
585 Event: &core.Event{
586 ObjectMeta: metav1.ObjectMeta{
587 Name: "test",
588 Namespace: metav1.NamespaceSystem,
589 },
590 InvolvedObject: core.ObjectReference{
591 APIVersion: "v1",
592 Kind: "Node",
593 },
594 EventTime: someTime,
595 ReportingController: "k8s.io/my-controller",
596 ReportingInstance: "node-xyz",
597 Action: "Do",
598 Reason: "Because",
599 Type: "invalid-type",
600 },
601 valid: false,
602 msg: "invalid type",
603 },
604 {
605 Event: &core.Event{
606 ObjectMeta: metav1.ObjectMeta{
607 Name: "test",
608 Namespace: metav1.NamespaceSystem,
609 },
610 InvolvedObject: core.ObjectReference{
611 APIVersion: "v1",
612 Kind: "Node",
613 },
614 EventTime: someTime,
615 ReportingController: "k8s.io/my-controller",
616 ReportingInstance: "node-xyz",
617 Action: "Do",
618 Reason: "Because",
619 Type: "Normal",
620 FirstTimestamp: metav1.Time{Time: time.Unix(1505828956, 0)},
621 },
622 valid: false,
623 msg: "non-empty firstTimestamp",
624 },
625 {
626 Event: &core.Event{
627 ObjectMeta: metav1.ObjectMeta{
628 Name: "test",
629 Namespace: metav1.NamespaceSystem,
630 },
631 InvolvedObject: core.ObjectReference{
632 APIVersion: "v1",
633 Kind: "Node",
634 },
635 EventTime: someTime,
636 ReportingController: "k8s.io/my-controller",
637 ReportingInstance: "node-xyz",
638 Action: "Do",
639 Reason: "Because",
640 Type: "Normal",
641 LastTimestamp: metav1.Time{Time: time.Unix(1505828956, 0)},
642 },
643 valid: false,
644 msg: "non-empty lastTimestamp",
645 },
646 {
647 Event: &core.Event{
648 ObjectMeta: metav1.ObjectMeta{
649 Name: "test",
650 Namespace: metav1.NamespaceSystem,
651 },
652 InvolvedObject: core.ObjectReference{
653 APIVersion: "v1",
654 Kind: "Node",
655 },
656 EventTime: someTime,
657 ReportingController: "k8s.io/my-controller",
658 ReportingInstance: "node-xyz",
659 Action: "Do",
660 Reason: "Because",
661 Type: "Normal",
662 Count: 123,
663 },
664 valid: false,
665 msg: "non-empty count",
666 },
667 {
668 Event: &core.Event{
669 ObjectMeta: metav1.ObjectMeta{
670 Name: "test",
671 Namespace: metav1.NamespaceSystem,
672 },
673 InvolvedObject: core.ObjectReference{
674 APIVersion: "v1",
675 Kind: "Node",
676 },
677 EventTime: someTime,
678 ReportingController: "k8s.io/my-controller",
679 ReportingInstance: "node-xyz",
680 Action: "Do",
681 Reason: "Because",
682 Type: "Normal",
683 Source: core.EventSource{
684 Host: "host",
685 },
686 },
687 valid: false,
688 msg: "non-empty source",
689 },
690 {
691 Event: &core.Event{
692 ObjectMeta: metav1.ObjectMeta{
693 Name: "test",
694 Namespace: metav1.NamespaceSystem,
695 },
696 InvolvedObject: core.ObjectReference{
697 APIVersion: "v1",
698 Kind: "Node",
699 },
700 EventTime: someTime,
701 ReportingController: "k8s.io/my-controller",
702 ReportingInstance: "node-xyz",
703 Action: "Do",
704 Reason: "Because",
705 Type: "Normal",
706 Series: &core.EventSeries{
707 Count: 0,
708 LastObservedTime: someTime,
709 },
710 },
711 valid: false,
712 msg: "non-nil series with cound < 2",
713 },
714 {
715 Event: &core.Event{
716 ObjectMeta: metav1.ObjectMeta{
717 Name: "test",
718 Namespace: metav1.NamespaceSystem,
719 },
720 InvolvedObject: core.ObjectReference{
721 APIVersion: "v1",
722 Kind: "Node",
723 },
724 EventTime: someTime,
725 ReportingController: "k8s.io/my-controller",
726 ReportingInstance: "node-xyz",
727 Action: "Do",
728 Reason: "Because",
729 Type: "Normal",
730 Series: &core.EventSeries{
731 Count: 2,
732 },
733 },
734 valid: false,
735 msg: "non-nil series with empty lastObservedTime",
736 },
737 }
738
739 for _, item := range table {
740 createErrs := ValidateEventCreate(item.Event, eventsv1.SchemeGroupVersion)
741 if e, a := item.valid, len(createErrs) == 0; e != a {
742 t.Errorf("%v: expected %v, got %v: %v", item.msg, e, a, createErrs)
743 }
744 }
745 }
746
747 func TestValidateEventUpdateForNewV1Events(t *testing.T) {
748 someTime := metav1.MicroTime{Time: time.Unix(1505828956, 0)}
749 table := []struct {
750 newEvent *core.Event
751 oldEvent *core.Event
752 valid bool
753 msg string
754 }{
755 {
756 newEvent: &core.Event{
757 ObjectMeta: metav1.ObjectMeta{
758 Name: "test",
759 Namespace: metav1.NamespaceSystem,
760 ResourceVersion: "2",
761 },
762 InvolvedObject: core.ObjectReference{
763 APIVersion: "v2",
764 Kind: "Node",
765 },
766 Series: &core.EventSeries{
767 Count: 2,
768 LastObservedTime: someTime,
769 },
770 EventTime: someTime,
771 ReportingController: "k8s.io/my-controller",
772 ReportingInstance: "node-xyz",
773 Action: "Do",
774 Reason: "Yeees",
775 Type: "Normal",
776 },
777 oldEvent: &core.Event{
778 ObjectMeta: metav1.ObjectMeta{
779 Name: "test",
780 Namespace: metav1.NamespaceSystem,
781 ResourceVersion: "2",
782 },
783 InvolvedObject: core.ObjectReference{
784 APIVersion: "v2",
785 Kind: "Node",
786 },
787 Series: &core.EventSeries{
788 Count: 1,
789 LastObservedTime: someTime,
790 },
791 EventTime: someTime,
792 ReportingController: "k8s.io/my-controller",
793 ReportingInstance: "node-xyz",
794 Action: "Do",
795 Reason: "Yeees",
796 Type: "Normal",
797 },
798 valid: true,
799 msg: "valid new updated event",
800 },
801 {
802 newEvent: &core.Event{
803 ObjectMeta: metav1.ObjectMeta{
804 Name: "test",
805 Namespace: metav1.NamespaceSystem,
806 ResourceVersion: "1",
807 },
808 InvolvedObject: core.ObjectReference{
809 APIVersion: "v2",
810 Kind: "Node",
811 },
812 EventTime: someTime,
813 ReportingController: "k8s.io/my-controller",
814 ReportingInstance: "node-xyz",
815 Action: "Do",
816 Reason: "Yeees",
817 Type: "Normal",
818 },
819 oldEvent: &core.Event{
820 ObjectMeta: metav1.ObjectMeta{
821 Name: "test",
822 Namespace: metav1.NamespaceSystem,
823 ResourceVersion: "1",
824 },
825 InvolvedObject: core.ObjectReference{
826 APIVersion: "v1",
827 Kind: "Node",
828 },
829 EventTime: someTime,
830 ReportingController: "k8s.io/my-controller",
831 ReportingInstance: "node-xyz",
832 Action: "Do",
833 Reason: "Yeees",
834 Type: "Normal",
835 },
836 valid: false,
837 msg: "forbidden updates to involvedObject",
838 },
839 {
840 newEvent: &core.Event{
841 ObjectMeta: metav1.ObjectMeta{
842 Name: "test",
843 Namespace: metav1.NamespaceSystem,
844 ResourceVersion: "1",
845 },
846 InvolvedObject: core.ObjectReference{
847 APIVersion: "v1",
848 Kind: "Node",
849 },
850 EventTime: someTime,
851 ReportingController: "k8s.io/my-controller",
852 ReportingInstance: "node-xyz",
853 Action: "Do",
854 Reason: "Yeees-new",
855 Type: "Normal",
856 },
857 oldEvent: &core.Event{
858 ObjectMeta: metav1.ObjectMeta{
859 Name: "test",
860 Namespace: metav1.NamespaceSystem,
861 ResourceVersion: "1",
862 },
863 InvolvedObject: core.ObjectReference{
864 APIVersion: "v1",
865 Kind: "Node",
866 },
867 EventTime: someTime,
868 ReportingController: "k8s.io/my-controller",
869 ReportingInstance: "node-xyz",
870 Action: "Do",
871 Reason: "Yeees",
872 Type: "Normal",
873 },
874 valid: false,
875 msg: "forbidden updates to reason",
876 },
877 {
878 newEvent: &core.Event{
879 ObjectMeta: metav1.ObjectMeta{
880 Name: "test",
881 Namespace: metav1.NamespaceSystem,
882 ResourceVersion: "1",
883 },
884 InvolvedObject: core.ObjectReference{
885 APIVersion: "v1",
886 Kind: "Node",
887 },
888 EventTime: someTime,
889 ReportingController: "k8s.io/my-controller",
890 ReportingInstance: "node-xyz",
891 Action: "Do",
892 Reason: "Yeees",
893 Type: "Normal",
894 Message: "new-message",
895 },
896 oldEvent: &core.Event{
897 ObjectMeta: metav1.ObjectMeta{
898 Name: "test",
899 Namespace: metav1.NamespaceSystem,
900 ResourceVersion: "1",
901 },
902 InvolvedObject: core.ObjectReference{
903 APIVersion: "v1",
904 Kind: "Node",
905 },
906 EventTime: someTime,
907 ReportingController: "k8s.io/my-controller",
908 ReportingInstance: "node-xyz",
909 Action: "Do",
910 Reason: "Yeees",
911 Type: "Normal",
912 Message: "message",
913 },
914 valid: false,
915 msg: "forbidden updates to message",
916 },
917 {
918 newEvent: &core.Event{
919 ObjectMeta: metav1.ObjectMeta{
920 Name: "test",
921 Namespace: metav1.NamespaceSystem,
922 ResourceVersion: "1",
923 },
924 InvolvedObject: core.ObjectReference{
925 APIVersion: "v1",
926 Kind: "Node",
927 },
928 EventTime: someTime,
929 ReportingController: "k8s.io/my-controller",
930 ReportingInstance: "node-xyz",
931 Action: "Do",
932 Reason: "Yeees",
933 Type: "Normal",
934 },
935 oldEvent: &core.Event{
936 ObjectMeta: metav1.ObjectMeta{
937 Name: "test",
938 Namespace: metav1.NamespaceSystem,
939 ResourceVersion: "1",
940 },
941 InvolvedObject: core.ObjectReference{
942 APIVersion: "v1",
943 Kind: "Node",
944 },
945 Source: core.EventSource{
946 Host: "host",
947 },
948 EventTime: someTime,
949 ReportingController: "k8s.io/my-controller",
950 ReportingInstance: "node-xyz",
951 Action: "Do",
952 Reason: "Yeees",
953 Type: "Normal",
954 },
955 valid: false,
956 msg: "forbidden updates to source",
957 },
958 {
959 newEvent: &core.Event{
960 ObjectMeta: metav1.ObjectMeta{
961 Name: "test",
962 Namespace: metav1.NamespaceSystem,
963 ResourceVersion: "1",
964 },
965 InvolvedObject: core.ObjectReference{
966 APIVersion: "v1",
967 Kind: "Node",
968 },
969 EventTime: someTime,
970 ReportingController: "k8s.io/my-controller",
971 ReportingInstance: "node-xyz",
972 Action: "Do",
973 Reason: "Yeees",
974 Type: "Normal",
975 },
976 oldEvent: &core.Event{
977 ObjectMeta: metav1.ObjectMeta{
978 Name: "test",
979 Namespace: metav1.NamespaceSystem,
980 ResourceVersion: "1",
981 },
982 InvolvedObject: core.ObjectReference{
983 APIVersion: "v1",
984 Kind: "Node",
985 },
986 EventTime: someTime,
987 ReportingController: "k8s.io/my-controller",
988 ReportingInstance: "node-xyz",
989 Action: "Do",
990 Reason: "Yeees",
991 Type: "Normal",
992 FirstTimestamp: metav1.Time{Time: time.Unix(1505828956, 0)},
993 },
994 valid: false,
995 msg: "forbidden updates to firstTimestamp",
996 },
997 {
998 newEvent: &core.Event{
999 ObjectMeta: metav1.ObjectMeta{
1000 Name: "test",
1001 Namespace: metav1.NamespaceSystem,
1002 ResourceVersion: "1",
1003 },
1004 InvolvedObject: core.ObjectReference{
1005 APIVersion: "v1",
1006 Kind: "Node",
1007 },
1008 EventTime: someTime,
1009 ReportingController: "k8s.io/my-controller",
1010 ReportingInstance: "node-xyz",
1011 Action: "Do",
1012 Reason: "Yeees",
1013 Type: "Normal",
1014 },
1015 oldEvent: &core.Event{
1016 ObjectMeta: metav1.ObjectMeta{
1017 Name: "test",
1018 Namespace: metav1.NamespaceSystem,
1019 ResourceVersion: "1",
1020 },
1021 InvolvedObject: core.ObjectReference{
1022 APIVersion: "v1",
1023 Kind: "Node",
1024 },
1025 EventTime: someTime,
1026 ReportingController: "k8s.io/my-controller",
1027 ReportingInstance: "node-xyz",
1028 Action: "Do",
1029 Reason: "Yeees",
1030 Type: "Normal",
1031 LastTimestamp: metav1.Time{Time: time.Unix(1505828956, 0)},
1032 },
1033 valid: false,
1034 msg: "forbidden updates to lastTimestamp",
1035 },
1036 {
1037 newEvent: &core.Event{
1038 ObjectMeta: metav1.ObjectMeta{
1039 Name: "test",
1040 Namespace: metav1.NamespaceSystem,
1041 ResourceVersion: "1",
1042 },
1043 InvolvedObject: core.ObjectReference{
1044 APIVersion: "v1",
1045 Kind: "Node",
1046 },
1047 EventTime: someTime,
1048 ReportingController: "k8s.io/my-controller",
1049 ReportingInstance: "node-xyz",
1050 Action: "Do",
1051 Reason: "Yeees",
1052 Type: "Normal",
1053 },
1054 oldEvent: &core.Event{
1055 ObjectMeta: metav1.ObjectMeta{
1056 Name: "test",
1057 Namespace: metav1.NamespaceSystem,
1058 ResourceVersion: "1",
1059 },
1060 InvolvedObject: core.ObjectReference{
1061 APIVersion: "v1",
1062 Kind: "Node",
1063 },
1064 EventTime: someTime,
1065 ReportingController: "k8s.io/my-controller",
1066 ReportingInstance: "node-xyz",
1067 Action: "Do",
1068 Reason: "Yeees",
1069 Type: "Normal",
1070 Count: 2,
1071 },
1072 valid: false,
1073 msg: "forbidden updates to count",
1074 },
1075 {
1076 newEvent: &core.Event{
1077 ObjectMeta: metav1.ObjectMeta{
1078 Name: "test",
1079 Namespace: metav1.NamespaceSystem,
1080 ResourceVersion: "1",
1081 },
1082 InvolvedObject: core.ObjectReference{
1083 APIVersion: "v1",
1084 Kind: "Node",
1085 },
1086 EventTime: someTime,
1087 ReportingController: "k8s.io/my-controller",
1088 ReportingInstance: "node-xyz",
1089 Action: "Do",
1090 Reason: "Yeees",
1091 Type: "Warning",
1092 },
1093 oldEvent: &core.Event{
1094 ObjectMeta: metav1.ObjectMeta{
1095 Name: "test",
1096 Namespace: metav1.NamespaceSystem,
1097 ResourceVersion: "1",
1098 },
1099 InvolvedObject: core.ObjectReference{
1100 APIVersion: "v1",
1101 Kind: "Node",
1102 },
1103 EventTime: someTime,
1104 ReportingController: "k8s.io/my-controller",
1105 ReportingInstance: "node-xyz",
1106 Action: "Do",
1107 Reason: "Yeees",
1108 Type: "Normal",
1109 },
1110 valid: false,
1111 msg: "forbidden updates to type",
1112 },
1113 {
1114 newEvent: &core.Event{
1115 ObjectMeta: metav1.ObjectMeta{
1116 Name: "test",
1117 Namespace: metav1.NamespaceSystem,
1118 ResourceVersion: "1",
1119 },
1120 InvolvedObject: core.ObjectReference{
1121 APIVersion: "v1",
1122 Kind: "Node",
1123 },
1124 EventTime: metav1.MicroTime{Time: time.Unix(1505828999, 0)},
1125 ReportingController: "k8s.io/my-controller",
1126 ReportingInstance: "node-xyz",
1127 Action: "Do",
1128 Reason: "Yeees",
1129 Type: "Normal",
1130 },
1131 oldEvent: &core.Event{
1132 ObjectMeta: metav1.ObjectMeta{
1133 Name: "test",
1134 Namespace: metav1.NamespaceSystem,
1135 ResourceVersion: "1",
1136 },
1137 InvolvedObject: core.ObjectReference{
1138 APIVersion: "v1",
1139 Kind: "Node",
1140 },
1141 EventTime: someTime,
1142 ReportingController: "k8s.io/my-controller",
1143 ReportingInstance: "node-xyz",
1144 Action: "Do",
1145 Reason: "Yeees",
1146 Type: "Normal",
1147 },
1148 valid: false,
1149 msg: "forbidden updates to eventTime",
1150 },
1151 {
1152 newEvent: &core.Event{
1153 ObjectMeta: metav1.ObjectMeta{
1154 Name: "test",
1155 Namespace: metav1.NamespaceSystem,
1156 ResourceVersion: "1",
1157 },
1158 InvolvedObject: core.ObjectReference{
1159 APIVersion: "v1",
1160 Kind: "Node",
1161 },
1162 EventTime: someTime,
1163 ReportingController: "k8s.io/my-controller",
1164 ReportingInstance: "node-xyz",
1165 Action: "Undo",
1166 Reason: "Yeees",
1167 Type: "Normal",
1168 },
1169 oldEvent: &core.Event{
1170 ObjectMeta: metav1.ObjectMeta{
1171 Name: "test",
1172 Namespace: metav1.NamespaceSystem,
1173 ResourceVersion: "1",
1174 },
1175 InvolvedObject: core.ObjectReference{
1176 APIVersion: "v1",
1177 Kind: "Node",
1178 },
1179 EventTime: someTime,
1180 ReportingController: "k8s.io/my-controller",
1181 ReportingInstance: "node-xyz",
1182 Action: "Do",
1183 Reason: "Yeees",
1184 Type: "Normal",
1185 },
1186 valid: false,
1187 msg: "forbidden updates to action",
1188 },
1189 {
1190 newEvent: &core.Event{
1191 ObjectMeta: metav1.ObjectMeta{
1192 Name: "test",
1193 Namespace: metav1.NamespaceSystem,
1194 ResourceVersion: "1",
1195 },
1196 InvolvedObject: core.ObjectReference{
1197 APIVersion: "v1",
1198 Kind: "Node",
1199 },
1200 Related: &core.ObjectReference{
1201 APIVersion: "v1",
1202 },
1203 EventTime: someTime,
1204 ReportingController: "k8s.io/my-controller",
1205 ReportingInstance: "node-xyz",
1206 Action: "Do",
1207 Reason: "Yeees",
1208 Type: "Normal",
1209 },
1210 oldEvent: &core.Event{
1211 ObjectMeta: metav1.ObjectMeta{
1212 Name: "test",
1213 Namespace: metav1.NamespaceSystem,
1214 ResourceVersion: "1",
1215 },
1216 InvolvedObject: core.ObjectReference{
1217 APIVersion: "v1",
1218 Kind: "Node",
1219 },
1220 EventTime: someTime,
1221 ReportingController: "k8s.io/my-controller",
1222 ReportingInstance: "node-xyz",
1223 Action: "Do",
1224 Reason: "Yeees",
1225 Type: "Normal",
1226 },
1227 valid: false,
1228 msg: "forbidden updates to related",
1229 },
1230 {
1231 newEvent: &core.Event{
1232 ObjectMeta: metav1.ObjectMeta{
1233 Name: "test",
1234 Namespace: metav1.NamespaceSystem,
1235 ResourceVersion: "1",
1236 },
1237 InvolvedObject: core.ObjectReference{
1238 APIVersion: "v1",
1239 Kind: "Node",
1240 },
1241 EventTime: someTime,
1242 ReportingController: "k8s.io/my-controller/new",
1243 ReportingInstance: "node-xyz",
1244 Action: "Do",
1245 Reason: "Yeees",
1246 Type: "Normal",
1247 },
1248 oldEvent: &core.Event{
1249 ObjectMeta: metav1.ObjectMeta{
1250 Name: "test",
1251 Namespace: metav1.NamespaceSystem,
1252 ResourceVersion: "1",
1253 },
1254 InvolvedObject: core.ObjectReference{
1255 APIVersion: "v1",
1256 Kind: "Node",
1257 },
1258 EventTime: someTime,
1259 ReportingController: "k8s.io/my-controller",
1260 ReportingInstance: "node-xyz",
1261 Action: "Do",
1262 Reason: "Yeees",
1263 Type: "Normal",
1264 },
1265 valid: false,
1266 msg: "forbidden updates to reportingController",
1267 },
1268 {
1269 newEvent: &core.Event{
1270 ObjectMeta: metav1.ObjectMeta{
1271 Name: "test",
1272 Namespace: metav1.NamespaceSystem,
1273 ResourceVersion: "1",
1274 },
1275 InvolvedObject: core.ObjectReference{
1276 APIVersion: "v1",
1277 Kind: "Node",
1278 },
1279 EventTime: someTime,
1280 ReportingController: "k8s.io/my-controller",
1281 ReportingInstance: "node-xyz-new",
1282 Action: "Do",
1283 Reason: "Yeees",
1284 Type: "Normal",
1285 },
1286 oldEvent: &core.Event{
1287 ObjectMeta: metav1.ObjectMeta{
1288 Name: "test",
1289 Namespace: metav1.NamespaceSystem,
1290 ResourceVersion: "1",
1291 },
1292 InvolvedObject: core.ObjectReference{
1293 APIVersion: "v1",
1294 Kind: "Node",
1295 },
1296 EventTime: someTime,
1297 ReportingController: "k8s.io/my-controller",
1298 ReportingInstance: "node-xyz",
1299 Action: "Do",
1300 Reason: "Yeees",
1301 Type: "Normal",
1302 },
1303 valid: false,
1304 msg: "forbidden updates to reportingInstance",
1305 },
1306 }
1307
1308 for _, item := range table {
1309 updateErrs := ValidateEventUpdate(item.newEvent, item.oldEvent, eventsv1.SchemeGroupVersion)
1310 if e, a := item.valid, len(updateErrs) == 0; e != a {
1311 t.Errorf("%v: expected %v, got %v: %v", item.msg, e, a, updateErrs)
1312 }
1313 }
1314 }
1315
1316 func TestEventV1EventTimeImmutability(t *testing.T) {
1317 testcases := []struct {
1318 Name string
1319 Old metav1.MicroTime
1320 New metav1.MicroTime
1321 Valid bool
1322 }{
1323 {
1324 Name: "noop microsecond precision",
1325 Old: metav1.NewMicroTime(time.Unix(100, int64(5*time.Microsecond))),
1326 New: metav1.NewMicroTime(time.Unix(100, int64(5*time.Microsecond))),
1327 Valid: true,
1328 },
1329 {
1330 Name: "noop nanosecond precision",
1331 Old: metav1.NewMicroTime(time.Unix(100, int64(5*time.Nanosecond))),
1332 New: metav1.NewMicroTime(time.Unix(100, int64(5*time.Nanosecond))),
1333 Valid: true,
1334 },
1335 {
1336 Name: "modify nanoseconds within the same microsecond",
1337 Old: metav1.NewMicroTime(time.Unix(100, int64(5*time.Nanosecond))),
1338 New: metav1.NewMicroTime(time.Unix(100, int64(6*time.Nanosecond))),
1339 Valid: true,
1340 },
1341 {
1342 Name: "modify microseconds",
1343 Old: metav1.NewMicroTime(time.Unix(100, int64(5*time.Microsecond))),
1344 New: metav1.NewMicroTime(time.Unix(100, int64(5*time.Microsecond-time.Nanosecond))),
1345 Valid: false,
1346 },
1347 {
1348 Name: "modify seconds",
1349 Old: metav1.NewMicroTime(time.Unix(100, 0)),
1350 New: metav1.NewMicroTime(time.Unix(101, 0)),
1351 Valid: false,
1352 },
1353 }
1354
1355 for _, tc := range testcases {
1356 t.Run(tc.Name, func(t *testing.T) {
1357 oldEvent := &core.Event{
1358 ObjectMeta: metav1.ObjectMeta{Name: "test", Namespace: metav1.NamespaceSystem, ResourceVersion: "2"},
1359 InvolvedObject: core.ObjectReference{APIVersion: "v2", Kind: "Node"},
1360 Series: &core.EventSeries{Count: 2, LastObservedTime: tc.Old},
1361 EventTime: tc.Old,
1362 ReportingController: "k8s.io/my-controller",
1363 ReportingInstance: "node-xyz",
1364 Action: "Do",
1365 Reason: "Yeees",
1366 Type: "Normal",
1367 }
1368
1369 newEvent := oldEvent.DeepCopy()
1370 newEvent.EventTime = tc.New
1371
1372 updateErrs := ValidateEventUpdate(newEvent, oldEvent, eventsv1.SchemeGroupVersion)
1373 if e, a := tc.Valid, len(updateErrs) == 0; e != a {
1374 t.Errorf("%v: expected valid=%v, got %v: %v", tc.Valid, e, a, updateErrs)
1375 }
1376 })
1377 }
1378 }
1379
View as plain text