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  }