mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
Merge pull request #31495 from hongchaodeng/fix2
Automatic merge from submit-queue refactor destroy func in unit testing Continued on https://github.com/kubernetes/kubernetes/pull/31390#issuecomment-242572312
This commit is contained in:
commit
45f96fa89d
@ -28,12 +28,17 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
||||||
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/storage/storagebackend/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newStorage(t *testing.T) (*ScaleREST, *etcdtesting.EtcdTestServer, storage.Interface, func()) {
|
func newStorage(t *testing.T) (*ScaleREST, *etcdtesting.EtcdTestServer, storage.Interface, factory.DestroyFunc) {
|
||||||
etcdStorage, server := registrytest.NewEtcdStorage(t, "")
|
etcdStorage, server := registrytest.NewEtcdStorage(t, "")
|
||||||
restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "controllers"}
|
restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "controllers"}
|
||||||
s, destroyFunc := generic.NewRawStorage(etcdStorage)
|
s, d := generic.NewRawStorage(etcdStorage)
|
||||||
|
destroyFunc := func() {
|
||||||
|
d()
|
||||||
|
server.Terminate(t)
|
||||||
|
}
|
||||||
return NewStorage(restOptions).Scale, server, s, destroyFunc
|
return NewStorage(restOptions).Scale, server, s, destroyFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,11 +88,8 @@ var validScale = extensions.Scale{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGet(t *testing.T) {
|
func TestGet(t *testing.T) {
|
||||||
storage, server, si, destroyFunc := newStorage(t)
|
storage, _, si, destroyFunc := newStorage(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
ctx := api.WithNamespace(api.NewContext(), "test")
|
ctx := api.WithNamespace(api.NewContext(), "test")
|
||||||
key := etcdtest.AddPrefix("/controllers/test/foo")
|
key := etcdtest.AddPrefix("/controllers/test/foo")
|
||||||
@ -105,11 +107,8 @@ func TestGet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUpdate(t *testing.T) {
|
func TestUpdate(t *testing.T) {
|
||||||
storage, server, si, destroyFunc := newStorage(t)
|
storage, _, si, destroyFunc := newStorage(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
ctx := api.WithNamespace(api.NewContext(), "test")
|
ctx := api.WithNamespace(api.NewContext(), "test")
|
||||||
key := etcdtest.AddPrefix("/controllers/test/foo")
|
key := etcdtest.AddPrefix("/controllers/test/foo")
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
||||||
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
||||||
|
"k8s.io/kubernetes/pkg/storage/storagebackend/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Creates a cacher based given storageConfig.
|
// Creates a cacher based given storageConfig.
|
||||||
@ -33,7 +34,7 @@ func StorageWithCacher(
|
|||||||
resourcePrefix string,
|
resourcePrefix string,
|
||||||
scopeStrategy rest.NamespaceScopedStrategy,
|
scopeStrategy rest.NamespaceScopedStrategy,
|
||||||
newListFunc func() runtime.Object,
|
newListFunc func() runtime.Object,
|
||||||
triggerFunc storage.TriggerPublisherFunc) (storage.Interface, func()) {
|
triggerFunc storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc) {
|
||||||
|
|
||||||
s, d := generic.NewRawStorage(storageConfig)
|
s, d := generic.NewRawStorage(storageConfig)
|
||||||
// TODO: we would change this later to make storage always have cacher and hide low level KV layer inside.
|
// TODO: we would change this later to make storage always have cacher and hide low level KV layer inside.
|
||||||
|
@ -40,6 +40,7 @@ import (
|
|||||||
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
||||||
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
||||||
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/storage/storagebackend/factory"
|
||||||
storagetesting "k8s.io/kubernetes/pkg/storage/testing"
|
storagetesting "k8s.io/kubernetes/pkg/storage/testing"
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||||
@ -88,7 +89,7 @@ func (t *testRESTStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Obje
|
|||||||
}
|
}
|
||||||
func (t *testRESTStrategy) Canonicalize(obj runtime.Object) {}
|
func (t *testRESTStrategy) Canonicalize(obj runtime.Object) {}
|
||||||
|
|
||||||
func NewTestGenericStoreRegistry(t *testing.T) (*etcdtesting.EtcdTestServer, func(), *Store) {
|
func NewTestGenericStoreRegistry(t *testing.T) (factory.DestroyFunc, *Store) {
|
||||||
return newTestGenericStoreRegistry(t, false)
|
return newTestGenericStoreRegistry(t, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +174,7 @@ func TestStoreList(t *testing.T) {
|
|||||||
if item.context != nil {
|
if item.context != nil {
|
||||||
ctx = item.context
|
ctx = item.context
|
||||||
}
|
}
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
|
|
||||||
if item.in != nil {
|
if item.in != nil {
|
||||||
if err := storagetesting.CreateList("/pods", registry.Storage, item.in); err != nil {
|
if err := storagetesting.CreateList("/pods", registry.Storage, item.in); err != nil {
|
||||||
@ -192,7 +193,6 @@ func TestStoreList(t *testing.T) {
|
|||||||
t.Errorf("%v: Expected %#v, got %#v", name, e, a)
|
t.Errorf("%v: Expected %#v, got %#v", name, e, a)
|
||||||
}
|
}
|
||||||
destroyFunc()
|
destroyFunc()
|
||||||
server.Terminate(t)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,11 +209,8 @@ func TestStoreListResourceVersion(t *testing.T) {
|
|||||||
}
|
}
|
||||||
ctx := api.WithNamespace(api.NewContext(), "test")
|
ctx := api.WithNamespace(api.NewContext(), "test")
|
||||||
|
|
||||||
server, destroyFunc, registry := newTestGenericStoreRegistry(t, true)
|
destroyFunc, registry := newTestGenericStoreRegistry(t, true)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
obj, err := registry.Create(ctx, fooPod)
|
obj, err := registry.Create(ctx, fooPod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -274,11 +271,8 @@ func TestStoreCreate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// create the object
|
// create the object
|
||||||
objA, err := registry.Create(testContext, podA)
|
objA, err := registry.Create(testContext, podA)
|
||||||
@ -337,11 +331,8 @@ func TestStoreUpdate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Test1 try to update a non-existing node
|
// Test1 try to update a non-existing node
|
||||||
_, _, err := registry.Update(testContext, podA.Name, rest.DefaultUpdatedObjectInfo(podA, api.Scheme))
|
_, _, err := registry.Update(testContext, podA.Name, rest.DefaultUpdatedObjectInfo(podA, api.Scheme))
|
||||||
@ -378,11 +369,8 @@ func TestStoreUpdate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestNoOpUpdates(t *testing.T) {
|
func TestNoOpUpdates(t *testing.T) {
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
newPod := func() *api.Pod {
|
newPod := func() *api.Pod {
|
||||||
return &api.Pod{
|
return &api.Pod{
|
||||||
@ -463,11 +451,8 @@ func TestStoreCustomExport(t *testing.T) {
|
|||||||
Spec: api.PodSpec{NodeName: "machine"},
|
Spec: api.PodSpec{NodeName: "machine"},
|
||||||
}
|
}
|
||||||
|
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
registry.ExportStrategy = testPodExport{}
|
registry.ExportStrategy = testPodExport{}
|
||||||
|
|
||||||
@ -512,11 +497,8 @@ func TestStoreBasicExport(t *testing.T) {
|
|||||||
Status: api.PodStatus{HostIP: "1.2.3.4"},
|
Status: api.PodStatus{HostIP: "1.2.3.4"},
|
||||||
}
|
}
|
||||||
|
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true
|
registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true
|
||||||
@ -547,11 +529,8 @@ func TestStoreGet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
_, err := registry.Get(testContext, podA.Name)
|
_, err := registry.Get(testContext, podA.Name)
|
||||||
if !errors.IsNotFound(err) {
|
if !errors.IsNotFound(err) {
|
||||||
@ -571,11 +550,8 @@ func TestStoreDelete(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// test failure condition
|
// test failure condition
|
||||||
_, err := registry.Delete(testContext, podA.Name, nil)
|
_, err := registry.Delete(testContext, podA.Name, nil)
|
||||||
@ -612,11 +588,8 @@ func TestStoreHandleFinalizers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
// create pod
|
// create pod
|
||||||
_, err := registry.Create(testContext, podWithFinalizer)
|
_, err := registry.Create(testContext, podWithFinalizer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -911,11 +884,8 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
registry.DeleteStrategy = tc.strategy
|
registry.DeleteStrategy = tc.strategy
|
||||||
@ -961,11 +931,8 @@ func TestStoreDeleteCollection(t *testing.T) {
|
|||||||
podB := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}
|
podB := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := registry.Create(testContext, podA); err != nil {
|
if _, err := registry.Create(testContext, podA); err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
@ -993,11 +960,8 @@ func TestStoreDeleteCollection(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStoreDeleteCollectionNotFound(t *testing.T) {
|
func TestStoreDeleteCollectionNotFound(t *testing.T) {
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
|
|
||||||
@ -1042,11 +1006,8 @@ func TestStoreDeleteCollectionWithWatch(t *testing.T) {
|
|||||||
podA := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
podA := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
|
|
||||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
|
|
||||||
objCreated, err := registry.Create(testContext, podA)
|
objCreated, err := registry.Create(testContext, podA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1112,7 +1073,7 @@ func TestStoreWatch(t *testing.T) {
|
|||||||
Spec: api.PodSpec{NodeName: "machine"},
|
Spec: api.PodSpec{NodeName: "machine"},
|
||||||
}
|
}
|
||||||
|
|
||||||
server, destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||||
wi, err := registry.WatchPredicate(ctx, m.selectPred, "0")
|
wi, err := registry.WatchPredicate(ctx, m.selectPred, "0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%v: unexpected error: %v", name, err)
|
t.Errorf("%v: unexpected error: %v", name, err)
|
||||||
@ -1131,18 +1092,19 @@ func TestStoreWatch(t *testing.T) {
|
|||||||
wi.Stop()
|
wi.Stop()
|
||||||
}
|
}
|
||||||
destroyFunc()
|
destroyFunc()
|
||||||
server.Terminate(t)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (*etcdtesting.EtcdTestServer, func(), *Store) {
|
func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (factory.DestroyFunc, *Store) {
|
||||||
podPrefix := "/pods"
|
podPrefix := "/pods"
|
||||||
server := etcdtesting.NewEtcdTestClientServer(t)
|
server := etcdtesting.NewEtcdTestClientServer(t)
|
||||||
strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true}
|
strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true}
|
||||||
|
|
||||||
codec := testapi.Default.StorageCodec()
|
codec := testapi.Default.StorageCodec()
|
||||||
s := etcdstorage.NewEtcdStorage(server.Client, codec, etcdtest.PathPrefix(), false, etcdtest.DeserializationCacheSize)
|
s := etcdstorage.NewEtcdStorage(server.Client, codec, etcdtest.PathPrefix(), false, etcdtest.DeserializationCacheSize)
|
||||||
destroyFunc := func() {}
|
destroyFunc := func() {
|
||||||
|
server.Terminate(t)
|
||||||
|
}
|
||||||
if hasCacheEnabled {
|
if hasCacheEnabled {
|
||||||
config := storage.CacherConfig{
|
config := storage.CacherConfig{
|
||||||
CacheCapacity: 10,
|
CacheCapacity: 10,
|
||||||
@ -1155,11 +1117,15 @@ func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (*etcdtesti
|
|||||||
Codec: codec,
|
Codec: codec,
|
||||||
}
|
}
|
||||||
cacher := storage.NewCacherFromConfig(config)
|
cacher := storage.NewCacherFromConfig(config)
|
||||||
|
d := destroyFunc
|
||||||
s = cacher
|
s = cacher
|
||||||
destroyFunc = cacher.Stop
|
destroyFunc = func() {
|
||||||
|
cacher.Stop()
|
||||||
|
d()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return server, destroyFunc, &Store{
|
return destroyFunc, &Store{
|
||||||
NewFunc: func() runtime.Object { return &api.Pod{} },
|
NewFunc: func() runtime.Object { return &api.Pod{} },
|
||||||
NewListFunc: func() runtime.Object { return &api.PodList{} },
|
NewListFunc: func() runtime.Object { return &api.PodList{} },
|
||||||
QualifiedResource: api.Resource("pods"),
|
QualifiedResource: api.Resource("pods"),
|
||||||
|
@ -34,7 +34,7 @@ type StorageDecorator func(
|
|||||||
resourcePrefix string,
|
resourcePrefix string,
|
||||||
scopeStrategy rest.NamespaceScopedStrategy,
|
scopeStrategy rest.NamespaceScopedStrategy,
|
||||||
newListFunc func() runtime.Object,
|
newListFunc func() runtime.Object,
|
||||||
trigger storage.TriggerPublisherFunc) (storage.Interface, func())
|
trigger storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc)
|
||||||
|
|
||||||
// Returns given 'storageInterface' without any decoration.
|
// Returns given 'storageInterface' without any decoration.
|
||||||
func UndecoratedStorage(
|
func UndecoratedStorage(
|
||||||
@ -44,14 +44,14 @@ func UndecoratedStorage(
|
|||||||
resourcePrefix string,
|
resourcePrefix string,
|
||||||
scopeStrategy rest.NamespaceScopedStrategy,
|
scopeStrategy rest.NamespaceScopedStrategy,
|
||||||
newListFunc func() runtime.Object,
|
newListFunc func() runtime.Object,
|
||||||
trigger storage.TriggerPublisherFunc) (storage.Interface, func()) {
|
trigger storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc) {
|
||||||
return NewRawStorage(config)
|
return NewRawStorage(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRawStorage creates the low level kv storage. This is a work-around for current
|
// NewRawStorage creates the low level kv storage. This is a work-around for current
|
||||||
// two layer of same storage interface.
|
// two layer of same storage interface.
|
||||||
// TODO: Once cacher is enabled on all registries (event registry is special), we will remove this method.
|
// TODO: Once cacher is enabled on all registries (event registry is special), we will remove this method.
|
||||||
func NewRawStorage(config *storagebackend.Config) (storage.Interface, func()) {
|
func NewRawStorage(config *storagebackend.Config) (storage.Interface, factory.DestroyFunc) {
|
||||||
s, d, err := factory.Create(*config)
|
s, d, err := factory.Create(*config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Unable to create storage backend: config (%v), err (%v)", config, err)
|
glog.Fatalf("Unable to create storage backend: config (%v), err (%v)", config, err)
|
||||||
|
@ -30,11 +30,12 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
||||||
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/storage/storagebackend/factory"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newStorage(t *testing.T) (*etcdtesting.EtcdTestServer, ipallocator.Interface, allocator.Interface, storage.Interface, func()) {
|
func newStorage(t *testing.T) (*etcdtesting.EtcdTestServer, ipallocator.Interface, allocator.Interface, storage.Interface, factory.DestroyFunc) {
|
||||||
etcdStorage, server := registrytest.NewEtcdStorage(t, "")
|
etcdStorage, server := registrytest.NewEtcdStorage(t, "")
|
||||||
_, cidr, err := net.ParseCIDR("192.168.1.0/24")
|
_, cidr, err := net.ParseCIDR("192.168.1.0/24")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -48,7 +49,11 @@ func newStorage(t *testing.T) (*etcdtesting.EtcdTestServer, ipallocator.Interfac
|
|||||||
etcd := allocatoretcd.NewEtcd(mem, "/ranges/serviceips", api.Resource("serviceipallocations"), etcdStorage)
|
etcd := allocatoretcd.NewEtcd(mem, "/ranges/serviceips", api.Resource("serviceipallocations"), etcdStorage)
|
||||||
return etcd
|
return etcd
|
||||||
})
|
})
|
||||||
s, destroyFunc := generic.NewRawStorage(etcdStorage)
|
s, d := generic.NewRawStorage(etcdStorage)
|
||||||
|
destroyFunc := func() {
|
||||||
|
d()
|
||||||
|
server.Terminate(t)
|
||||||
|
}
|
||||||
return server, storage, backing, s, destroyFunc
|
return server, storage, backing, s, destroyFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,33 +70,24 @@ func key() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestEmpty(t *testing.T) {
|
func TestEmpty(t *testing.T) {
|
||||||
server, storage, _, _, destroyFunc := newStorage(t)
|
_, storage, _, _, destroyFunc := newStorage(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
if err := storage.Allocate(net.ParseIP("192.168.1.2")); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocations at this time") {
|
if err := storage.Allocate(net.ParseIP("192.168.1.2")); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocations at this time") {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestErrors(t *testing.T) {
|
func TestErrors(t *testing.T) {
|
||||||
server, storage, _, _, destroyFunc := newStorage(t)
|
_, storage, _, _, destroyFunc := newStorage(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
if err := storage.Allocate(net.ParseIP("192.168.0.0")); err != ipallocator.ErrNotInRange {
|
if err := storage.Allocate(net.ParseIP("192.168.0.0")); err != ipallocator.ErrNotInRange {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStore(t *testing.T) {
|
func TestStore(t *testing.T) {
|
||||||
server, storage, backing, si, destroyFunc := newStorage(t)
|
_, storage, backing, si, destroyFunc := newStorage(t)
|
||||||
defer func() {
|
defer destroyFunc()
|
||||||
destroyFunc()
|
|
||||||
server.Terminate(t)
|
|
||||||
}()
|
|
||||||
if err := si.Create(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil {
|
if err := si.Create(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ import (
|
|||||||
utilnet "k8s.io/kubernetes/pkg/util/net"
|
utilnet "k8s.io/kubernetes/pkg/util/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newETCD2Storage(c storagebackend.Config) (storage.Interface, func(), error) {
|
func newETCD2Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
|
||||||
tr, err := newTransportForETCD2(c.CertFile, c.KeyFile, c.CAFile)
|
tr, err := newTransportForETCD2(c.CertFile, c.KeyFile, c.CAFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newETCD3Storage(c storagebackend.Config) (storage.Interface, func(), error) {
|
func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
|
||||||
tlsInfo := transport.TLSInfo{
|
tlsInfo := transport.TLSInfo{
|
||||||
CertFile: c.CertFile,
|
CertFile: c.CertFile,
|
||||||
KeyFile: c.KeyFile,
|
KeyFile: c.KeyFile,
|
||||||
|
@ -23,8 +23,11 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
"k8s.io/kubernetes/pkg/storage/storagebackend"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DestroyFunc is to destroy any resources used by the storage returned in Create() together.
|
||||||
|
type DestroyFunc func()
|
||||||
|
|
||||||
// Create creates a storage backend based on given config.
|
// Create creates a storage backend based on given config.
|
||||||
func Create(c storagebackend.Config) (storage.Interface, func(), error) {
|
func Create(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
|
||||||
switch c.Type {
|
switch c.Type {
|
||||||
case storagebackend.StorageTypeUnset, storagebackend.StorageTypeETCD2:
|
case storagebackend.StorageTypeUnset, storagebackend.StorageTypeETCD2:
|
||||||
return newETCD2Storage(c)
|
return newETCD2Storage(c)
|
||||||
|
Loading…
Reference in New Issue
Block a user