Merge pull request #17469 from timothysc/etcd-remove-fakeclient-part4

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2015-11-19 09:09:50 -08:00
commit 834b64addb
28 changed files with 709 additions and 795 deletions

View File

@ -32,36 +32,25 @@ import (
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
type Tester struct { type Tester struct {
*testing.T *testing.T
storage rest.Storage storage rest.Storage
storageError injectErrorFunc
clusterScope bool clusterScope bool
createOnUpdate bool createOnUpdate bool
generatesName bool generatesName bool
returnDeletedObject bool returnDeletedObject bool
} }
type injectErrorFunc func(err error) func New(t *testing.T, storage rest.Storage) *Tester {
func New(t *testing.T, storage rest.Storage, storageError injectErrorFunc) *Tester {
return &Tester{ return &Tester{
T: t, T: t,
storage: storage, storage: storage,
storageError: storageError,
} }
} }
func (t *Tester) withStorageError(err error, fn func()) {
t.storageError(err)
defer t.storageError(nil)
fn()
}
func (t *Tester) ClusterScope() *Tester { func (t *Tester) ClusterScope() *Tester {
t.clusterScope = true t.clusterScope = true
return t return t
@ -142,7 +131,6 @@ func (t *Tester) TestCreate(valid runtime.Object, setFn SetFunc, getFn GetFunc,
t.testCreateHasMetadata(copyOrDie(valid)) t.testCreateHasMetadata(copyOrDie(valid))
if !t.generatesName { if !t.generatesName {
t.testCreateGeneratesName(copyOrDie(valid)) t.testCreateGeneratesName(copyOrDie(valid))
t.testCreateGeneratesNameReturnsServerTimeout(copyOrDie(valid))
} }
t.testCreateEquals(copyOrDie(valid), getFn) t.testCreateEquals(copyOrDie(valid), getFn)
t.testCreateAlreadyExisting(copyOrDie(valid), setFn) t.testCreateAlreadyExisting(copyOrDie(valid), setFn)
@ -158,9 +146,9 @@ func (t *Tester) TestCreate(valid runtime.Object, setFn SetFunc, getFn GetFunc,
} }
// Test updating an object. // Test updating an object.
func (t *Tester) TestUpdate(valid runtime.Object, setFn SetFunc, setRVFn SetRVFunc, getFn GetFunc, updateFn UpdateFunc, invalidUpdateFn ...UpdateFunc) { func (t *Tester) TestUpdate(valid runtime.Object, setFn SetFunc, getFn GetFunc, updateFn UpdateFunc, invalidUpdateFn ...UpdateFunc) {
t.testUpdateEquals(copyOrDie(valid), setFn, getFn, updateFn) t.testUpdateEquals(copyOrDie(valid), setFn, getFn, updateFn)
t.testUpdateFailsOnVersionTooOld(copyOrDie(valid), setFn, setRVFn) t.testUpdateFailsOnVersionTooOld(copyOrDie(valid), setFn)
t.testUpdateOnNotFound(copyOrDie(valid)) t.testUpdateOnNotFound(copyOrDie(valid))
if !t.clusterScope { if !t.clusterScope {
t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), setFn) t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), setFn)
@ -194,20 +182,18 @@ func (t *Tester) TestGet(valid runtime.Object) {
} }
// Test listing objects. // Test listing objects.
func (t *Tester) TestList(valid runtime.Object, assignFn AssignFunc, setRVFn SetRVFunc) { func (t *Tester) TestList(valid runtime.Object, assignFn AssignFunc) {
t.testListError() t.testListNotFound(assignFn)
t.testListFound(copyOrDie(valid), assignFn) t.testListFound(copyOrDie(valid), assignFn)
t.testListNotFound(assignFn, setRVFn)
t.testListMatchLabels(copyOrDie(valid), assignFn) t.testListMatchLabels(copyOrDie(valid), assignFn)
} }
// Test watching objects. // Test watching objects.
func (t *Tester) TestWatch( func (t *Tester) TestWatch(
valid runtime.Object, initWatchFn InitWatchFunc, injectErrFn InjectErrFunc, emitFn EmitFunc, valid runtime.Object, emitFn EmitFunc,
labelsPass, labelsFail []labels.Set, fieldsPass, fieldsFail []fields.Set, actions []string) { labelsPass, labelsFail []labels.Set, fieldsPass, fieldsFail []fields.Set, actions []string) {
t.testWatch(initWatchFn, injectErrFn) t.testWatchLabels(copyOrDie(valid), emitFn, labelsPass, labelsFail, actions)
t.testWatchLabels(copyOrDie(valid), initWatchFn, emitFn, labelsPass, labelsFail, actions) t.testWatchFields(copyOrDie(valid), emitFn, fieldsPass, fieldsFail, actions)
t.testWatchFields(copyOrDie(valid), initWatchFn, emitFn, fieldsPass, fieldsFail, actions)
} }
// ============================================================================= // =============================================================================
@ -285,18 +271,6 @@ func (t *Tester) testCreateGeneratesName(valid runtime.Object) {
} }
} }
func (t *Tester) testCreateGeneratesNameReturnsServerTimeout(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Name = ""
objectMeta.GenerateName = "test-"
t.withStorageError(errors.NewAlreadyExists("kind", "thing"), func() {
_, err := t.storage.(rest.Creater).Create(t.TestContext(), valid)
if err == nil || !errors.IsServerTimeout(err) {
t.Fatalf("Unexpected error: %v", err)
}
})
}
func (t *Tester) testCreateHasMetadata(valid runtime.Object) { func (t *Tester) testCreateHasMetadata(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Name = "" objectMeta.Name = ""
@ -452,20 +426,19 @@ func (t *Tester) testUpdateEquals(obj runtime.Object, setFn SetFunc, getFn GetFu
} }
} }
func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, setFn SetFunc, setRVFn SetRVFunc) { func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, setFn SetFunc) {
ctx := t.TestContext() ctx := t.TestContext()
foo := copyOrDie(obj) foo := copyOrDie(obj)
t.setObjectMeta(foo, "foo3") t.setObjectMeta(foo, "foo3")
setRVFn(10)
if err := setFn(ctx, foo); err != nil { if err := setFn(ctx, foo); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
older := copyOrDie(foo) older := copyOrDie(foo)
olderMeta := t.getObjectMetaOrFail(older) olderMeta := t.getObjectMetaOrFail(older)
olderMeta.ResourceVersion = "8" olderMeta.ResourceVersion = "1"
_, _, err := t.storage.(rest.Updater).Update(t.TestContext(), older) _, _, err := t.storage.(rest.Updater).Update(t.TestContext(), older)
if err == nil { if err == nil {
@ -572,12 +545,11 @@ func (t *Tester) testDeleteNoGraceful(obj runtime.Object, setFn SetFunc, getFn G
func (t *Tester) testDeleteNonExist(obj runtime.Object) { func (t *Tester) testDeleteNonExist(obj runtime.Object) {
objectMeta := t.getObjectMetaOrFail(obj) objectMeta := t.getObjectMetaOrFail(obj)
t.withStorageError(tools.EtcdErrorNotFound, func() { _, err := t.storage.(rest.GracefulDeleter).Delete(t.TestContext(), objectMeta.Name, nil)
_, err := t.storage.(rest.GracefulDeleter).Delete(t.TestContext(), objectMeta.Name, nil) if err == nil || !errors.IsNotFound(err) {
if err == nil || !errors.IsNotFound(err) { t.Errorf("unexpected error: %v", err)
t.Errorf("unexpected error: %v", err) }
}
})
} }
// ============================================================================= // =============================================================================
@ -848,18 +820,6 @@ func listToItems(listObj runtime.Object) ([]runtime.Object, error) {
return result, nil return result, nil
} }
func (t *Tester) testListError() {
ctx := t.TestContext()
storageError := fmt.Errorf("test error")
t.withStorageError(storageError, func() {
_, err := t.storage.(rest.Lister).List(ctx, nil)
if err != storageError {
t.Errorf("unexpected error: %v", err)
}
})
}
func (t *Tester) testListFound(obj runtime.Object, assignFn AssignFunc) { func (t *Tester) testListFound(obj runtime.Object, assignFn AssignFunc) {
ctx := t.TestContext() ctx := t.TestContext()
@ -890,16 +850,18 @@ func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) {
ctx := t.TestContext() ctx := t.TestContext()
testLabels := map[string]string{"key": "value"} testLabels := map[string]string{"key": "value"}
foo1 := copyOrDie(obj) foo3 := copyOrDie(obj)
t.setObjectMeta(foo1, "foo1") t.setObjectMeta(foo3, "foo3")
foo2 := copyOrDie(obj) foo4 := copyOrDie(obj)
foo2Meta := t.getObjectMetaOrFail(foo2) foo4Meta := t.getObjectMetaOrFail(foo4)
foo2Meta.Name = "foo2" foo4Meta.Name = "foo4"
foo2Meta.Namespace = api.NamespaceValue(ctx) foo4Meta.Namespace = api.NamespaceValue(ctx)
foo2Meta.Labels = testLabels foo4Meta.Labels = testLabels
existing := assignFn([]runtime.Object{foo1, foo2}) objs := ([]runtime.Object{foo3, foo4})
filtered := []runtime.Object{existing[1]}
assignFn(objs)
filtered := []runtime.Object{objs[1]}
selector := labels.SelectorFromSet(labels.Set(testLabels)) selector := labels.SelectorFromSet(labels.Set(testLabels))
options := &api.ListOptions{LabelSelector: selector} options := &api.ListOptions{LabelSelector: selector}
@ -919,10 +881,8 @@ func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) {
} }
} }
func (t *Tester) testListNotFound(assignFn AssignFunc, setRVFn SetRVFunc) { func (t *Tester) testListNotFound(assignFn AssignFunc) {
ctx := t.TestContext() ctx := t.TestContext()
setRVFn(uint64(123))
_ = assignFn([]runtime.Object{}) _ = assignFn([]runtime.Object{})
listObj, err := t.storage.(rest.Lister).List(ctx, nil) listObj, err := t.storage.(rest.Lister).List(ctx, nil)
@ -934,45 +894,14 @@ func (t *Tester) testListNotFound(assignFn AssignFunc, setRVFn SetRVFunc) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if len(items) != 0 { if len(items) != 0 {
t.Errorf("unexpected items: %v", items) t.Errorf("unexpected items: %#v", items)
}
meta, err := api.ListMetaFor(listObj)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if meta.ResourceVersion != "123" {
t.Errorf("unexpected resource version: %d", meta.ResourceVersion)
} }
} }
// ============================================================================= // =============================================================================
// Watching tests. // Watching tests.
func (t *Tester) testWatch(initWatchFn InitWatchFunc, injectErrFn InjectErrFunc) { func (t *Tester) testWatchFields(obj runtime.Object, emitFn EmitFunc, fieldsPass, fieldsFail []fields.Set, actions []string) {
ctx := t.TestContext()
watcher, err := t.storage.(rest.Watcher).Watch(ctx, &api.ListOptions{ResourceVersion: "1"})
if err != nil {
t.Errorf("unexpected error: %v", err)
}
initWatchFn()
select {
case _, ok := <-watcher.ResultChan():
if !ok {
t.Errorf("watch channel should be open")
}
default:
}
injectErrFn(nil)
if _, ok := <-watcher.ResultChan(); ok {
t.Errorf("watch channel should be closed")
}
watcher.Stop()
}
func (t *Tester) testWatchFields(obj runtime.Object, initWatchFn InitWatchFunc, emitFn EmitFunc, fieldsPass, fieldsFail []fields.Set, actions []string) {
ctx := t.TestContext() ctx := t.TestContext()
for _, field := range fieldsPass { for _, field := range fieldsPass {
@ -980,9 +909,9 @@ func (t *Tester) testWatchFields(obj runtime.Object, initWatchFn InitWatchFunc,
options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"} options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"}
watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) watcher, err := t.storage.(rest.Watcher).Watch(ctx, options)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v, %v", err, action)
} }
initWatchFn()
if err := emitFn(obj, action); err != nil { if err := emitFn(obj, action); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -1006,7 +935,6 @@ func (t *Tester) testWatchFields(obj runtime.Object, initWatchFn InitWatchFunc,
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
initWatchFn()
if err := emitFn(obj, action); err != nil { if err := emitFn(obj, action); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -1022,7 +950,7 @@ func (t *Tester) testWatchFields(obj runtime.Object, initWatchFn InitWatchFunc,
} }
} }
func (t *Tester) testWatchLabels(obj runtime.Object, initWatchFn InitWatchFunc, emitFn EmitFunc, labelsPass, labelsFail []labels.Set, actions []string) { func (t *Tester) testWatchLabels(obj runtime.Object, emitFn EmitFunc, labelsPass, labelsFail []labels.Set, actions []string) {
ctx := t.TestContext() ctx := t.TestContext()
for _, label := range labelsPass { for _, label := range labelsPass {
@ -1032,7 +960,6 @@ func (t *Tester) testWatchLabels(obj runtime.Object, initWatchFn InitWatchFunc,
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
initWatchFn()
if err := emitFn(obj, action); err != nil { if err := emitFn(obj, action); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -1056,7 +983,6 @@ func (t *Tester) testWatchLabels(obj runtime.Object, initWatchFn InitWatchFunc,
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
initWatchFn()
if err := emitFn(obj, action); err != nil { if err := emitFn(obj, action); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }

View File

@ -25,13 +25,13 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
controllerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) controllerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return controllerStorage, statusStorage, fakeClient return controllerStorage, statusStorage, server
} }
// createController is a helper function that returns a controller with the updated resource version. // createController is a helper function that returns a controller with the updated resource version.
@ -76,8 +76,9 @@ func validNewController() *api.ReplicationController {
var validController = validNewController() var validController = validNewController()
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
controller := validNewController() controller := validNewController()
controller.ObjectMeta = api.ObjectMeta{} controller.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -95,8 +96,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewController(), validNewController(),
@ -126,13 +128,15 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewController()) test.TestDelete(validNewController())
} }
func TestGenerationNumber(t *testing.T) { func TestGenerationNumber(t *testing.T) {
storage, _, _ := newStorage(t) storage, _, server := newStorage(t)
defer server.Terminate(t)
modifiedSno := *validNewController() modifiedSno := *validNewController()
modifiedSno.Generation = 100 modifiedSno.Generation = 100
modifiedSno.Status.ObservedGeneration = 10 modifiedSno.Status.ObservedGeneration = 10
@ -181,20 +185,23 @@ func TestGenerationNumber(t *testing.T) {
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewController()) test.TestGet(validNewController())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewController()) test.TestList(validNewController())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validController, validController,
// matching labels // matching labels

View File

@ -26,13 +26,13 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
daemonSetStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) daemonSetStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return daemonSetStorage, statusStorage, fakeClient return daemonSetStorage, statusStorage, server
} }
func newValidDaemonSet() *extensions.DaemonSet { func newValidDaemonSet() *extensions.DaemonSet {
@ -66,8 +66,9 @@ func newValidDaemonSet() *extensions.DaemonSet {
var validDaemonSet = newValidDaemonSet() var validDaemonSet = newValidDaemonSet()
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
ds := newValidDaemonSet() ds := newValidDaemonSet()
ds.ObjectMeta = api.ObjectMeta{} ds.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -84,8 +85,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
newValidDaemonSet(), newValidDaemonSet(),
@ -120,26 +122,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(newValidDaemonSet()) test.TestDelete(newValidDaemonSet())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(newValidDaemonSet()) test.TestGet(newValidDaemonSet())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(newValidDaemonSet()) test.TestList(newValidDaemonSet())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validDaemonSet, validDaemonSet,
// matching labels // matching labels

View File

@ -20,7 +20,6 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@ -28,14 +27,14 @@ import (
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*DeploymentStorage, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*DeploymentStorage, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
deploymentStorage := NewStorage(etcdStorage, generic.UndecoratedStorage) deploymentStorage := NewStorage(etcdStorage, generic.UndecoratedStorage)
return &deploymentStorage, fakeClient return &deploymentStorage, server
} }
var namespace = "foo-namespace" var namespace = "foo-namespace"
@ -92,8 +91,9 @@ func validNewScale() *extensions.Scale {
var validScale = *validNewScale() var validScale = *validNewScale()
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
deployment := validNewDeployment() deployment := validNewDeployment()
deployment.ObjectMeta = api.ObjectMeta{} deployment.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -110,8 +110,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewDeployment(), validNewDeployment(),
@ -146,26 +147,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
test.TestDelete(validNewDeployment()) test.TestDelete(validNewDeployment())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
test.TestGet(validNewDeployment()) test.TestGet(validNewDeployment())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
test.TestList(validNewDeployment()) test.TestList(validNewDeployment())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Deployment.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Deployment.Etcd)
test.TestWatch( test.TestWatch(
validNewDeployment(), validNewDeployment(),
// matching labels // matching labels
@ -188,11 +193,12 @@ func TestWatch(t *testing.T) {
} }
func TestScaleGet(t *testing.T) { func TestScaleGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
ctx := api.WithNamespace(api.NewContext(), namespace) ctx := api.WithNamespace(api.NewContext(), namespace)
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Extensions.Codec(), &validDeployment), 0); err != nil { if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -202,17 +208,17 @@ func TestScaleGet(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if e, a := expect, scale; !api.Semantic.DeepEqual(e, a) { if e, a := expect, scale; !api.Semantic.DeepDerivative(e, a) {
t.Errorf("unexpected scale: %s", util.ObjectDiff(e, a)) t.Errorf("unexpected scale: %s", util.ObjectDiff(e, a))
} }
} }
func TestScaleUpdate(t *testing.T) { func TestScaleUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
ctx := api.WithNamespace(api.NewContext(), namespace) ctx := api.WithNamespace(api.NewContext(), namespace)
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Extensions.Codec(), &validDeployment), 0); err != nil { if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
replicas := 12 replicas := 12
@ -226,24 +232,24 @@ func TestScaleUpdate(t *testing.T) {
if _, _, err := storage.Scale.Update(ctx, &update); err != nil { if _, _, err := storage.Scale.Update(ctx, &update); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
response, err := fakeClient.Get(key, false, false) obj, err := storage.Scale.Get(ctx, name)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
var deployment extensions.Deployment deployment := obj.(*extensions.Scale)
testapi.Extensions.Codec().DecodeInto([]byte(response.Node.Value), &deployment)
if deployment.Spec.Replicas != replicas { if deployment.Spec.Replicas != replicas {
t.Errorf("wrong replicas count expected: %d got: %d", replicas, deployment.Spec.Replicas) t.Errorf("wrong replicas count expected: %d got: %d", replicas, deployment.Spec.Replicas)
} }
} }
func TestStatusUpdate(t *testing.T) { func TestStatusUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
ctx := api.WithNamespace(api.NewContext(), namespace) ctx := api.WithNamespace(api.NewContext(), namespace)
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Extensions.Codec(), &validDeployment), 0); err != nil { if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
update := extensions.Deployment{ update := extensions.Deployment{
@ -259,13 +265,12 @@ func TestStatusUpdate(t *testing.T) {
if _, _, err := storage.Status.Update(ctx, &update); err != nil { if _, _, err := storage.Status.Update(ctx, &update); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
response, err := fakeClient.Get(key, false, false) obj, err := storage.Deployment.Get(ctx, name)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
var deployment extensions.Deployment deployment := obj.(*extensions.Deployment)
testapi.Extensions.Codec().DecodeInto([]byte(response.Node.Value), &deployment)
if deployment.Spec.Replicas != 7 { if deployment.Spec.Replicas != 7 {
t.Errorf("we expected .spec.replicas to not be updated but it was updated to %v", deployment.Spec.Replicas) t.Errorf("we expected .spec.replicas to not be updated but it was updated to %v", deployment.Spec.Replicas)
} }

View File

@ -25,12 +25,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewEndpoints() *api.Endpoints { func validNewEndpoints() *api.Endpoints {
@ -57,8 +57,9 @@ func validChangedEndpoints() *api.Endpoints {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
endpoints := validNewEndpoints() endpoints := validNewEndpoints()
endpoints.ObjectMeta = api.ObjectMeta{} endpoints.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -72,8 +73,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewEndpoints(), validNewEndpoints(),
@ -90,26 +92,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewEndpoints()) test.TestDelete(validNewEndpoints())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewEndpoints()) test.TestGet(validNewEndpoints())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewEndpoints()) test.TestList(validNewEndpoints())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewEndpoints(), validNewEndpoints(),
// matching labels // matching labels

View File

@ -23,15 +23,14 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
var testTTL uint64 = 60 var testTTL uint64 = 60
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
fakeClient.HideExpires = true return NewREST(etcdStorage, generic.UndecoratedStorage, testTTL), server
return NewREST(etcdStorage, generic.UndecoratedStorage, testTTL), fakeClient
} }
func validNewEvent(namespace string) *api.Event { func validNewEvent(namespace string) *api.Event {
@ -49,8 +48,9 @@ func validNewEvent(namespace string) *api.Event {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
event := validNewEvent(test.TestNamespace()) event := validNewEvent(test.TestNamespace())
event.ObjectMeta = api.ObjectMeta{} event.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -62,8 +62,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewEvent(test.TestNamespace()), validNewEvent(test.TestNamespace()),
@ -83,7 +84,8 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewEvent(test.TestNamespace())) test.TestDelete(validNewEvent(test.TestNamespace()))
} }

View File

@ -20,19 +20,17 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*ScaleREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*ScaleREST, *etcdtesting.EtcdTestServer, storage.Interface) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewStorage(etcdStorage, generic.UndecoratedStorage).Scale, fakeClient return NewStorage(etcdStorage, generic.UndecoratedStorage).Scale, server, etcdStorage
} }
var validPodTemplate = api.PodTemplate{ var validPodTemplate = api.PodTemplate{
@ -63,7 +61,7 @@ var validControllerSpec = api.ReplicationControllerSpec{
} }
var validController = api.ReplicationController{ var validController = api.ReplicationController{
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "1"}, ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"},
Spec: validControllerSpec, Spec: validControllerSpec,
} }
@ -79,31 +77,31 @@ var validScale = extensions.Scale{
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server, si := newStorage(t)
defer 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")
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), &validController), 0); err != nil { if err := si.Set(ctx, key, &validController, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
expect := &validScale
obj, err := storage.Get(ctx, "foo") obj, err := storage.Get(ctx, "foo")
scale := obj.(*extensions.Scale)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if e, a := expect, scale; !api.Semantic.DeepEqual(e, a) { scale := obj.(*extensions.Scale)
t.Errorf("unexpected scale: %s", util.ObjectDiff(e, a)) if scale.Spec.Replicas != validReplicas {
t.Errorf("wrong replicas count expected: %d got: %d", validReplicas, scale.Spec.Replicas)
} }
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server, si := newStorage(t)
defer 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")
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), &validController), 0); err != nil { if err := si.Set(ctx, key, &validController, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
replicas := 12 replicas := 12
@ -117,14 +115,13 @@ func TestUpdate(t *testing.T) {
if _, _, err := storage.Update(ctx, &update); err != nil { if _, _, err := storage.Update(ctx, &update); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
response, err := fakeClient.Get(key, false, false) obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
var controller api.ReplicationController updated := obj.(*extensions.Scale)
testapi.Extensions.Codec().DecodeInto([]byte(response.Node.Value), &controller) if updated.Spec.Replicas != replicas {
if controller.Spec.Replicas != replicas { t.Errorf("wrong replicas count expected: %d got: %d", replicas, updated.Spec.Replicas)
t.Errorf("wrong replicas count expected: %d got: %d", replicas, controller.Spec.Replicas)
} }
} }

View File

@ -182,7 +182,7 @@ func TestEtcdList(t *testing.T) {
server, registry := NewTestGenericEtcdRegistry(t) server, registry := NewTestGenericEtcdRegistry(t)
if item.in != nil { if item.in != nil {
if err := storagetesting.CreateList(t, "/pods", registry.Storage, item.in); err != nil { if err := storagetesting.CreateList("/pods", registry.Storage, item.in); err != nil {
t.Errorf("Unexpected error %v", err) t.Errorf("Unexpected error %v", err)
} }
} }

View File

@ -28,13 +28,13 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
horizontalPodAutoscalerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) horizontalPodAutoscalerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return horizontalPodAutoscalerStorage, statusStorage, fakeClient return horizontalPodAutoscalerStorage, statusStorage, server
} }
func validNewHorizontalPodAutoscaler(name string) *extensions.HorizontalPodAutoscaler { func validNewHorizontalPodAutoscaler(name string) *extensions.HorizontalPodAutoscaler {
@ -56,8 +56,9 @@ func validNewHorizontalPodAutoscaler(name string) *extensions.HorizontalPodAutos
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
autoscaler := validNewHorizontalPodAutoscaler("foo") autoscaler := validNewHorizontalPodAutoscaler("foo")
autoscaler.ObjectMeta = api.ObjectMeta{} autoscaler.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -69,8 +70,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewHorizontalPodAutoscaler("foo"), validNewHorizontalPodAutoscaler("foo"),
@ -84,26 +86,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewHorizontalPodAutoscaler("foo")) test.TestDelete(validNewHorizontalPodAutoscaler("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewHorizontalPodAutoscaler("foo")) test.TestGet(validNewHorizontalPodAutoscaler("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewHorizontalPodAutoscaler("foo")) test.TestList(validNewHorizontalPodAutoscaler("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewHorizontalPodAutoscaler("foo"), validNewHorizontalPodAutoscaler("foo"),
// matching labels // matching labels

View File

@ -26,14 +26,14 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
ingressStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) ingressStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return ingressStorage, statusStorage, fakeClient return ingressStorage, statusStorage, server
} }
var ( var (
@ -108,8 +108,9 @@ func validIngress() *extensions.Ingress {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
ingress := validIngress() ingress := validIngress()
noDefaultBackendAndRules := validIngress() noDefaultBackendAndRules := validIngress()
noDefaultBackendAndRules.Spec.Backend = &extensions.IngressBackend{} noDefaultBackendAndRules.Spec.Backend = &extensions.IngressBackend{}
@ -126,8 +127,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validIngress(), validIngress(),
@ -162,26 +164,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validIngress()) test.TestDelete(validIngress())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validIngress()) test.TestGet(validIngress())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validIngress()) test.TestList(validIngress())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validIngress(), validIngress(),
// matching labels // matching labels

View File

@ -28,13 +28,13 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
jobStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) jobStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return jobStorage, statusStorage, fakeClient return jobStorage, statusStorage, server
} }
func validNewJob() *extensions.Job { func validNewJob() *extensions.Job {
@ -72,8 +72,9 @@ func validNewJob() *extensions.Job {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
validJob := validNewJob() validJob := validNewJob()
validJob.ObjectMeta = api.ObjectMeta{} validJob.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -91,8 +92,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
two := 2 two := 2
test.TestUpdate( test.TestUpdate(
// valid // valid
@ -118,26 +120,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewJob()) test.TestDelete(validNewJob())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewJob()) test.TestGet(validNewJob())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewJob()) test.TestList(validNewJob())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewJob(), validNewJob(),
// matching labels // matching labels

View File

@ -26,12 +26,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewLimitRange() *api.LimitRange { func validNewLimitRange() *api.LimitRange {
@ -59,8 +59,9 @@ func validNewLimitRange() *api.LimitRange {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).GeneratesName() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).GeneratesName()
validLimitRange := validNewLimitRange() validLimitRange := validNewLimitRange()
validLimitRange.ObjectMeta = api.ObjectMeta{} validLimitRange.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -74,8 +75,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewLimitRange(), validNewLimitRange(),
@ -101,26 +103,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewLimitRange()) test.TestDelete(validNewLimitRange())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewLimitRange()) test.TestGet(validNewLimitRange())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewLimitRange()) test.TestList(validNewLimitRange())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewLimitRange(), validNewLimitRange(),
// matching labels // matching labels

