From fd8758b047855699e4672c3417e21cb837f5f414 Mon Sep 17 00:00:00 2001 From: dhilipkumars Date: Sun, 12 Nov 2017 15:10:57 +0530 Subject: [PATCH] Extend apiserver testserver such that in can be used in integration tests abstract out etcd server creation test/integration/framework: cleanup master_utils.go kube-apiserver: move StartTestServer tests into test/integration/master Fix the failing scale test kube-apiserver's TestServer now returns a struct instead of individual values --- cmd/kube-apiserver/app/testing/BUILD | 29 +------ cmd/kube-apiserver/app/testing/testserver.go | 79 +++++++++++-------- test/integration/framework/etcd.go | 4 +- test/integration/framework/master_utils.go | 75 ++---------------- test/integration/framework/util.go | 74 +++++++++++++++++ test/integration/garbagecollector/BUILD | 7 +- .../garbage_collector_test.go | 31 ++------ .../integration/garbagecollector/main_test.go | 27 +++++++ test/integration/master/BUILD | 17 +++- .../integration/master/crd_test.go | 70 +++------------- .../integration/master/kube_apiserver_test.go | 74 +++++++++++++++++ ...aster_test.go => synthetic_master_test.go} | 0 test/integration/scale/BUILD | 1 + test/integration/scale/scale_test.go | 17 ++-- 14 files changed, 284 insertions(+), 221 deletions(-) create mode 100644 test/integration/garbagecollector/main_test.go rename cmd/kube-apiserver/app/testing/server_test.go => test/integration/master/crd_test.go (87%) create mode 100644 test/integration/master/kube_apiserver_test.go rename test/integration/master/{master_test.go => synthetic_master_test.go} (100%) diff --git a/cmd/kube-apiserver/app/testing/BUILD b/cmd/kube-apiserver/app/testing/BUILD index 3ef1e2f6ae4..81763ecbaaf 100644 --- a/cmd/kube-apiserver/app/testing/BUILD +++ b/cmd/kube-apiserver/app/testing/BUILD @@ -3,32 +3,6 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["server_test.go"], - importpath = "k8s.io/kubernetes/cmd/kube-apiserver/app/testing", - library = ":go_default_library", - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1: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/networking/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], ) go_library( @@ -38,9 +12,10 @@ go_library( deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", + "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library", + "//vendor/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", ], diff --git a/cmd/kube-apiserver/app/testing/testserver.go b/cmd/kube-apiserver/app/testing/testserver.go index 955ae9a4d00..469111185e5 100644 --- a/cmd/kube-apiserver/app/testing/testserver.go +++ b/cmd/kube-apiserver/app/testing/testserver.go @@ -21,13 +21,14 @@ import ( "io/ioutil" "net" "os" - "strings" "testing" "time" + pflag "github.com/spf13/pflag" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/registry/generic/registry" - etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" + "k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/cmd/kube-apiserver/app" @@ -37,15 +38,21 @@ import ( // TearDownFunc is to be called to tear down a test server. type TearDownFunc func() -// StartTestServer starts a etcd server and kube-apiserver. A rest client config and a tear-down func -// are returned. +// TestServer return values supplied by kube-test-ApiServer +type TestServer struct { + ClientConfig *restclient.Config // Rest client config + ServerOpts *options.ServerRunOptions // ServerOpts + TearDownFn TearDownFunc // TearDown function + TmpDir string // Temp Dir used, by the apiserver +} + +// StartTestServer starts a etcd server and kube-apiserver. A rest client config and a tear-down func, +// and location of the tmpdir are returned. // // Note: we return a tear-down func instead of a stop channel because the later will leak temporariy // files that becaues Golang testing's call to os.Exit will not give a stop channel go routine // enough time to remove temporariy files. -func StartTestServer(t *testing.T) (result *restclient.Config, tearDownForCaller TearDownFunc, err error) { - var tmpDir string - var etcdServer *etcdtesting.EtcdTestServer +func StartTestServer(t *testing.T, customFlags []string, storageConfig *storagebackend.Config) (result TestServer, err error) { // TODO : Remove TrackStorageCleanup below when PR // https://github.com/kubernetes/kubernetes/pull/50690 @@ -56,46 +63,45 @@ func StartTestServer(t *testing.T) (result *restclient.Config, tearDownForCaller tearDown := func() { registry.CleanupStorage() close(stopCh) - if etcdServer != nil { - etcdServer.Terminate(t) - } - if len(tmpDir) != 0 { - os.RemoveAll(tmpDir) + if len(result.TmpDir) != 0 { + os.RemoveAll(result.TmpDir) } } defer func() { - if tearDownForCaller == nil { + if result.TearDownFn == nil { tearDown() } }() - t.Logf("Starting etcd...") - etcdServer, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) - - tmpDir, err = ioutil.TempDir("", "kubernetes-kube-apiserver") + result.TmpDir, err = ioutil.TempDir("", "kubernetes-kube-apiserver") if err != nil { - return nil, nil, fmt.Errorf("failed to create temp dir: %v", err) + return result, fmt.Errorf("failed to create temp dir: %v", err) } + fs := pflag.NewFlagSet("test", pflag.PanicOnError) + s := options.NewServerRunOptions() + s.AddFlags(fs) + s.InsecureServing.BindPort = 0 + s.SecureServing.Listener, s.SecureServing.BindPort, err = createListenerOnFreePort() if err != nil { - return nil, nil, fmt.Errorf("failed to create listener: %v", err) + return result, fmt.Errorf("failed to create listener: %v", err) } - - s.SecureServing.ServerCert.CertDirectory = tmpDir + s.SecureServing.ServerCert.CertDirectory = result.TmpDir s.ServiceClusterIPRange.IP = net.IPv4(10, 0, 0, 0) s.ServiceClusterIPRange.Mask = net.CIDRMask(16, 32) s.Etcd.StorageConfig = *storageConfig - s.Etcd.DefaultStorageMediaType = "application/json" - s.Admission.PluginNames = strings.Split("Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds", ",") s.APIEnablement.RuntimeConfig.Set("api/all=true") + fs.Parse(customFlags) + t.Logf("Starting kube-apiserver on port %d...", s.SecureServing.BindPort) server, err := app.CreateServerChain(s, stopCh) if err != nil { - return nil, nil, fmt.Errorf("failed to create server chain: %v", err) + return result, fmt.Errorf("failed to create server chain: %v", err) + } go func(stopCh <-chan struct{}) { if err := server.PrepareRun().Run(stopCh); err != nil { @@ -104,9 +110,10 @@ func StartTestServer(t *testing.T) (result *restclient.Config, tearDownForCaller }(stopCh) t.Logf("Waiting for /healthz to be ok...") + client, err := kubernetes.NewForConfig(server.LoopbackClientConfig) if err != nil { - return nil, nil, fmt.Errorf("failed to create a client: %v", err) + return result, fmt.Errorf("failed to create a client: %v", err) } err = wait.Poll(100*time.Millisecond, 30*time.Second, func() (bool, error) { result := client.CoreV1().RESTClient().Get().AbsPath("/healthz").Do() @@ -118,23 +125,27 @@ func StartTestServer(t *testing.T) (result *restclient.Config, tearDownForCaller return false, nil }) if err != nil { - return nil, nil, fmt.Errorf("failed to wait for /healthz to return ok: %v", err) + return result, fmt.Errorf("failed to wait for /healthz to return ok: %v", err) } // from here the caller must call tearDown - return server.LoopbackClientConfig, tearDown, nil + result.ClientConfig = server.LoopbackClientConfig + result.ServerOpts = s + result.TearDownFn = tearDown + + return result, nil } -// StartTestServerOrDie calls StartTestServer with up to 5 retries on bind error and dies with -// t.Fatal if it does not succeed. -func StartTestServerOrDie(t *testing.T) (*restclient.Config, TearDownFunc) { - config, td, err := StartTestServer(t) +// StartTestServerOrDie calls StartTestServer t.Fatal if it does not succeed. +func StartTestServerOrDie(t *testing.T, flags []string, storageConfig *storagebackend.Config) *TestServer { + + result, err := StartTestServer(t, flags, storageConfig) if err == nil { - return config, td + return &result } - t.Fatalf("Failed to launch server: %v", err) - return nil, nil + t.Fatalf("failed to launch server: %v", err) + return nil } func createListenerOnFreePort() (net.Listener, int, error) { diff --git a/test/integration/framework/etcd.go b/test/integration/framework/etcd.go index dcb4bbc4e23..790c13ff8ad 100644 --- a/test/integration/framework/etcd.go +++ b/test/integration/framework/etcd.go @@ -27,9 +27,9 @@ import ( "path/filepath" "sync" - "k8s.io/kubernetes/pkg/util/env" - "github.com/golang/glog" + + "k8s.io/kubernetes/pkg/util/env" ) var ( diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 53fd8e0cb2c..1ba723a3241 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -17,14 +17,13 @@ limitations under the License. package framework import ( - "io/ioutil" "net" "net/http" "net/http/httptest" + "path" goruntime "runtime" "strconv" "sync" - "testing" "time" "github.com/go-openapi/spec" @@ -38,7 +37,6 @@ import ( extensions "k8s.io/api/extensions/v1beta1" rbac "k8s.io/api/rbac/v1alpha1" storage "k8s.io/api/storage/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/wait" @@ -62,13 +60,10 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/apis/batch" - api "k8s.io/kubernetes/pkg/apis/core" policy "k8s.io/kubernetes/pkg/apis/policy/v1beta1" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/controller" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" "k8s.io/kubernetes/pkg/generated/openapi" - "k8s.io/kubernetes/pkg/kubectl" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/version" @@ -395,67 +390,6 @@ func (m *MasterComponents) Stop(apiServer, rcManager bool) { } } -func CreateTestingNamespace(baseName string, apiserver *httptest.Server, t *testing.T) *v1.Namespace { - // TODO: Create a namespace with a given basename. - // Currently we neither create the namespace nor delete all its contents at the end. - // But as long as tests are not using the same namespaces, this should work fine. - return &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - // TODO: Once we start creating namespaces, switch to GenerateName. - Name: baseName, - }, - } -} - -func DeleteTestingNamespace(ns *v1.Namespace, apiserver *httptest.Server, t *testing.T) { - // TODO: Remove all resources from a given namespace once we implement CreateTestingNamespace. -} - -// RCFromManifest reads a .json file and returns the rc in it. -func RCFromManifest(fileName string) *v1.ReplicationController { - data, err := ioutil.ReadFile(fileName) - if err != nil { - glog.Fatalf("Unexpected error reading rc manifest %v", err) - } - var controller v1.ReplicationController - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &controller); err != nil { - glog.Fatalf("Unexpected error reading rc manifest %v", err) - } - return &controller -} - -// StopRC stops the rc via kubectl's stop library -func StopRC(rc *v1.ReplicationController, clientset internalclientset.Interface) error { - reaper, err := kubectl.ReaperFor(api.Kind("ReplicationController"), clientset) - if err != nil || reaper == nil { - return err - } - err = reaper.Stop(rc.Namespace, rc.Name, 0, nil) - if err != nil { - return err - } - return nil -} - -// ScaleRC scales the given rc to the given replicas. -func ScaleRC(name, ns string, replicas int32, clientset internalclientset.Interface) (*api.ReplicationController, error) { - scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), clientset) - if err != nil { - return nil, err - } - retry := &kubectl.RetryParams{Interval: 50 * time.Millisecond, Timeout: DefaultTimeout} - waitForReplicas := &kubectl.RetryParams{Interval: 50 * time.Millisecond, Timeout: DefaultTimeout} - err = scaler.Scale(ns, name, uint(replicas), nil, retry, waitForReplicas) - if err != nil { - return nil, err - } - scaled, err := clientset.Core().ReplicationControllers(ns).Get(name, metav1.GetOptions{}) - if err != nil { - return nil, err - } - return scaled, nil -} - // CloseFunc can be called to cleanup the master type CloseFunc func() @@ -524,3 +458,10 @@ func FindFreeLocalPort() (int, error) { } return port, nil } + +// SharedEtcd creates a storage config for a shared etcd instance, with a unique prefix. +func SharedEtcd() *storagebackend.Config { + cfg := storagebackend.NewDefaultConfig(path.Join(uuid.New(), "registry"), nil) + cfg.ServerList = []string{GetEtcdURL()} + return cfg +} diff --git a/test/integration/framework/util.go b/test/integration/framework/util.go index 239c06ac22d..88f4ac52497 100644 --- a/test/integration/framework/util.go +++ b/test/integration/framework/util.go @@ -19,9 +19,22 @@ limitations under the License. package framework import ( + "io/ioutil" + "net/http/httptest" "strings" + "testing" + "time" + "github.com/golang/glog" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/api/testapi" + api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/kubernetes/pkg/kubectl" ) const ( @@ -51,3 +64,64 @@ func GetServerArchitecture(c clientset.Interface) string { func GetPauseImageName(c clientset.Interface) string { return currentPodInfraContainerImageName + "-" + GetServerArchitecture(c) + ":" + currentPodInfraContainerImageVersion } + +func CreateTestingNamespace(baseName string, apiserver *httptest.Server, t *testing.T) *v1.Namespace { + // TODO: Create a namespace with a given basename. + // Currently we neither create the namespace nor delete all of its contents at the end. + // But as long as tests are not using the same namespaces, this should work fine. + return &v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + // TODO: Once we start creating namespaces, switch to GenerateName. + Name: baseName, + }, + } +} + +func DeleteTestingNamespace(ns *v1.Namespace, apiserver *httptest.Server, t *testing.T) { + // TODO: Remove all resources from a given namespace once we implement CreateTestingNamespace. +} + +// RCFromManifest reads a .json file and returns the rc in it. +func RCFromManifest(fileName string) *v1.ReplicationController { + data, err := ioutil.ReadFile(fileName) + if err != nil { + glog.Fatalf("Unexpected error reading rc manifest %v", err) + } + var controller v1.ReplicationController + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &controller); err != nil { + glog.Fatalf("Unexpected error reading rc manifest %v", err) + } + return &controller +} + +// StopRC stops the rc via kubectl's stop library +func StopRC(rc *v1.ReplicationController, clientset internalclientset.Interface) error { + reaper, err := kubectl.ReaperFor(api.Kind("ReplicationController"), clientset) + if err != nil || reaper == nil { + return err + } + err = reaper.Stop(rc.Namespace, rc.Name, 0, nil) + if err != nil { + return err + } + return nil +} + +// ScaleRC scales the given rc to the given replicas. +func ScaleRC(name, ns string, replicas int32, clientset internalclientset.Interface) (*api.ReplicationController, error) { + scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), clientset) + if err != nil { + return nil, err + } + retry := &kubectl.RetryParams{Interval: 50 * time.Millisecond, Timeout: DefaultTimeout} + waitForReplicas := &kubectl.RetryParams{Interval: 50 * time.Millisecond, Timeout: DefaultTimeout} + err = scaler.Scale(ns, name, uint(replicas), nil, retry, waitForReplicas) + if err != nil { + return nil, err + } + scaled, err := clientset.Core().ReplicationControllers(ns).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, err + } + return scaled, nil +} diff --git a/test/integration/garbagecollector/BUILD b/test/integration/garbagecollector/BUILD index b2f8827938e..ff6f60c8ec8 100644 --- a/test/integration/garbagecollector/BUILD +++ b/test/integration/garbagecollector/BUILD @@ -8,14 +8,17 @@ load( go_test( name = "go_default_test", size = "large", - srcs = ["garbage_collector_test.go"], + srcs = [ + "garbage_collector_test.go", + "main_test.go", + ], importpath = "k8s.io/kubernetes/test/integration/garbagecollector", tags = ["integration"], deps = [ "//cmd/kube-apiserver/app/testing:go_default_library", "//pkg/controller/garbagecollector:go_default_library", "//test/integration:go_default_library", - "//vendor/github.com/coreos/pkg/capnslog:go_default_library", + "//test/integration/framework:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index 632a75890a3..897c30ff2dc 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -41,11 +41,10 @@ import ( "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" - apitesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" "k8s.io/kubernetes/pkg/controller/garbagecollector" "k8s.io/kubernetes/test/integration" - - "github.com/coreos/pkg/capnslog" + "k8s.io/kubernetes/test/integration/framework" ) func getForegroundOptions() *metav1.DeleteOptions { @@ -201,28 +200,15 @@ type testContext struct { // if workerCount > 0, will start the GC, otherwise it's up to the caller to Run() the GC. func setup(t *testing.T, workerCount int) *testContext { - masterConfig, tearDownMaster := apitesting.StartTestServerOrDie(t) + result := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd()) - // TODO: Disable logging here until we resolve teardown issues which result in - // massive log spam. Another path forward would be to refactor - // StartTestServerOrDie to work with the etcd instance already started by the - // integration test scripts. - // See https://github.com/kubernetes/kubernetes/issues/49489. - repo, err := capnslog.GetRepoLogger("github.com/coreos/etcd") - if err != nil { - t.Fatalf("couldn't configure logging: %v", err) - } - repo.SetLogLevel(map[string]capnslog.LogLevel{ - "etcdserver/api/v3rpc": capnslog.CRITICAL, - }) - - clientSet, err := clientset.NewForConfig(masterConfig) + clientSet, err := clientset.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("error creating clientset: %v", err) } // Helpful stuff for testing CRD. - apiExtensionClient, err := apiextensionsclientset.NewForConfig(masterConfig) + apiExtensionClient, err := apiextensionsclientset.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("error creating extension clientset: %v", err) } @@ -234,7 +220,7 @@ func setup(t *testing.T, workerCount int) *testContext { restMapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.InterfacesForUnstructured) restMapper.Reset() deletableResources := garbagecollector.GetDeletableResources(discoveryClient) - config := *masterConfig + config := *result.ClientConfig config.ContentConfig = dynamic.ContentConfig() metaOnlyClientPool := dynamic.NewClientPool(&config, restMapper, dynamic.LegacyAPIPathResolverFunc) clientPool := dynamic.NewClientPool(&config, restMapper, dynamic.LegacyAPIPathResolverFunc) @@ -257,10 +243,7 @@ func setup(t *testing.T, workerCount int) *testContext { stopCh := make(chan struct{}) tearDown := func() { close(stopCh) - tearDownMaster() - repo.SetLogLevel(map[string]capnslog.LogLevel{ - "etcdserver/api/v3rpc": capnslog.ERROR, - }) + result.TearDownFn() } syncPeriod := 5 * time.Second startGC := func(workers int) { diff --git a/test/integration/garbagecollector/main_test.go b/test/integration/garbagecollector/main_test.go new file mode 100644 index 00000000000..1e2f4b243bc --- /dev/null +++ b/test/integration/garbagecollector/main_test.go @@ -0,0 +1,27 @@ +/* +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 garbagecollector + +import ( + "testing" + + "k8s.io/kubernetes/test/integration/framework" +) + +func TestMain(m *testing.M) { + framework.EtcdMain(m.Run) +} diff --git a/test/integration/master/BUILD b/test/integration/master/BUILD index b981702afbf..2d658707950 100644 --- a/test/integration/master/BUILD +++ b/test/integration/master/BUILD @@ -9,12 +9,15 @@ go_test( name = "go_default_test", size = "large", srcs = [ + "crd_test.go", + "kube_apiserver_test.go", "main_test.go", - "master_test.go", + "synthetic_master_test.go", ], importpath = "k8s.io/kubernetes/test/integration/master", tags = ["integration"], deps = [ + "//cmd/kube-apiserver/app/testing:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -22,16 +25,28 @@ go_test( "//test/integration:go_default_library", "//test/integration/framework:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", + "//vendor/k8s.io/api/admissionregistration/v1alpha1: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/networking/v1:go_default_library", + "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", + "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/group:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", + "//vendor/k8s.io/apiserver/pkg/features:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", "//vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest:go_default_library", + "//vendor/k8s.io/client-go/dynamic:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", ], diff --git a/cmd/kube-apiserver/app/testing/server_test.go b/test/integration/master/crd_test.go similarity index 87% rename from cmd/kube-apiserver/app/testing/server_test.go rename to test/integration/master/crd_test.go index 70444c749d0..f2bc91a5c87 100644 --- a/cmd/kube-apiserver/app/testing/server_test.go +++ b/test/integration/master/crd_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package testing +package master import ( "encoding/json" @@ -23,8 +23,6 @@ import ( "time" admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" - appsv1beta1 "k8s.io/api/apps/v1beta1" - corev1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" @@ -38,64 +36,20 @@ import ( utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/test/integration/framework" ) -func TestRun(t *testing.T) { - config, tearDown := StartTestServerOrDie(t) - defer tearDown() - - client, err := kubernetes.NewForConfig(config) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - // test whether the server is really healthy after /healthz told us so - t.Logf("Creating Deployment directly after being healthy") - var replicas int32 = 1 - _, err = client.AppsV1beta1().Deployments("default").Create(&appsv1beta1.Deployment{ - TypeMeta: metav1.TypeMeta{ - Kind: "Deployment", - APIVersion: "apps/v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{ - Namespace: "default", - Name: "test", - }, - Spec: appsv1beta1.DeploymentSpec{ - Replicas: &replicas, - Strategy: appsv1beta1.DeploymentStrategy{ - Type: appsv1beta1.RollingUpdateDeploymentStrategyType, - }, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "foo", - Image: "foo", - }, - }, - }, - }, - }, - }) - if err != nil { - t.Fatalf("Failed to create deployment: %v", err) - } -} - func TestCRDShadowGroup(t *testing.T) { - config, tearDown := StartTestServerOrDie(t) - defer tearDown() + result := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd()) + defer result.TearDownFn() - kubeclient, err := kubernetes.NewForConfig(config) + kubeclient, err := kubernetes.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("Unexpected error: %v", err) } - apiextensionsclient, err := apiextensionsclientset.NewForConfig(config) + apiextensionsclient, err := apiextensionsclientset.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -155,15 +109,15 @@ func TestCRDShadowGroup(t *testing.T) { func TestCRD(t *testing.T) { defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.Initializers, true)() - config, tearDown := StartTestServerOrDie(t) - defer tearDown() + result := kubeapiservertesting.StartTestServerOrDie(t, []string{"--admission-control", "Initializers"}, framework.SharedEtcd()) + defer result.TearDownFn() - kubeclient, err := kubernetes.NewForConfig(config) + kubeclient, err := kubernetes.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("Unexpected error: %v", err) } - apiextensionsclient, err := apiextensionsclientset.NewForConfig(config) + apiextensionsclient, err := apiextensionsclientset.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -196,7 +150,7 @@ func TestCRD(t *testing.T) { } t.Logf("Trying to access foos.cr.bar.com with dynamic client") - barComConfig := *config + barComConfig := *result.ClientConfig barComConfig.GroupVersion = &schema.GroupVersion{Group: "cr.bar.com", Version: "v1"} barComConfig.APIPath = "/apis" barComClient, err := dynamic.NewClient(&barComConfig) diff --git a/test/integration/master/kube_apiserver_test.go b/test/integration/master/kube_apiserver_test.go new file mode 100644 index 00000000000..73b4fc14cef --- /dev/null +++ b/test/integration/master/kube_apiserver_test.go @@ -0,0 +1,74 @@ +/* +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 master + +import ( + "testing" + + appsv1beta1 "k8s.io/api/apps/v1beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/test/integration/framework" +) + +func TestRun(t *testing.T) { + result := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.SharedEtcd()) + defer result.TearDownFn() + + client, err := kubernetes.NewForConfig(result.ClientConfig) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // test whether the server is really healthy after /healthz told us so + t.Logf("Creating Deployment directly after being healthy") + var replicas int32 = 1 + _, err = client.AppsV1beta1().Deployments("default").Create(&appsv1beta1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "apps/v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test", + }, + Spec: appsv1beta1.DeploymentSpec{ + Replicas: &replicas, + Strategy: appsv1beta1.DeploymentStrategy{ + Type: appsv1beta1.RollingUpdateDeploymentStrategyType, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"foo": "bar"}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "foo", + Image: "foo", + }, + }, + }, + }, + }, + }) + if err != nil { + t.Fatalf("Failed to create deployment: %v", err) + } +} diff --git a/test/integration/master/master_test.go b/test/integration/master/synthetic_master_test.go similarity index 100% rename from test/integration/master/master_test.go rename to test/integration/master/synthetic_master_test.go diff --git a/test/integration/scale/BUILD b/test/integration/scale/BUILD index 6f55ba0de37..120e556ce4b 100644 --- a/test/integration/scale/BUILD +++ b/test/integration/scale/BUILD @@ -13,6 +13,7 @@ go_test( tags = ["integration"], deps = [ "//cmd/kube-apiserver/app/testing:go_default_library", + "//test/integration/framework:go_default_library", "//vendor/github.com/coreos/pkg/capnslog:go_default_library", "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/test/integration/scale/scale_test.go b/test/integration/scale/scale_test.go index 8e6f30c44c8..a40093571c1 100644 --- a/test/integration/scale/scale_test.go +++ b/test/integration/scale/scale_test.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" apitesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/test/integration/framework" ) type subresourceTest struct { @@ -45,6 +46,10 @@ func makeGVK(group, version, kind string) schema.GroupVersionKind { return schema.GroupVersionKind{Group: group, Version: version, Kind: kind} } +func TestMain(m *testing.M) { + framework.EtcdMain(m.Run) +} + func TestScaleSubresources(t *testing.T) { clientSet, tearDown := setup(t) defer tearDown() @@ -209,7 +214,7 @@ var ( ) func setup(t *testing.T) (client kubernetes.Interface, tearDown func()) { - masterConfig, tearDownMaster := apitesting.StartTestServerOrDie(t) + result := apitesting.StartTestServerOrDie(t, nil, framework.SharedEtcd()) // TODO: Disable logging here until we resolve teardown issues which result in // massive log spam. Another path forward would be to refactor @@ -224,13 +229,13 @@ func setup(t *testing.T) (client kubernetes.Interface, tearDown func()) { "etcdserver/api/v3rpc": capnslog.CRITICAL, }) - masterConfig.AcceptContentTypes = "" - masterConfig.ContentType = "" - masterConfig.NegotiatedSerializer = nil - clientSet, err := kubernetes.NewForConfig(masterConfig) + result.ClientConfig.AcceptContentTypes = "" + result.ClientConfig.ContentType = "" + result.ClientConfig.NegotiatedSerializer = nil + clientSet, err := kubernetes.NewForConfig(result.ClientConfig) if err != nil { t.Fatalf("error creating clientset: %v", err) } - return clientSet, tearDownMaster + return clientSet, result.TearDownFn }