mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	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 <eric.ernst@intel.com>
This commit is contained in:
		@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								test/e2e/framework/node/runtimeclass.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								test/e2e/framework/node/runtimeclass.go
									
									
									
									
									
										Normal file
									
								
							@@ -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),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user