From 76a72f6248896217ec489aa8efe9d94ed69af03f Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Fri, 24 Mar 2017 15:47:59 -0400 Subject: [PATCH] Move e2e fromManifest funcs to manifest package --- hack/.linted_packages | 1 + test/e2e/BUILD | 2 + test/e2e/e2e.go | 23 +---- test/e2e/framework/BUILD | 3 +- test/e2e/framework/ingress_utils.go | 25 ++---- test/e2e/framework/statefulset_utils.go | 44 +++------- test/e2e/manifest/BUILD | 37 ++++++++ test/e2e/manifest/manifest.go | 109 ++++++++++++++++++++++++ test/e2e/serviceloadbalancers.go | 44 +++------- 9 files changed, 184 insertions(+), 104 deletions(-) create mode 100644 test/e2e/manifest/BUILD create mode 100644 test/e2e/manifest/manifest.go diff --git a/hack/.linted_packages b/hack/.linted_packages index 734990b75cf..8b59a161dea 100644 --- a/hack/.linted_packages +++ b/hack/.linted_packages @@ -463,6 +463,7 @@ staging/src/k8s.io/metrics/pkg/apis/metrics/install staging/src/k8s.io/sample-apiserver staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install test/e2e/framework/ginkgowrapper +test/e2e/manifest test/e2e/perftype test/e2e_node/perftype test/e2e_node/runner/local diff --git a/test/e2e/BUILD b/test/e2e/BUILD index 4f9deb65fb8..c666c63429c 100644 --- a/test/e2e/BUILD +++ b/test/e2e/BUILD @@ -157,6 +157,7 @@ go_library( "//test/e2e/framework:go_default_library", "//test/e2e/framework/ginkgowrapper:go_default_library", "//test/e2e/generated:go_default_library", + "//test/e2e/manifest:go_default_library", "//test/e2e/perf:go_default_library", "//test/e2e/scheduling:go_default_library", "//test/e2e/upgrades:go_default_library", @@ -246,6 +247,7 @@ filegroup( "//test/e2e/extension:all-srcs", "//test/e2e/framework:all-srcs", "//test/e2e/generated:all-srcs", + "//test/e2e/manifest:all-srcs", "//test/e2e/perf:all-srcs", "//test/e2e/perftype:all-srcs", "//test/e2e/scheduling:all-srcs", diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 4475ed83a29..8b2158a9999 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -31,12 +31,8 @@ import ( "github.com/onsi/ginkgo/reporters" "github.com/onsi/gomega" - "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" runtimeutils "k8s.io/apimachinery/pkg/util/runtime" - utilyaml "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/cloudprovider/providers/azure" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" @@ -45,7 +41,7 @@ import ( commontest "k8s.io/kubernetes/test/e2e/common" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework/ginkgowrapper" - "k8s.io/kubernetes/test/e2e/generated" + "k8s.io/kubernetes/test/e2e/manifest" federationtest "k8s.io/kubernetes/test/e2e_federation" testutils "k8s.io/kubernetes/test/utils" ) @@ -341,25 +337,12 @@ func RunE2ETests(t *testing.T) { ginkgo.RunSpecsWithDefaultAndCustomReporters(t, "Kubernetes e2e suite", r) } -func podFromManifest(filename string) (*v1.Pod, error) { - var pod v1.Pod - framework.Logf("Parsing pod from %v", filename) - data := generated.ReadOrDie(filename) - json, err := utilyaml.ToJSON(data) - if err != nil { - return nil, err - } - if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &pod); err != nil { - return nil, err - } - return &pod, nil -} - // Run a test container to try and contact the Kubernetes api-server from a pod, wait for it // to flip to Ready, log its output and delete it. func runKubernetesServiceTestContainer(c clientset.Interface, ns string) { path := "test/images/clusterapi-tester/pod.yaml" - p, err := podFromManifest(path) + framework.Logf("Parsing pod from %v", path) + p, err := manifest.PodFromManifest(path) if err != nil { framework.Logf("Failed to parse clusterapi-tester from manifest %v: %v", path, err) return diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 333b510e43b..55e2812a6eb 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -80,7 +80,7 @@ go_library( "//plugin/pkg/scheduler/algorithm/predicates:go_default_library", "//plugin/pkg/scheduler/schedulercache:go_default_library", "//test/e2e/framework/ginkgowrapper:go_default_library", - "//test/e2e/generated:go_default_library", + "//test/e2e/manifest:go_default_library", "//test/e2e/perftype:go_default_library", "//test/utils:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", @@ -125,7 +125,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library", diff --git a/test/e2e/framework/ingress_utils.go b/test/e2e/framework/ingress_utils.go index 640ab91b522..92d0ef59f0c 100644 --- a/test/e2e/framework/ingress_utils.go +++ b/test/e2e/framework/ingress_utils.go @@ -27,7 +27,6 @@ import ( "encoding/pem" "fmt" "io" - "io/ioutil" "math/big" "net" "net/http" @@ -44,16 +43,14 @@ import ( apierrs "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" - utilyaml "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" "k8s.io/kubernetes/pkg/util" utilexec "k8s.io/kubernetes/pkg/util/exec" + "k8s.io/kubernetes/test/e2e/manifest" testutils "k8s.io/kubernetes/test/utils" . "github.com/onsi/ginkgo" @@ -825,14 +822,16 @@ func (j *IngressTestJig) CreateIngress(manifestPath, ns string, ingAnnotations m Logf("creating secret") RunKubectlOrDie("create", "-f", mkpath("secret.yaml"), fmt.Sprintf("--namespace=%v", ns)) } - j.Ingress = createIngressFromManifest(mkpath("ing.yaml")) + Logf("Parsing ingress from %v", filepath.Join(manifestPath, "ing.yaml")) + var err error + j.Ingress, err = manifest.IngressFromManifest(filepath.Join(manifestPath, "ing.yaml")) + ExpectNoError(err) j.Ingress.Namespace = ns j.Ingress.Annotations = map[string]string{ingressClass: j.Class} for k, v := range ingAnnotations { j.Ingress.Annotations[k] = v } Logf(fmt.Sprintf("creating" + j.Ingress.Name + " ingress")) - var err error j.Ingress, err = j.Client.Extensions().Ingresses(ns).Create(j.Ingress) ExpectNoError(err) } @@ -990,20 +989,6 @@ func (j *IngressTestJig) ConstructFirewallForIngress(gceController *GCEIngressCo return &fw } -// createIngressFromManifest reads a .json/yaml file and returns the rc in it. -func createIngressFromManifest(fileName string) *extensions.Ingress { - var ing extensions.Ingress - Logf("Parsing ingress from %v", fileName) - data, err := ioutil.ReadFile(fileName) - ExpectNoError(err) - - json, err := utilyaml.ToJSON(data) - ExpectNoError(err) - - ExpectNoError(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ing)) - return &ing -} - func (cont *GCEIngressController) getL7AddonUID() (string, error) { Logf("Retrieving UID from config map: %v/%v", metav1.NamespaceSystem, uidConfigMap) cm, err := cont.Client.Core().ConfigMaps(metav1.NamespaceSystem).Get(uidConfigMap, metav1.GetOptions{}) diff --git a/test/e2e/framework/statefulset_utils.go b/test/e2e/framework/statefulset_utils.go index e7f6c88c292..8d1e70baf7c 100644 --- a/test/e2e/framework/statefulset_utils.go +++ b/test/e2e/framework/statefulset_utils.go @@ -27,21 +27,17 @@ import ( . "github.com/onsi/gomega" + apps "k8s.io/api/apps/v1beta1" + "k8s.io/api/core/v1" apierrs "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" - utilyaml "k8s.io/apimachinery/pkg/util/yaml" - - apps "k8s.io/api/apps/v1beta1" - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/api" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" - "k8s.io/kubernetes/test/e2e/generated" + "k8s.io/kubernetes/test/e2e/manifest" ) const ( @@ -70,24 +66,6 @@ func CreateStatefulSetService(name string, labels map[string]string) *v1.Service return headlessService } -// StatefulSetFromManifest returns a StatefulSet from a manifest stored in fileName in the Namespace indicated by ns. -func StatefulSetFromManifest(fileName, ns string) *apps.StatefulSet { - var ss apps.StatefulSet - Logf("Parsing statefulset from %v", fileName) - data := generated.ReadOrDie(fileName) - json, err := utilyaml.ToJSON(data) - Expect(err).NotTo(HaveOccurred()) - - Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ss)).NotTo(HaveOccurred()) - ss.Namespace = ns - if ss.Spec.Selector == nil { - ss.Spec.Selector = &metav1.LabelSelector{ - MatchLabels: ss.Spec.Template.Labels, - } - } - return &ss -} - // StatefulSetTester is a struct that contains utility methods for testing StatefulSet related functionality. It uses a // clientset.Interface to communicate with the API server. type StatefulSetTester struct { @@ -113,15 +91,21 @@ func (s *StatefulSetTester) CreateStatefulSet(manifestPath, ns string) *apps.Sta mkpath := func(file string) string { return filepath.Join(manifestPath, file) } - ss := StatefulSetFromManifest(mkpath("statefulset.yaml"), ns) - svcYaml := generated.ReadOrDie(mkpath("service.yaml")) - ssYaml := generated.ReadOrDie(mkpath("statefulset.yaml")) + + Logf("Parsing statefulset from %v", mkpath("statefulset.yaml")) + ss, err := manifest.StatefulSetFromManifest(mkpath("statefulset.yaml"), ns) + Expect(err).NotTo(HaveOccurred()) + Logf("Parsing service from %v", mkpath("service.yaml")) + svc, err := manifest.SvcFromManifest(mkpath("service.yaml")) + Expect(err).NotTo(HaveOccurred()) Logf(fmt.Sprintf("creating " + ss.Name + " service")) - RunKubectlOrDieInput(string(svcYaml[:]), "create", "-f", "-", fmt.Sprintf("--namespace=%v", ns)) + _, err = s.c.CoreV1().Services(ns).Create(svc) + Expect(err).NotTo(HaveOccurred()) Logf(fmt.Sprintf("creating statefulset %v/%v with %d replicas and selector %+v", ss.Namespace, ss.Name, *(ss.Spec.Replicas), ss.Spec.Selector)) - RunKubectlOrDieInput(string(ssYaml[:]), "create", "-f", "-", fmt.Sprintf("--namespace=%v", ns)) + _, err = s.c.AppsV1beta1().StatefulSets(ns).Create(ss) + Expect(err).NotTo(HaveOccurred()) s.WaitForRunningAndReady(*ss.Spec.Replicas, ss) return ss } diff --git a/test/e2e/manifest/BUILD b/test/e2e/manifest/BUILD new file mode 100644 index 00000000000..42091e3198d --- /dev/null +++ b/test/e2e/manifest/BUILD @@ -0,0 +1,37 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["manifest.go"], + tags = ["automanaged"], + deps = [ + "//pkg/api:go_default_library", + "//test/e2e/generated:go_default_library", + "//vendor/k8s.io/api/apps/v1beta1:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/test/e2e/manifest/manifest.go b/test/e2e/manifest/manifest.go new file mode 100644 index 00000000000..9d7130f4d89 --- /dev/null +++ b/test/e2e/manifest/manifest.go @@ -0,0 +1,109 @@ +/* +Copyright 2017 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 manifest + +import ( + apps "k8s.io/api/apps/v1beta1" + "k8s.io/api/core/v1" + extensions "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + utilyaml "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/test/e2e/generated" +) + +// PodFromManifest reads a .json/yaml file and returns the pod in it. +func PodFromManifest(filename string) (*v1.Pod, error) { + var pod v1.Pod + data := generated.ReadOrDie(filename) + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &pod); err != nil { + return nil, err + } + return &pod, nil +} + +// RcFromManifest reads a .json/yaml file and returns the rc in it. +func RcFromManifest(fileName string) (*v1.ReplicationController, error) { + var controller v1.ReplicationController + data := generated.ReadOrDie(fileName) + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &controller); err != nil { + return nil, err + } + return &controller, nil +} + +// SvcFromManifest reads a .json/yaml file and returns the service in it. +func SvcFromManifest(fileName string) (*v1.Service, error) { + var svc v1.Service + data := generated.ReadOrDie(fileName) + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &svc); err != nil { + return nil, err + } + return &svc, nil +} + +// IngressFromManifest reads a .json/yaml file and returns the ingress in it. +func IngressFromManifest(fileName string) (*extensions.Ingress, error) { + var ing extensions.Ingress + data := generated.ReadOrDie(fileName) + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ing); err != nil { + return nil, err + } + return &ing, nil +} + +// StatefulSetFromManifest returns a StatefulSet from a manifest stored in fileName in the Namespace indicated by ns. +func StatefulSetFromManifest(fileName, ns string) (*apps.StatefulSet, error) { + var ss apps.StatefulSet + data := generated.ReadOrDie(fileName) + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ss); err != nil { + return nil, err + } + ss.Namespace = ns + if ss.Spec.Selector == nil { + ss.Spec.Selector = &metav1.LabelSelector{ + MatchLabels: ss.Spec.Template.Labels, + } + } + return &ss, nil +} diff --git a/test/e2e/serviceloadbalancers.go b/test/e2e/serviceloadbalancers.go index 7312e056b95..e244567261f 100644 --- a/test/e2e/serviceloadbalancers.go +++ b/test/e2e/serviceloadbalancers.go @@ -23,13 +23,11 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/wait" - utilyaml "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/generated" + "k8s.io/kubernetes/test/e2e/manifest" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -88,7 +86,9 @@ func (h *haproxyControllerTester) getName() string { func (h *haproxyControllerTester) start(namespace string) (err error) { // Create a replication controller with the given configuration. - rc := rcFromManifest(h.cfg) + framework.Logf("Parsing rc from %v", h.cfg) + rc, err := manifest.RcFromManifest(h.cfg) + Expect(err).NotTo(HaveOccurred()) rc.Namespace = namespace rc.Spec.Template.Labels["name"] = rc.Name @@ -164,7 +164,10 @@ func (s *ingManager) getName() string { func (s *ingManager) start(namespace string) (err error) { // Create rcs for _, rcPath := range s.rcCfgPaths { - rc := rcFromManifest(rcPath) + framework.Logf("Parsing rc from %v", rcPath) + var rc *v1.ReplicationController + rc, err = manifest.RcFromManifest(rcPath) + Expect(err).NotTo(HaveOccurred()) rc.Namespace = namespace rc.Spec.Template.Labels["name"] = rc.Name rc, err = s.client.Core().ReplicationControllers(rc.Namespace).Create(rc) @@ -179,7 +182,10 @@ func (s *ingManager) start(namespace string) (err error) { // Note that it's up to the caller to make sure the service actually matches // the pods of the rc. for _, svcPath := range s.svcCfgPaths { - svc := svcFromManifest(svcPath) + framework.Logf("Parsing service from %v", svcPath) + var svc *v1.Service + svc, err = manifest.SvcFromManifest(svcPath) + Expect(err).NotTo(HaveOccurred()) svc.Namespace = namespace svc, err = s.client.Core().Services(svc.Namespace).Create(svc) if err != nil { @@ -238,29 +244,3 @@ var _ = framework.KubeDescribe("ServiceLoadBalancer [Feature:ServiceLoadBalancer } }) }) - -// rcFromManifest reads a .json/yaml file and returns the rc in it. -func rcFromManifest(fileName string) *v1.ReplicationController { - var controller v1.ReplicationController - framework.Logf("Parsing rc from %v", fileName) - data := generated.ReadOrDie(fileName) - - json, err := utilyaml.ToJSON(data) - Expect(err).NotTo(HaveOccurred()) - - Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &controller)).NotTo(HaveOccurred()) - return &controller -} - -// svcFromManifest reads a .json/yaml file and returns the rc in it. -func svcFromManifest(fileName string) *v1.Service { - var svc v1.Service - framework.Logf("Parsing service from %v", fileName) - data := generated.ReadOrDie(fileName) - - json, err := utilyaml.ToJSON(data) - Expect(err).NotTo(HaveOccurred()) - - Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &svc)).NotTo(HaveOccurred()) - return &svc -}