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"
 | 
						runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
	e2eevents "k8s.io/kubernetes/test/e2e/framework/events"
 | 
						e2eevents "k8s.io/kubernetes/test/e2e/framework/events"
 | 
				
			||||||
 | 
						e2enode "k8s.io/kubernetes/test/e2e/framework/node"
 | 
				
			||||||
	e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
 | 
						e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
 | 
				
			||||||
	imageutils "k8s.io/kubernetes/test/utils/image"
 | 
					 | 
				
			||||||
	utilpointer "k8s.io/utils/pointer"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/onsi/ginkgo"
 | 
						"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() {
 | 
						ginkgo.It("should reject a Pod requesting a non-existent RuntimeClass", func() {
 | 
				
			||||||
		rcName := f.Namespace.Name + "-nonexistent"
 | 
							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() {
 | 
						ginkgo.It("should reject a Pod requesting a RuntimeClass with an unconfigured handler", func() {
 | 
				
			||||||
		handler := f.Namespace.Name + "-handler"
 | 
							handler := f.Namespace.Name + "-handler"
 | 
				
			||||||
		rcName := createRuntimeClass(f, "unconfigured-handler", handler)
 | 
							rcName := createRuntimeClass(f, "unconfigured-handler", handler)
 | 
				
			||||||
		pod := f.PodClient().Create(newRuntimeClassPod(rcName))
 | 
							pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName))
 | 
				
			||||||
		expectSandboxFailureEvent(f, pod, handler)
 | 
							expectSandboxFailureEvent(f, pod, handler)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// This test requires that the PreconfiguredRuntimeHandler has already been set up on nodes.
 | 
						// 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() {
 | 
						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.
 | 
							// 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)
 | 
							rcName := createRuntimeClass(f, "preconfigured-handler", handler)
 | 
				
			||||||
		pod := f.PodClient().Create(newRuntimeClassPod(rcName))
 | 
							pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName))
 | 
				
			||||||
		expectPodSuccess(f, pod)
 | 
							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()
 | 
						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) {
 | 
					func expectPodRejection(f *framework.Framework, pod *v1.Pod) {
 | 
				
			||||||
	// The Node E2E doesn't run the RuntimeClass admission controller, so we expect the rejection to
 | 
						// The Node E2E doesn't run the RuntimeClass admission controller, so we expect the rejection to
 | 
				
			||||||
	// happen by the Kubelet.
 | 
						// happen by the Kubelet.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -877,18 +877,3 @@ func (cl *ClusterVerification) ForEach(podFunc func(v1.Pod)) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return err
 | 
						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",
 | 
					    name = "go_default_library",
 | 
				
			||||||
    srcs = [
 | 
					    srcs = [
 | 
				
			||||||
        "resource.go",
 | 
					        "resource.go",
 | 
				
			||||||
 | 
					        "runtimeclass.go",
 | 
				
			||||||
        "wait.go",
 | 
					        "wait.go",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    importpath = "k8s.io/kubernetes/test/e2e/framework/node",
 | 
					    importpath = "k8s.io/kubernetes/test/e2e/framework/node",
 | 
				
			||||||
@@ -22,6 +23,8 @@ go_library(
 | 
				
			|||||||
        "//test/e2e/framework/log:go_default_library",
 | 
					        "//test/e2e/framework/log:go_default_library",
 | 
				
			||||||
        "//test/e2e/system:go_default_library",
 | 
					        "//test/e2e/system:go_default_library",
 | 
				
			||||||
        "//test/utils: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",
 | 
					        "//test/utils/image:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
					        "//vendor/github.com/onsi/ginkgo:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/onsi/gomega: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"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing"
 | 
						runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
 | 
						e2enode "k8s.io/kubernetes/test/e2e/framework/node"
 | 
				
			||||||
	e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
 | 
						e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/scheduling"
 | 
						"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/ginkgo"
 | 
				
			||||||
	"github.com/onsi/gomega"
 | 
						"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
 | 
							runtimeClass.Scheduling = scheduling
 | 
				
			||||||
		rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{})
 | 
							rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{})
 | 
				
			||||||
		framework.ExpectNoError(err, "failed to create RuntimeClass resource")
 | 
							framework.ExpectNoError(err, "failed to create RuntimeClass resource")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pod := newRuntimeClassPod(rc.GetName())
 | 
							pod := e2enode.NewRuntimeClassPod(rc.GetName())
 | 
				
			||||||
		pod.Spec.NodeSelector = map[string]string{
 | 
							pod.Spec.NodeSelector = map[string]string{
 | 
				
			||||||
			"foo": "bar",
 | 
								"foo": "bar",
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -96,12 +95,12 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() {
 | 
				
			|||||||
		defer framework.RemoveTaintOffNode(f.ClientSet, nodeName, taint)
 | 
							defer framework.RemoveTaintOffNode(f.ClientSet, nodeName, taint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ginkgo.By("Trying to create runtimeclass and pod")
 | 
							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
 | 
							runtimeClass.Scheduling = scheduling
 | 
				
			||||||
		rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{})
 | 
							rc, err := f.ClientSet.NodeV1beta1().RuntimeClasses().Create(context.TODO(), runtimeClass, metav1.CreateOptions{})
 | 
				
			||||||
		framework.ExpectNoError(err, "failed to create RuntimeClass resource")
 | 
							framework.ExpectNoError(err, "failed to create RuntimeClass resource")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pod := newRuntimeClassPod(rc.GetName())
 | 
							pod := e2enode.NewRuntimeClassPod(rc.GetName())
 | 
				
			||||||
		pod.Spec.NodeSelector = map[string]string{
 | 
							pod.Spec.NodeSelector = map[string]string{
 | 
				
			||||||
			"foo": "bar",
 | 
								"foo": "bar",
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -119,26 +118,7 @@ var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// newRuntimeClass returns a test runtime class.
 | 
					// 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)
 | 
						uniqueName := fmt.Sprintf("%s-%s", namespace, name)
 | 
				
			||||||
	return runtimeclasstest.NewRuntimeClass(uniqueName, framework.PreconfiguredRuntimeClassHandler())
 | 
						return runtimeclasstest.NewRuntimeClass(uniqueName, e2enode.PreconfiguredRuntimeClassHandler(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),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ go_library(
 | 
				
			|||||||
        "//pkg/scheduler/util:go_default_library",
 | 
					        "//pkg/scheduler/util:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/api/apps/v1: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/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/api/scheduling/v1:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/apimachinery/pkg/api/errors: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",
 | 
					        "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user