k8s.io/kubernetes@v1.29.3/test/integration/events/events_test.go (about) 1 /* 2 Copyright 2019 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 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 }