From e5760015d202a67b932c642ac53b9a87da482023 Mon Sep 17 00:00:00 2001 From: Eric Ernst Date: Tue, 14 Jan 2020 11:55:15 -0800 Subject: [PATCH] e2e-framework-node: add runtimeclass to dedup code Similar functionality is required across e2e tests for RuntimeClass. Let's create runtimeclass as part of the framework/node package. Signed-off-by: Eric Ernst --- test/e2e/common/runtimeclass.go | 32 +++----------- test/e2e/framework/framework.go | 15 ------- test/e2e/framework/node/BUILD | 3 ++ test/e2e/framework/node/runtimeclass.go | 56 +++++++++++++++++++++++++ test/e2e/node/BUILD | 1 - test/e2e/node/runtimeclass.go | 34 ++++----------- test/e2e/scheduling/BUILD | 1 + 7 files changed, 73 insertions(+), 69 deletions(-) create mode 100644 test/e2e/framework/node/runtimeclass.go diff --git a/test/e2e/common/runtimeclass.go b/test/e2e/common/runtimeclass.go index f7b8c443d04..b4217955c4e 100644 --- a/test/e2e/common/runtimeclass.go +++ b/test/e2e/common/runtimeclass.go @@ -30,9 +30,8 @@ import ( runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing" "k8s.io/kubernetes/test/e2e/framework" e2eevents "k8s.io/kubernetes/test/e2e/framework/events" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - imageutils "k8s.io/kubernetes/test/utils/image" - utilpointer "k8s.io/utils/pointer" "github.com/onsi/ginkgo" ) @@ -42,23 +41,23 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { ginkgo.It("should reject a Pod requesting a non-existent RuntimeClass", func() { rcName := f.Namespace.Name + "-nonexistent" - expectPodRejection(f, newRuntimeClassPod(rcName)) + expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) }) ginkgo.It("should reject a Pod requesting a RuntimeClass with an unconfigured handler", func() { handler := f.Namespace.Name + "-handler" rcName := createRuntimeClass(f, "unconfigured-handler", handler) - pod := f.PodClient().Create(newRuntimeClassPod(rcName)) + pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) expectSandboxFailureEvent(f, pod, handler) }) // This test requires that the PreconfiguredRuntimeHandler has already been set up on nodes. ginkgo.It("should run a Pod requesting a RuntimeClass with a configured handler [NodeFeature:RuntimeHandler]", func() { // The built-in docker runtime does not support configuring runtime handlers. - handler := framework.PreconfiguredRuntimeClassHandler() + handler := e2enode.PreconfiguredRuntimeClassHandler(framework.TestContext.ContainerRuntime) rcName := createRuntimeClass(f, "preconfigured-handler", handler) - pod := f.PodClient().Create(newRuntimeClassPod(rcName)) + pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) expectPodSuccess(f, pod) }) @@ -83,7 +82,7 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { })) }) - expectPodRejection(f, newRuntimeClassPod(rcName)) + expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) }) }) @@ -97,25 +96,6 @@ func createRuntimeClass(f *framework.Framework, name, handler string) string { return rc.GetName() } -// newRuntimeClassPod generates a test pod with the given runtimeClassName. -func newRuntimeClassPod(runtimeClassName string) *v1.Pod { - return &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - GenerateName: fmt.Sprintf("test-runtimeclass-%s-", runtimeClassName), - }, - Spec: v1.PodSpec{ - RuntimeClassName: &runtimeClassName, - Containers: []v1.Container{{ - Name: "test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"true"}, - }}, - RestartPolicy: v1.RestartPolicyNever, - AutomountServiceAccountToken: utilpointer.BoolPtr(false), - }, - } -} - func expectPodRejection(f *framework.Framework, pod *v1.Pod) { // The Node E2E doesn't run the RuntimeClass admission controller, so we expect the rejection to // happen by the Kubelet. diff --git a/test/e2e/framework/framework.go b/test/e2e/framework/framework.go index aafa4def823..0fbe3d129dd 100644 --- a/test/e2e/framework/framework.go +++ b/test/e2e/framework/framework.go @@ -877,18 +877,3 @@ func (cl *ClusterVerification) ForEach(podFunc func(v1.Pod)) error { return err } - -const ( - // preconfiguredRuntimeHandler is the name of the runtime handler that is expected to be - // preconfigured in the test environment. - preconfiguredRuntimeHandler = "test-handler" -) - -// PreconfiguredRuntimeClassHandler returns configured runtime handler. -func PreconfiguredRuntimeClassHandler() string { - if TestContext.ContainerRuntime == "docker" { - return TestContext.ContainerRuntime - } - - return preconfiguredRuntimeHandler -} diff --git a/test/e2e/framework/node/BUILD b/test/e2e/framework/node/BUILD index 95c56e2f1b2..e4d3dba0066 100644 --- a/test/e2e/framework/node/BUILD +++ b/test/e2e/framework/node/BUILD @@ -4,6 +4,7 @@ go_library( name = "go_default_library", srcs = [ "resource.go", + "runtimeclass.go", "wait.go", ], importpath = "k8s.io/kubernetes/test/e2e/framework/node", @@ -22,6 +23,8 @@ go_library( "//test/e2e/framework/log:go_default_library", "//test/e2e/system:go_default_library", "//test/utils:go_default_library", + "//test/utils/image:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/test/e2e/framework/node/runtimeclass.go b/test/e2e/framework/node/runtimeclass.go new file mode 100644 index 00000000000..a1381200373 --- /dev/null +++ b/test/e2e/framework/node/runtimeclass.go @@ -0,0 +1,56 @@ +/* +Copyright 2020 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 node + +import ( + "fmt" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + imageutils "k8s.io/kubernetes/test/utils/image" + utilpointer "k8s.io/utils/pointer" +) + +// PreconfiguredRuntimeClassHandler returns configured runtime handler. +func PreconfiguredRuntimeClassHandler(handler string) string { + if handler == "docker" { + return handler + } + + // test-handler is the name of the runtime handler that is expected to be + // preconfigured in the test environment. + return "test-handler" +} + +// NewRuntimeClassPod returns a test pod with the given runtimeClassName +func NewRuntimeClassPod(runtimeClassName string) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: fmt.Sprintf("test-runtimeclass-%s-", runtimeClassName), + }, + Spec: v1.PodSpec{ + RuntimeClassName: &runtimeClassName, + Containers: []v1.Container{{ + Name: "test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"true"}, + }}, + RestartPolicy: v1.RestartPolicyNever, + AutomountServiceAccountToken: utilpointer.BoolPtr(false), + }, + } +} diff --git a/test/e2e/node/BUILD b/test/e2e/node/BUILD index b256ff6c503..6e833e1fd3e 100644 --- a/test/e2e/node/BUILD +++ b/test/e2e/node/BUILD @@ -57,7 +57,6 @@ go_library( "//test/utils/image:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/test/e2e/node/runtimeclass.go b/test/e2e/node/runtimeclass.go index a25f718f93f..f60aa5900db 100644 --- a/test/e2e/node/runtimeclass.go +++ b/test/e2e/node/runtimeclass.go @@ -26,10 +26,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing" "k8s.io/kubernetes/test/e2e/framework" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" "k8s.io/kubernetes/test/e2e/scheduling" - imageutils "k8s.io/kubernetes/test/utils/image" - utilpointer "k8s.io/utils/pointer" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -45,12 +44,12 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { }, } - runtimeClass := newRuntimeClass(f.Namespace.Name, "conflict-runtimeclass") + runtimeClass := newRuntimeClass(f.Namespace.Name, "conflict-runtimeclass", framework.TestContext.ContainerRuntime) runtimeClass.Scheduling = scheduling rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{}) framework.ExpectNoError(err, "failed to create RuntimeClass resource") - pod := newRuntimeClassPod(rc.GetName()) + pod := e2enode.NewRuntimeClassPod(rc.GetName()) pod.Spec.NodeSelector = map[string]string{ "foo": "bar", } @@ -96,12 +95,12 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { defer framework.RemoveTaintOffNode(f.ClientSet, nodeName, taint) ginkgo.By("Trying to create runtimeclass and pod") - runtimeClass := newRuntimeClass(f.Namespace.Name, "non-conflict-runtimeclass") + runtimeClass := newRuntimeClass(f.Namespace.Name, "non-conflict-runtimeclass", framework.TestContext.ContainerRuntime) runtimeClass.Scheduling = scheduling rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{}) framework.ExpectNoError(err, "failed to create RuntimeClass resource") - pod := newRuntimeClassPod(rc.GetName()) + pod := e2enode.NewRuntimeClassPod(rc.GetName()) pod.Spec.NodeSelector = map[string]string{ "foo": "bar", } @@ -119,26 +118,7 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { }) // newRuntimeClass returns a test runtime class. -func newRuntimeClass(namespace, name string) *nodev1beta1.RuntimeClass { +func newRuntimeClass(namespace, name, handler string) *nodev1beta1.RuntimeClass { uniqueName := fmt.Sprintf("%s-%s", namespace, name) - return runtimeclasstest.NewRuntimeClass(uniqueName, framework.PreconfiguredRuntimeClassHandler()) -} - -// newRuntimeClassPod returns a test pod with the given runtimeClassName. -func newRuntimeClassPod(runtimeClassName string) *v1.Pod { - return &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - GenerateName: fmt.Sprintf("test-runtimeclass-%s-", runtimeClassName), - }, - Spec: v1.PodSpec{ - RuntimeClassName: &runtimeClassName, - Containers: []v1.Container{{ - Name: "test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"true"}, - }}, - RestartPolicy: v1.RestartPolicyNever, - AutomountServiceAccountToken: utilpointer.BoolPtr(false), - }, - } + return runtimeclasstest.NewRuntimeClass(uniqueName, e2enode.PreconfiguredRuntimeClassHandler(handler)) } diff --git a/test/e2e/scheduling/BUILD b/test/e2e/scheduling/BUILD index a7bec3e7646..f56619f835c 100644 --- a/test/e2e/scheduling/BUILD +++ b/test/e2e/scheduling/BUILD @@ -24,6 +24,7 @@ go_library( "//pkg/scheduler/util:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/node/v1beta1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",