...

Source file src/k8s.io/kubernetes/pkg/apis/core/validation/events_test.go

Documentation: k8s.io/kubernetes/pkg/apis/core/validation

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