From 4147d727a67a9c67a3511faeafacd9870d2cce75 Mon Sep 17 00:00:00 2001 From: Jorge Alarcon Ochoa Date: Wed, 8 May 2019 11:07:14 -0400 Subject: [PATCH] Refactored runtime.Object helper functions into subpkg Organized functions that abstract the access of k8s.io/apimachinery/pkg/runtime.Objects into a framework subpackge. Signed-off-by: Jorge Alarcon Ochoa --- test/e2e/framework/BUILD | 7 +- test/e2e/framework/pod/BUILD | 10 +- test/e2e/framework/pod/wait.go | 11 ++- test/e2e/framework/resource/BUILD | 37 +++++++ .../runtimeobj.go} | 19 ++-- test/e2e/framework/util.go | 96 +------------------ 6 files changed, 59 insertions(+), 121 deletions(-) create mode 100644 test/e2e/framework/resource/BUILD rename test/e2e/framework/{pod/runtimeobject.go => resource/runtimeobj.go} (88%) diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 22ad397f8a5..daa7b15dd91 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -34,10 +34,7 @@ go_library( importpath = "k8s.io/kubernetes/test/e2e/framework", deps = [ "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/batch:go_default_library", "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", "//pkg/apis/storage/v1/util:go_default_library", "//pkg/client/conditions:go_default_library", "//pkg/controller:go_default_library", @@ -60,9 +57,7 @@ go_library( "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", "//staging/src/k8s.io/api/rbac/v1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library", @@ -109,6 +104,7 @@ go_library( "//test/e2e/framework/metrics:go_default_library", "//test/e2e/framework/node:go_default_library", "//test/e2e/framework/pod:go_default_library", + "//test/e2e/framework/resource:go_default_library", "//test/e2e/framework/ssh:go_default_library", "//test/e2e/framework/testfiles:go_default_library", "//test/e2e/manifest:go_default_library", @@ -160,6 +156,7 @@ filegroup( "//test/e2e/framework/providers/openstack:all-srcs", "//test/e2e/framework/providers/vsphere:all-srcs", "//test/e2e/framework/replicaset:all-srcs", + "//test/e2e/framework/resource:all-srcs", "//test/e2e/framework/ssh:all-srcs", "//test/e2e/framework/testfiles:all-srcs", "//test/e2e/framework/timer:all-srcs", diff --git a/test/e2e/framework/pod/BUILD b/test/e2e/framework/pod/BUILD index 6e190f2219f..24d8581c481 100644 --- a/test/e2e/framework/pod/BUILD +++ b/test/e2e/framework/pod/BUILD @@ -4,35 +4,27 @@ go_library( name = "go_default_library", srcs = [ "resource.go", - "runtimeobject.go", "wait.go", ], importpath = "k8s.io/kubernetes/test/e2e/framework/pod", visibility = ["//visibility:public"], deps = [ "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", "//pkg/client/conditions:go_default_library", "//pkg/controller:go_default_library", "//pkg/kubelet/pod:go_default_library", "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//test/e2e/framework/log:go_default_library", + "//test/e2e/framework/resource:go_default_library", "//test/utils:go_default_library", "//test/utils/image:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", diff --git a/test/e2e/framework/pod/wait.go b/test/e2e/framework/pod/wait.go index 392ddf81004..5b63418c8de 100644 --- a/test/e2e/framework/pod/wait.go +++ b/test/e2e/framework/pod/wait.go @@ -38,6 +38,7 @@ import ( "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/kubelet/util/format" e2elog "k8s.io/kubernetes/test/e2e/framework/log" + e2eresource "k8s.io/kubernetes/test/e2e/framework/resource" testutils "k8s.io/kubernetes/test/utils" ) @@ -456,15 +457,15 @@ func PodsResponding(c clientset.Interface, ns, name string, wantName bool, pods // WaitForControlledPodsRunning waits up to 10 minutes for pods to become Running. func WaitForControlledPodsRunning(c clientset.Interface, ns, name string, kind schema.GroupKind) error { - rtObject, err := getRuntimeObjectForKind(c, kind, ns, name) + rtObject, err := e2eresource.GetRuntimeObjectForKind(c, kind, ns, name) if err != nil { return err } - selector, err := getSelectorFromRuntimeObject(rtObject) + selector, err := e2eresource.GetSelectorFromRuntimeObject(rtObject) if err != nil { return err } - replicas, err := getReplicasFromRuntimeObject(rtObject) + replicas, err := e2eresource.GetReplicasFromRuntimeObject(rtObject) if err != nil { return err } @@ -477,11 +478,11 @@ func WaitForControlledPodsRunning(c clientset.Interface, ns, name string, kind s // WaitForControlledPods waits up to podListTimeout for getting pods of the specified controller name and return them. func WaitForControlledPods(c clientset.Interface, ns, name string, kind schema.GroupKind) (pods *v1.PodList, err error) { - rtObject, err := getRuntimeObjectForKind(c, kind, ns, name) + rtObject, err := e2eresource.GetRuntimeObjectForKind(c, kind, ns, name) if err != nil { return nil, err } - selector, err := getSelectorFromRuntimeObject(rtObject) + selector, err := e2eresource.GetSelectorFromRuntimeObject(rtObject) if err != nil { return nil, err } diff --git a/test/e2e/framework/resource/BUILD b/test/e2e/framework/resource/BUILD new file mode 100644 index 00000000000..6f0409cdb02 --- /dev/null +++ b/test/e2e/framework/resource/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["runtimeobj.go"], + importpath = "k8s.io/kubernetes/test/e2e/framework/resource", + visibility = ["//visibility:public"], + deps = [ + "//pkg/apis/apps:go_default_library", + "//pkg/apis/batch:go_default_library", + "//pkg/apis/core:go_default_library", + "//pkg/apis/extensions:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes: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/e2e/framework/pod/runtimeobject.go b/test/e2e/framework/resource/runtimeobj.go similarity index 88% rename from test/e2e/framework/pod/runtimeobject.go rename to test/e2e/framework/resource/runtimeobj.go index e6e5100da40..3f7c322b14e 100644 --- a/test/e2e/framework/pod/runtimeobject.go +++ b/test/e2e/framework/resource/runtimeobj.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package pod +package resource import ( "fmt" @@ -34,9 +34,9 @@ import ( extensionsinternal "k8s.io/kubernetes/pkg/apis/extensions" ) -// TODO: This function is generic enough and used enough that it should be -// moved to its own subpkg. -func getRuntimeObjectForKind(c clientset.Interface, kind schema.GroupKind, ns, name string) (runtime.Object, error) { +// GetRuntimeObjectForKind returns a runtime.Object based on its GroupKind, +// namespace and name. +func GetRuntimeObjectForKind(c clientset.Interface, kind schema.GroupKind, ns, name string) (runtime.Object, error) { switch kind { case api.Kind("ReplicationController"): return c.CoreV1().ReplicationControllers(ns).Get(name, metav1.GetOptions{}) @@ -53,9 +53,8 @@ func getRuntimeObjectForKind(c clientset.Interface, kind schema.GroupKind, ns, n } } -// TODO: This function is generic enough and used enough that it should be -// moved to its own subpkg. -func getSelectorFromRuntimeObject(obj runtime.Object) (labels.Selector, error) { +// GetSelectorFromRuntimeObject returns the labels for the given object. +func GetSelectorFromRuntimeObject(obj runtime.Object) (labels.Selector, error) { switch typed := obj.(type) { case *v1.ReplicationController: return labels.SelectorFromSet(typed.Spec.Selector), nil @@ -78,9 +77,9 @@ func getSelectorFromRuntimeObject(obj runtime.Object) (labels.Selector, error) { } } -// TODO: This function is generic enough and used enough that it should be -// moved to its own subpkg. -func getReplicasFromRuntimeObject(obj runtime.Object) (int32, error) { +// GetReplicasFromRuntimeObject returns the number of replicas for the given +// object. +func GetReplicasFromRuntimeObject(obj runtime.Object) (int32, error) { switch typed := obj.(type) { case *v1.ReplicationController: if typed.Spec.Replicas != nil { diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 5e1345a1467..b310e317d12 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -48,9 +48,7 @@ import ( gomegatypes "github.com/onsi/gomega/types" appsv1 "k8s.io/api/apps/v1" - batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" - extensionsv1beta1 "k8s.io/api/extensions/v1beta1" apierrs "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -74,10 +72,6 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" watchtools "k8s.io/client-go/tools/watch" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - appsinternal "k8s.io/kubernetes/pkg/apis/apps" - batchinternal "k8s.io/kubernetes/pkg/apis/batch" - api "k8s.io/kubernetes/pkg/apis/core" - extensionsinternal "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/conditions" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/service" @@ -91,6 +85,7 @@ import ( e2elog "k8s.io/kubernetes/test/e2e/framework/log" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2eresource "k8s.io/kubernetes/test/e2e/framework/resource" e2essh "k8s.io/kubernetes/test/e2e/framework/ssh" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -2226,94 +2221,11 @@ func ScaleResource( return e2epod.WaitForControlledPodsRunning(clientset, ns, name, kind) } -func getRuntimeObjectForKind(c clientset.Interface, kind schema.GroupKind, ns, name string) (runtime.Object, error) { - switch kind { - case api.Kind("ReplicationController"): - return c.CoreV1().ReplicationControllers(ns).Get(name, metav1.GetOptions{}) - case extensionsinternal.Kind("ReplicaSet"), appsinternal.Kind("ReplicaSet"): - return c.AppsV1().ReplicaSets(ns).Get(name, metav1.GetOptions{}) - case extensionsinternal.Kind("Deployment"), appsinternal.Kind("Deployment"): - return c.AppsV1().Deployments(ns).Get(name, metav1.GetOptions{}) - case extensionsinternal.Kind("DaemonSet"): - return c.AppsV1().DaemonSets(ns).Get(name, metav1.GetOptions{}) - case batchinternal.Kind("Job"): - return c.BatchV1().Jobs(ns).Get(name, metav1.GetOptions{}) - default: - return nil, fmt.Errorf("Unsupported kind when getting runtime object: %v", kind) - } -} - -func getSelectorFromRuntimeObject(obj runtime.Object) (labels.Selector, error) { - switch typed := obj.(type) { - case *v1.ReplicationController: - return labels.SelectorFromSet(typed.Spec.Selector), nil - case *extensionsv1beta1.ReplicaSet: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *appsv1.ReplicaSet: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *extensionsv1beta1.Deployment: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *appsv1.Deployment: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *extensionsv1beta1.DaemonSet: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *appsv1.DaemonSet: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - case *batchv1.Job: - return metav1.LabelSelectorAsSelector(typed.Spec.Selector) - default: - return nil, fmt.Errorf("Unsupported kind when getting selector: %v", obj) - } -} - -func getReplicasFromRuntimeObject(obj runtime.Object) (int32, error) { - switch typed := obj.(type) { - case *v1.ReplicationController: - if typed.Spec.Replicas != nil { - return *typed.Spec.Replicas, nil - } - return 0, nil - case *extensionsv1beta1.ReplicaSet: - if typed.Spec.Replicas != nil { - return *typed.Spec.Replicas, nil - } - return 0, nil - case *appsv1.ReplicaSet: - if typed.Spec.Replicas != nil { - return *typed.Spec.Replicas, nil - } - return 0, nil - case *extensionsv1beta1.Deployment: - if typed.Spec.Replicas != nil { - return *typed.Spec.Replicas, nil - } - return 0, nil - case *appsv1.Deployment: - if typed.Spec.Replicas != nil { - return *typed.Spec.Replicas, nil - } - return 0, nil - case *extensionsv1beta1.DaemonSet: - return 0, nil - case *appsv1.DaemonSet: - return 0, nil - case *batchv1.Job: - // TODO: currently we use pause pods so that's OK. When we'll want to switch to Pods - // that actually finish we need a better way to do this. - if typed.Spec.Parallelism != nil { - return *typed.Spec.Parallelism, nil - } - return 0, nil - default: - return -1, fmt.Errorf("Unsupported kind when getting number of replicas: %v", obj) - } -} - // DeleteResourceAndWaitForGC deletes only given resource and waits for GC to delete the pods. func DeleteResourceAndWaitForGC(c clientset.Interface, kind schema.GroupKind, ns, name string) error { ginkgo.By(fmt.Sprintf("deleting %v %s in namespace %s, will wait for the garbage collector to delete the pods", kind, name, ns)) - rtObject, err := getRuntimeObjectForKind(c, kind, ns, name) + rtObject, err := e2eresource.GetRuntimeObjectForKind(c, kind, ns, name) if err != nil { if apierrs.IsNotFound(err) { e2elog.Logf("%v %s not found: %v", kind, name, err) @@ -2321,11 +2233,11 @@ func DeleteResourceAndWaitForGC(c clientset.Interface, kind schema.GroupKind, ns } return err } - selector, err := getSelectorFromRuntimeObject(rtObject) + selector, err := e2eresource.GetSelectorFromRuntimeObject(rtObject) if err != nil { return err } - replicas, err := getReplicasFromRuntimeObject(rtObject) + replicas, err := e2eresource.GetReplicasFromRuntimeObject(rtObject) if err != nil { return err }