...

Source file src/k8s.io/kubectl/pkg/cmd/events/events_test.go

Documentation: k8s.io/kubectl/pkg/cmd/events

     1  /*
     2  Copyright 2022 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  	"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