diff --git a/pkg/genericapiserver/genericapiserver_test.go b/pkg/genericapiserver/genericapiserver_test.go index 44e32632fc..30a5a57da8 100644 --- a/pkg/genericapiserver/genericapiserver_test.go +++ b/pkg/genericapiserver/genericapiserver_test.go @@ -45,7 +45,7 @@ import ( // setUp is a convience function for setting up for (most) tests. func setUp(t *testing.T) (GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { - etcdServer := etcdtesting.NewEtcdTestClientServer(t) + etcdServer, _ := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) genericapiserver := GenericAPIServer{} config := Config{} diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 24911d43b1..c0490bbce3 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -60,7 +60,6 @@ import ( "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" - "k8s.io/kubernetes/pkg/storage/storagebackend" "k8s.io/kubernetes/pkg/util/intstr" utilnet "k8s.io/kubernetes/pkg/util/net" "k8s.io/kubernetes/pkg/util/sets" @@ -75,7 +74,7 @@ import ( // setUp is a convience function for setting up for (most) tests. func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { - server := etcdtesting.NewUnsecuredEtcdTestClientServer(t) + server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) master := &Master{ GenericAPIServer: &genericapiserver.GenericAPIServer{}, @@ -84,16 +83,6 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. Config: &genericapiserver.Config{}, } - storageConfig := storagebackend.Config{ - Prefix: etcdtest.PathPrefix(), - CAFile: server.CAFile, - KeyFile: server.KeyFile, - CertFile: server.CertFile, - } - for _, url := range server.ClientURLs { - storageConfig.ServerList = append(storageConfig.ServerList, url.String()) - } - resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig() resourceEncoding.SetVersionEncoding(api.GroupName, *testapi.Default.GroupVersion(), unversioned.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(autoscaling.GroupName, *testapi.Autoscaling.GroupVersion(), unversioned.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal}) @@ -102,7 +91,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. resourceEncoding.SetVersionEncoding(extensions.GroupName, *testapi.Extensions.GroupVersion(), unversioned.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(rbac.GroupName, *testapi.Rbac.GroupVersion(), unversioned.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(certificates.GroupName, *testapi.Certificates.GroupVersion(), unversioned.GroupVersion{Group: certificates.GroupName, Version: runtime.APIVersionInternal}) - storageFactory := genericapiserver.NewDefaultStorageFactory(storageConfig, testapi.StorageMediaType(), api.Codecs, resourceEncoding, DefaultAPIResourceConfigSource()) + storageFactory := genericapiserver.NewDefaultStorageFactory(*storageConfig, testapi.StorageMediaType(), api.Codecs, resourceEncoding, DefaultAPIResourceConfigSource()) config.StorageFactory = storageFactory config.APIResourceConfigSource = DefaultAPIResourceConfigSource() diff --git a/pkg/registry/certificates/etcd/etcd.go b/pkg/registry/certificates/etcd/etcd.go index 2dbeb09aaa..cefe494de0 100644 --- a/pkg/registry/certificates/etcd/etcd.go +++ b/pkg/registry/certificates/etcd/etcd.go @@ -40,7 +40,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &certificates.CertificateSigningRequestList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.CertificateSigningRequests), &certificates.CertificateSigningRequest{}, @@ -72,7 +72,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { UpdateStrategy: csrregistry.Strategy, DeleteStrategy: csrregistry.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } // Subresources use the same store and creation strategy, which only diff --git a/pkg/registry/clusterrole/etcd/etcd.go b/pkg/registry/clusterrole/etcd/etcd.go index f3b4e16f4d..034621a4dc 100644 --- a/pkg/registry/clusterrole/etcd/etcd.go +++ b/pkg/registry/clusterrole/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.ClusterRoleList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ClusterRoles), &rbac.ClusterRole{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: clusterrole.Strategy, DeleteStrategy: clusterrole.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/clusterrolebinding/etcd/etcd.go b/pkg/registry/clusterrolebinding/etcd/etcd.go index 4d2b3cd82e..ae88503efb 100644 --- a/pkg/registry/clusterrolebinding/etcd/etcd.go +++ b/pkg/registry/clusterrolebinding/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.ClusterRoleBindingList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ClusterRoleBindings), &rbac.ClusterRoleBinding{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: clusterrolebinding.Strategy, DeleteStrategy: clusterrolebinding.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/configmap/etcd/etcd.go b/pkg/registry/configmap/etcd/etcd.go index f3adfa9f3e..74c54090a4 100644 --- a/pkg/registry/configmap/etcd/etcd.go +++ b/pkg/registry/configmap/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ConfigMapList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ConfigMaps), &api.ConfigMap{}, @@ -81,7 +81,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: configmap.Strategy, DeleteStrategy: configmap.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/configmap/etcd/etcd_test.go b/pkg/registry/configmap/etcd/etcd_test.go index d93b0b0ddf..4cd6a8090b 100644 --- a/pkg/registry/configmap/etcd/etcd_test.go +++ b/pkg/registry/configmap/etcd/etcd_test.go @@ -53,6 +53,7 @@ func validNewConfigMap() *api.ConfigMap { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) validConfigMap := validNewConfigMap() @@ -80,6 +81,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -102,6 +104,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewConfigMap()) } @@ -109,6 +112,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewConfigMap()) } @@ -116,6 +120,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewConfigMap()) } @@ -123,6 +128,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewConfigMap(), diff --git a/pkg/registry/controller/etcd/etcd.go b/pkg/registry/controller/etcd/etcd.go index 41a3b320cc..3fb538dbf9 100644 --- a/pkg/registry/controller/etcd/etcd.go +++ b/pkg/registry/controller/etcd/etcd.go @@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, @@ -104,7 +104,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: controller.Strategy, DeleteStrategy: controller.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = controller.StatusStrategy diff --git a/pkg/registry/controller/etcd/etcd_test.go b/pkg/registry/controller/etcd/etcd_test.go index 4e2b027669..9aaa995b8b 100644 --- a/pkg/registry/controller/etcd/etcd_test.go +++ b/pkg/registry/controller/etcd/etcd_test.go @@ -88,6 +88,7 @@ var validController = validNewController() func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) controller := validNewController() controller.ObjectMeta = api.ObjectMeta{} @@ -108,6 +109,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) test.TestUpdate( // valid @@ -135,6 +137,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) test.TestDelete(validNewController()) } @@ -142,6 +145,7 @@ func TestDelete(t *testing.T) { func TestGenerationNumber(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() modifiedSno := *validNewController() modifiedSno.Generation = 100 modifiedSno.Status.ObservedGeneration = 10 @@ -192,6 +196,7 @@ func TestGenerationNumber(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) test.TestGet(validNewController()) } @@ -199,6 +204,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) test.TestList(validNewController()) } @@ -206,6 +212,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() test := registrytest.New(t, storage.Controller.Store) test.TestWatch( validController, @@ -240,6 +247,7 @@ func TestWatch(t *testing.T) { func TestScaleGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), namespace) rc, err := createController(storage.Controller, *validController, t) @@ -276,6 +284,7 @@ func TestScaleGet(t *testing.T) { func TestScaleUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Controller.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), namespace) rc, err := createController(storage.Controller, *validController, t) diff --git a/pkg/registry/daemonset/etcd/etcd.go b/pkg/registry/daemonset/etcd/etcd.go index 0c1d3a89e7..cf3ee4593a 100644 --- a/pkg/registry/daemonset/etcd/etcd.go +++ b/pkg/registry/daemonset/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.DaemonSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Daemonsets), &extensions.DaemonSet{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: daemonset.Strategy, DeleteStrategy: daemonset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = daemonset.StatusStrategy diff --git a/pkg/registry/daemonset/etcd/etcd_test.go b/pkg/registry/daemonset/etcd/etcd_test.go index 07d5136358..470763fd88 100644 --- a/pkg/registry/daemonset/etcd/etcd_test.go +++ b/pkg/registry/daemonset/etcd/etcd_test.go @@ -70,6 +70,7 @@ var validDaemonSet = newValidDaemonSet() func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) ds := newValidDaemonSet() ds.ObjectMeta = api.ObjectMeta{} @@ -96,6 +97,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -124,6 +126,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(newValidDaemonSet()) } @@ -131,6 +134,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(newValidDaemonSet()) } @@ -138,6 +142,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(newValidDaemonSet()) } @@ -145,6 +150,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validDaemonSet, diff --git a/pkg/registry/deployment/etcd/etcd.go b/pkg/registry/deployment/etcd/etcd.go index 502d681a94..1e93d6a90a 100644 --- a/pkg/registry/deployment/etcd/etcd.go +++ b/pkg/registry/deployment/etcd/etcd.go @@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, @@ -102,7 +102,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) { UpdateStrategy: deployment.Strategy, DeleteStrategy: deployment.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = deployment.StatusStrategy diff --git a/pkg/registry/deployment/etcd/etcd_test.go b/pkg/registry/deployment/etcd/etcd_test.go index 8c0c4a85d9..6d4433416b 100644 --- a/pkg/registry/deployment/etcd/etcd_test.go +++ b/pkg/registry/deployment/etcd/etcd_test.go @@ -93,6 +93,7 @@ var validDeployment = *validNewDeployment() func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) deployment := validNewDeployment() deployment.ObjectMeta = api.ObjectMeta{} @@ -112,6 +113,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) test.TestUpdate( // valid @@ -144,6 +146,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) test.TestDelete(validNewDeployment()) } @@ -151,6 +154,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) test.TestGet(validNewDeployment()) } @@ -158,6 +162,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) test.TestList(validNewDeployment()) } @@ -165,6 +170,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() test := registrytest.New(t, storage.Deployment.Store) test.TestWatch( validNewDeployment(), @@ -190,7 +196,7 @@ func TestWatch(t *testing.T) { func TestScaleGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) - + defer storage.Deployment.Store.DestroyFunc() var deployment extensions.Deployment ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) @@ -227,7 +233,7 @@ func TestScaleGet(t *testing.T) { func TestScaleUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) - + defer storage.Deployment.Store.DestroyFunc() var deployment extensions.Deployment ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) @@ -265,7 +271,7 @@ func TestScaleUpdate(t *testing.T) { func TestStatusUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) - + defer storage.Deployment.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, nil, 0); err != nil { @@ -348,6 +354,7 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) { t.Errorf("%s: expected: %v, got: %v", k, *d.(*extensions.Deployment).Spec.RollbackTo, test.rollback.RollbackTo) } } + storage.Deployment.Store.DestroyFunc() server.Terminate(t) } } @@ -357,6 +364,7 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) { func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Deployment.Store.DestroyFunc() rollbackStorage := storage.Rollback ctx := api.WithNamespace(api.NewContext(), namespace) diff --git a/pkg/registry/endpoint/etcd/etcd.go b/pkg/registry/endpoint/etcd/etcd.go index 9baf0e7472..ed70ffbf2b 100644 --- a/pkg/registry/endpoint/etcd/etcd.go +++ b/pkg/registry/endpoint/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.EndpointsList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Endpoints), &api.Endpoints{}, @@ -65,7 +65,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: endpoint.Strategy, DeleteStrategy: endpoint.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/endpoint/etcd/etcd_test.go b/pkg/registry/endpoint/etcd/etcd_test.go index 957aadf322..4692c9b9c6 100644 --- a/pkg/registry/endpoint/etcd/etcd_test.go +++ b/pkg/registry/endpoint/etcd/etcd_test.go @@ -60,6 +60,7 @@ func validChangedEndpoints() *api.Endpoints { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) endpoints := validNewEndpoints() endpoints.ObjectMeta = api.ObjectMeta{} @@ -76,6 +77,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestUpdate( // valid @@ -95,6 +97,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewEndpoints()) } @@ -102,6 +105,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewEndpoints()) } @@ -109,6 +113,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewEndpoints()) } @@ -116,6 +121,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewEndpoints(), diff --git a/pkg/registry/event/etcd/etcd.go b/pkg/registry/event/etcd/etcd.go index ee5f650639..01574a5fa2 100644 --- a/pkg/registry/event/etcd/etcd.go +++ b/pkg/registry/event/etcd/etcd.go @@ -34,7 +34,7 @@ func NewREST(opts generic.RESTOptions, ttl uint64) *REST { // We explicitly do NOT do any decoration here - switching on Cacher // for events will lead to too high memory consumption. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Event{} }, @@ -59,7 +59,8 @@ func NewREST(opts generic.RESTOptions, ttl uint64) *REST { UpdateStrategy: event.Strategy, DeleteStrategy: event.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/event/etcd/etcd_test.go b/pkg/registry/event/etcd/etcd_test.go index 9ed2630b40..1aa6a11dd6 100644 --- a/pkg/registry/event/etcd/etcd_test.go +++ b/pkg/registry/event/etcd/etcd_test.go @@ -51,6 +51,7 @@ func validNewEvent(namespace string) *api.Event { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) event := validNewEvent(test.TestNamespace()) event.ObjectMeta = api.ObjectMeta{} @@ -65,6 +66,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestUpdate( // valid @@ -87,6 +89,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewEvent(test.TestNamespace())) } diff --git a/pkg/registry/generic/registry/store.go b/pkg/registry/generic/registry/store.go index 8669316d6d..fd49e3ee11 100644 --- a/pkg/registry/generic/registry/store.go +++ b/pkg/registry/generic/registry/store.go @@ -90,6 +90,9 @@ type Store struct { // Returns a matcher corresponding to the provided labels and fields. PredicateFunc func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate + // Called to cleanup storage clients. + DestroyFunc func() + // DeleteCollectionWorkers is the maximum number of workers in a single // DeleteCollection call. DeleteCollectionWorkers int diff --git a/pkg/registry/generic/registry/store_test.go b/pkg/registry/generic/registry/store_test.go index 444c321b03..bdf1b6a8a3 100644 --- a/pkg/registry/generic/registry/store_test.go +++ b/pkg/registry/generic/registry/store_test.go @@ -40,7 +40,6 @@ import ( "k8s.io/kubernetes/pkg/selection" "k8s.io/kubernetes/pkg/storage" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" "k8s.io/kubernetes/pkg/storage/storagebackend/factory" storagetesting "k8s.io/kubernetes/pkg/storage/testing" @@ -1197,12 +1196,16 @@ func TestStoreWatch(t *testing.T) { func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (factory.DestroyFunc, *Store) { podPrefix := "/pods" - server := etcdtesting.NewEtcdTestClientServer(t) + server, sc := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true} - codec := testapi.Default.StorageCodec() - s := etcdstorage.NewEtcdStorage(server.Client, codec, etcdtest.PathPrefix(), false, etcdtest.DeserializationCacheSize) + sc.Codec = testapi.Default.StorageCodec() + s, dFunc, err := factory.Create(*sc) + if err != nil { + t.Fatalf("Error creating storage: %v", err) + } destroyFunc := func() { + dFunc() server.Terminate(t) } if hasCacheEnabled { @@ -1214,7 +1217,7 @@ func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (factory.De ResourcePrefix: podPrefix, KeyFunc: func(obj runtime.Object) (string, error) { return storage.NoNamespaceKeyFunc(podPrefix, obj) }, NewListFunc: func() runtime.Object { return &api.PodList{} }, - Codec: codec, + Codec: sc.Codec, } cacher := storage.NewCacherFromConfig(config) d := destroyFunc diff --git a/pkg/registry/horizontalpodautoscaler/etcd/etcd.go b/pkg/registry/horizontalpodautoscaler/etcd/etcd.go index b9b238bdc1..7a34f36f7f 100644 --- a/pkg/registry/horizontalpodautoscaler/etcd/etcd.go +++ b/pkg/registry/horizontalpodautoscaler/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.HorizontalPodAutoscalers), &autoscaling.HorizontalPodAutoscaler{}, @@ -77,7 +77,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: horizontalpodautoscaler.Strategy, DeleteStrategy: horizontalpodautoscaler.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = horizontalpodautoscaler.StatusStrategy diff --git a/pkg/registry/horizontalpodautoscaler/etcd/etcd_test.go b/pkg/registry/horizontalpodautoscaler/etcd/etcd_test.go index 6436804a92..a474d75350 100644 --- a/pkg/registry/horizontalpodautoscaler/etcd/etcd_test.go +++ b/pkg/registry/horizontalpodautoscaler/etcd/etcd_test.go @@ -59,6 +59,7 @@ func validNewHorizontalPodAutoscaler(name string) *autoscaling.HorizontalPodAuto func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) autoscaler := validNewHorizontalPodAutoscaler("foo") autoscaler.ObjectMeta = api.ObjectMeta{} @@ -73,6 +74,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -89,6 +91,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewHorizontalPodAutoscaler("foo")) } @@ -96,6 +99,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewHorizontalPodAutoscaler("foo")) } @@ -103,6 +107,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewHorizontalPodAutoscaler("foo")) } @@ -110,6 +115,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewHorizontalPodAutoscaler("foo"), diff --git a/pkg/registry/ingress/etcd/etcd.go b/pkg/registry/ingress/etcd/etcd.go index afa05ca0d4..3b991c9046 100644 --- a/pkg/registry/ingress/etcd/etcd.go +++ b/pkg/registry/ingress/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.IngressList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Ingress), &extensions.Ingress{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: ingress.Strategy, DeleteStrategy: ingress.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = ingress.StatusStrategy diff --git a/pkg/registry/ingress/etcd/etcd_test.go b/pkg/registry/ingress/etcd/etcd_test.go index 8c94e12e48..7828d8a654 100644 --- a/pkg/registry/ingress/etcd/etcd_test.go +++ b/pkg/registry/ingress/etcd/etcd_test.go @@ -115,6 +115,7 @@ func validIngress() *extensions.Ingress { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) ingress := validIngress() noDefaultBackendAndRules := validIngress() @@ -134,6 +135,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -169,6 +171,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validIngress()) } @@ -176,6 +179,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validIngress()) } @@ -183,6 +187,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validIngress()) } @@ -190,6 +195,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validIngress(), diff --git a/pkg/registry/job/etcd/etcd.go b/pkg/registry/job/etcd/etcd.go index fe7f300b62..08507a77c4 100644 --- a/pkg/registry/job/etcd/etcd.go +++ b/pkg/registry/job/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &batch.JobList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Jobs), &batch.Job{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: job.Strategy, DeleteStrategy: job.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/job/etcd/etcd_test.go b/pkg/registry/job/etcd/etcd_test.go index 291642ea90..fed6d91879 100644 --- a/pkg/registry/job/etcd/etcd_test.go +++ b/pkg/registry/job/etcd/etcd_test.go @@ -76,6 +76,7 @@ func validNewJob() *batch.Job { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) validJob := validNewJob() validJob.ObjectMeta = api.ObjectMeta{} @@ -96,6 +97,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) two := int32(2) test.TestUpdate( @@ -124,6 +126,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewJob()) } @@ -131,6 +134,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewJob()) } @@ -138,6 +142,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewJob()) } @@ -145,6 +150,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewJob(), diff --git a/pkg/registry/limitrange/etcd/etcd.go b/pkg/registry/limitrange/etcd/etcd.go index b39343e6c0..ddfd4662fd 100644 --- a/pkg/registry/limitrange/etcd/etcd.go +++ b/pkg/registry/limitrange/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.LimitRangeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.LimitRanges), &api.LimitRange{}, @@ -66,7 +66,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: limitrange.Strategy, ExportStrategy: limitrange.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/limitrange/etcd/etcd_test.go b/pkg/registry/limitrange/etcd/etcd_test.go index 8e2e558e69..f20a26942a 100644 --- a/pkg/registry/limitrange/etcd/etcd_test.go +++ b/pkg/registry/limitrange/etcd/etcd_test.go @@ -62,6 +62,7 @@ func validNewLimitRange() *api.LimitRange { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).GeneratesName() validLimitRange := validNewLimitRange() validLimitRange.ObjectMeta = api.ObjectMeta{} @@ -78,6 +79,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestUpdate( // valid @@ -106,6 +108,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewLimitRange()) } @@ -113,6 +116,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewLimitRange()) } @@ -120,6 +124,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewLimitRange()) } @@ -127,6 +132,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewLimitRange(), diff --git a/pkg/registry/namespace/etcd/etcd.go b/pkg/registry/namespace/etcd/etcd.go index 3adc1eca3d..047692b459 100644 --- a/pkg/registry/namespace/etcd/etcd.go +++ b/pkg/registry/namespace/etcd/etcd.go @@ -53,7 +53,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NamespaceList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, @@ -84,7 +84,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { DeleteStrategy: namespace.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/namespace/etcd/etcd_test.go b/pkg/registry/namespace/etcd/etcd_test.go index 1265e83f7e..7a243fc1dd 100644 --- a/pkg/registry/namespace/etcd/etcd_test.go +++ b/pkg/registry/namespace/etcd/etcd_test.go @@ -47,6 +47,7 @@ func validNewNamespace() *api.Namespace { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() namespace := validNewNamespace() namespace.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} @@ -63,6 +64,7 @@ func TestCreate(t *testing.T) { func TestCreateSetsFields(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() namespace := validNewNamespace() ctx := api.NewContext() _, err := storage.Create(ctx, namespace) @@ -89,6 +91,7 @@ func TestCreateSetsFields(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() test.TestDelete(validNewNamespace()) } @@ -96,6 +99,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestGet(validNewNamespace()) } @@ -103,6 +107,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestList(validNewNamespace()) } @@ -110,6 +115,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestWatch( validNewNamespace(), @@ -134,6 +140,7 @@ func TestWatch(t *testing.T) { func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() key := etcdtest.AddPrefix("namespaces/foo") ctx := api.NewContext() now := unversioned.Now() @@ -158,6 +165,7 @@ func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) { func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() key := etcdtest.AddPrefix("namespaces/foo") ctx := api.NewContext() now := unversioned.Now() diff --git a/pkg/registry/networkpolicy/etcd/etcd.go b/pkg/registry/networkpolicy/etcd/etcd.go index 135e6eee20..00460004ec 100644 --- a/pkg/registry/networkpolicy/etcd/etcd.go +++ b/pkg/registry/networkpolicy/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensionsapi.NetworkPolicyList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.NetworkPolicys), &extensionsapi.NetworkPolicy{}, @@ -78,7 +78,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: networkpolicy.Strategy, DeleteStrategy: networkpolicy.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/networkpolicy/etcd/etcd_test.go b/pkg/registry/networkpolicy/etcd/etcd_test.go index 3eba670e7b..1c16dd2464 100644 --- a/pkg/registry/networkpolicy/etcd/etcd_test.go +++ b/pkg/registry/networkpolicy/etcd/etcd_test.go @@ -81,6 +81,7 @@ var validNetworkPolicy = *validNewNetworkPolicy() func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) np := validNewNetworkPolicy() np.ObjectMeta = api.ObjectMeta{} @@ -102,6 +103,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -128,6 +130,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewNetworkPolicy()) } @@ -135,6 +138,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewNetworkPolicy()) } @@ -142,6 +146,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewNetworkPolicy()) } @@ -149,6 +154,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewNetworkPolicy(), diff --git a/pkg/registry/node/etcd/etcd.go b/pkg/registry/node/etcd/etcd.go index 4f215f2e2a..862cfe9898 100644 --- a/pkg/registry/node/etcd/etcd.go +++ b/pkg/registry/node/etcd/etcd.go @@ -69,7 +69,7 @@ func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NodeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, @@ -99,7 +99,8 @@ func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter DeleteStrategy: node.Strategy, ExportStrategy: node.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/node/etcd/etcd_test.go b/pkg/registry/node/etcd/etcd_test.go index 9c5c96f3d9..fe7754346e 100644 --- a/pkg/registry/node/etcd/etcd_test.go +++ b/pkg/registry/node/etcd/etcd_test.go @@ -67,6 +67,7 @@ func validNewNode() *api.Node { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() node := validNewNode() node.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} @@ -83,6 +84,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestUpdate( // valid @@ -99,6 +101,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestDelete(validNewNode()) } @@ -106,6 +109,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestGet(validNewNode()) } @@ -113,6 +117,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestList(validNewNode()) } @@ -120,6 +125,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestWatch( validNewNode(), diff --git a/pkg/registry/persistentvolume/etcd/etcd.go b/pkg/registry/persistentvolume/etcd/etcd.go index 63fd220c2d..3ae4c63612 100644 --- a/pkg/registry/persistentvolume/etcd/etcd.go +++ b/pkg/registry/persistentvolume/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PersistentVolumeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumes), &api.PersistentVolume{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: persistentvolume.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/persistentvolume/etcd/etcd_test.go b/pkg/registry/persistentvolume/etcd/etcd_test.go index db07b4acd9..11ce4e61c8 100644 --- a/pkg/registry/persistentvolume/etcd/etcd_test.go +++ b/pkg/registry/persistentvolume/etcd/etcd_test.go @@ -71,6 +71,7 @@ func validChangedPersistentVolume() *api.PersistentVolume { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() pv := validNewPersistentVolume("foo") pv.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} @@ -87,6 +88,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestUpdate( // valid @@ -105,6 +107,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() test.TestDelete(validNewPersistentVolume("foo")) } @@ -112,6 +115,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestGet(validNewPersistentVolume("foo")) } @@ -119,6 +123,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestList(validNewPersistentVolume("foo")) } @@ -126,6 +131,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestWatch( validNewPersistentVolume("foo"), @@ -150,6 +156,7 @@ func TestWatch(t *testing.T) { func TestUpdateStatus(t *testing.T) { storage, statusStorage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewContext() key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) diff --git a/pkg/registry/persistentvolumeclaim/etcd/etcd.go b/pkg/registry/persistentvolumeclaim/etcd/etcd.go index 8637bd5a4f..677e9317a9 100644 --- a/pkg/registry/persistentvolumeclaim/etcd/etcd.go +++ b/pkg/registry/persistentvolumeclaim/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumeClaims), &api.PersistentVolumeClaim{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: persistentvolumeclaim.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go index 9b09e1cae1..f362e64488 100644 --- a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go +++ b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go @@ -63,6 +63,7 @@ func validNewPersistentVolumeClaim(name, ns string) *api.PersistentVolumeClaim { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) pv := validNewPersistentVolumeClaim("foo", api.NamespaceDefault) pv.ObjectMeta = api.ObjectMeta{} @@ -79,6 +80,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -95,6 +97,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ReturnDeletedObject() test.TestDelete(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) } @@ -102,6 +105,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) } @@ -109,6 +113,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) } @@ -116,6 +121,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewPersistentVolumeClaim("foo", api.NamespaceDefault), @@ -140,6 +146,7 @@ func TestWatch(t *testing.T) { func TestUpdateStatus(t *testing.T) { storage, statusStorage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") diff --git a/pkg/registry/petset/etcd/etcd.go b/pkg/registry/petset/etcd/etcd.go index d256414cff..e52367930a 100644 --- a/pkg/registry/petset/etcd/etcd.go +++ b/pkg/registry/petset/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &appsapi.PetSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PetSet), &appsapi.PetSet{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: petset.Strategy, DeleteStrategy: petset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = petset.StatusStrategy diff --git a/pkg/registry/petset/etcd/etcd_test.go b/pkg/registry/petset/etcd/etcd_test.go index 4caee14e40..38ef403376 100644 --- a/pkg/registry/petset/etcd/etcd_test.go +++ b/pkg/registry/petset/etcd/etcd_test.go @@ -83,6 +83,7 @@ func validNewPetSet() *apps.PetSet { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) ps := validNewPetSet() ps.ObjectMeta = api.ObjectMeta{} @@ -98,7 +99,7 @@ func TestCreate(t *testing.T) { func TestStatusUpdate(t *testing.T) { storage, statusStorage, server := newStorage(t) defer server.Terminate(t) - + defer storage.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/petsets/" + api.NamespaceDefault + "/foo") validPetSet := validNewPetSet() @@ -135,6 +136,7 @@ func TestStatusUpdate(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewPetSet()) } @@ -142,6 +144,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewPetSet()) } @@ -149,6 +152,7 @@ func TestList(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewPetSet()) } @@ -156,6 +160,7 @@ func TestDelete(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewPetSet(), diff --git a/pkg/registry/pod/etcd/etcd.go b/pkg/registry/pod/etcd/etcd.go index dc4fa3e37c..a5650beec6 100644 --- a/pkg/registry/pod/etcd/etcd.go +++ b/pkg/registry/pod/etcd/etcd.go @@ -63,7 +63,7 @@ func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTr prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, @@ -94,7 +94,8 @@ func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTr DeleteStrategy: pod.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/pod/etcd/etcd_test.go b/pkg/registry/pod/etcd/etcd_test.go index dbeeb0a05f..2c7e8cc427 100644 --- a/pkg/registry/pod/etcd/etcd_test.go +++ b/pkg/registry/pod/etcd/etcd_test.go @@ -82,6 +82,7 @@ func validChangedPod() *api.Pod { func TestCreate(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) pod := validNewPod() pod.ObjectMeta = api.ObjectMeta{} @@ -108,6 +109,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -124,6 +126,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ReturnDeletedObject() test.TestDelete(validNewPod()) @@ -156,6 +159,7 @@ func TestIgnoreDeleteNotFound(t *testing.T) { called := false registry, server := newFailDeleteStorage(t, &called) defer server.Terminate(t) + defer registry.Store.DestroyFunc() // should fail if pod A is not created yet. _, err := registry.Delete(testContext, pod.Name, nil) @@ -199,6 +203,7 @@ func TestIgnoreDeleteNotFound(t *testing.T) { func TestCreateSetsFields(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() pod := validNewPod() _, err := storage.Create(api.NewDefaultContext(), pod) if err != nil { @@ -341,6 +346,7 @@ func TestResourceLocation(t *testing.T) { func TestGet(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewPod()) } @@ -348,6 +354,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewPod()) } @@ -355,6 +362,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewPod(), @@ -378,6 +386,7 @@ func TestWatch(t *testing.T) { func TestEtcdCreate(t *testing.T) { storage, bindingStorage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) @@ -406,6 +415,7 @@ func TestEtcdCreate(t *testing.T) { func TestEtcdCreateBindingNoPod(t *testing.T) { storage, bindingStorage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") @@ -437,6 +447,7 @@ func TestEtcdCreateBindingNoPod(t *testing.T) { func TestEtcdCreateFailsWithoutNamespace(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() pod := validNewPod() pod.Namespace = "" _, err := storage.Create(api.NewContext(), pod) @@ -449,6 +460,7 @@ func TestEtcdCreateFailsWithoutNamespace(t *testing.T) { func TestEtcdCreateWithContainersNotFound(t *testing.T) { storage, bindingStorage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) @@ -484,6 +496,7 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) { func TestEtcdCreateWithConflict(t *testing.T) { storage, bindingStorage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() _, err := storage.Create(ctx, validNewPod()) @@ -514,6 +527,7 @@ func TestEtcdCreateWithConflict(t *testing.T) { func TestEtcdCreateWithExistingContainers(t *testing.T) { storage, bindingStorage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) @@ -592,6 +606,7 @@ func TestEtcdCreateBinding(t *testing.T) { t.Errorf("%s: expected: %v, got: %v", k, pod.(*api.Pod).Spec.NodeName, test.binding.Target.Name) } } + storage.Store.DestroyFunc() server.Terminate(t) } } @@ -599,6 +614,7 @@ func TestEtcdCreateBinding(t *testing.T) { func TestEtcdUpdateNotScheduled(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") @@ -626,6 +642,7 @@ func TestEtcdUpdateNotScheduled(t *testing.T) { func TestEtcdUpdateScheduled(t *testing.T) { storage, _, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") @@ -695,6 +712,7 @@ func TestEtcdUpdateScheduled(t *testing.T) { func TestEtcdUpdateStatus(t *testing.T) { storage, _, statusStorage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") diff --git a/pkg/registry/poddisruptionbudget/etcd/etcd.go b/pkg/registry/poddisruptionbudget/etcd/etcd.go index 9a5eef5a5e..3bf6620433 100644 --- a/pkg/registry/poddisruptionbudget/etcd/etcd.go +++ b/pkg/registry/poddisruptionbudget/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodDisruptionBudget), &policyapi.PodDisruptionBudget{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: poddisruptionbudget.Strategy, DeleteStrategy: poddisruptionbudget.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = poddisruptionbudget.StatusStrategy diff --git a/pkg/registry/poddisruptionbudget/etcd/etcd_test.go b/pkg/registry/poddisruptionbudget/etcd/etcd_test.go index adec5f1c0d..18098dc544 100644 --- a/pkg/registry/poddisruptionbudget/etcd/etcd_test.go +++ b/pkg/registry/poddisruptionbudget/etcd/etcd_test.go @@ -68,6 +68,7 @@ func validNewPodDisruptionBudget() *policy.PodDisruptionBudget { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) pdb := validNewPodDisruptionBudget() pdb.ObjectMeta = api.ObjectMeta{} @@ -83,7 +84,7 @@ func TestCreate(t *testing.T) { func TestStatusUpdate(t *testing.T) { storage, statusStorage, server := newStorage(t) defer server.Terminate(t) - + defer storage.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/poddisruptionbudgets/" + api.NamespaceDefault + "/foo") validPodDisruptionBudget := validNewPodDisruptionBudget() @@ -120,6 +121,7 @@ func TestStatusUpdate(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewPodDisruptionBudget()) } @@ -127,6 +129,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewPodDisruptionBudget()) } @@ -134,6 +137,7 @@ func TestList(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewPodDisruptionBudget()) } @@ -141,6 +145,7 @@ func TestDelete(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewPodDisruptionBudget(), diff --git a/pkg/registry/podsecuritypolicy/etcd/etcd.go b/pkg/registry/podsecuritypolicy/etcd/etcd.go index b5991f84ba..2a62230cff 100644 --- a/pkg/registry/podsecuritypolicy/etcd/etcd.go +++ b/pkg/registry/podsecuritypolicy/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.PodSecurityPolicyList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodSecurityPolicies), &extensions.PodSecurityPolicy{}, @@ -68,6 +68,7 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: podsecuritypolicy.Strategy, ReturnDeletedObject: true, Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/podsecuritypolicy/etcd/etcd_test.go b/pkg/registry/podsecuritypolicy/etcd/etcd_test.go index cca1f40639..5dba2a05cf 100644 --- a/pkg/registry/podsecuritypolicy/etcd/etcd_test.go +++ b/pkg/registry/podsecuritypolicy/etcd/etcd_test.go @@ -62,6 +62,7 @@ func validNewPodSecurityPolicy() *extensions.PodSecurityPolicy { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() psp := validNewPodSecurityPolicy() psp.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"} @@ -78,6 +79,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestUpdate( // valid @@ -94,6 +96,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() test.TestDelete(validNewPodSecurityPolicy()) } @@ -101,6 +104,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestGet(validNewPodSecurityPolicy()) } @@ -108,6 +112,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestList(validNewPodSecurityPolicy()) } @@ -115,6 +120,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestWatch( validNewPodSecurityPolicy(), diff --git a/pkg/registry/podtemplate/etcd/etcd.go b/pkg/registry/podtemplate/etcd/etcd.go index 0394c94016..0371ad5ad9 100644 --- a/pkg/registry/podtemplate/etcd/etcd.go +++ b/pkg/registry/podtemplate/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodTemplateList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, @@ -68,7 +68,8 @@ func NewREST(opts generic.RESTOptions) *REST { ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/podtemplate/etcd/etcd_test.go b/pkg/registry/podtemplate/etcd/etcd_test.go index 47ee4a6bf2..97b1e78438 100644 --- a/pkg/registry/podtemplate/etcd/etcd_test.go +++ b/pkg/registry/podtemplate/etcd/etcd_test.go @@ -64,6 +64,7 @@ func validNewPodTemplate(name string) *api.PodTemplate { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) pod := validNewPodTemplate("foo") pod.ObjectMeta = api.ObjectMeta{} @@ -80,6 +81,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( //valid @@ -96,6 +98,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ReturnDeletedObject() test.TestDelete(validNewPodTemplate("foo")) } @@ -103,6 +106,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewPodTemplate("foo")) } @@ -110,6 +114,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewPodTemplate("foo")) } @@ -117,6 +122,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewPodTemplate("foo"), diff --git a/pkg/registry/registrytest/etcd.go b/pkg/registry/registrytest/etcd.go index a08f03a9ee..8f74233db8 100644 --- a/pkg/registry/registrytest/etcd.go +++ b/pkg/registry/registrytest/etcd.go @@ -30,21 +30,14 @@ import ( "k8s.io/kubernetes/pkg/registry/generic/registry" "k8s.io/kubernetes/pkg/runtime" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" "k8s.io/kubernetes/pkg/storage/storagebackend" storagetesting "k8s.io/kubernetes/pkg/storage/testing" ) func NewEtcdStorage(t *testing.T, group string) (*storagebackend.Config, *etcdtesting.EtcdTestServer) { - server := etcdtesting.NewUnsecuredEtcdTestClientServer(t) - config := &storagebackend.Config{ - Type: "etcd2", - Prefix: etcdtest.PathPrefix(), - ServerList: server.Client.Endpoints(), - DeserializationCacheSize: etcdtest.DeserializationCacheSize, - Codec: testapi.Groups[group].StorageCodec(), - } + server, config := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) + config.Codec = testapi.Groups[group].StorageCodec() return config, server } diff --git a/pkg/registry/replicaset/etcd/etcd.go b/pkg/registry/replicaset/etcd/etcd.go index 9bed4db74a..ce078ff3e4 100644 --- a/pkg/registry/replicaset/etcd/etcd.go +++ b/pkg/registry/replicaset/etcd/etcd.go @@ -61,7 +61,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.ReplicaSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Replicasets), &extensions.ReplicaSet{}, @@ -102,7 +102,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: replicaset.Strategy, DeleteStrategy: replicaset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = replicaset.StatusStrategy diff --git a/pkg/registry/replicaset/etcd/etcd_test.go b/pkg/registry/replicaset/etcd/etcd_test.go index f09c70edc1..9f0757b946 100644 --- a/pkg/registry/replicaset/etcd/etcd_test.go +++ b/pkg/registry/replicaset/etcd/etcd_test.go @@ -91,6 +91,7 @@ var validReplicaSet = *validNewReplicaSet() func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) rs := validNewReplicaSet() rs.ObjectMeta = api.ObjectMeta{} @@ -111,6 +112,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) test.TestUpdate( // valid @@ -138,6 +140,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) test.TestDelete(validNewReplicaSet()) } @@ -145,6 +148,7 @@ func TestDelete(t *testing.T) { func TestGenerationNumber(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() modifiedSno := *validNewReplicaSet() modifiedSno.Generation = 100 modifiedSno.Status.ObservedGeneration = 10 @@ -195,6 +199,7 @@ func TestGenerationNumber(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) test.TestGet(validNewReplicaSet()) } @@ -202,6 +207,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) test.TestList(validNewReplicaSet()) } @@ -209,6 +215,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() test := registrytest.New(t, storage.ReplicaSet.Store) test.TestWatch( validNewReplicaSet(), @@ -241,6 +248,7 @@ func TestWatch(t *testing.T) { func TestScaleGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() name := "foo" @@ -280,6 +288,7 @@ func TestScaleGet(t *testing.T) { func TestScaleUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() name := "foo" @@ -324,6 +333,7 @@ func TestScaleUpdate(t *testing.T) { func TestStatusUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.ReplicaSet.Store.DestroyFunc() ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/replicasets/" + api.NamespaceDefault + "/foo") diff --git a/pkg/registry/resourcequota/etcd/etcd.go b/pkg/registry/resourcequota/etcd/etcd.go index 404eddc0e1..6d2c55341a 100644 --- a/pkg/registry/resourcequota/etcd/etcd.go +++ b/pkg/registry/resourcequota/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ResourceQuotas), &api.ResourceQuota{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: resourcequota.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/resourcequota/etcd/etcd_test.go b/pkg/registry/resourcequota/etcd/etcd_test.go index 65605ecf76..36bf92a138 100644 --- a/pkg/registry/resourcequota/etcd/etcd_test.go +++ b/pkg/registry/resourcequota/etcd/etcd_test.go @@ -60,6 +60,7 @@ func validNewResourceQuota() *api.ResourceQuota { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) resourcequota := validNewResourceQuota() resourcequota.ObjectMeta = api.ObjectMeta{} @@ -76,6 +77,7 @@ func TestCreate(t *testing.T) { func TestCreateSetsFields(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() resourcequota := validNewResourceQuota() _, err := storage.Create(api.NewDefaultContext(), resourcequota) @@ -99,6 +101,7 @@ func TestCreateSetsFields(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ReturnDeletedObject() test.TestDelete(validNewResourceQuota()) } @@ -106,6 +109,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewResourceQuota()) } @@ -113,6 +117,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewResourceQuota()) } @@ -120,6 +125,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewResourceQuota(), @@ -143,6 +149,7 @@ func TestWatch(t *testing.T) { func TestUpdateStatus(t *testing.T) { storage, status, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() ctx := api.NewDefaultContext() key, _ := storage.KeyFunc(ctx, "foo") diff --git a/pkg/registry/role/etcd/etcd.go b/pkg/registry/role/etcd/etcd.go index 4f6c5235da..2464fb1b21 100644 --- a/pkg/registry/role/etcd/etcd.go +++ b/pkg/registry/role/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.RoleList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Roles), &rbac.Role{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: role.Strategy, DeleteStrategy: role.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/rolebinding/etcd/etcd.go b/pkg/registry/rolebinding/etcd/etcd.go index af43741fc3..c5b5c97a55 100644 --- a/pkg/registry/rolebinding/etcd/etcd.go +++ b/pkg/registry/rolebinding/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.RoleBindingList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.RoleBindings), &rbac.RoleBinding{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: rolebinding.Strategy, DeleteStrategy: rolebinding.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/scheduledjob/etcd/etcd.go b/pkg/registry/scheduledjob/etcd/etcd.go index 5e55afcaca..d67e0ace74 100644 --- a/pkg/registry/scheduledjob/etcd/etcd.go +++ b/pkg/registry/scheduledjob/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &batch.ScheduledJobList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ScheduledJobs), &batch.ScheduledJob{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: scheduledjob.Strategy, DeleteStrategy: scheduledjob.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/pkg/registry/scheduledjob/etcd/etcd_test.go b/pkg/registry/scheduledjob/etcd/etcd_test.go index 5d650b0383..eabe29cbbd 100644 --- a/pkg/registry/scheduledjob/etcd/etcd_test.go +++ b/pkg/registry/scheduledjob/etcd/etcd_test.go @@ -70,6 +70,7 @@ func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) validScheduledJob := validNewScheduledJob() validScheduledJob.ObjectMeta = api.ObjectMeta{} @@ -91,6 +92,7 @@ func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) schedule := "1 1 1 1 ?" test.TestUpdate( @@ -119,6 +121,7 @@ func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewScheduledJob()) } @@ -131,6 +134,7 @@ func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewScheduledJob()) } @@ -143,6 +147,7 @@ func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewScheduledJob()) } @@ -155,6 +160,7 @@ func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewScheduledJob(), diff --git a/pkg/registry/secret/etcd/etcd.go b/pkg/registry/secret/etcd/etcd.go index 30a759aa96..0d9151c550 100644 --- a/pkg/registry/secret/etcd/etcd.go +++ b/pkg/registry/secret/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.SecretList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Secrets), &api.Secret{}, @@ -65,7 +65,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: secret.Strategy, DeleteStrategy: secret.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/secret/etcd/etcd_test.go b/pkg/registry/secret/etcd/etcd_test.go index d1b04fd2c7..21fc72ab60 100644 --- a/pkg/registry/secret/etcd/etcd_test.go +++ b/pkg/registry/secret/etcd/etcd_test.go @@ -49,6 +49,7 @@ func validNewSecret(name string) *api.Secret { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) secret := validNewSecret("foo") secret.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"} @@ -71,6 +72,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -87,6 +89,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewSecret("foo")) } @@ -94,6 +97,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewSecret("foo")) } @@ -101,6 +105,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewSecret("foo")) } @@ -108,6 +113,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewSecret("foo"), diff --git a/pkg/registry/service/etcd/etcd.go b/pkg/registry/service/etcd/etcd.go index 9c137b96ff..ac91b6db3c 100644 --- a/pkg/registry/service/etcd/etcd.go +++ b/pkg/registry/service/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ServiceList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: service.Strategy, ExportStrategy: service.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = service.StatusStrategy diff --git a/pkg/registry/service/etcd/etcd_test.go b/pkg/registry/service/etcd/etcd_test.go index bda2783d33..f9702dd3ef 100644 --- a/pkg/registry/service/etcd/etcd_test.go +++ b/pkg/registry/service/etcd/etcd_test.go @@ -59,6 +59,7 @@ func validService() *api.Service { func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) validService := validService() validService.ObjectMeta = api.ObjectMeta{} @@ -89,6 +90,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestUpdate( // valid @@ -114,6 +116,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestDelete(validService()) } @@ -121,6 +124,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestGet(validService()) } @@ -128,6 +132,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).AllowCreateOnUpdate() test.TestList(validService()) } @@ -135,6 +140,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validService(), diff --git a/pkg/registry/serviceaccount/etcd/etcd.go b/pkg/registry/serviceaccount/etcd/etcd.go index 22dc642441..22b853e83a 100644 --- a/pkg/registry/serviceaccount/etcd/etcd.go +++ b/pkg/registry/serviceaccount/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ServiceAccountList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ServiceAccounts), &api.ServiceAccount{}, @@ -66,7 +66,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: serviceaccount.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/pkg/registry/serviceaccount/etcd/etcd_test.go b/pkg/registry/serviceaccount/etcd/etcd_test.go index 320d9fe9cb..1fa2381a3d 100644 --- a/pkg/registry/serviceaccount/etcd/etcd_test.go +++ b/pkg/registry/serviceaccount/etcd/etcd_test.go @@ -47,6 +47,7 @@ func validNewServiceAccount(name string) *api.ServiceAccount { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) serviceAccount := validNewServiceAccount("foo") serviceAccount.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"} @@ -64,6 +65,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -80,6 +82,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ReturnDeletedObject() test.TestDelete(validNewServiceAccount("foo")) } @@ -87,6 +90,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewServiceAccount("foo")) } @@ -94,6 +98,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewServiceAccount("foo")) } @@ -101,6 +106,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewServiceAccount("foo"), diff --git a/pkg/registry/storageclass/etcd/etcd.go b/pkg/registry/storageclass/etcd/etcd.go index 7b26058d97..44ea28bcb3 100644 --- a/pkg/registry/storageclass/etcd/etcd.go +++ b/pkg/registry/storageclass/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &storageapi.StorageClassList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.StorageClasses), &storageapi.StorageClass{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: storageclass.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/storageclass/etcd/etcd_test.go b/pkg/registry/storageclass/etcd/etcd_test.go index 63cb6af4c0..09cc3c200d 100644 --- a/pkg/registry/storageclass/etcd/etcd_test.go +++ b/pkg/registry/storageclass/etcd/etcd_test.go @@ -55,6 +55,7 @@ func validChangedStorageClass() *storageapi.StorageClass { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() storageClass := validNewStorageClass("foo") storageClass.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} @@ -71,6 +72,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestUpdate( // valid @@ -94,6 +96,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() test.TestDelete(validNewStorageClass("foo")) } @@ -101,6 +104,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestGet(validNewStorageClass("foo")) } @@ -108,6 +112,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestList(validNewStorageClass("foo")) } @@ -115,6 +120,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope() test.TestWatch( validNewStorageClass("foo"), diff --git a/pkg/registry/thirdpartyresource/etcd/etcd.go b/pkg/registry/thirdpartyresource/etcd/etcd.go index 8da3c6b32f..e9e974d688 100644 --- a/pkg/registry/thirdpartyresource/etcd/etcd.go +++ b/pkg/registry/thirdpartyresource/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix // We explicitly do NOT do any decoration here yet. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.ThirdPartyResource{} }, @@ -56,7 +56,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: thirdpartyresource.Strategy, DeleteStrategy: thirdpartyresource.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/pkg/registry/thirdpartyresource/etcd/etcd_test.go b/pkg/registry/thirdpartyresource/etcd/etcd_test.go index 0696fc5abf..0a26b6b20b 100644 --- a/pkg/registry/thirdpartyresource/etcd/etcd_test.go +++ b/pkg/registry/thirdpartyresource/etcd/etcd_test.go @@ -58,6 +58,7 @@ func namer(i int) string { func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer).GeneratesName() rsrc := validNewThirdPartyResource("kind.domain.tld") test.TestCreate( @@ -75,6 +76,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer) test.TestUpdate( // valid @@ -91,6 +93,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer) test.TestDelete(validNewThirdPartyResource("kind.domain.tld")) } @@ -98,6 +101,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer) test.TestGet(validNewThirdPartyResource("kind.domain.tld")) } @@ -105,6 +109,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer) test.TestList(validNewThirdPartyResource("kind.domain.tld")) } @@ -112,6 +117,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store).ClusterScope().Namer(namer) test.TestWatch( validNewThirdPartyResource("kind.domain.tld"), diff --git a/pkg/registry/thirdpartyresourcedata/etcd/etcd.go b/pkg/registry/thirdpartyresourcedata/etcd/etcd.go index 768411dea8..eeda2785bb 100644 --- a/pkg/registry/thirdpartyresourcedata/etcd/etcd.go +++ b/pkg/registry/thirdpartyresourcedata/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions, group, kind string) *REST { prefix := "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s" // We explicitly do NOT do any decoration here yet. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} }, @@ -59,7 +59,8 @@ func NewREST(opts generic.RESTOptions, group, kind string) *REST { UpdateStrategy: thirdpartyresourcedata.Strategy, DeleteStrategy: thirdpartyresourcedata.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{ diff --git a/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go b/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go index c94aec54b3..15d9e05964 100644 --- a/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go +++ b/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go @@ -50,6 +50,7 @@ func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceD func TestCreate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) rsrc := validNewThirdPartyResourceData("foo") rsrc.ObjectMeta = api.ObjectMeta{} @@ -64,6 +65,7 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestUpdate( // valid @@ -80,6 +82,7 @@ func TestUpdate(t *testing.T) { func TestDelete(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestDelete(validNewThirdPartyResourceData("foo")) } @@ -87,6 +90,7 @@ func TestDelete(t *testing.T) { func TestGet(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestGet(validNewThirdPartyResourceData("foo")) } @@ -94,6 +98,7 @@ func TestGet(t *testing.T) { func TestList(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestList(validNewThirdPartyResourceData("foo")) } @@ -101,6 +106,7 @@ func TestList(t *testing.T) { func TestWatch(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) + defer storage.Store.DestroyFunc() test := registrytest.New(t, storage.Store) test.TestWatch( validNewThirdPartyResourceData("foo"), diff --git a/pkg/storage/etcd/testing/utils.go b/pkg/storage/etcd/testing/utils.go index 4d72864059..aa6daa5148 100644 --- a/pkg/storage/etcd/testing/utils.go +++ b/pkg/storage/etcd/testing/utils.go @@ -27,12 +27,16 @@ import ( "testing" "time" + "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/testing/testingcert" + "k8s.io/kubernetes/pkg/storage/storagebackend" "k8s.io/kubernetes/pkg/util/wait" etcd "github.com/coreos/etcd/client" + "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver/api/v2http" + "github.com/coreos/etcd/integration" "github.com/coreos/etcd/pkg/testutil" "github.com/coreos/etcd/pkg/transport" "github.com/coreos/etcd/pkg/types" @@ -42,6 +46,8 @@ import ( // EtcdTestServer encapsulates the datastructures needed to start local instance for testing type EtcdTestServer struct { + // The following are lumped etcd2 test server params + // TODO: Deprecate in a post 1.5 release etcdserver.ServerConfig PeerListeners, ClientListeners []net.Listener Client etcd.Client @@ -54,6 +60,10 @@ type EtcdTestServer struct { raftHandler http.Handler s *etcdserver.EtcdServer hss []*httptest.Server + + // The following are lumped etcd3 test server params + v3Cluster *integration.ClusterV3 + v3Client *clientv3.Client } // newLocalListener opens a port localhost using any port @@ -219,30 +229,34 @@ func (m *EtcdTestServer) waitUntilUp() error { // Terminate will shutdown the running etcd server func (m *EtcdTestServer) Terminate(t *testing.T) { - m.Client = nil - m.s.Stop() - // TODO: This is a pretty ugly hack to workaround races during closing - // in-memory etcd server in unit tests - see #18928 for more details. - // We should get rid of it as soon as we have a proper fix - etcd clients - // have overwritten transport counting opened connections (probably by - // overwriting Dial function) and termination function waiting for all - // connections to be closed and stopping accepting new ones. - time.Sleep(250 * time.Millisecond) - for _, hs := range m.hss { - hs.CloseClientConnections() - hs.Close() - } - if err := os.RemoveAll(m.ServerConfig.DataDir); err != nil { - t.Fatal(err) - } - if len(m.CertificatesDir) > 0 { - if err := os.RemoveAll(m.CertificatesDir); err != nil { + if m.v3Cluster != nil { + m.v3Cluster.Terminate(t) + } else { + m.Client = nil + m.s.Stop() + // TODO: This is a pretty ugly hack to workaround races during closing + // in-memory etcd server in unit tests - see #18928 for more details. + // We should get rid of it as soon as we have a proper fix - etcd clients + // have overwritten transport counting opened connections (probably by + // overwriting Dial function) and termination function waiting for all + // connections to be closed and stopping accepting new ones. + time.Sleep(250 * time.Millisecond) + for _, hs := range m.hss { + hs.CloseClientConnections() + hs.Close() + } + if err := os.RemoveAll(m.ServerConfig.DataDir); err != nil { t.Fatal(err) } + if len(m.CertificatesDir) > 0 { + if err := os.RemoveAll(m.CertificatesDir); err != nil { + t.Fatal(err) + } + } } } -// NewEtcdTestClientServer creates a new client and server for testing +// NewEtcdTestClientServer DEPRECATED creates a new client and server for testing func NewEtcdTestClientServer(t *testing.T) *EtcdTestServer { server := configureTestCluster(t, "foo", true) err := server.launch(t) @@ -269,7 +283,7 @@ func NewEtcdTestClientServer(t *testing.T) *EtcdTestServer { return server } -// NewUnsecuredEtcdTestClientServer creates a new client and server for testing +// NewUnsecuredEtcdTestClientServer DEPRECATED creates a new client and server for testing func NewUnsecuredEtcdTestClientServer(t *testing.T) *EtcdTestServer { server := configureTestCluster(t, "foo", false) err := server.launch(t) @@ -294,3 +308,18 @@ func NewUnsecuredEtcdTestClientServer(t *testing.T) *EtcdTestServer { } return server } + +// NewEtcd3TestClientServer creates a new client and server for testing +func NewUnsecuredEtcd3TestClientServer(t *testing.T) (*EtcdTestServer, *storagebackend.Config) { + server := &EtcdTestServer{ + v3Cluster: integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}), + } + server.v3Client = server.v3Cluster.RandClient() + config := &storagebackend.Config{ + Type: "etcd3", + Prefix: etcdtest.PathPrefix(), + ServerList: server.v3Client.Endpoints(), + DeserializationCacheSize: etcdtest.DeserializationCacheSize, + } + return server, config +} diff --git a/pkg/storage/storagebackend/factory/etcd3.go b/pkg/storage/storagebackend/factory/etcd3.go index ee5d1d9326..f860f91814 100644 --- a/pkg/storage/storagebackend/factory/etcd3.go +++ b/pkg/storage/storagebackend/factory/etcd3.go @@ -36,7 +36,11 @@ func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, e if err != nil { return nil, nil, err } - + // NOTE: Client relies on nil tlsConfig + // for non-secure connections, update the implicit variable + if len(c.CertFile) == 0 && len(c.KeyFile) == 0 && len(c.CAFile) == 0 { + tlsConfig = nil + } cfg := clientv3.Config{ Endpoints: c.ServerList, TLS: tlsConfig,