diff --git a/cmd/kube-apiserver/app/aggregator.go b/cmd/kube-apiserver/app/aggregator.go index 0107d12b8a6..178a1fdca35 100644 --- a/cmd/kube-apiserver/app/aggregator.go +++ b/cmd/kube-apiserver/app/aggregator.go @@ -89,8 +89,8 @@ func createAggregatorConfig(kubeAPIServerConfig genericapiserver.Config, command } -func createAggregatorServer(aggregatorConfig *aggregatorapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget, sharedInformers informers.SharedInformerFactory, stopCh <-chan struct{}) (*aggregatorapiserver.APIAggregator, error) { - aggregatorServer, err := aggregatorConfig.Complete().NewWithDelegate(delegateAPIServer, stopCh) +func createAggregatorServer(aggregatorConfig *aggregatorapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget, sharedInformers informers.SharedInformerFactory) (*aggregatorapiserver.APIAggregator, error) { + aggregatorServer, err := aggregatorConfig.Complete().NewWithDelegate(delegateAPIServer) if err != nil { return nil, err } @@ -105,8 +105,8 @@ func createAggregatorServer(aggregatorConfig *aggregatorapiserver.Config, delega tprRegistrationController := thirdparty.NewAutoRegistrationController(sharedInformers.Extensions().InternalVersion().ThirdPartyResources(), autoRegistrationController) aggregatorServer.GenericAPIServer.AddPostStartHook("kube-apiserver-autoregistration", func(context genericapiserver.PostStartHookContext) error { - go autoRegistrationController.Run(5, stopCh) - go tprRegistrationController.Run(5, stopCh) + go autoRegistrationController.Run(5, context.StopCh) + go tprRegistrationController.Run(5, context.StopCh) return nil }) aggregatorServer.GenericAPIServer.AddHealthzChecks(healthz.NamedCheck("autoregister-completion", func(r *http.Request) error { diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 4b4c9768fe5..f98ab300ae3 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -103,7 +103,7 @@ func Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error { if err != nil { return err } - kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers, stopCh) + kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers) if err != nil { return err } @@ -129,7 +129,7 @@ func Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error { if err != nil { return err } - aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, sharedInformers, stopCh) + aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, sharedInformers) if err != nil { // we don't need special handling for innerStopCh because the aggregator server doesn't create any go routines return err @@ -138,13 +138,13 @@ func Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error { } // CreateKubeAPIServer creates and wires a workable kube-apiserver -func CreateKubeAPIServer(kubeAPIServerConfig *master.Config, sharedInformers informers.SharedInformerFactory, stopCh <-chan struct{}) (*master.Master, error) { +func CreateKubeAPIServer(kubeAPIServerConfig *master.Config, sharedInformers informers.SharedInformerFactory) (*master.Master, error) { kubeAPIServer, err := kubeAPIServerConfig.Complete().New(genericapiserver.EmptyDelegate) if err != nil { return nil, err } kubeAPIServer.GenericAPIServer.AddPostStartHook("start-kube-apiserver-informers", func(context genericapiserver.PostStartHookContext) error { - sharedInformers.Start(stopCh) + sharedInformers.Start(context.StopCh) return nil }) diff --git a/staging/src/k8s.io/apiserver/pkg/server/config_test.go b/staging/src/k8s.io/apiserver/pkg/server/config_test.go index acaab781c8d..0ce592c2aff 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config_test.go @@ -88,7 +88,7 @@ func TestNewWithDelegate(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) wrappingServer.PrepareRun() - wrappingServer.RunPostStartHooks() + wrappingServer.RunPostStartHooks(stopCh) server := httptest.NewServer(wrappingServer.Handler) defer server.Close() diff --git a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go index 4197209e827..97229efc845 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go +++ b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -272,7 +272,7 @@ func (s preparedGenericAPIServer) NonBlockingRun(stopCh <-chan struct{}) error { close(internalStopCh) }() - s.RunPostStartHooks() + s.RunPostStartHooks(stopCh) if _, err := systemd.SdNotify(true, "READY=1\n"); err != nil { glog.Errorf("Unable to send systemd daemon successful start message: %v\n", err) diff --git a/staging/src/k8s.io/apiserver/pkg/server/hooks.go b/staging/src/k8s.io/apiserver/pkg/server/hooks.go index 89ba6288a93..1d6eb8cc867 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/hooks.go +++ b/staging/src/k8s.io/apiserver/pkg/server/hooks.go @@ -43,6 +43,8 @@ type PostStartHookFunc func(context PostStartHookContext) error type PostStartHookContext struct { // LoopbackClientConfig is a config for a privileged loopback connection to the API server LoopbackClientConfig *restclient.Config + // StopCh is the channel that will be closed when the server stops + StopCh <-chan struct{} } // PostStartHookProvider is an interface in addition to provide a post start hook for the api server @@ -89,12 +91,15 @@ func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc) } // RunPostStartHooks runs the PostStartHooks for the server -func (s *GenericAPIServer) RunPostStartHooks() { +func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) { s.postStartHookLock.Lock() defer s.postStartHookLock.Unlock() s.postStartHooksCalled = true - context := PostStartHookContext{LoopbackClientConfig: s.LoopbackClientConfig} + context := PostStartHookContext{ + LoopbackClientConfig: s.LoopbackClientConfig, + StopCh: stopCh, + } for hookName, hookEntry := range s.postStartHooks { go runPostStartHook(hookName, hookEntry, context) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go index 40f518e90ab..d19e67320d0 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -129,7 +129,7 @@ func (c *Config) SkipComplete() completedConfig { } // New returns a new instance of APIAggregator from the given config. -func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.DelegationTarget, stopCh <-chan struct{}) (*APIAggregator, error) { +func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.DelegationTarget) (*APIAggregator, error) { genericServer, err := c.Config.GenericConfig.SkipComplete().New(delegationTarget) // completion is done in Complete, no need for a second time if err != nil { return nil, err @@ -185,16 +185,16 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg ) s.GenericAPIServer.AddPostStartHook("start-kube-aggregator-informers", func(context genericapiserver.PostStartHookContext) error { - informerFactory.Start(stopCh) - kubeInformers.Start(stopCh) + informerFactory.Start(context.StopCh) + kubeInformers.Start(context.StopCh) return nil }) s.GenericAPIServer.AddPostStartHook("apiservice-registration-controller", func(context genericapiserver.PostStartHookContext) error { - go apiserviceRegistrationController.Run(stopCh) + go apiserviceRegistrationController.Run(context.StopCh) return nil }) s.GenericAPIServer.AddPostStartHook("apiservice-status-available-controller", func(context genericapiserver.PostStartHookContext) error { - go availableController.Run(stopCh) + go availableController.Run(context.StopCh) return nil }) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go index 98a63dd0b10..9c32c3dd546 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go @@ -157,7 +157,7 @@ func (o AggregatorOptions) RunAggregator(stopCh <-chan struct{}) error { return err } - server, err := config.Complete().NewWithDelegate(genericapiserver.EmptyDelegate, stopCh) + server, err := config.Complete().NewWithDelegate(genericapiserver.EmptyDelegate) if err != nil { return err } diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/apiserver.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/apiserver.go index 9322d33a63f..6c9edef0b35 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/apiserver.go @@ -101,7 +101,7 @@ func (c *Config) SkipComplete() completedConfig { } // New returns a new instance of CustomResources from the given config. -func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget, stopCh <-chan struct{}) (*CustomResources, error) { +func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*CustomResources, error) { genericServer, err := c.Config.GenericConfig.SkipComplete().New(genericapiserver.EmptyDelegate) // completion is done in Complete, no need for a second time if err != nil { return nil, err @@ -155,11 +155,11 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget, customResourceController := NewDiscoveryController(customResourceInformers.Apiextensions().InternalVersion().CustomResources(), versionDiscoveryHandler, groupDiscoveryHandler) s.GenericAPIServer.AddPostStartHook("start-apiextensions-informers", func(context genericapiserver.PostStartHookContext) error { - customResourceInformers.Start(stopCh) + customResourceInformers.Start(context.StopCh) return nil }) s.GenericAPIServer.AddPostStartHook("start-apiextensions-controllers", func(context genericapiserver.PostStartHookContext) error { - go customResourceController.Run(stopCh) + go customResourceController.Run(context.StopCh) return nil }) diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/cmd/server/start.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/cmd/server/start.go index 29530cc5bb6..c01762aafa7 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/cmd/server/start.go @@ -119,7 +119,7 @@ func (o CustomResourcesServerOptions) RunCustomResourcesServer(stopCh <-chan str return err } - server, err := config.Complete().New(genericapiserver.EmptyDelegate, stopCh) + server, err := config.Complete().New(genericapiserver.EmptyDelegate) if err != nil { return err } diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/start.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/start.go index f86c3d7e584..f0747098bc2 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/start.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/start.go @@ -97,9 +97,8 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) { func StartServer(config *extensionsapiserver.Config) (chan struct{}, clientset.Interface, dynamic.ClientPool, error) { stopCh := make(chan struct{}) - server, err := config.Complete().New(genericapiserver.EmptyDelegate, stopCh) + server, err := config.Complete().New(genericapiserver.EmptyDelegate) if err != nil { - close(stopCh) return nil, nil, nil, err } go func() { diff --git a/test/integration/apiserver/apiserver_test.go b/test/integration/apiserver/apiserver_test.go index 9f403a8caa6..3847e2fb36e 100644 --- a/test/integration/apiserver/apiserver_test.go +++ b/test/integration/apiserver/apiserver_test.go @@ -34,16 +34,16 @@ import ( "k8s.io/kubernetes/test/integration/framework" ) -func setup(t *testing.T) (*httptest.Server, clientset.Interface) { +func setup(t *testing.T) (*httptest.Server, clientset.Interface, framework.CloseFunc) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.EnableCoreControllers = false - _, s := framework.RunAMaster(masterConfig) + _, s, closeFn := framework.RunAMaster(masterConfig) clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL}) if err != nil { t.Fatalf("Error in create clientset: %v", err) } - return s, clientSet + return s, clientSet, closeFn } func verifyStatusCode(t *testing.T, verb, URL, body string, expectedStatusCode int) { @@ -109,8 +109,8 @@ var cascDel = ` // Tests that the apiserver returns 202 status code as expected. func Test202StatusCode(t *testing.T) { - s, clientSet := setup(t) - defer s.Close() + s, clientSet, closeFn := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("status-code", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/apiserver/patch_test.go b/test/integration/apiserver/patch_test.go index a74ea1f92fd..924eb5bbd4d 100644 --- a/test/integration/apiserver/patch_test.go +++ b/test/integration/apiserver/patch_test.go @@ -37,8 +37,8 @@ import ( // Tests that the apiserver retries non-overlapping conflicts on patches func TestPatchConflicts(t *testing.T) { - s, clientSet := setup(t) - defer s.Close() + s, clientSet, closeFn := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("status-code", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/auth/accessreview_test.go b/test/integration/auth/accessreview_test.go index d3d71c04883..571f7412568 100644 --- a/test/integration/auth/accessreview_test.go +++ b/test/integration/auth/accessreview_test.go @@ -57,8 +57,8 @@ func TestSubjectAccessReview(t *testing.T) { masterConfig.GenericConfig.Authenticator = authenticator.RequestFunc(alwaysAlice) masterConfig.GenericConfig.Authorizer = sarAuthorizer{} masterConfig.GenericConfig.AdmissionControl = admit.NewAlwaysAdmit() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) @@ -151,8 +151,8 @@ func TestSelfSubjectAccessReview(t *testing.T) { }) masterConfig.GenericConfig.Authorizer = sarAuthorizer{} masterConfig.GenericConfig.AdmissionControl = admit.NewAlwaysAdmit() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) @@ -231,8 +231,8 @@ func TestLocalSubjectAccessReview(t *testing.T) { masterConfig.GenericConfig.Authenticator = authenticator.RequestFunc(alwaysAlice) masterConfig.GenericConfig.Authorizer = sarAuthorizer{} masterConfig.GenericConfig.AdmissionControl = admit.NewAlwaysAdmit() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) diff --git a/test/integration/auth/auth_test.go b/test/integration/auth/auth_test.go index 7a5819f0947..49bd6fff905 100644 --- a/test/integration/auth/auth_test.go +++ b/test/integration/auth/auth_test.go @@ -403,8 +403,8 @@ func getTestRequests(namespace string) []struct { func TestAuthModeAlwaysAllow(t *testing.T) { // Set up a master masterConfig := framework.NewIntegrationTestMasterConfig() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-always-allow", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -501,8 +501,8 @@ func TestAuthModeAlwaysDeny(t *testing.T) { // Set up a master masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authorizer = authorizerfactory.NewAlwaysDenyAuthorizer() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-always-deny", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -552,8 +552,8 @@ func TestAliceNotForbiddenOrUnauthorized(t *testing.T) { masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = allowAliceAuthorizer{} masterConfig.GenericConfig.AdmissionControl = admit.NewAlwaysAdmit() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-alice-not-forbidden", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -621,8 +621,8 @@ func TestBobIsForbidden(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = allowAliceAuthorizer{} - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-bob-forbidden", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -665,8 +665,8 @@ func TestUnknownUserIsUnauthorized(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = allowAliceAuthorizer{} - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-unknown-unauthorized", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -727,8 +727,8 @@ func TestImpersonateIsForbidden(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = impersonateAuthorizer{} - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-impersonate-forbidden", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -874,8 +874,8 @@ func TestAuthorizationAttributeDetermination(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = trackingAuthorizer - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-attribute-determination", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -940,8 +940,8 @@ func TestNamespaceAuthorization(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = a - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-namespace", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -1038,8 +1038,8 @@ func TestKindAuthorization(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = a - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-kind", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -1122,8 +1122,8 @@ func TestReadOnlyAuthorization(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = getTestTokenAuth() masterConfig.GenericConfig.Authorizer = a - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-read-only", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -1181,8 +1181,8 @@ func TestWebhookTokenAuthenticator(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authenticator = authenticator masterConfig.GenericConfig.Authorizer = allowAliceAuthorizer{} - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() ns := framework.CreateTestingNamespace("auth-webhook-token", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/auth/rbac_test.go b/test/integration/auth/rbac_test.go index 2c981c76c71..15767e76d0b 100644 --- a/test/integration/auth/rbac_test.go +++ b/test/integration/auth/rbac_test.go @@ -415,8 +415,8 @@ func TestRBAC(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authorizer = newRBACAuthorizer(masterConfig) masterConfig.GenericConfig.Authenticator = newFakeAuthenticator() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} @@ -507,8 +507,8 @@ func TestBootstrapping(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.Authorizer = newRBACAuthorizer(masterConfig) masterConfig.GenericConfig.Authenticator = newFakeAuthenticator() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() clientset := clientset.NewForConfigOrDie(&restclient.Config{BearerToken: superUser, Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) diff --git a/test/integration/client/client_test.go b/test/integration/client/client_test.go index 78c7be698f3..74f5b517b9e 100644 --- a/test/integration/client/client_test.go +++ b/test/integration/client/client_test.go @@ -45,8 +45,8 @@ import ( ) func TestClient(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -117,8 +117,8 @@ func TestClient(t *testing.T) { } func TestAtomicPut(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() c := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -209,8 +209,8 @@ func TestAtomicPut(t *testing.T) { } func TestPatch(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() c := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -348,8 +348,8 @@ func TestPatch(t *testing.T) { } func TestPatchWithCreateOnUpdate(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() c := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -459,8 +459,8 @@ func TestPatchWithCreateOnUpdate(t *testing.T) { } func TestAPIVersions(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() c := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -481,8 +481,8 @@ func TestAPIVersions(t *testing.T) { } func TestSingleWatch(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("single-watch", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -566,8 +566,8 @@ func TestMultiWatch(t *testing.T) { const watcherCount = 50 rt.GOMAXPROCS(watcherCount) - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("multi-watch", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -822,8 +822,8 @@ func runSelfLinkTestOnNamespace(t *testing.T, c clientset.Interface, namespace s } func TestSelfLinkOnNamespace(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("selflink", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/client/dynamic_client_test.go b/test/integration/client/dynamic_client_test.go index 10ac0316153..4261a5ded49 100644 --- a/test/integration/client/dynamic_client_test.go +++ b/test/integration/client/dynamic_client_test.go @@ -33,8 +33,8 @@ import ( ) func TestDynamicClient(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("dynamic-client", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/configmap/configmap_test.go b/test/integration/configmap/configmap_test.go index c9197a0a738..e10f308d4ac 100644 --- a/test/integration/configmap/configmap_test.go +++ b/test/integration/configmap/configmap_test.go @@ -32,8 +32,8 @@ import ( // TestConfigMap tests apiserver-side behavior of creation of ConfigMaps and pods that consume them. func TestConfigMap(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) diff --git a/test/integration/defaulttolerationseconds/defaulttolerationseconds_test.go b/test/integration/defaulttolerationseconds/defaulttolerationseconds_test.go index 635322e64c4..1143d3c3b7c 100644 --- a/test/integration/defaulttolerationseconds/defaulttolerationseconds_test.go +++ b/test/integration/defaulttolerationseconds/defaulttolerationseconds_test.go @@ -34,8 +34,8 @@ func TestAdmission(t *testing.T) { masterConfig.GenericConfig.EnableProfiling = true masterConfig.GenericConfig.EnableMetrics = true masterConfig.GenericConfig.AdmissionControl = defaulttolerationseconds.NewDefaultTolerationSeconds() - _, s := framework.RunAMaster(masterConfig) - defer s.Close() + _, s, closeFn := framework.RunAMaster(masterConfig) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index 877092d3b17..432a6d3ea47 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -559,7 +559,7 @@ func startRealMasterOrDie(t *testing.T, certDir string) (*allClient, clientv3.KV kubeAPIServerConfig.APIResourceConfigSource = &allResourceSource{} // force enable all resources - kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers, wait.NeverStop) + kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers) if err != nil { t.Fatal(err) } diff --git a/test/integration/evictions/evictions_test.go b/test/integration/evictions/evictions_test.go index f26d5edb9cb..d2a0d0dec5c 100644 --- a/test/integration/evictions/evictions_test.go +++ b/test/integration/evictions/evictions_test.go @@ -48,8 +48,8 @@ const ( func TestConcurrentEvictionRequests(t *testing.T) { podNameFormat := "test-pod-%d" - s, rm, informers, clientSet := rmSetup(t) - defer s.Close() + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() ns := framework.CreateTestingNamespace("concurrent-eviction-requests", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -225,9 +225,9 @@ func newEviction(ns, evictionName string, deleteOption *metav1.DeleteOptions) *v } } -func rmSetup(t *testing.T) (*httptest.Server, *disruption.DisruptionController, informers.SharedInformerFactory, clientset.Interface) { +func rmSetup(t *testing.T) (*httptest.Server, framework.CloseFunc, *disruption.DisruptionController, informers.SharedInformerFactory, clientset.Interface) { masterConfig := framework.NewIntegrationTestMasterConfig() - _, s := framework.RunAMaster(masterConfig) + _, s, closeFn := framework.RunAMaster(masterConfig) config := restclient.Config{Host: s.URL} clientSet, err := clientset.NewForConfig(&config) @@ -246,7 +246,7 @@ func rmSetup(t *testing.T) (*httptest.Server, *disruption.DisruptionController, informers.Apps().V1beta1().StatefulSets(), clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "disruption-controller")), ) - return s, rm, informers, clientSet + return s, closeFn, rm, informers, clientSet } // wait for the podInformer to observe the pods. Call this function before diff --git a/test/integration/examples/apiserver_test.go b/test/integration/examples/apiserver_test.go index b468ee2bc6d..29ed7a82134 100644 --- a/test/integration/examples/apiserver_test.go +++ b/test/integration/examples/apiserver_test.go @@ -117,7 +117,7 @@ func TestAggregatedAPIServer(t *testing.T) { } kubeClientConfigValue.Store(kubeAPIServerConfig.GenericConfig.LoopbackClientConfig) - kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers, wait.NeverStop) + kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, sharedInformers) if err != nil { t.Fatal(err) } diff --git a/test/integration/federation/framework/federation.go b/test/integration/federation/framework/federation.go index 1b643b45fd2..54d4548ea43 100644 --- a/test/integration/federation/framework/federation.go +++ b/test/integration/federation/framework/federation.go @@ -18,7 +18,6 @@ package framework import ( "fmt" - "net/http/httptest" "testing" "time" @@ -31,10 +30,10 @@ import ( ) type MemberCluster struct { - Server *httptest.Server - Config *master.Config - Client clientset.Interface - Host string + CloseFn framework.CloseFunc + Config *master.Config + Client clientset.Interface + Host string } // FederationFixture manages a federation api server and a set of member clusters @@ -72,7 +71,7 @@ func (f *FederationFixture) startClusters() { fedClient := f.APIFixture.NewClient("federation-fixture") for i := 0; i < f.DesiredClusterCount; i++ { config := framework.NewMasterConfig() - _, server := framework.RunAMaster(config) + _, _, closeFn := framework.RunAMaster(config) host := config.GenericConfig.LoopbackClientConfig.Host // Use fmt to ensure the output will be visible when run with go test -v @@ -80,10 +79,10 @@ func (f *FederationFixture) startClusters() { clusterClient := clientset.NewForConfigOrDie(config.GenericConfig.LoopbackClientConfig) f.Clusters = append(f.Clusters, &MemberCluster{ - Server: server, - Config: config, - Client: clusterClient, - Host: host, + CloseFn: closeFn, + Config: config, + Client: clusterClient, + Host: host, }) f.ClusterClients = append(f.ClusterClients, clusterClient) @@ -113,7 +112,7 @@ func (f *FederationFixture) TearDown(t *testing.T) { f.stopChan = nil } for _, cluster := range f.Clusters { - cluster.Server.Close() + cluster.CloseFn() } f.Clusters = nil if f.APIFixture != nil { diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 8f6c7471444..88cc19856be 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -98,6 +98,8 @@ type MasterComponents struct { ClientSet clientset.Interface // Replication controller manager ControllerManager *replicationcontroller.ReplicationManager + // CloseFn shuts down the server + CloseFn CloseFunc // Channel for stop signals to rc manager rcStopCh chan struct{} // Used to stop master components individually, and via MasterComponents.Stop @@ -118,7 +120,7 @@ type Config struct { // NewMasterComponents creates, initializes and starts master components based on the given config. func NewMasterComponents(c *Config) *MasterComponents { - m, s := startMasterOrDie(c.MasterConfig, nil, nil) + m, s, closeFn := startMasterOrDie(c.MasterConfig, nil, nil) // TODO: Allow callers to pipe through a different master url and create a client/start components using it. glog.Infof("Master %+v", s.URL) // TODO: caesarxuchao: remove this client when the refactoring of client libraray is done. @@ -138,6 +140,7 @@ func NewMasterComponents(c *Config) *MasterComponents { KubeMaster: m, ClientSet: clientset, ControllerManager: controllerManager, + CloseFn: closeFn, rcStopCh: rcStopCh, } } @@ -173,7 +176,7 @@ func (h *MasterHolder) SetMaster(m *master.Master) { } // startMasterOrDie starts a kubernetes master and an httpserver to handle api requests -func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Server, masterReceiver MasterReceiver) (*master.Master, *httptest.Server) { +func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Server, masterReceiver MasterReceiver) (*master.Master, *httptest.Server, CloseFunc) { var m *master.Master var s *httptest.Server @@ -185,6 +188,12 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv })) } + stopCh := make(chan struct{}) + closeFn := func() { + close(stopCh) + s.Close() + } + if masterConfig == nil { masterConfig = NewMasterConfig() masterConfig.GenericConfig.EnableProfiling = true @@ -238,6 +247,7 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv m, err := masterConfig.Complete().New(genericapiserver.EmptyDelegate) if err != nil { + closeFn() glog.Fatalf("error in bringing up the master: %v", err) } if masterReceiver != nil { @@ -248,12 +258,13 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv // this method never actually calls the `Run` method for the API server // fire the post hooks ourselves m.GenericAPIServer.PrepareRun() - m.GenericAPIServer.RunPostStartHooks() + m.GenericAPIServer.RunPostStartHooks(stopCh) cfg := *masterConfig.GenericConfig.LoopbackClientConfig cfg.ContentConfig.GroupVersion = &schema.GroupVersion{} privilegedClient, err := restclient.RESTClientFor(&cfg) if err != nil { + closeFn() glog.Fatal(err) } err = wait.PollImmediate(100*time.Millisecond, 30*time.Second, func() (bool, error) { @@ -266,6 +277,7 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv return false, nil }) if err != nil { + closeFn() glog.Fatal(err) } @@ -275,6 +287,7 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv coreClient := coreclient.NewForConfigOrDie(&cfg) svcWatch, err := coreClient.Services(metav1.NamespaceDefault).Watch(metav1.ListOptions{}) if err != nil { + closeFn() glog.Fatal(err) } _, err = watch.Until(30*time.Second, svcWatch, func(event watch.Event) (bool, error) { @@ -287,11 +300,12 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv return false, nil }) if err != nil { + closeFn() glog.Fatal(err) } } - return m, s + return m, s, closeFn } func parseCIDROrDie(cidr string) *net.IPNet { @@ -402,7 +416,7 @@ func (m *MasterComponents) Stop(apiServer, rcManager bool) { m.once.Do(m.stopRCManager) } if apiServer { - m.ApiServer.Close() + m.CloseFn() } } @@ -467,7 +481,10 @@ func ScaleRC(name, ns string, replicas int32, clientset internalclientset.Interf return scaled, nil } -func RunAMaster(masterConfig *master.Config) (*master.Master, *httptest.Server) { +// CloseFunc can be called to cleanup the master +type CloseFunc func() + +func RunAMaster(masterConfig *master.Config) (*master.Master, *httptest.Server, CloseFunc) { if masterConfig == nil { masterConfig = NewMasterConfig() masterConfig.GenericConfig.EnableProfiling = true @@ -476,7 +493,7 @@ func RunAMaster(masterConfig *master.Config) (*master.Master, *httptest.Server) return startMasterOrDie(masterConfig, nil, nil) } -func RunAMasterUsingServer(masterConfig *master.Config, s *httptest.Server, masterReceiver MasterReceiver) (*master.Master, *httptest.Server) { +func RunAMasterUsingServer(masterConfig *master.Config, s *httptest.Server, masterReceiver MasterReceiver) (*master.Master, *httptest.Server, CloseFunc) { return startMasterOrDie(masterConfig, s, masterReceiver) } diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index c10c1387363..e56959ba6fc 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -123,10 +123,10 @@ func newOwnerRC(name, namespace string) *v1.ReplicationController { } } -func setup(t *testing.T) (*httptest.Server, *garbagecollector.GarbageCollector, clientset.Interface) { +func setup(t *testing.T) (*httptest.Server, framework.CloseFunc, *garbagecollector.GarbageCollector, clientset.Interface) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.EnableCoreControllers = false - _, s := framework.RunAMaster(masterConfig) + _, s, closeFn := framework.RunAMaster(masterConfig) clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL}) if err != nil { @@ -150,15 +150,15 @@ func setup(t *testing.T) (*httptest.Server, *garbagecollector.GarbageCollector, if err != nil { t.Fatalf("Failed to create garbage collector") } - return s, gc, clientSet + return s, closeFn, gc, clientSet } // This test simulates the cascading deletion. func TestCascadingDeletion(t *testing.T) { glog.V(6).Infof("TestCascadingDeletion starts") defer glog.V(6).Infof("TestCascadingDeletion ends") - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-cascading-deletion", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -245,8 +245,8 @@ func TestCascadingDeletion(t *testing.T) { // This test simulates the case where an object is created with an owner that // doesn't exist. It verifies the GC will delete such an object. func TestCreateWithNonExistentOwner(t *testing.T) { - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-non-existing-owner", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -341,8 +341,8 @@ func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, namespa // e2e tests that put more stress. func TestStressingCascadingDeletion(t *testing.T) { t.Logf("starts garbage collector stress test") - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-stressing-cascading-deletion", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -402,8 +402,8 @@ func TestStressingCascadingDeletion(t *testing.T) { } func TestOrphaning(t *testing.T) { - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-orphaning", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -473,8 +473,8 @@ func TestOrphaning(t *testing.T) { } func TestSolidOwnerDoesNotBlockWaitingOwner(t *testing.T) { - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-foreground1", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -535,8 +535,8 @@ func TestSolidOwnerDoesNotBlockWaitingOwner(t *testing.T) { } func TestNonBlockingOwnerRefDoesNotBlock(t *testing.T) { - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-foreground2", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -603,8 +603,8 @@ func TestNonBlockingOwnerRefDoesNotBlock(t *testing.T) { } func TestBlockingOwnerRefDoesBlock(t *testing.T) { - s, gc, clientSet := setup(t) - defer s.Close() + s, closeFn, gc, clientSet := setup(t) + defer closeFn() ns := framework.CreateTestingNamespace("gc-foreground3", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/master/master_test.go b/test/integration/master/master_test.go index 3f7c1aa89c1..709ee2589f2 100644 --- a/test/integration/master/master_test.go +++ b/test/integration/master/master_test.go @@ -45,8 +45,8 @@ import ( ) func testPrefix(t *testing.T, prefix string) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() resp, err := http.Get(s.URL + prefix) if err != nil { @@ -74,8 +74,8 @@ func TestExtensionsPrefix(t *testing.T) { } func TestEmptyList(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() u := s.URL + "/api/v1/namespaces/default/pods" resp, err := http.Get(u) @@ -102,8 +102,8 @@ func TestEmptyList(t *testing.T) { } func TestWatchSucceedsWithoutArgs(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() resp, err := http.Get(s.URL + "/api/v1/namespaces?watch=1") if err != nil { @@ -207,8 +207,8 @@ func appsPath(resource, namespace, name string) string { } func TestAutoscalingGroupBackwardCompatibility(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() transport := http.DefaultTransport requests := []struct { @@ -252,8 +252,8 @@ func TestAutoscalingGroupBackwardCompatibility(t *testing.T) { } func TestAppsGroupBackwardCompatibility(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() transport := http.DefaultTransport requests := []struct { @@ -305,8 +305,8 @@ func TestAppsGroupBackwardCompatibility(t *testing.T) { } func TestAccept(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() resp, err := http.Get(s.URL + "/api/") if err != nil { @@ -383,8 +383,8 @@ func countEndpoints(eps *api.Endpoints) int { } func TestMasterService(t *testing.T) { - _, s := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) - defer s.Close() + _, s, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) @@ -425,8 +425,8 @@ func TestServiceAlloc(t *testing.T) { t.Fatalf("bad cidr: %v", err) } cfg.ServiceIPRange = *cidr - _, s := framework.RunAMaster(cfg) - defer s.Close() + _, s, closeFn := framework.RunAMaster(cfg) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion}}) diff --git a/test/integration/metrics/metrics_test.go b/test/integration/metrics/metrics_test.go index 23b4f9be1cc..e91995267f5 100644 --- a/test/integration/metrics/metrics_test.go +++ b/test/integration/metrics/metrics_test.go @@ -90,8 +90,8 @@ func TestMasterProcessMetrics(t *testing.T) { t.Skipf("not supported on GOOS=%s", runtime.GOOS) } - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() metrics, err := scrapeMetrics(s) if err != nil { @@ -106,8 +106,8 @@ func TestMasterProcessMetrics(t *testing.T) { } func TestApiserverMetrics(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() // Make a request to the apiserver to ensure there's at least one data point // for the metrics we're expecting -- otherwise, they won't be exported. diff --git a/test/integration/objectmeta/objectmeta_test.go b/test/integration/objectmeta/objectmeta_test.go index bc3460c7287..257ab3912b0 100644 --- a/test/integration/objectmeta/objectmeta_test.go +++ b/test/integration/objectmeta/objectmeta_test.go @@ -31,8 +31,8 @@ import ( func TestIgnoreClusterName(t *testing.T) { config := framework.NewMasterConfig() - _, s := framework.RunAMaster(config) - defer s.Close() + _, s, closeFn := framework.RunAMaster(config) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) ns := v1.Namespace{ diff --git a/test/integration/pods/pods_test.go b/test/integration/pods/pods_test.go index 9eeb9b3ca51..d4baaae46f9 100644 --- a/test/integration/pods/pods_test.go +++ b/test/integration/pods/pods_test.go @@ -30,8 +30,8 @@ import ( ) func TestPodUpdateActiveDeadlineSeconds(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pod-activedeadline-update", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -147,8 +147,8 @@ func TestPodUpdateActiveDeadlineSeconds(t *testing.T) { } func TestPodReadOnlyFilesystem(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() isReadOnly := true ns := framework.CreateTestingNamespace("pod-readonly-root", s, t) diff --git a/test/integration/quota/quota_test.go b/test/integration/quota/quota_test.go index db2b2227193..fec64b2928f 100644 --- a/test/integration/quota/quota_test.go +++ b/test/integration/quota/quota_test.go @@ -61,7 +61,6 @@ func TestQuota(t *testing.T) { <-h.Initialized h.M.GenericAPIServer.Handler.ServeHTTP(w, req) })) - defer s.Close() admissionCh := make(chan struct{}) clientset := clientset.NewForConfigOrDie(&restclient.Config{QPS: -1, Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -78,7 +77,8 @@ func TestQuota(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.AdmissionControl = admission - framework.RunAMasterUsingServer(masterConfig, s, h) + _, _, closeFn := framework.RunAMasterUsingServer(masterConfig, s, h) + defer closeFn() ns := framework.CreateTestingNamespace("quotaed", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -237,7 +237,6 @@ func TestQuotaLimitedResourceDenial(t *testing.T) { <-h.Initialized h.M.GenericAPIServer.Handler.ServeHTTP(w, req) })) - defer s.Close() admissionCh := make(chan struct{}) clientset := clientset.NewForConfigOrDie(&restclient.Config{QPS: -1, Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) @@ -263,7 +262,8 @@ func TestQuotaLimitedResourceDenial(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.GenericConfig.AdmissionControl = admission - framework.RunAMasterUsingServer(masterConfig, s, h) + _, _, closeFn := framework.RunAMasterUsingServer(masterConfig, s, h) + defer closeFn() ns := framework.CreateTestingNamespace("quota", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/replicaset/replicaset_test.go b/test/integration/replicaset/replicaset_test.go index cefd147b1cf..b299292f13e 100644 --- a/test/integration/replicaset/replicaset_test.go +++ b/test/integration/replicaset/replicaset_test.go @@ -124,9 +124,9 @@ func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, namespa return ret, nil } -func rmSetup(t *testing.T) (*httptest.Server, *replicaset.ReplicaSetController, informers.SharedInformerFactory, clientset.Interface) { +func rmSetup(t *testing.T) (*httptest.Server, framework.CloseFunc, *replicaset.ReplicaSetController, informers.SharedInformerFactory, clientset.Interface) { masterConfig := framework.NewIntegrationTestMasterConfig() - _, s := framework.RunAMaster(masterConfig) + _, s, closeFn := framework.RunAMaster(masterConfig) config := restclient.Config{Host: s.URL} clientSet, err := clientset.NewForConfig(&config) @@ -146,7 +146,7 @@ func rmSetup(t *testing.T) (*httptest.Server, *replicaset.ReplicaSetController, if err != nil { t.Fatalf("Failed to create replicaset controller") } - return s, rm, informers, clientSet + return s, closeFn, rm, informers, clientSet } // wait for the podInformer to observe the pods. Call this function before @@ -216,7 +216,8 @@ func TestAdoption(t *testing.T) { }, } for i, tc := range testCases { - s, rm, informers, clientSet := rmSetup(t) + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() podInformer := informers.Core().V1().Pods().Informer() ns := framework.CreateTestingNamespace(fmt.Sprintf("rs-adoption-%d", i), s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -294,7 +295,8 @@ func TestUpdateSelectorToAdopt(t *testing.T) { // We have pod1, pod2 and rs. rs.spec.replicas=1. At first rs.Selector // matches pod1 only; change the selector to match pod2 as well. Verify // there is only one pod left. - s, rm, informers, clientSet := rmSetup(t) + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() ns := framework.CreateTestingNamespace("rs-update-selector-to-adopt", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rs := newRS("rs", ns.Name, 1) @@ -334,7 +336,8 @@ func TestUpdateSelectorToRemoveControllerRef(t *testing.T) { // matches pod1 and pod2; change the selector to match only pod1. Verify // that rs creates one more pod, so there are 3 pods. Also verify that // pod2's controllerRef is cleared. - s, rm, informers, clientSet := rmSetup(t) + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() podInformer := informers.Core().V1().Pods().Informer() ns := framework.CreateTestingNamespace("rs-update-selector-to-remove-controllerref", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -381,7 +384,8 @@ func TestUpdateLabelToRemoveControllerRef(t *testing.T) { // matches pod1 and pod2; change pod2's labels to non-matching. Verify // that rs creates one more pod, so there are 3 pods. Also verify that // pod2's controllerRef is cleared. - s, rm, informers, clientSet := rmSetup(t) + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() ns := framework.CreateTestingNamespace("rs-update-label-to-remove-controllerref", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rs := newRS("rs", ns.Name, 2) @@ -423,7 +427,8 @@ func TestUpdateLabelToBeAdopted(t *testing.T) { // matches pod1 only; change pod2's labels to be matching. Verify the RS // controller adopts pod2 and delete one of them, so there is only 1 pod // left. - s, rm, informers, clientSet := rmSetup(t) + s, closeFn, rm, informers, clientSet := rmSetup(t) + defer closeFn() ns := framework.CreateTestingNamespace("rs-update-label-to-be-adopted", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rs := newRS("rs", ns.Name, 1) diff --git a/test/integration/replicationcontroller/replicationcontroller_test.go b/test/integration/replicationcontroller/replicationcontroller_test.go index fee16bc4297..d80aa86f1d6 100644 --- a/test/integration/replicationcontroller/replicationcontroller_test.go +++ b/test/integration/replicationcontroller/replicationcontroller_test.go @@ -121,9 +121,9 @@ func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, namespa return ret, nil } -func rmSetup(t *testing.T, stopCh chan struct{}) (*httptest.Server, *replication.ReplicationManager, informers.SharedInformerFactory, clientset.Interface) { +func rmSetup(t *testing.T, stopCh chan struct{}) (*httptest.Server, framework.CloseFunc, *replication.ReplicationManager, informers.SharedInformerFactory, clientset.Interface) { masterConfig := framework.NewIntegrationTestMasterConfig() - _, s := framework.RunAMaster(masterConfig) + _, s, closeFn := framework.RunAMaster(masterConfig) config := restclient.Config{Host: s.URL} clientSet, err := clientset.NewForConfig(&config) @@ -136,7 +136,7 @@ func rmSetup(t *testing.T, stopCh chan struct{}) (*httptest.Server, *replication rm := replication.NewReplicationManager(informers.Core().V1().Pods(), informers.Core().V1().ReplicationControllers(), clientSet, replication.BurstReplicas) informers.Start(stopCh) - return s, rm, informers, clientSet + return s, closeFn, rm, informers, clientSet } // wait for the podInformer to observe the pods. Call this function before @@ -207,7 +207,8 @@ func TestAdoption(t *testing.T) { } for i, tc := range testCases { stopCh := make(chan struct{}) - s, rm, informers, clientSet := rmSetup(t, stopCh) + s, closeFn, rm, informers, clientSet := rmSetup(t, stopCh) + defer closeFn() ns := framework.CreateTestingNamespace(fmt.Sprintf("adoption-%d", i), s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -284,7 +285,8 @@ func TestUpdateSelectorToAdopt(t *testing.T) { // matches pod1 only; change the selector to match pod2 as well. Verify // there is only one pod left. stopCh := make(chan struct{}) - s, rm, _, clientSet := rmSetup(t, stopCh) + s, closeFn, rm, _, clientSet := rmSetup(t, stopCh) + defer closeFn() ns := framework.CreateTestingNamespace("update-selector-to-adopt", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rc := newRC("rc", ns.Name, 1) @@ -323,7 +325,8 @@ func TestUpdateSelectorToRemoveControllerRef(t *testing.T) { // that rc creates one more pod, so there are 3 pods. Also verify that // pod2's controllerRef is cleared. stopCh := make(chan struct{}) - s, rm, informers, clientSet := rmSetup(t, stopCh) + s, closeFn, rm, informers, clientSet := rmSetup(t, stopCh) + defer closeFn() ns := framework.CreateTestingNamespace("update-selector-to-remove-controllerref", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rc := newRC("rc", ns.Name, 2) @@ -368,7 +371,8 @@ func TestUpdateLabelToRemoveControllerRef(t *testing.T) { // that rc creates one more pod, so there are 3 pods. Also verify that // pod2's controllerRef is cleared. stopCh := make(chan struct{}) - s, rm, _, clientSet := rmSetup(t, stopCh) + s, closeFn, rm, _, clientSet := rmSetup(t, stopCh) + defer closeFn() ns := framework.CreateTestingNamespace("update-label-to-remove-controllerref", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rc := newRC("rc", ns.Name, 2) @@ -409,7 +413,8 @@ func TestUpdateLabelToBeAdopted(t *testing.T) { // controller adopts pod2 and delete one of them, so there is only 1 pod // left. stopCh := make(chan struct{}) - s, rm, _, clientSet := rmSetup(t, stopCh) + s, closeFn, rm, _, clientSet := rmSetup(t, stopCh) + defer closeFn() ns := framework.CreateTestingNamespace("update-label-to-be-adopted", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rc := newRC("rc", ns.Name, 1) diff --git a/test/integration/scheduler/extender_test.go b/test/integration/scheduler/extender_test.go index 36619ec11a5..4a8a2b732fd 100644 --- a/test/integration/scheduler/extender_test.go +++ b/test/integration/scheduler/extender_test.go @@ -254,8 +254,8 @@ func machine_3_Prioritizer(pod *v1.Pod, nodes *v1.NodeList) (*schedulerapi.HostP } func TestSchedulerExtender(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("scheduler-extender", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index cc7f4fad9e6..ae41c990dfd 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -76,8 +76,8 @@ func PriorityTwo(pod *v1.Pod, nodeNameToInfo map[string]*schedulercache.NodeInfo // from configurations provided by a ConfigMap object and then verifies that the // configuration is applied correctly. func TestSchedulerCreationFromConfigMap(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("configmap", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -155,8 +155,8 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { // TestSchedulerCreationFromNonExistentConfigMap ensures that creation of the // scheduler from a non-existent ConfigMap fails. func TestSchedulerCreationFromNonExistentConfigMap(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("configmap", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -191,8 +191,8 @@ func TestSchedulerCreationFromNonExistentConfigMap(t *testing.T) { // TestSchedulerCreationInLegacyMode ensures that creation of the scheduler // works fine when legacy mode is enabled. func TestSchedulerCreationInLegacyMode(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("configmap", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -232,8 +232,8 @@ func TestSchedulerCreationInLegacyMode(t *testing.T) { } func TestUnschedulableNodes(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("unschedulable-nodes", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -488,7 +488,7 @@ func DoTestUnschedulableNodes(t *testing.T, cs clientset.Interface, ns *v1.Names } func TestMultiScheduler(t *testing.T) { - _, s := framework.RunAMaster(nil) + _, s, _ := framework.RunAMaster(nil) // TODO: Uncomment when fix #19254 // This seems to be a different issue - it still doesn't work. // defer s.Close() @@ -703,8 +703,8 @@ func createPod(client clientset.Interface, name string, scheduler string) *v1.Po // This test will verify scheduler can work well regardless of whether kubelet is allocatable aware or not. func TestAllocatable(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("allocatable", s, t) defer framework.DeleteTestingNamespace(ns, s, t) diff --git a/test/integration/secrets/secrets_test.go b/test/integration/secrets/secrets_test.go index 2379071236b..23277613fd2 100644 --- a/test/integration/secrets/secrets_test.go +++ b/test/integration/secrets/secrets_test.go @@ -38,8 +38,8 @@ func deleteSecretOrErrorf(t *testing.T, c clientset.Interface, ns, name string) // TestSecrets tests apiserver-side behavior of creation of secret objects and their use by pods. func TestSecrets(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) diff --git a/test/integration/storageclasses/storage_classes_test.go b/test/integration/storageclasses/storage_classes_test.go index 205e0f0eed3..7151c9179e4 100644 --- a/test/integration/storageclasses/storage_classes_test.go +++ b/test/integration/storageclasses/storage_classes_test.go @@ -35,8 +35,8 @@ const provisionerPluginName = "kubernetes.io/mock-provisioner" // TestStorageClasses tests apiserver-side behavior of creation of storage class objects and their use by pvcs. func TestStorageClasses(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) diff --git a/test/integration/thirdparty/client-go_test.go b/test/integration/thirdparty/client-go_test.go index 4b1359b6970..0e638dc7f2d 100644 --- a/test/integration/thirdparty/client-go_test.go +++ b/test/integration/thirdparty/client-go_test.go @@ -34,8 +34,8 @@ import ( ) func TestClientGoThirdPartyResourceExample(t *testing.T) { - _, s := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) - defer s.Close() + _, s, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) + defer closeFn() scheme := runtime.NewScheme() if err := exampletprv1.AddToScheme(scheme); err != nil { diff --git a/test/integration/thirdparty/thirdparty_test.go b/test/integration/thirdparty/thirdparty_test.go index 03c47be4b46..5ce210e380a 100644 --- a/test/integration/thirdparty/thirdparty_test.go +++ b/test/integration/thirdparty/thirdparty_test.go @@ -42,8 +42,8 @@ func TestThirdPartyDiscovery(t *testing.T) { group := "company.com" version := "v1" - _, s := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) - defer s.Close() + _, s, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) + defer closeFn() clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} client := clientset.NewForConfigOrDie(clientConfig) @@ -91,8 +91,8 @@ func TestThirdPartyDiscovery(t *testing.T) { // TODO these tests will eventually be runnable in a single test func TestThirdPartyDelete(t *testing.T) { - _, s := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) - defer s.Close() + _, s, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) + defer closeFn() clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} client := clientset.NewForConfigOrDie(clientConfig) @@ -101,8 +101,8 @@ func TestThirdPartyDelete(t *testing.T) { } func TestThirdPartyMultiple(t *testing.T) { - _, s := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) - defer s.Close() + _, s, closeFn := framework.RunAMaster(framework.NewIntegrationTestMasterConfig()) + defer closeFn() clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} client := clientset.NewForConfigOrDie(clientConfig) diff --git a/test/integration/ttlcontroller/ttlcontroller_test.go b/test/integration/ttlcontroller/ttlcontroller_test.go index 7167afac563..e6511a512c8 100644 --- a/test/integration/ttlcontroller/ttlcontroller_test.go +++ b/test/integration/ttlcontroller/ttlcontroller_test.go @@ -109,8 +109,8 @@ func waitForNodesWithTTLAnnotation(t *testing.T, nodeLister listers.NodeLister, // Test whether ttlcontroller sets correct ttl annotations. func TestTTLAnnotations(t *testing.T) { - _, server := framework.RunAMaster(nil) - defer server.Close() + _, server, closeFn := framework.RunAMaster(nil) + defer closeFn() testClient, informers := createClientAndInformers(t, server) nodeInformer := informers.Core().V1().Nodes() diff --git a/test/integration/volume/attach_detach_test.go b/test/integration/volume/attach_detach_test.go index 61794bf9981..3e15eee0fa6 100644 --- a/test/integration/volume/attach_detach_test.go +++ b/test/integration/volume/attach_detach_test.go @@ -77,8 +77,8 @@ func fakePodWithVol(namespace string) *v1.Pod { // event is somehow missed by AttachDetach controller - it still // gets cleaned up by Desired State of World populator. func TestPodDeletionWithDswp(t *testing.T) { - _, server := framework.RunAMaster(nil) - defer server.Close() + _, server, closeFn := framework.RunAMaster(nil) + defer closeFn() namespaceName := "test-pod-deletion" node := &v1.Node{ @@ -225,8 +225,8 @@ func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, sy // event is somehow missed by AttachDetach controller - it still // gets added by Desired State of World populator. func TestPodAddedByDswp(t *testing.T) { - _, server := framework.RunAMaster(nil) - defer server.Close() + _, server, closeFn := framework.RunAMaster(nil) + defer closeFn() namespaceName := "test-pod-deletion" node := &v1.Node{ diff --git a/test/integration/volume/persistent_volumes_test.go b/test/integration/volume/persistent_volumes_test.go index eaa55a2cd7e..3e2bb0c84e1 100644 --- a/test/integration/volume/persistent_volumes_test.go +++ b/test/integration/volume/persistent_volumes_test.go @@ -103,8 +103,8 @@ func testSleep() { func TestPersistentVolumeRecycler(t *testing.T) { glog.V(2).Infof("TestPersistentVolumeRecycler started") - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pv-recycler", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -158,8 +158,8 @@ func TestPersistentVolumeRecycler(t *testing.T) { func TestPersistentVolumeDeleter(t *testing.T) { glog.V(2).Infof("TestPersistentVolumeDeleter started") - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pv-deleter", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -218,8 +218,8 @@ func TestPersistentVolumeBindRace(t *testing.T) { // Test a race binding many claims to a PV that is pre-bound to a specific // PVC. Only this specific PVC should get bound. glog.V(2).Infof("TestPersistentVolumeBindRace started") - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pv-bind-race", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -290,8 +290,8 @@ func TestPersistentVolumeBindRace(t *testing.T) { // TestPersistentVolumeClaimLabelSelector test binding using label selectors func TestPersistentVolumeClaimLabelSelector(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pvc-label-selector", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -371,8 +371,8 @@ func TestPersistentVolumeClaimLabelSelector(t *testing.T) { // TestPersistentVolumeClaimLabelSelectorMatchExpressions test binding using // MatchExpressions label selectors func TestPersistentVolumeClaimLabelSelectorMatchExpressions(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("pvc-match-expressions", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -471,8 +471,8 @@ func TestPersistentVolumeClaimLabelSelectorMatchExpressions(t *testing.T) { // TestPersistentVolumeMultiPVs tests binding of one PVC to 100 PVs with // different size. func TestPersistentVolumeMultiPVs(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("multi-pvs", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -561,8 +561,8 @@ func TestPersistentVolumeMultiPVs(t *testing.T) { // TestPersistentVolumeMultiPVsPVCs tests binding of 100 PVC to 100 PVs. // This test is configurable by KUBE_INTEGRATION_PV_* variables. func TestPersistentVolumeMultiPVsPVCs(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("multi-pvs-pvcs", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -722,8 +722,8 @@ func TestPersistentVolumeMultiPVsPVCs(t *testing.T) { // TestPersistentVolumeControllerStartup tests startup of the controller. // The controller should not unbind any volumes when it starts. func TestPersistentVolumeControllerStartup(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("controller-startup", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -851,8 +851,8 @@ func TestPersistentVolumeControllerStartup(t *testing.T) { // TestPersistentVolumeProvisionMultiPVCs tests provisioning of many PVCs. // This test is configurable by KUBE_INTEGRATION_PV_* variables. func TestPersistentVolumeProvisionMultiPVCs(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("provision-multi-pvs", s, t) defer framework.DeleteTestingNamespace(ns, s, t) @@ -946,8 +946,8 @@ func TestPersistentVolumeProvisionMultiPVCs(t *testing.T) { // TestPersistentVolumeMultiPVsDiffAccessModes tests binding of one PVC to two // PVs with different access modes. func TestPersistentVolumeMultiPVsDiffAccessModes(t *testing.T) { - _, s := framework.RunAMaster(nil) - defer s.Close() + _, s, closeFn := framework.RunAMaster(nil) + defer closeFn() ns := framework.CreateTestingNamespace("multi-pvs-diff-access", s, t) defer framework.DeleteTestingNamespace(ns, s, t)