View File

@ -20,21 +20,19 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
namespaceStorage, _, _ := NewREST(etcdStorage, generic.UndecoratedStorage) namespaceStorage, _, _ := NewREST(etcdStorage, generic.UndecoratedStorage)
return namespaceStorage, fakeClient return namespaceStorage, server
} }
func validNewNamespace() *api.Namespace { func validNewNamespace() *api.Namespace {
@ -46,8 +44,9 @@ func validNewNamespace() *api.Namespace {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
namespace := validNewNamespace() namespace := validNewNamespace()
namespace.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} namespace.ObjectMeta = api.ObjectMeta{GenerateName: "foo"}
test.TestCreate( test.TestCreate(
@ -61,7 +60,8 @@ func TestCreate(t *testing.T) {
} }
func TestCreateSetsFields(t *testing.T) { func TestCreateSetsFields(t *testing.T) {
storage, _ := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
namespace := validNewNamespace() namespace := validNewNamespace()
ctx := api.NewContext() ctx := api.NewContext()
_, err := storage.Create(ctx, namespace) _, err := storage.Create(ctx, namespace)
@ -86,26 +86,30 @@ func TestCreateSetsFields(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope().ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope().ReturnDeletedObject()
test.TestDelete(validNewNamespace()) test.TestDelete(validNewNamespace())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestGet(validNewNamespace()) test.TestGet(validNewNamespace())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestList(validNewNamespace()) test.TestList(validNewNamespace())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestWatch( test.TestWatch(
validNewNamespace(), validNewNamespace(),
// matching labels // matching labels
@ -127,7 +131,8 @@ func TestWatch(t *testing.T) {
} }
func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) { func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
key := etcdtest.AddPrefix("namespaces/foo") key := etcdtest.AddPrefix("namespaces/foo")
ctx := api.NewContext() ctx := api.NewContext()
now := unversioned.Now() now := unversioned.Now()
@ -141,7 +146,7 @@ func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) {
}, },
Status: api.NamespaceStatus{Phase: api.NamespaceActive}, Status: api.NamespaceStatus{Phase: api.NamespaceActive},
} }
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), namespace), 0); err != nil { if err := storage.Storage.Set(ctx, key, namespace, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if _, err := storage.Delete(ctx, "foo", nil); err == nil { if _, err := storage.Delete(ctx, "foo", nil); err == nil {
@ -150,7 +155,8 @@ func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) {
} }
func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) { func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
defer server.Terminate(t)
key := etcdtest.AddPrefix("namespaces/foo") key := etcdtest.AddPrefix("namespaces/foo")
ctx := api.NewContext() ctx := api.NewContext()
now := unversioned.Now() now := unversioned.Now()
@ -164,7 +170,7 @@ func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) {
}, },
Status: api.NamespaceStatus{Phase: api.NamespaceActive}, Status: api.NamespaceStatus{Phase: api.NamespaceActive},
} }
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), namespace), 0); err != nil { if err := storage.Storage.Set(ctx, key, namespace, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if _, err := storage.Delete(ctx, "foo", nil); err != nil { if _, err := storage.Delete(ctx, "foo", nil); err != nil {

View File

@ -27,7 +27,7 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
type fakeConnectionInfoGetter struct { type fakeConnectionInfoGetter struct {
@ -37,10 +37,10 @@ func (fakeConnectionInfoGetter) GetConnectionInfo(host string) (string, uint, ht
return "http", 12345, nil, nil return "http", 12345, nil, nil
} }
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
storage, _ := NewREST(etcdStorage, generic.UndecoratedStorage, fakeConnectionInfoGetter{}, nil) storage, _ := NewREST(etcdStorage, generic.UndecoratedStorage, fakeConnectionInfoGetter{}, nil)
return storage, fakeClient return storage, server
} }
func validNewNode() *api.Node { func validNewNode() *api.Node {
@ -64,8 +64,9 @@ func validNewNode() *api.Node {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
node := validNewNode() node := validNewNode()
node.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} node.ObjectMeta = api.ObjectMeta{GenerateName: "foo"}
test.TestCreate( test.TestCreate(
@ -79,8 +80,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewNode(), validNewNode(),
@ -94,26 +96,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestDelete(validNewNode()) test.TestDelete(validNewNode())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestGet(validNewNode()) test.TestGet(validNewNode())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestList(validNewNode()) test.TestList(validNewNode())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestWatch( test.TestWatch(
validNewNode(), validNewNode(),
// matching labels // matching labels

View File

@ -21,21 +21,20 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
persistentVolumeStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) persistentVolumeStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return persistentVolumeStorage, statusStorage, fakeClient return persistentVolumeStorage, statusStorage, server
} }
func validNewPersistentVolume(name string) *api.PersistentVolume { func validNewPersistentVolume(name string) *api.PersistentVolume {
@ -64,13 +63,13 @@ func validNewPersistentVolume(name string) *api.PersistentVolume {
func validChangedPersistentVolume() *api.PersistentVolume { func validChangedPersistentVolume() *api.PersistentVolume {
pv := validNewPersistentVolume("foo") pv := validNewPersistentVolume("foo")
pv.ResourceVersion = "1"
return pv return pv
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
pv := validNewPersistentVolume("foo") pv := validNewPersistentVolume("foo")
pv.ObjectMeta = api.ObjectMeta{GenerateName: "foo"} pv.ObjectMeta = api.ObjectMeta{GenerateName: "foo"}
test.TestCreate( test.TestCreate(
@ -84,8 +83,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewPersistentVolume("foo"), validNewPersistentVolume("foo"),
@ -101,26 +101,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope().ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope().ReturnDeletedObject()
test.TestDelete(validNewPersistentVolume("foo")) test.TestDelete(validNewPersistentVolume("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestGet(validNewPersistentVolume("foo")) test.TestGet(validNewPersistentVolume("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestList(validNewPersistentVolume("foo")) test.TestList(validNewPersistentVolume("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ClusterScope() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ClusterScope()
test.TestWatch( test.TestWatch(
validNewPersistentVolume("foo"), validNewPersistentVolume("foo"),
// matching labels // matching labels
@ -142,39 +146,37 @@ func TestWatch(t *testing.T) {
} }
func TestUpdateStatus(t *testing.T) { func TestUpdateStatus(t *testing.T) {
storage, statusStorage, fakeClient := newStorage(t) storage, statusStorage, server := newStorage(t)
fakeClient.TestIndex = true defer server.Terminate(t)
ctx := api.NewContext() ctx := api.NewContext()
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
pvStart := validNewPersistentVolume("foo") pvStart := validNewPersistentVolume("foo")
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), pvStart), 0) err := storage.Storage.Set(ctx, key, pvStart, nil, 0)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
pvIn := &api.PersistentVolume{ pvIn := &api.PersistentVolume{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
ResourceVersion: "1",
}, },
Status: api.PersistentVolumeStatus{ Status: api.PersistentVolumeStatus{
Phase: api.VolumeBound, Phase: api.VolumeBound,
}, },
} }
expected := *pvStart _, _, err = statusStorage.Update(ctx, pvIn)
expected.ResourceVersion = "2"
expected.Labels = pvIn.Labels
expected.Status = pvIn.Status
_, _, err := statusStorage.Update(ctx, pvIn)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
pvOut, err := storage.Get(ctx, "foo") obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if !api.Semantic.DeepEqual(&expected, pvOut) { pvOut := obj.(*api.PersistentVolume)
t.Errorf("unexpected object: %s", util.ObjectDiff(&expected, pvOut)) // only compare the relevant change b/c metadata will differ
if !api.Semantic.DeepEqual(pvIn.Status, pvOut.Status) {
t.Errorf("unexpected object: %s", util.ObjectDiff(pvIn.Status, pvOut.Status))
} }
} }

View File

@ -21,21 +21,20 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
persistentVolumeClaimStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) persistentVolumeClaimStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return persistentVolumeClaimStorage, statusStorage, fakeClient return persistentVolumeClaimStorage, statusStorage, server
} }
func validNewPersistentVolumeClaim(name, ns string) *api.PersistentVolumeClaim { func validNewPersistentVolumeClaim(name, ns string) *api.PersistentVolumeClaim {
@ -60,8 +59,9 @@ func validNewPersistentVolumeClaim(name, ns string) *api.PersistentVolumeClaim {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
pv := validNewPersistentVolumeClaim("foo", api.NamespaceDefault) pv := validNewPersistentVolumeClaim("foo", api.NamespaceDefault)
pv.ObjectMeta = api.ObjectMeta{} pv.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -75,8 +75,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewPersistentVolumeClaim("foo", api.NamespaceDefault), validNewPersistentVolumeClaim("foo", api.NamespaceDefault),
@ -94,26 +95,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ReturnDeletedObject()
test.TestDelete(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) test.TestDelete(validNewPersistentVolumeClaim("foo", api.NamespaceDefault))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) test.TestGet(validNewPersistentVolumeClaim("foo", api.NamespaceDefault))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewPersistentVolumeClaim("foo", api.NamespaceDefault)) test.TestList(validNewPersistentVolumeClaim("foo", api.NamespaceDefault))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewPersistentVolumeClaim("foo", api.NamespaceDefault), validNewPersistentVolumeClaim("foo", api.NamespaceDefault),
// matching labels // matching labels
@ -135,20 +140,19 @@ func TestWatch(t *testing.T) {
} }
func TestUpdateStatus(t *testing.T) { func TestUpdateStatus(t *testing.T) {
storage, statusStorage, fakeClient := newStorage(t) storage, statusStorage, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
pvcStart := validNewPersistentVolumeClaim("foo", api.NamespaceDefault) pvcStart := validNewPersistentVolumeClaim("foo", api.NamespaceDefault)
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), pvcStart), 0) err := storage.Storage.Set(ctx, key, pvcStart, nil, 0)
pvc := &api.PersistentVolumeClaim{ pvc := &api.PersistentVolumeClaim{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
ResourceVersion: "1",
}, },
Spec: api.PersistentVolumeClaimSpec{ Spec: api.PersistentVolumeClaimSpec{
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
@ -163,20 +167,17 @@ func TestUpdateStatus(t *testing.T) {
}, },
} }
expected := *pvcStart _, _, err = statusStorage.Update(ctx, pvc)
expected.ResourceVersion = "2"
expected.Labels = pvc.Labels
expected.Status = pvc.Status
_, _, err := statusStorage.Update(ctx, pvc)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
pvcOut, err := storage.Get(ctx, "foo") obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if !api.Semantic.DeepEqual(&expected, pvcOut) { pvcOut := obj.(*api.PersistentVolumeClaim)
t.Errorf("unexpected object: %s", util.ObjectDiff(&expected, pvcOut)) // only compare relevant changes b/c of difference in metadata
if !api.Semantic.DeepEqual(pvc.Status, pvcOut.Status) {
t.Errorf("unexpected object: %s", util.ObjectDiff(pvc.Status, pvcOut.Status))
} }
} }

View File

@ -17,7 +17,6 @@ limitations under the License.
package etcd package etcd
import ( import (
"fmt"
"strings" "strings"
"testing" "testing"
@ -25,7 +24,6 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
etcderrors "k8s.io/kubernetes/pkg/api/errors/etcd" etcderrors "k8s.io/kubernetes/pkg/api/errors/etcd"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
@ -33,14 +31,14 @@ import (
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/securitycontext"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*REST, *BindingREST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *BindingREST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
storage := NewStorage(etcdStorage, generic.UndecoratedStorage, nil, nil) storage := NewStorage(etcdStorage, generic.UndecoratedStorage, nil, nil)
return storage.Pod, storage.Binding, storage.Status, fakeClient return storage.Pod, storage.Binding, storage.Status, server
} }
func validNewPod() *api.Pod { func validNewPod() *api.Pod {
@ -72,7 +70,6 @@ func validNewPod() *api.Pod {
func validChangedPod() *api.Pod { func validChangedPod() *api.Pod {
pod := validNewPod() pod := validNewPod()
pod.ResourceVersion = "1"
pod.Labels = map[string]string{ pod.Labels = map[string]string{
"foo": "bar", "foo": "bar",
} }
@ -80,8 +77,9 @@ func validChangedPod() *api.Pod {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
pod := validNewPod() pod := validNewPod()
pod.ObjectMeta = api.ObjectMeta{} pod.ObjectMeta = api.ObjectMeta{}
// Make an invalid pod with an an incorrect label. // Make an invalid pod with an an incorrect label.
@ -105,8 +103,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewPod(), validNewPod(),
@ -120,8 +119,9 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ReturnDeletedObject()
test.TestDelete(validNewPod()) test.TestDelete(validNewPod())
scheduledPod := validNewPod() scheduledPod := validNewPod()
@ -129,22 +129,12 @@ func TestDelete(t *testing.T) {
test.TestDeleteGraceful(scheduledPod, 30) test.TestDeleteGraceful(scheduledPod, 30)
} }
func TestCreateRegistryError(t *testing.T) {
storage, _, _, fakeClient := newStorage(t)
fakeClient.Err = fmt.Errorf("test error")
pod := validNewPod()
_, err := storage.Create(api.NewDefaultContext(), pod)
if err != fakeClient.Err {
t.Fatalf("unexpected error: %v", err)
}
}
func TestCreateSetsFields(t *testing.T) { func TestCreateSetsFields(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
defer server.Terminate(t)
pod := validNewPod() pod := validNewPod()
_, err := storage.Create(api.NewDefaultContext(), pod) _, err := storage.Create(api.NewDefaultContext(), pod)
if err != fakeClient.Err { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
@ -255,10 +245,10 @@ func TestResourceLocation(t *testing.T) {
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
for _, tc := range testCases { for _, tc := range testCases {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
key, _ := storage.KeyFunc(ctx, tc.pod.Name) key, _ := storage.KeyFunc(ctx, tc.pod.Name)
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
if _, err := fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), &tc.pod), 0); err != nil { if err := storage.Storage.Create(ctx, key, &tc.pod, nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -277,24 +267,28 @@ func TestResourceLocation(t *testing.T) {
if location.Host != tc.location { if location.Host != tc.location {
t.Errorf("Expected %v, but got %v", tc.location, location.Host) t.Errorf("Expected %v, but got %v", tc.location, location.Host)
} }
server.Terminate(t)
} }
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewPod()) test.TestGet(validNewPod())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewPod()) test.TestList(validNewPod())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewPod(), validNewPod(),
// matching labels // matching labels
@ -315,12 +309,11 @@ func TestWatch(t *testing.T) {
} }
func TestEtcdCreate(t *testing.T) { func TestEtcdCreate(t *testing.T) {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.ExpectNotFoundGet(key)
_, err := storage.Create(ctx, validNewPod()) _, err := storage.Create(ctx, validNewPod())
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
@ -335,31 +328,21 @@ func TestEtcdCreate(t *testing.T) {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
resp, err := fakeClient.Get(key, false, false) _, err = storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Fatalf("Unexpected error %v", err) t.Fatalf("Unexpected error %v", err)
} }
var pod api.Pod
err = testapi.Default.Codec().DecodeInto([]byte(resp.Node.Value), &pod)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if pod.Name != "foo" {
t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value)
}
} }
// Ensure that when scheduler creates a binding for a pod that has already been deleted // Ensure that when scheduler creates a binding for a pod that has already been deleted
// by the API server, API server returns not-found error. // by the API server, API server returns not-found error.
func TestEtcdCreateBindingNoPod(t *testing.T) { func TestEtcdCreateBindingNoPod(t *testing.T) {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.ExpectNotFoundGet(key)
// Assume that a pod has undergone the following: // Assume that a pod has undergone the following:
// - Create (apiserver) // - Create (apiserver)
// - Schedule (scheduler) // - Schedule (scheduler)
@ -385,8 +368,8 @@ func TestEtcdCreateBindingNoPod(t *testing.T) {
} }
func TestEtcdCreateFailsWithoutNamespace(t *testing.T) { func TestEtcdCreateFailsWithoutNamespace(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
fakeClient.TestIndex = true defer server.Terminate(t)
pod := validNewPod() pod := validNewPod()
pod.Namespace = "" pod.Namespace = ""
_, err := storage.Create(api.NewContext(), pod) _, err := storage.Create(api.NewContext(), pod)
@ -397,12 +380,11 @@ func TestEtcdCreateFailsWithoutNamespace(t *testing.T) {
} }
func TestEtcdCreateWithContainersNotFound(t *testing.T) { func TestEtcdCreateWithContainersNotFound(t *testing.T) {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.ExpectNotFoundGet(key)
_, err := storage.Create(ctx, validNewPod()) _, err := storage.Create(ctx, validNewPod())
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
@ -421,30 +403,21 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
resp, err := fakeClient.Get(key, false, false) obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Fatalf("Unexpected error %v", err) t.Fatalf("Unexpected error %v", err)
} }
var pod api.Pod pod := obj.(*api.Pod)
err = testapi.Default.Codec().DecodeInto([]byte(resp.Node.Value), &pod)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if pod.Name != "foo" {
t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value)
}
if !(pod.Annotations != nil && pod.Annotations["label1"] == "value1") { if !(pod.Annotations != nil && pod.Annotations["label1"] == "value1") {
t.Fatalf("Pod annotations don't match the expected: %v", pod.Annotations) t.Fatalf("Pod annotations don't match the expected: %v", pod.Annotations)
} }
} }
func TestEtcdCreateWithConflict(t *testing.T) { func TestEtcdCreateWithConflict(t *testing.T) {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo")
fakeClient.ExpectNotFoundGet(key)
_, err := storage.Create(ctx, validNewPod()) _, err := storage.Create(ctx, validNewPod())
if err != nil { if err != nil {
@ -472,12 +445,11 @@ func TestEtcdCreateWithConflict(t *testing.T) {
} }
func TestEtcdCreateWithExistingContainers(t *testing.T) { func TestEtcdCreateWithExistingContainers(t *testing.T) {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.ExpectNotFoundGet(key)
_, err := storage.Create(ctx, validNewPod()) _, err := storage.Create(ctx, validNewPod())
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
@ -492,19 +464,10 @@ func TestEtcdCreateWithExistingContainers(t *testing.T) {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
resp, err := fakeClient.Get(key, false, false) _, err = storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Fatalf("Unexpected error %v", err) t.Fatalf("Unexpected error %v", err)
} }
var pod api.Pod
err = testapi.Default.Codec().DecodeInto([]byte(resp.Node.Value), &pod)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if pod.Name != "foo" {
t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value)
}
} }
func TestEtcdCreateBinding(t *testing.T) { func TestEtcdCreateBinding(t *testing.T) {
@ -544,10 +507,9 @@ func TestEtcdCreateBinding(t *testing.T) {
}, },
} }
for k, test := range testCases { for k, test := range testCases {
storage, bindingStorage, _, fakeClient := newStorage(t) storage, bindingStorage, _, server := newStorage(t)
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.ExpectNotFoundGet(key)
if _, err := storage.Create(ctx, validNewPod()); err != nil { if _, err := storage.Create(ctx, validNewPod()); err != nil {
t.Fatalf("%s: unexpected error: %v", k, err) t.Fatalf("%s: unexpected error: %v", k, err)
@ -563,42 +525,45 @@ func TestEtcdCreateBinding(t *testing.T) {
t.Errorf("%s: expected: %v, got: %v", k, pod.(*api.Pod).Spec.NodeName, test.binding.Target.Name) t.Errorf("%s: expected: %v, got: %v", k, pod.(*api.Pod).Spec.NodeName, test.binding.Target.Name)
} }
} }
server.Terminate(t)
} }
} }
func TestEtcdUpdateNotScheduled(t *testing.T) { func TestEtcdUpdateNotScheduled(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), validNewPod()), 1) if _, err := storage.Create(ctx, validNewPod()); err != nil {
t.Fatalf("unexpected error: %v", err)
}
podIn := validChangedPod() podIn := validChangedPod()
_, _, err := storage.Update(ctx, podIn) _, _, err := storage.Update(ctx, podIn)
if err != nil { if err != nil {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
response, err := fakeClient.Get(key, false, false) obj, err := storage.Get(ctx, validNewPod().ObjectMeta.Name)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
podOut := &api.Pod{} podOut := obj.(*api.Pod)
testapi.Default.Codec().DecodeInto([]byte(response.Node.Value), podOut) // validChangedPod only changes the Labels, so were checking the update was valid
if !api.Semantic.DeepEqual(podOut, podIn) { if !api.Semantic.DeepEqual(podIn.Labels, podOut.Labels) {
t.Errorf("objects differ: %v", util.ObjectDiff(podOut, podIn)) t.Errorf("objects differ: %v", util.ObjectDiff(podOut, podIn))
} }
} }
func TestEtcdUpdateScheduled(t *testing.T) { func TestEtcdUpdateScheduled(t *testing.T) {
storage, _, _, fakeClient := newStorage(t) storage, _, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ err := storage.Storage.Create(ctx, key, &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
@ -614,13 +579,15 @@ func TestEtcdUpdateScheduled(t *testing.T) {
}, },
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},
}, },
}), 1) }, nil, 1)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
grace := int64(30) grace := int64(30)
podIn := api.Pod{ podIn := api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
ResourceVersion: "1",
Labels: map[string]string{ Labels: map[string]string{
"foo": "bar", "foo": "bar",
}, },
@ -641,26 +608,27 @@ func TestEtcdUpdateScheduled(t *testing.T) {
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},
}, },
} }
_, _, err := storage.Update(ctx, &podIn) _, _, err = storage.Update(ctx, &podIn)
if err != nil { if err != nil {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
response, err := fakeClient.Get(key, false, false)
obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
var podOut api.Pod podOut := obj.(*api.Pod)
testapi.Default.Codec().DecodeInto([]byte(response.Node.Value), &podOut) // Check to verify the Spec and Label updates match from change above. Those are the fields changed.
if !api.Semantic.DeepEqual(podOut, podIn) { if !api.Semantic.DeepEqual(podOut.Spec, podIn.Spec) || !api.Semantic.DeepEqual(podOut.Labels, podIn.Labels) {
t.Errorf("expected: %#v, got: %#v", podOut, podIn) t.Errorf("objects differ: %v", util.ObjectDiff(podOut, podIn))
} }
} }
func TestEtcdUpdateStatus(t *testing.T) { func TestEtcdUpdateStatus(t *testing.T) {
storage, _, statusStorage, fakeClient := newStorage(t) storage, _, statusStorage, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
@ -680,12 +648,14 @@ func TestEtcdUpdateStatus(t *testing.T) {
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},
}, },
} }
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), &podStart), 0) err := storage.Storage.Create(ctx, key, &podStart, nil, 0)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
podIn := api.Pod{ podIn := api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
ResourceVersion: "1",
Labels: map[string]string{ Labels: map[string]string{
"foo": "bar", "foo": "bar",
}, },
@ -719,15 +689,19 @@ func TestEtcdUpdateStatus(t *testing.T) {
expected.Labels = podIn.Labels expected.Labels = podIn.Labels
expected.Status = podIn.Status expected.Status = podIn.Status
_, _, err := statusStorage.Update(ctx, &podIn) _, _, err = statusStorage.Update(ctx, &podIn)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
podOut, err := storage.Get(ctx, "foo") obj, err := storage.Get(ctx, "foo")
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if !api.Semantic.DeepEqual(&expected, podOut) { podOut := obj.(*api.Pod)
t.Errorf("unexpected object: %s", util.ObjectDiff(&expected, podOut)) // Check to verify the Spec, Label, and Status updates match from change above. Those are the fields changed.
if !api.Semantic.DeepEqual(podOut.Spec, podIn.Spec) ||
!api.Semantic.DeepEqual(podOut.Labels, podIn.Labels) ||
!api.Semantic.DeepEqual(podOut.Status, podIn.Status) {
t.Errorf("objects differ: %v", util.ObjectDiff(podOut, podIn))
} }
} }

