1
16
17 package events
18
19 import (
20 "context"
21 "fmt"
22 "testing"
23 "time"
24
25 v1 "k8s.io/api/core/v1"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 clientset "k8s.io/client-go/kubernetes"
28
29 "k8s.io/apimachinery/pkg/util/wait"
30 "k8s.io/client-go/kubernetes/scheme"
31 typedv1 "k8s.io/client-go/kubernetes/typed/core/v1"
32 "k8s.io/client-go/tools/events"
33 "k8s.io/client-go/tools/record"
34 ref "k8s.io/client-go/tools/reference"
35 kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
36 "k8s.io/kubernetes/test/integration/framework"
37 )
38
39 func TestEventCompatibility(t *testing.T) {
40 result := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins", "ServiceAccount"}, framework.SharedEtcd())
41 defer result.TearDownFn()
42
43 client := clientset.NewForConfigOrDie(result.ClientConfig)
44
45 testPod := &v1.Pod{
46 ObjectMeta: metav1.ObjectMeta{
47 Name: "foo",
48 Namespace: "default",
49 UID: "bar",
50 },
51 }
52
53 regarding, err := ref.GetReference(scheme.Scheme, testPod)
54 if err != nil {
55 t.Fatal(err)
56 }
57
58 related, err := ref.GetPartialReference(scheme.Scheme, testPod, ".spec.containers[0]")
59 if err != nil {
60 t.Fatal(err)
61 }
62
63 stopCh := make(chan struct{})
64 defer close(stopCh)
65 oldBroadcaster := record.NewBroadcaster()
66 defer oldBroadcaster.Shutdown()
67 oldRecorder := oldBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "integration"})
68 oldBroadcaster.StartRecordingToSink(&typedv1.EventSinkImpl{Interface: client.CoreV1().Events("")})
69 oldRecorder.Eventf(regarding, v1.EventTypeNormal, "started", "note")
70
71 newBroadcaster := events.NewBroadcaster(&events.EventSinkImpl{Interface: client.EventsV1()})
72 defer newBroadcaster.Shutdown()
73 newRecorder := newBroadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-scheduler")
74 newBroadcaster.StartRecordingToSink(stopCh)
75 newRecorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure")
76 err = wait.PollImmediate(100*time.Millisecond, 20*time.Second, func() (done bool, err error) {
77 v1Events, err := client.EventsV1().Events("").List(context.TODO(), metav1.ListOptions{})
78 if err != nil {
79 return false, err
80 }
81
82 if len(v1Events.Items) != 2 {
83 return false, nil
84 }
85
86 events, err := client.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{})
87 if err != nil {
88 return false, err
89 }
90
91 if len(events.Items) != 2 {
92 return false, nil
93 }
94 return true, nil
95 })
96 if err != nil {
97 t.Fatalf("unexpected err: %v", err)
98 }
99 }
100
101 func TestEventSeries(t *testing.T) {
102 result := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins", "ServiceAccount"}, framework.SharedEtcd())
103 defer result.TearDownFn()
104
105 client := clientset.NewForConfigOrDie(result.ClientConfig)
106
107 testPod := &v1.Pod{
108 ObjectMeta: metav1.ObjectMeta{
109 Name: "foo",
110 Namespace: "default",
111 UID: "bar",
112 },
113 }
114
115 regarding, err := ref.GetReference(scheme.Scheme, testPod)
116 if err != nil {
117 t.Fatal(err)
118 }
119
120 related, err := ref.GetPartialReference(scheme.Scheme, testPod, ".spec.containers[0]")
121 if err != nil {
122 t.Fatal(err)
123 }
124
125 stopCh := make(chan struct{})
126 defer close(stopCh)
127
128 broadcaster := events.NewBroadcaster(&events.EventSinkImpl{Interface: client.EventsV1()})
129 defer broadcaster.Shutdown()
130 recorder := broadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-scheduler")
131 broadcaster.StartRecordingToSink(stopCh)
132 recorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure")
133 recorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure")
134 err = wait.PollImmediate(100*time.Millisecond, 20*time.Second, func() (done bool, err error) {
135 events, err := client.EventsV1().Events("").List(context.TODO(), metav1.ListOptions{})
136 if err != nil {
137 return false, err
138 }
139
140 if len(events.Items) != 1 {
141 return false, nil
142 }
143
144 if events.Items[0].Series == nil {
145 return false, nil
146 }
147
148 if events.Items[0].Series.Count != 2 {
149 return false, fmt.Errorf("expected EventSeries to have a starting count of 2, got: %d", events.Items[0].Series.Count)
150 }
151
152 return true, nil
153 })
154 if err != nil {
155 t.Fatalf("error waiting for an Event with a non nil Series to be created: %v", err)
156 }
157
158 }
159
View as plain text