diff --git a/test/integration/BUILD b/test/integration/BUILD index 4d657752613..138752de4bd 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -48,6 +48,7 @@ filegroup( "//test/integration/disruption:all-srcs", "//test/integration/dryrun:all-srcs", "//test/integration/etcd:all-srcs", + "//test/integration/events:all-srcs", "//test/integration/evictions:all-srcs", "//test/integration/examples:all-srcs", "//test/integration/framework:all-srcs", diff --git a/test/integration/client/client_test.go b/test/integration/client/client_test.go index 3edbf8d0d15..57031679bb7 100644 --- a/test/integration/client/client_test.go +++ b/test/integration/client/client_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -36,6 +36,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/version" diff --git a/test/integration/events/BUILD b/test/integration/events/BUILD new file mode 100644 index 00000000000..48290ba3b8e --- /dev/null +++ b/test/integration/events/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "go_default_test", + srcs = [ + "events_test.go", + "main_test.go", + ], + tags = ["integration"], + deps = [ + "//cmd/kube-apiserver/app/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/events:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//test/integration/framework:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/test/integration/events/events_test.go b/test/integration/events/events_test.go new file mode 100644 index 00000000000..3df8c3b2d56 --- /dev/null +++ b/test/integration/events/events_test.go @@ -0,0 +1,94 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package events + +import ( + "testing" + "time" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes/scheme" + typedv1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/events" + "k8s.io/client-go/tools/record" + ref "k8s.io/client-go/tools/reference" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/test/integration/framework" +) + +func TestEventCompatibility(t *testing.T) { + result := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins", "ServiceAccount"}, framework.SharedEtcd()) + defer result.TearDownFn() + + client := clientset.NewForConfigOrDie(result.ClientConfig) + + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + Namespace: "default", + UID: "bar", + }, + } + + regarding, err := ref.GetReference(scheme.Scheme, testPod) + if err != nil { + t.Fatal(err) + } + + related, err := ref.GetPartialReference(scheme.Scheme, testPod, ".spec.containers[0]") + if err != nil { + t.Fatal(err) + } + stopCh := make(chan struct{}) + oldBroadcaster := record.NewBroadcaster() + oldRecorder := oldBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "integration"}) + oldBroadcaster.StartRecordingToSink(&typedv1.EventSinkImpl{Interface: client.CoreV1().Events("")}) + oldRecorder.Eventf(regarding, v1.EventTypeNormal, "started", "note") + + newBroadcaster := events.NewBroadcaster(&events.EventSinkImpl{Interface: client.EventsV1beta1().Events("")}) + newRecorder := newBroadcaster.NewRecorder(scheme.Scheme, "k8s.io/kube-scheduler") + newBroadcaster.StartRecordingToSink(stopCh) + newRecorder.Eventf(regarding, related, v1.EventTypeNormal, "memoryPressure", "killed", "memory pressure") + err = wait.PollImmediate(100*time.Millisecond, 20*time.Second, func() (done bool, err error) { + v1beta1Events, err := client.EventsV1beta1().Events("").List(metav1.ListOptions{}) + if err != nil { + return false, err + } + + if len(v1beta1Events.Items) != 2 { + return false, nil + } + + events, err := client.CoreV1().Events("").List(metav1.ListOptions{}) + if err != nil { + return false, err + } + + if len(events.Items) != 2 { + return false, nil + } + return true, nil + }) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } +} diff --git a/test/integration/events/main_test.go b/test/integration/events/main_test.go new file mode 100644 index 00000000000..1574b8c91b5 --- /dev/null +++ b/test/integration/events/main_test.go @@ -0,0 +1,27 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package events + +import ( + "testing" + + "k8s.io/kubernetes/test/integration/framework" +) + +func TestMain(m *testing.M) { + framework.EtcdMain(m.Run) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index e7e68f3cf5f..39ea9492cdc 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1514,6 +1514,7 @@ k8s.io/client-go/tools/clientcmd k8s.io/client-go/tools/clientcmd/api k8s.io/client-go/tools/clientcmd/api/latest k8s.io/client-go/tools/clientcmd/api/v1 +k8s.io/client-go/tools/events k8s.io/client-go/tools/leaderelection k8s.io/client-go/tools/leaderelection/resourcelock k8s.io/client-go/tools/metrics