View File

@ -25,12 +25,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewPodTemplate(name string) *api.PodTemplate { func validNewPodTemplate(name string) *api.PodTemplate {
@ -61,8 +61,9 @@ func validNewPodTemplate(name string) *api.PodTemplate {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
pod := validNewPodTemplate("foo") pod := validNewPodTemplate("foo")
pod.ObjectMeta = api.ObjectMeta{} pod.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -76,8 +77,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
//valid //valid
validNewPodTemplate("foo"), validNewPodTemplate("foo"),
@ -91,26 +93,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ReturnDeletedObject()
test.TestDelete(validNewPodTemplate("foo")) test.TestDelete(validNewPodTemplate("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewPodTemplate("foo")) test.TestGet(validNewPodTemplate("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewPodTemplate("foo")) test.TestList(validNewPodTemplate("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewPodTemplate("foo"), validNewPodTemplate("foo"),
// matching labels // matching labels

View File

@ -20,9 +20,8 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/coreos/go-etcd/etcd"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/rest/resttest" "k8s.io/kubernetes/pkg/api/rest/resttest"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@ -32,28 +31,26 @@ 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/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
storagetesting "k8s.io/kubernetes/pkg/storage/testing"
) )
func NewEtcdStorage(t *testing.T, group string) (storage.Interface, *tools.FakeEtcdClient) { func NewEtcdStorage(t *testing.T, group string) (storage.Interface, *etcdtesting.EtcdTestServer) {
fakeClient := tools.NewFakeEtcdClient(t) server := etcdtesting.NewEtcdTestClientServer(t)
fakeClient.TestIndex = true storage := etcdstorage.NewEtcdStorage(server.Client, testapi.Groups[group].Codec(), etcdtest.PathPrefix())
etcdStorage := etcdstorage.NewEtcdStorage(fakeClient, testapi.Groups[group].Codec(), etcdtest.PathPrefix()) return storage, server
return etcdStorage, fakeClient
} }
type Tester struct { type Tester struct {
tester *resttest.Tester tester *resttest.Tester
fakeClient *tools.FakeEtcdClient storage *etcdgeneric.Etcd
storage *etcdgeneric.Etcd
} }
type UpdateFunc func(runtime.Object) runtime.Object type UpdateFunc func(runtime.Object) runtime.Object
func New(t *testing.T, fakeClient *tools.FakeEtcdClient, storage *etcdgeneric.Etcd) *Tester { func New(t *testing.T, storage *etcdgeneric.Etcd) *Tester {
return &Tester{ return &Tester{
tester: resttest.New(t, storage, fakeClient.SetError), tester: resttest.New(t, storage),
fakeClient: fakeClient, storage: storage,
storage: storage,
} }
} }
@ -98,7 +95,6 @@ func (t *Tester) TestUpdate(valid runtime.Object, validUpdateFunc UpdateFunc, in
t.tester.TestUpdate( t.tester.TestUpdate(
valid, valid,
t.setObject, t.setObject,
t.setResourceVersion,
t.getObject, t.getObject,
resttest.UpdateFunc(validUpdateFunc), resttest.UpdateFunc(validUpdateFunc),
invalidFuncs..., invalidFuncs...,
@ -110,7 +106,7 @@ func (t *Tester) TestDelete(valid runtime.Object) {
valid, valid,
t.setObject, t.setObject,
t.getObject, t.getObject,
isNotFoundEtcdError, errors.IsNotFound,
) )
} }
@ -131,21 +127,19 @@ func (t *Tester) TestList(valid runtime.Object) {
t.tester.TestList( t.tester.TestList(
valid, valid,
t.setObjectsForList, t.setObjectsForList,
t.setResourceVersion,
) )
} }
func (t *Tester) TestWatch(valid runtime.Object, labelsPass, labelsFail []labels.Set, fieldsPass, fieldsFail []fields.Set) { func (t *Tester) TestWatch(valid runtime.Object, labelsPass, labelsFail []labels.Set, fieldsPass, fieldsFail []fields.Set) {
t.tester.TestWatch( t.tester.TestWatch(
valid, valid,
t.fakeClient.WaitForWatchCompletion,
t.injectWatchError,
t.emitObject, t.emitObject,
labelsPass, labelsPass,
labelsFail, labelsFail,
fieldsPass, fieldsPass,
fieldsFail, fieldsFail,
[]string{etcdstorage.EtcdCreate, etcdstorage.EtcdSet, etcdstorage.EtcdCAS, etcdstorage.EtcdDelete}, // TODO: This should be filtered, the registry should not be aware of this level of detail
[]string{etcdstorage.EtcdCreate, etcdstorage.EtcdDelete},
) )
} }
@ -178,24 +172,11 @@ func (t *Tester) getObject(ctx api.Context, obj runtime.Object) (runtime.Object,
if err != nil { if err != nil {
return nil, err return nil, err
} }
key, err := t.storage.KeyFunc(ctx, meta.Name)
if err != nil {
return nil, err
}
key = etcdtest.AddPrefix(key)
resp, err := t.fakeClient.Get(key, false, false)
if err != nil {
return nil, err
}
result := t.storage.NewFunc()
codec, err := getCodec(obj) result, err := t.storage.Get(ctx, meta.Name)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err := codec.DecodeInto([]byte(resp.Node.Value), result); err != nil {
return nil, err
}
return result, nil return result, nil
} }
@ -208,82 +189,34 @@ func (t *Tester) setObject(ctx api.Context, obj runtime.Object) error {
if err != nil { if err != nil {
return err return err
} }
key = etcdtest.AddPrefix(key) return t.storage.Storage.Set(ctx, key, obj, nil, 0)
codec, err := getCodec(obj)
if err != nil {
return err
}
_, err = t.fakeClient.Set(key, runtime.EncodeOrDie(codec, obj), 0)
return err
} }
func (t *Tester) setObjectsForList(objects []runtime.Object) []runtime.Object { func (t *Tester) setObjectsForList(objects []runtime.Object) []runtime.Object {
result := make([]runtime.Object, len(objects)) key := t.storage.KeyRootFunc(t.tester.TestContext())
key := etcdtest.AddPrefix(t.storage.KeyRootFunc(t.tester.TestContext())) if err := storagetesting.CreateObjList(key, t.storage.Storage, objects); err != nil {
t.tester.Errorf("unexpected error: %v", err)
if len(objects) > 0 { return nil
nodes := make([]*etcd.Node, len(objects))
for i, obj := range objects {
codec, _ := getCodec(obj)
encoded := runtime.EncodeOrDie(codec, obj)
decoded, _ := codec.Decode([]byte(encoded))
nodes[i] = &etcd.Node{Value: encoded}
result[i] = decoded
}
t.fakeClient.Data[key] = tools.EtcdResponseWithError{
R: &etcd.Response{
Node: &etcd.Node{
Nodes: nodes,
},
},
E: nil,
}
} else {
t.fakeClient.Data[key] = tools.EtcdResponseWithError{
R: &etcd.Response{},
E: t.fakeClient.NewError(tools.EtcdErrorCodeNotFound),
}
} }
return result return objects
}
func (t *Tester) setResourceVersion(resourceVersion uint64) {
t.fakeClient.ChangeIndex = resourceVersion
}
func (t *Tester) injectWatchError(err error) {
t.fakeClient.WatchInjectError <- err
} }
func (t *Tester) emitObject(obj runtime.Object, action string) error { func (t *Tester) emitObject(obj runtime.Object, action string) error {
codec, err := getCodec(obj) ctx := t.tester.TestContext()
if err != nil { var err error
return err
}
encoded, err := codec.Encode(obj)
if err != nil {
return err
}
node := &etcd.Node{
Value: string(encoded),
}
var prevNode *etcd.Node = nil
if action == etcdstorage.EtcdDelete {
prevNode = node
}
t.fakeClient.WatchResponse <- &etcd.Response{
Action: action,
Node: node,
PrevNode: prevNode,
}
return nil
}
func isNotFoundEtcdError(err error) bool { switch action {
etcdError, ok := err.(*etcd.EtcdError) case etcdstorage.EtcdCreate:
if !ok { err = t.setObject(ctx, obj)
return false case etcdstorage.EtcdDelete:
meta, err := api.ObjectMetaFor(obj)
if err != nil {
return err
}
_, err = t.storage.Delete(ctx, meta.Name, nil)
default:
err = fmt.Errorf("unexpected action: %v", action)
} }
return etcdError.ErrorCode == tools.EtcdErrorCodeNotFound
return err
} }

View File

@ -17,26 +17,23 @@ limitations under the License.
package etcd package etcd
import ( import (
"fmt"
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
resourceQuotaStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) resourceQuotaStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage)
return resourceQuotaStorage, statusStorage, fakeClient return resourceQuotaStorage, statusStorage, server
} }
func validNewResourceQuota() *api.ResourceQuota { func validNewResourceQuota() *api.ResourceQuota {
@ -59,8 +56,9 @@ func validNewResourceQuota() *api.ResourceQuota {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
resourcequota := validNewResourceQuota() resourcequota := validNewResourceQuota()
resourcequota.ObjectMeta = api.ObjectMeta{} resourcequota.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -73,23 +71,13 @@ func TestCreate(t *testing.T) {
) )
} }
func TestCreateRegistryError(t *testing.T) {
storage, _, fakeClient := newStorage(t)
fakeClient.Err = fmt.Errorf("test error")
resourcequota := validNewResourceQuota()
_, err := storage.Create(api.NewDefaultContext(), resourcequota)
if err != fakeClient.Err {
t.Fatalf("unexpected error: %v", err)
}
}
func TestCreateSetsFields(t *testing.T) { func TestCreateSetsFields(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
resourcequota := validNewResourceQuota() resourcequota := validNewResourceQuota()
_, err := storage.Create(api.NewDefaultContext(), resourcequota) _, err := storage.Create(api.NewDefaultContext(), resourcequota)
if err != fakeClient.Err { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -107,26 +95,30 @@ func TestCreateSetsFields(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ReturnDeletedObject()
test.TestDelete(validNewResourceQuota()) test.TestDelete(validNewResourceQuota())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewResourceQuota()) test.TestGet(validNewResourceQuota())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewResourceQuota()) test.TestList(validNewResourceQuota())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, _, fakeClient := newStorage(t) storage, _, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewResourceQuota(), validNewResourceQuota(),
// matching labels // matching labels
@ -147,19 +139,22 @@ func TestWatch(t *testing.T) {
} }
func TestUpdateStatus(t *testing.T) { func TestUpdateStatus(t *testing.T) {
storage, status, fakeClient := newStorage(t) storage, status, server := newStorage(t)
defer server.Terminate(t)
ctx := api.NewDefaultContext() ctx := api.NewDefaultContext()
key, _ := storage.KeyFunc(ctx, "foo") key, _ := storage.KeyFunc(ctx, "foo")
key = etcdtest.AddPrefix(key) key = etcdtest.AddPrefix(key)
resourcequotaStart := validNewResourceQuota() resourcequotaStart := validNewResourceQuota()
fakeClient.Set(key, runtime.EncodeOrDie(testapi.Default.Codec(), resourcequotaStart), 0) err := storage.Storage.Set(ctx, key, resourcequotaStart, nil, 0)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
resourcequotaIn := &api.ResourceQuota{ resourcequotaIn := &api.ResourceQuota{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
ResourceVersion: "1",
}, },
Status: api.ResourceQuotaStatus{ Status: api.ResourceQuotaStatus{
Used: api.ResourceList{ Used: api.ResourceList{
@ -181,17 +176,14 @@ func TestUpdateStatus(t *testing.T) {
}, },
} }
expected := *resourcequotaStart _, _, err = status.Update(ctx, resourcequotaIn)
expected.ResourceVersion = "2"
expected.Labels = resourcequotaIn.Labels
expected.Status = resourcequotaIn.Status
_, _, err := status.Update(ctx, resourcequotaIn)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
rqOut, err := storage.Get(ctx, "foo") obj, err := storage.Get(ctx, "foo")
if !api.Semantic.DeepEqual(&expected, rqOut) { rqOut := obj.(*api.ResourceQuota)
t.Errorf("unexpected object: %s", util.ObjectDiff(&expected, rqOut)) // only compare the meaningful update b/c we can't compare due to metadata
if !api.Semantic.DeepEqual(resourcequotaIn.Status, rqOut.Status) {
t.Errorf("unexpected object: %s", util.ObjectDiff(resourcequotaIn, rqOut))
} }
} }

View File

@ -25,12 +25,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewSecret(name string) *api.Secret { func validNewSecret(name string) *api.Secret {
@ -46,8 +46,9 @@ func validNewSecret(name string) *api.Secret {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
secret := validNewSecret("foo") secret := validNewSecret("foo")
secret.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"} secret.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"}
test.TestCreate( test.TestCreate(
@ -67,8 +68,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewSecret("foo"), validNewSecret("foo"),
@ -82,26 +84,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewSecret("foo")) test.TestDelete(validNewSecret("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewSecret("foo")) test.TestGet(validNewSecret("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewSecret("foo")) test.TestList(validNewSecret("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewSecret("foo"), validNewSecret("foo"),
// matching labels // matching labels

View File

@ -21,21 +21,19 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/registry/service/allocator" "k8s.io/kubernetes/pkg/registry/service/allocator"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
func newStorage(t *testing.T) (*Etcd, *tools.FakeEtcdClient, allocator.Interface) { func newStorage(t *testing.T) (*Etcd, *etcdtesting.EtcdTestServer, allocator.Interface) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
mem := allocator.NewAllocationMap(100, "rangeSpecValue") mem := allocator.NewAllocationMap(100, "rangeSpecValue")
etcd := NewEtcd(mem, "/ranges/serviceips", "serviceipallocation", etcdStorage) etcd := NewEtcd(mem, "/ranges/serviceips", "serviceipallocation", etcdStorage)
return etcd, fakeClient, mem return etcd, server, mem
} }
func validNewRangeAllocation() *api.RangeAllocation { func validNewRangeAllocation() *api.RangeAllocation {
@ -50,16 +48,17 @@ func key() string {
} }
func TestEmpty(t *testing.T) { func TestEmpty(t *testing.T) {
storage, fakeClient, _ := newStorage(t) storage, server, _ := newStorage(t)
fakeClient.ExpectNotFoundGet(key()) defer server.Terminate(t)
if _, err := storage.Allocate(1); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocation at this time") { if _, err := storage.Allocate(1); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocation at this time") {
t.Fatal(err) t.Fatal(err)
} }
} }
func TestStore(t *testing.T) { func TestStore(t *testing.T) {
storage, fakeClient, backing := newStorage(t) storage, server, backing := newStorage(t)
if _, err := fakeClient.Set(key(), runtime.EncodeOrDie(testapi.Default.Codec(), validNewRangeAllocation()), 0); err != nil { defer server.Terminate(t)
if err := storage.storage.Set(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -77,21 +76,12 @@ func TestStore(t *testing.T) {
t.Fatal("Expected allocation to fail") t.Fatal("Expected allocation to fail")
} }
obj := fakeClient.Data[key()]
if obj.R == nil || obj.R.Node == nil {
t.Fatalf("%s is empty: %#v", key(), obj)
}
t.Logf("data: %#v", obj.R.Node)
other := allocator.NewAllocationMap(100, "rangeSpecValue") other := allocator.NewAllocationMap(100, "rangeSpecValue")
allocation := &api.RangeAllocation{} allocation := &api.RangeAllocation{}
if err := storage.storage.Get(context.TODO(), key(), allocation, false); err != nil { if err := storage.storage.Get(context.TODO(), key(), allocation, false); err != nil {
t.Fatal(err) t.Fatal(err)
} }
if allocation.ResourceVersion != "2" {
t.Fatalf("%#v", allocation)
}
if allocation.Range != "rangeSpecValue" { if allocation.Range != "rangeSpecValue" {
t.Errorf("unexpected stored Range: %s", allocation.Range) t.Errorf("unexpected stored Range: %s", allocation.Range)
} }

View File

@ -25,13 +25,13 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validService() *api.Service { func validService() *api.Service {
@ -55,8 +55,9 @@ func validService() *api.Service {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
validService := validService() validService := validService()
validService.ObjectMeta = api.ObjectMeta{} validService.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -84,8 +85,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestUpdate( test.TestUpdate(
// valid // valid
validService(), validService(),
@ -108,26 +110,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestDelete(validService()) test.TestDelete(validService())
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestGet(validService()) test.TestGet(validService())
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).AllowCreateOnUpdate() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).AllowCreateOnUpdate()
test.TestList(validService()) test.TestList(validService())
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validService(), validService(),
// matching labels // matching labels

View File

@ -22,18 +22,19 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/registry/service/allocator" "k8s.io/kubernetes/pkg/registry/service/allocator"
allocatoretcd "k8s.io/kubernetes/pkg/registry/service/allocator/etcd" allocatoretcd "k8s.io/kubernetes/pkg/registry/service/allocator/etcd"
"k8s.io/kubernetes/pkg/registry/service/ipallocator" "k8s.io/kubernetes/pkg/registry/service/ipallocator"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"golang.org/x/net/context"
) )
func newStorage(t *testing.T) (*tools.FakeEtcdClient, ipallocator.Interface, allocator.Interface) { func newStorage(t *testing.T) (*etcdtesting.EtcdTestServer, ipallocator.Interface, allocator.Interface, storage.Interface) {
etcdStorage, fakeClient := 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 {
t.Fatal(err) t.Fatal(err)
@ -47,7 +48,7 @@ func newStorage(t *testing.T) (*tools.FakeEtcdClient, ipallocator.Interface, all
return etcd return etcd
}) })
return fakeClient, storage, backing return server, storage, backing, etcdStorage
} }
func validNewRangeAllocation() *api.RangeAllocation { func validNewRangeAllocation() *api.RangeAllocation {
@ -63,23 +64,25 @@ func key() string {
} }
func TestEmpty(t *testing.T) { func TestEmpty(t *testing.T) {
fakeClient, storage, _ := newStorage(t) server, storage, _, _ := newStorage(t)
fakeClient.ExpectNotFoundGet(key()) defer server.Terminate(t)
if err := storage.Allocate(net.ParseIP("192.168.1.2")); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocation at this time") { if err := storage.Allocate(net.ParseIP("192.168.1.2")); !strings.Contains(err.Error(), "cannot allocate resources of type serviceipallocation at this time") {
t.Fatal(err) t.Fatal(err)
} }
} }
func TestErrors(t *testing.T) { func TestErrors(t *testing.T) {
_, storage, _ := newStorage(t) server, storage, _, _ := newStorage(t)
defer 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) {
fakeClient, storage, backing := newStorage(t) server, storage, backing, si := newStorage(t)
if _, err := fakeClient.Set(key(), runtime.EncodeOrDie(testapi.Default.Codec(), validNewRangeAllocation()), 0); err != nil { defer server.Terminate(t)
if err := si.Set(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -96,10 +99,4 @@ func TestStore(t *testing.T) {
if err := storage.Allocate(net.ParseIP("192.168.1.2")); err != ipallocator.ErrAllocated { if err := storage.Allocate(net.ParseIP("192.168.1.2")); err != ipallocator.ErrAllocated {
t.Fatal(err) t.Fatal(err)
} }
obj := fakeClient.Data[key()]
if obj.R == nil || obj.R.Node == nil {
t.Fatalf("%s is empty: %#v", key(), obj)
}
t.Logf("data: %#v", obj.R.Node)
} }

View File

@ -25,12 +25,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewServiceAccount(name string) *api.ServiceAccount { func validNewServiceAccount(name string) *api.ServiceAccount {
@ -44,8 +44,9 @@ func validNewServiceAccount(name string) *api.ServiceAccount {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
serviceAccount := validNewServiceAccount("foo") serviceAccount := validNewServiceAccount("foo")
serviceAccount.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"} serviceAccount.ObjectMeta = api.ObjectMeta{GenerateName: "foo-"}
test.TestCreate( test.TestCreate(
@ -60,8 +61,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewServiceAccount("foo"), validNewServiceAccount("foo"),
@ -75,26 +77,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd).ReturnDeletedObject() defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd).ReturnDeletedObject()
test.TestDelete(validNewServiceAccount("foo")) test.TestDelete(validNewServiceAccount("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewServiceAccount("foo")) test.TestGet(validNewServiceAccount("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewServiceAccount("foo")) test.TestList(validNewServiceAccount("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewServiceAccount("foo"), validNewServiceAccount("foo"),
// matching labels // matching labels

View File

@ -28,12 +28,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
return NewREST(etcdStorage, generic.UndecoratedStorage), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage), server
} }
func validNewThirdPartyResource(name string) *extensions.ThirdPartyResource { func validNewThirdPartyResource(name string) *extensions.ThirdPartyResource {
@ -51,8 +51,9 @@ func validNewThirdPartyResource(name string) *extensions.ThirdPartyResource {
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
rsrc := validNewThirdPartyResource("foo") rsrc := validNewThirdPartyResource("foo")
rsrc.ObjectMeta = api.ObjectMeta{} rsrc.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -64,8 +65,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewThirdPartyResource("foo"), validNewThirdPartyResource("foo"),
@ -79,26 +81,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewThirdPartyResource("foo")) test.TestDelete(validNewThirdPartyResource("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewThirdPartyResource("foo")) test.TestGet(validNewThirdPartyResource("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewThirdPartyResource("foo")) test.TestList(validNewThirdPartyResource("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewThirdPartyResource("foo"), validNewThirdPartyResource("foo"),
// matching labels // matching labels

View File

@ -28,12 +28,12 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/tools" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
) )
func newStorage(t *testing.T) (*REST, *tools.FakeEtcdClient) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, fakeClient := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
return NewREST(etcdStorage, generic.UndecoratedStorage, "foo", "bar"), fakeClient return NewREST(etcdStorage, generic.UndecoratedStorage, "foo", "bar"), server
} }
func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceData { func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceData {
@ -47,8 +47,9 @@ func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceD
} }
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
rsrc := validNewThirdPartyResourceData("foo") rsrc := validNewThirdPartyResourceData("foo")
rsrc.ObjectMeta = api.ObjectMeta{} rsrc.ObjectMeta = api.ObjectMeta{}
test.TestCreate( test.TestCreate(
@ -60,8 +61,9 @@ func TestCreate(t *testing.T) {
} }
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestUpdate( test.TestUpdate(
// valid // valid
validNewThirdPartyResourceData("foo"), validNewThirdPartyResourceData("foo"),
@ -75,26 +77,30 @@ func TestUpdate(t *testing.T) {
} }
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestDelete(validNewThirdPartyResourceData("foo")) test.TestDelete(validNewThirdPartyResourceData("foo"))
} }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestGet(validNewThirdPartyResourceData("foo")) test.TestGet(validNewThirdPartyResourceData("foo"))
} }
func TestList(t *testing.T) { func TestList(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestList(validNewThirdPartyResourceData("foo")) test.TestList(validNewThirdPartyResourceData("foo"))
} }
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
storage, fakeClient := newStorage(t) storage, server := newStorage(t)
test := registrytest.New(t, fakeClient, storage.Etcd) defer server.Terminate(t)
test := registrytest.New(t, storage.Etcd)
test.TestWatch( test.TestWatch(
validNewThirdPartyResourceData("foo"), validNewThirdPartyResourceData("foo"),
// matching labels // matching labels

View File

@ -18,7 +18,6 @@ package testing
import ( import (
"path" "path"
"testing"
"golang.org/x/net/context" "golang.org/x/net/context"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
@ -27,31 +26,36 @@ import (
) )
// CreateObj will create a single object using the storage interface // CreateObj will create a single object using the storage interface
func CreateObj(t *testing.T, helper storage.Interface, name string, obj, out runtime.Object, ttl uint64) error { func CreateObj(helper storage.Interface, name string, obj, out runtime.Object, ttl uint64) error {
err := helper.Set(context.TODO(), name, obj, out, ttl) return helper.Set(context.TODO(), name, obj, out, ttl)
if err != nil {
t.Errorf("Unexpected error %v", err)
}
return err
} }
// CreateList will properly create a list using the storage interface //CreateObjList will create a list from the array of objects
func CreateList(t *testing.T, prefix string, helper storage.Interface, list runtime.Object) error { func CreateObjList(prefix string, helper storage.Interface, items []runtime.Object) error {
items, err := runtime.ExtractList(list)
if err != nil {
return err
}
for i := range items { for i := range items {
obj := items[i] obj := items[i]
meta, err := meta.Accessor(obj) meta, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
err = CreateObj(t, helper, path.Join(prefix, meta.Name()), obj, obj, 0) err = CreateObj(helper, path.Join(prefix, meta.Name()), obj, obj, 0)
if err != nil { if err != nil {
return err return err
} }
items[i] = obj items[i] = obj
} }
return nil
}
// CreateList will properly create a list using the storage interface
func CreateList(prefix string, helper storage.Interface, list runtime.Object) error {
items, err := runtime.ExtractList(list)
if err != nil {
return err
}
err = CreateObjList(prefix, helper, items)
if err != nil {
return err
}
return runtime.SetList(list, items) return runtime.SetList(list, items)
} }