diff --git a/pkg/api/rest/resttest/resttest.go b/pkg/api/rest/resttest/resttest.go index de1b6c6893..bd0a36475d 100644 --- a/pkg/api/rest/resttest/resttest.go +++ b/pkg/api/rest/resttest/resttest.go @@ -123,18 +123,18 @@ type GetFunc func(api.Context, runtime.Object) (runtime.Object, error) type InitWatchFunc func() type InjectErrFunc func(err error) type IsErrorFunc func(err error) bool -type SetFunc func(api.Context, runtime.Object) error +type CreateFunc func(api.Context, runtime.Object) error type SetRVFunc func(uint64) type UpdateFunc func(runtime.Object) runtime.Object // Test creating an object. -func (t *Tester) TestCreate(valid runtime.Object, setFn SetFunc, getFn GetFunc, invalid ...runtime.Object) { +func (t *Tester) TestCreate(valid runtime.Object, createFn CreateFunc, getFn GetFunc, invalid ...runtime.Object) { t.testCreateHasMetadata(copyOrDie(valid)) if !t.generatesName { t.testCreateGeneratesName(copyOrDie(valid)) } t.testCreateEquals(copyOrDie(valid), getFn) - t.testCreateAlreadyExisting(copyOrDie(valid), setFn) + t.testCreateAlreadyExisting(copyOrDie(valid), createFn) if t.clusterScope { t.testCreateDiscardsObjectNamespace(copyOrDie(valid)) t.testCreateIgnoresContextNamespace(copyOrDie(valid)) @@ -147,31 +147,31 @@ func (t *Tester) TestCreate(valid runtime.Object, setFn SetFunc, getFn GetFunc, } // Test updating an object. -func (t *Tester) TestUpdate(valid runtime.Object, setFn SetFunc, getFn GetFunc, updateFn UpdateFunc, invalidUpdateFn ...UpdateFunc) { - t.testUpdateEquals(copyOrDie(valid), setFn, getFn, updateFn) - t.testUpdateFailsOnVersionTooOld(copyOrDie(valid), setFn, getFn) +func (t *Tester) TestUpdate(valid runtime.Object, createFn CreateFunc, getFn GetFunc, updateFn UpdateFunc, invalidUpdateFn ...UpdateFunc) { + t.testUpdateEquals(copyOrDie(valid), createFn, getFn, updateFn) + t.testUpdateFailsOnVersionTooOld(copyOrDie(valid), createFn, getFn) t.testUpdateOnNotFound(copyOrDie(valid)) if !t.clusterScope { - t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), setFn) + t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), createFn) } - t.testUpdateInvokesValidation(copyOrDie(valid), setFn, invalidUpdateFn...) - t.testUpdateWithWrongUID(copyOrDie(valid), setFn, getFn) + t.testUpdateInvokesValidation(copyOrDie(valid), createFn, invalidUpdateFn...) + t.testUpdateWithWrongUID(copyOrDie(valid), createFn, getFn) } // Test deleting an object. -func (t *Tester) TestDelete(valid runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { +func (t *Tester) TestDelete(valid runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { t.testDeleteNonExist(copyOrDie(valid)) - t.testDeleteNoGraceful(copyOrDie(valid), setFn, getFn, isNotFoundFn) - t.testDeleteWithUID(copyOrDie(valid), setFn, getFn, isNotFoundFn) + t.testDeleteNoGraceful(copyOrDie(valid), createFn, getFn, isNotFoundFn) + t.testDeleteWithUID(copyOrDie(valid), createFn, getFn, isNotFoundFn) } // Test gracefully deleting an object. -func (t *Tester) TestDeleteGraceful(valid runtime.Object, setFn SetFunc, getFn GetFunc, expectedGrace int64) { - t.testDeleteGracefulHasDefault(copyOrDie(valid), setFn, getFn, expectedGrace) - t.testDeleteGracefulWithValue(copyOrDie(valid), setFn, getFn, expectedGrace) - t.testDeleteGracefulUsesZeroOnNil(copyOrDie(valid), setFn, expectedGrace) - t.testDeleteGracefulExtend(copyOrDie(valid), setFn, getFn, expectedGrace) - t.testDeleteGracefulImmediate(copyOrDie(valid), setFn, getFn, expectedGrace) +func (t *Tester) TestDeleteGraceful(valid runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { + t.testDeleteGracefulHasDefault(copyOrDie(valid), createFn, getFn, expectedGrace) + t.testDeleteGracefulWithValue(copyOrDie(valid), createFn, getFn, expectedGrace) + t.testDeleteGracefulUsesZeroOnNil(copyOrDie(valid), createFn, expectedGrace) + t.testDeleteGracefulExtend(copyOrDie(valid), createFn, getFn, expectedGrace) + t.testDeleteGracefulImmediate(copyOrDie(valid), createFn, getFn, expectedGrace) } // Test getting object. @@ -202,12 +202,12 @@ func (t *Tester) TestWatch( // ============================================================================= // Creation tests. -func (t *Tester) testCreateAlreadyExisting(obj runtime.Object, setFn SetFunc) { +func (t *Tester) testCreateAlreadyExisting(obj runtime.Object, createFn CreateFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo1") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } @@ -394,12 +394,12 @@ func (t *Tester) testCreateResetsUserData(valid runtime.Object) { // ============================================================================= // Update tests. -func (t *Tester) testUpdateEquals(obj runtime.Object, setFn SetFunc, getFn GetFunc, updateFn UpdateFunc) { +func (t *Tester) testUpdateEquals(obj runtime.Object, createFn CreateFunc, getFn GetFunc, updateFn UpdateFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo2") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } @@ -429,13 +429,13 @@ func (t *Tester) testUpdateEquals(obj runtime.Object, setFn SetFunc, getFn GetFu } } -func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, setFn SetFunc, getFn GetFunc) { +func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, createFn CreateFunc, getFn GetFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo3") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } @@ -456,12 +456,12 @@ func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, setFn SetFun } } -func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, setFn SetFunc, invalidUpdateFn ...UpdateFunc) { +func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, createFn CreateFunc, invalidUpdateFn ...UpdateFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo4") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } @@ -477,13 +477,13 @@ func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, setFn SetFunc, } } -func (t *Tester) testUpdateWithWrongUID(obj runtime.Object, setFn SetFunc, getFn GetFunc) { +func (t *Tester) testUpdateWithWrongUID(obj runtime.Object, createFn CreateFunc, getFn GetFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo5") objectMeta := t.getObjectMetaOrFail(foo) objectMeta.UID = types.UID("UID0000") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta.UID = types.UID("UID1111") @@ -516,12 +516,12 @@ func (t *Tester) testUpdateOnNotFound(obj runtime.Object) { } } -func (t *Tester) testUpdateRejectsMismatchedNamespace(obj runtime.Object, setFn SetFunc) { +func (t *Tester) testUpdateRejectsMismatchedNamespace(obj runtime.Object, createFn CreateFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo1") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } @@ -543,12 +543,12 @@ func (t *Tester) testUpdateRejectsMismatchedNamespace(obj runtime.Object, setFn // ============================================================================= // Deletion tests. -func (t *Tester) testDeleteNoGraceful(obj runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { +func (t *Tester) testDeleteNoGraceful(obj runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo1") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) @@ -582,14 +582,14 @@ func (t *Tester) testDeleteNonExist(obj runtime.Object) { // This test the fast-fail path. We test that the precondition gets verified // again before deleting the object in tests of pkg/storage/etcd. -func (t *Tester) testDeleteWithUID(obj runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { +func (t *Tester) testDeleteWithUID(obj runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo1") objectMeta := t.getObjectMetaOrFail(foo) objectMeta.UID = types.UID("UID0000") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } obj, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewPreconditionDeleteOptions("UID1111")) @@ -619,12 +619,12 @@ func (t *Tester) testDeleteWithUID(obj runtime.Object, setFn SetFunc, getFn GetF // ============================================================================= // Graceful Deletion tests. -func (t *Tester) testDeleteGracefulHasDefault(obj runtime.Object, setFn SetFunc, getFn GetFunc, expectedGrace int64) { +func (t *Tester) testDeleteGracefulHasDefault(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo1") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) @@ -646,12 +646,12 @@ func (t *Tester) testDeleteGracefulHasDefault(obj runtime.Object, setFn SetFunc, } } -func (t *Tester) testDeleteGracefulWithValue(obj runtime.Object, setFn SetFunc, getFn GetFunc, expectedGrace int64) { +func (t *Tester) testDeleteGracefulWithValue(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo2") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) @@ -673,12 +673,12 @@ func (t *Tester) testDeleteGracefulWithValue(obj runtime.Object, setFn SetFunc, } } -func (t *Tester) testDeleteGracefulExtend(obj runtime.Object, setFn SetFunc, getFn GetFunc, expectedGrace int64) { +func (t *Tester) testDeleteGracefulExtend(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo3") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) @@ -705,12 +705,12 @@ func (t *Tester) testDeleteGracefulExtend(obj runtime.Object, setFn SetFunc, get } } -func (t *Tester) testDeleteGracefulImmediate(obj runtime.Object, setFn SetFunc, getFn GetFunc, expectedGrace int64) { +func (t *Tester) testDeleteGracefulImmediate(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo4") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) @@ -738,12 +738,12 @@ func (t *Tester) testDeleteGracefulImmediate(obj runtime.Object, setFn SetFunc, } } -func (t *Tester) testDeleteGracefulUsesZeroOnNil(obj runtime.Object, setFn SetFunc, expectedGrace int64) { +func (t *Tester) testDeleteGracefulUsesZeroOnNil(obj runtime.Object, createFn CreateFunc, expectedGrace int64) { ctx := t.TestContext() foo := copyOrDie(obj) t.setObjectMeta(foo, "foo5") - if err := setFn(ctx, foo); err != nil { + if err := createFn(ctx, foo); err != nil { t.Errorf("unexpected error: %v", err) } objectMeta := t.getObjectMetaOrFail(foo) diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index d8bf77ff49..225cd6d1d0 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -569,7 +569,7 @@ func testInstallThirdPartyAPIListVersion(t *testing.T, version string) { defer etcdserver.Terminate(t) if test.items != nil { - err := storeThirdPartyList(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default", test.items) + err := createThirdPartyList(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default", test.items) if !assert.NoError(err) { return } @@ -637,17 +637,17 @@ func encodeToThirdParty(name string, obj interface{}) (runtime.Object, error) { return &thirdPartyData, nil } -func storeThirdPartyObject(s storage.Interface, path, name string, obj interface{}) error { +func createThirdPartyObject(s storage.Interface, path, name string, obj interface{}) error { data, err := encodeToThirdParty(name, obj) if err != nil { return err } - return s.Set(context.TODO(), etcdtest.AddPrefix(path), data, nil, 0) + return s.Create(context.TODO(), etcdtest.AddPrefix(path), data, nil, 0) } -func storeThirdPartyList(s storage.Interface, path string, list []Foo) error { +func createThirdPartyList(s storage.Interface, path string, list []Foo) error { for _, obj := range list { - if err := storeThirdPartyObject(s, path+"/"+obj.Name, obj.Name, obj); err != nil { + if err := createThirdPartyObject(s, path+"/"+obj.Name, obj.Name, obj); err != nil { return err } } @@ -690,7 +690,7 @@ func testInstallThirdPartyAPIGetVersion(t *testing.T, version string) { SomeField: "test field", OtherField: 10, } - if !assert.NoError(storeThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { + if !assert.NoError(createThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { t.FailNow() return } @@ -803,7 +803,7 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) { SomeField: "test field", OtherField: 10, } - if !assert.NoError(storeThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { + if !assert.NoError(createThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { t.FailNow() return } @@ -913,13 +913,13 @@ func testInstallThirdPartyResourceRemove(t *testing.T, version string) { SomeField: "test field", OtherField: 10, } - if !assert.NoError(storeThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { + if !assert.NoError(createThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { t.FailNow() return } secondObj := expectedObj secondObj.Name = "bar" - if !assert.NoError(storeThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/bar", "bar", secondObj)) { + if !assert.NoError(createThirdPartyObject(master.thirdPartyStorage, "/ThirdPartyResourceData/company.com/foos/default/bar", "bar", secondObj)) { t.FailNow() return } diff --git a/pkg/registry/deployment/etcd/etcd_test.go b/pkg/registry/deployment/etcd/etcd_test.go index 8201168d44..5ab2d10675 100644 --- a/pkg/registry/deployment/etcd/etcd_test.go +++ b/pkg/registry/deployment/etcd/etcd_test.go @@ -185,7 +185,7 @@ func TestScaleGet(t *testing.T) { var deployment extensions.Deployment ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) - if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, &deployment, 0); err != nil { + if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, &deployment, 0); err != nil { t.Fatalf("error setting new deployment (key: %s) %v: %v", key, validDeployment, err) } @@ -222,7 +222,7 @@ func TestScaleUpdate(t *testing.T) { var deployment extensions.Deployment ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) - if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, &deployment, 0); err != nil { + if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, &deployment, 0); err != nil { t.Fatalf("error setting new deployment (key: %s) %v: %v", key, validDeployment, err) } replicas := 12 @@ -259,7 +259,7 @@ func TestStatusUpdate(t *testing.T) { ctx := api.WithNamespace(api.NewContext(), namespace) key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name) - if err := storage.Deployment.Storage.Set(ctx, key, &validDeployment, nil, 0); err != nil { + if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } update := extensions.Deployment{ diff --git a/pkg/registry/experimental/controller/etcd/etcd_test.go b/pkg/registry/experimental/controller/etcd/etcd_test.go index 6d27068636..e1686b453c 100644 --- a/pkg/registry/experimental/controller/etcd/etcd_test.go +++ b/pkg/registry/experimental/controller/etcd/etcd_test.go @@ -86,7 +86,7 @@ func TestGet(t *testing.T) { ctx := api.WithNamespace(api.NewContext(), "test") key := etcdtest.AddPrefix("/controllers/test/foo") - if err := si.Set(ctx, key, &validController, nil, 0); err != nil { + if err := si.Create(ctx, key, &validController, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } obj, err := storage.Get(ctx, "foo") @@ -105,7 +105,7 @@ func TestUpdate(t *testing.T) { ctx := api.WithNamespace(api.NewContext(), "test") key := etcdtest.AddPrefix("/controllers/test/foo") - if err := si.Set(ctx, key, &validController, nil, 0); err != nil { + if err := si.Create(ctx, key, &validController, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } replicas := 12 diff --git a/pkg/registry/namespace/etcd/etcd_test.go b/pkg/registry/namespace/etcd/etcd_test.go index 862697f484..fa8038da05 100644 --- a/pkg/registry/namespace/etcd/etcd_test.go +++ b/pkg/registry/namespace/etcd/etcd_test.go @@ -147,7 +147,7 @@ func TestDeleteNamespaceWithIncompleteFinalizers(t *testing.T) { }, Status: api.NamespaceStatus{Phase: api.NamespaceActive}, } - if err := storage.Storage.Set(ctx, key, namespace, nil, 0); err != nil { + if err := storage.Storage.Create(ctx, key, namespace, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := storage.Delete(ctx, "foo", nil); err == nil { @@ -171,7 +171,7 @@ func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) { }, Status: api.NamespaceStatus{Phase: api.NamespaceActive}, } - if err := storage.Storage.Set(ctx, key, namespace, nil, 0); err != nil { + if err := storage.Storage.Create(ctx, key, namespace, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := storage.Delete(ctx, "foo", nil); err != nil { diff --git a/pkg/registry/persistentvolume/etcd/etcd_test.go b/pkg/registry/persistentvolume/etcd/etcd_test.go index c9fd6ad83a..1874c2ac16 100644 --- a/pkg/registry/persistentvolume/etcd/etcd_test.go +++ b/pkg/registry/persistentvolume/etcd/etcd_test.go @@ -153,7 +153,7 @@ func TestUpdateStatus(t *testing.T) { key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) pvStart := validNewPersistentVolume("foo") - err := storage.Storage.Set(ctx, key, pvStart, nil, 0) + err := storage.Storage.Create(ctx, key, pvStart, nil, 0) if err != nil { t.Errorf("unexpected error: %v", err) } diff --git a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go index 04ccda0420..fa37d01c70 100644 --- a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go +++ b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go @@ -148,7 +148,7 @@ func TestUpdateStatus(t *testing.T) { key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) pvcStart := validNewPersistentVolumeClaim("foo", api.NamespaceDefault) - err := storage.Storage.Set(ctx, key, pvcStart, nil, 0) + err := storage.Storage.Create(ctx, key, pvcStart, nil, 0) pvc := &api.PersistentVolumeClaim{ ObjectMeta: api.ObjectMeta{ diff --git a/pkg/registry/registrytest/etcd.go b/pkg/registry/registrytest/etcd.go index 84ae667079..135d4c5b85 100644 --- a/pkg/registry/registrytest/etcd.go +++ b/pkg/registry/registrytest/etcd.go @@ -82,7 +82,7 @@ func (t *Tester) ReturnDeletedObject() *Tester { func (t *Tester) TestCreate(valid runtime.Object, invalid ...runtime.Object) { t.tester.TestCreate( valid, - t.setObject, + t.createObject, t.getObject, invalid..., ) @@ -95,7 +95,7 @@ func (t *Tester) TestUpdate(valid runtime.Object, validUpdateFunc UpdateFunc, in } t.tester.TestUpdate( valid, - t.setObject, + t.createObject, t.getObject, resttest.UpdateFunc(validUpdateFunc), invalidFuncs..., @@ -105,7 +105,7 @@ func (t *Tester) TestUpdate(valid runtime.Object, validUpdateFunc UpdateFunc, in func (t *Tester) TestDelete(valid runtime.Object) { t.tester.TestDelete( valid, - t.setObject, + t.createObject, t.getObject, errors.IsNotFound, ) @@ -114,7 +114,7 @@ func (t *Tester) TestDelete(valid runtime.Object) { func (t *Tester) TestDeleteGraceful(valid runtime.Object, expectedGrace int64) { t.tester.TestDeleteGraceful( valid, - t.setObject, + t.createObject, t.getObject, expectedGrace, ) @@ -181,7 +181,7 @@ func (t *Tester) getObject(ctx api.Context, obj runtime.Object) (runtime.Object, return result, nil } -func (t *Tester) setObject(ctx api.Context, obj runtime.Object) error { +func (t *Tester) createObject(ctx api.Context, obj runtime.Object) error { accessor, err := meta.Accessor(obj) if err != nil { return err @@ -190,7 +190,7 @@ func (t *Tester) setObject(ctx api.Context, obj runtime.Object) error { if err != nil { return err } - return t.storage.Storage.Set(ctx, key, obj, nil, 0) + return t.storage.Storage.Create(ctx, key, obj, nil, 0) } func (t *Tester) setObjectsForList(objects []runtime.Object) []runtime.Object { @@ -208,7 +208,7 @@ func (t *Tester) emitObject(obj runtime.Object, action string) error { switch action { case etcdstorage.EtcdCreate: - err = t.setObject(ctx, obj) + err = t.createObject(ctx, obj) case etcdstorage.EtcdDelete: accessor, err := meta.Accessor(obj) if err != nil { diff --git a/pkg/registry/replicaset/etcd/etcd_test.go b/pkg/registry/replicaset/etcd/etcd_test.go index 77cb949df1..0512e3c22e 100644 --- a/pkg/registry/replicaset/etcd/etcd_test.go +++ b/pkg/registry/replicaset/etcd/etcd_test.go @@ -246,7 +246,7 @@ func TestScaleGet(t *testing.T) { var rs extensions.ReplicaSet ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/replicasets/" + api.NamespaceDefault + "/" + name) - if err := storage.ReplicaSet.Storage.Set(ctx, key, &validReplicaSet, &rs, 0); err != nil { + if err := storage.ReplicaSet.Storage.Create(ctx, key, &validReplicaSet, &rs, 0); err != nil { t.Fatalf("error setting new replica set (key: %s) %v: %v", key, validReplicaSet, err) } @@ -285,7 +285,7 @@ func TestScaleUpdate(t *testing.T) { var rs extensions.ReplicaSet ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/replicasets/" + api.NamespaceDefault + "/" + name) - if err := storage.ReplicaSet.Storage.Set(ctx, key, &validReplicaSet, &rs, 0); err != nil { + if err := storage.ReplicaSet.Storage.Create(ctx, key, &validReplicaSet, &rs, 0); err != nil { t.Fatalf("error setting new replica set (key: %s) %v: %v", key, validReplicaSet, err) } replicas := 12 @@ -326,7 +326,7 @@ func TestStatusUpdate(t *testing.T) { ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) key := etcdtest.AddPrefix("/replicasets/" + api.NamespaceDefault + "/foo") - if err := storage.ReplicaSet.Storage.Set(ctx, key, &validReplicaSet, nil, 0); err != nil { + if err := storage.ReplicaSet.Storage.Create(ctx, key, &validReplicaSet, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } update := extensions.ReplicaSet{ diff --git a/pkg/registry/resourcequota/etcd/etcd_test.go b/pkg/registry/resourcequota/etcd/etcd_test.go index 6b9e5c10af..6006a24b40 100644 --- a/pkg/registry/resourcequota/etcd/etcd_test.go +++ b/pkg/registry/resourcequota/etcd/etcd_test.go @@ -147,7 +147,7 @@ func TestUpdateStatus(t *testing.T) { key, _ := storage.KeyFunc(ctx, "foo") key = etcdtest.AddPrefix(key) resourcequotaStart := validNewResourceQuota() - err := storage.Storage.Set(ctx, key, resourcequotaStart, nil, 0) + err := storage.Storage.Create(ctx, key, resourcequotaStart, nil, 0) if err != nil { t.Fatalf("Unexpected error: %v", err) } diff --git a/pkg/registry/service/allocator/etcd/etcd_test.go b/pkg/registry/service/allocator/etcd/etcd_test.go index d40cc0f1b1..2f2e4bcaa5 100644 --- a/pkg/registry/service/allocator/etcd/etcd_test.go +++ b/pkg/registry/service/allocator/etcd/etcd_test.go @@ -58,7 +58,7 @@ func TestEmpty(t *testing.T) { func TestStore(t *testing.T) { storage, server, backing := newStorage(t) defer server.Terminate(t) - if err := storage.storage.Set(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil { + if err := storage.storage.Create(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/registry/service/ipallocator/etcd/etcd_test.go b/pkg/registry/service/ipallocator/etcd/etcd_test.go index ae0c8b90d2..94aa14ac62 100644 --- a/pkg/registry/service/ipallocator/etcd/etcd_test.go +++ b/pkg/registry/service/ipallocator/etcd/etcd_test.go @@ -82,7 +82,7 @@ func TestErrors(t *testing.T) { func TestStore(t *testing.T) { server, storage, backing, si := newStorage(t) defer server.Terminate(t) - if err := si.Set(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil { + if err := si.Create(context.TODO(), key(), validNewRangeAllocation(), nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/storage/cacher.go b/pkg/storage/cacher.go index 3b67f50e22..57617e36f4 100644 --- a/pkg/storage/cacher.go +++ b/pkg/storage/cacher.go @@ -234,11 +234,6 @@ func (c *Cacher) Create(ctx context.Context, key string, obj, out runtime.Object return c.storage.Create(ctx, key, obj, out, ttl) } -// Implements storage.Interface. -func (c *Cacher) Set(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error { - return c.storage.Set(ctx, key, obj, out, ttl) -} - // Implements storage.Interface. func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error { return c.storage.Delete(ctx, key, out, preconditions) diff --git a/pkg/storage/cacher_test.go b/pkg/storage/cacher_test.go index 2dd6382d15..35cef406de 100644 --- a/pkg/storage/cacher_test.go +++ b/pkg/storage/cacher_test.go @@ -70,20 +70,22 @@ func makeTestPod(name string) *api.Pod { } func updatePod(t *testing.T, s storage.Interface, obj, old *api.Pod) *api.Pod { + updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + newObj, err := api.Scheme.DeepCopy(obj) + if err != nil { + t.Errorf("unexpected error: %v", err) + return nil, nil, err + } + return newObj.(*api.Pod), nil, nil + } key := etcdtest.AddPrefix("pods/ns/" + obj.Name) + if err := s.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, old == nil, nil, updateFn); err != nil { + t.Errorf("unexpected error: %v", err) + } + obj.ResourceVersion = "" result := &api.Pod{} - if old == nil { - if err := s.Create(context.TODO(), key, obj, result, 0); err != nil { - t.Errorf("unexpected error: %v", err) - } - } else { - // To force "update" behavior of Set() we need to set ResourceVersion of - // previous version of object. - obj.ResourceVersion = old.ResourceVersion - if err := s.Set(context.TODO(), key, obj, result, 0); err != nil { - t.Errorf("unexpected error: %v", err) - } - obj.ResourceVersion = "" + if err := s.Get(context.TODO(), key, result, false); err != nil { + t.Errorf("unexpected error: %v", err) } return result } diff --git a/pkg/storage/etcd/etcd_helper.go b/pkg/storage/etcd/etcd_helper.go index f3ef8f8c7e..f84f0edbd5 100644 --- a/pkg/storage/etcd/etcd_helper.go +++ b/pkg/storage/etcd/etcd_helper.go @@ -228,69 +228,6 @@ func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Ob return err } -// Implements storage.Interface. -func (h *etcdHelper) Set(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - - version := uint64(0) - var err error - if version, err = h.versioner.ObjectResourceVersion(obj); err != nil { - return errors.New("couldn't get resourceVersion from object") - } - if version != 0 { - // We cannot store object with resourceVersion in etcd, we need to clear it here. - if err := h.versioner.UpdateObject(obj, nil, 0); err != nil { - return errors.New("resourceVersion cannot be set on objects store in etcd") - } - } - - var response *etcd.Response - data, err := runtime.Encode(h.codec, obj) - if err != nil { - return err - } - key = h.prefixEtcdKey(key) - - create := true - if version != 0 { - create = false - startTime := time.Now() - opts := etcd.SetOptions{ - TTL: time.Duration(ttl) * time.Second, - PrevIndex: version, - } - response, err = h.etcdKeysAPI.Set(ctx, key, string(data), &opts) - metrics.RecordEtcdRequestLatency("compareAndSwap", getTypeName(obj), startTime) - if err != nil { - return toStorageErr(err, key, int64(version)) - } - } - if create { - // Create will fail if a key already exists. - startTime := time.Now() - opts := etcd.SetOptions{ - TTL: time.Duration(ttl) * time.Second, - PrevExist: etcd.PrevNoExist, - } - response, err = h.etcdKeysAPI.Set(ctx, key, string(data), &opts) - if err != nil { - return toStorageErr(err, key, 0) - } - metrics.RecordEtcdRequestLatency("create", getTypeName(obj), startTime) - } - - if out != nil { - if _, err := conversion.EnforcePtr(out); err != nil { - panic("unable to convert output object to pointer") - } - _, _, err = h.extractObj(response, err, out, false, false) - } - - return err -} - func checkPreconditions(preconditions *storage.Preconditions, out runtime.Object) error { if preconditions == nil { return nil diff --git a/pkg/storage/etcd/etcd_helper_test.go b/pkg/storage/etcd/etcd_helper_test.go index 109cf9fc84..35b6b2e74e 100644 --- a/pkg/storage/etcd/etcd_helper_test.go +++ b/pkg/storage/etcd/etcd_helper_test.go @@ -229,7 +229,7 @@ func TestGet(t *testing.T) { Spec: apitesting.DeepEqualSafePodSpec(), } var got api.Pod - if err := helper.Set(context.TODO(), key, &expect, &got, 0); err != nil { + if err := helper.Create(context.TODO(), key, &expect, &got, 0); err != nil { t.Errorf("Unexpected error %#v", err) } expect = got @@ -293,76 +293,6 @@ func TestCreateNilOutParam(t *testing.T) { } } -func TestSet(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - returnedObj := &api.Pod{} - err := helper.Set(context.TODO(), "/some/key", obj, returnedObj, 5) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - - if obj.ObjectMeta.Name == returnedObj.ObjectMeta.Name { - // Set worked, now override the values. - obj = returnedObj - } - - err = helper.Get(context.TODO(), "/some/key", returnedObj, false) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if !reflect.DeepEqual(obj, returnedObj) { - t.Errorf("Wanted %#v, got %#v", obj, returnedObj) - } -} - -func TestSetFailCAS(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - err := helper.Set(context.TODO(), "/some/key", obj, nil, 5) - if err == nil { - t.Errorf("Expecting error.") - } -} - -func TestSetWithVersion(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - - returnedObj := &api.Pod{} - err := helper.Set(context.TODO(), "/some/key", obj, returnedObj, 7) - if err != nil { - t.Fatalf("Unexpected error %#v", err) - } - // resource revision is now set, try to set again with new value to test CAS - obj = returnedObj - obj.Name = "bar" - err = helper.Set(context.TODO(), "/some/key", obj, returnedObj, 7) - if err != nil { - t.Fatalf("Unexpected error %#v", err) - } - if returnedObj.Name != "bar" { - t.Fatalf("Unexpected error %#v", returnedObj) - } -} - -func TestSetNilOutParam(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - err := helper.Set(context.TODO(), "/some/key", obj, nil, 3) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } -} - func TestGuaranteedUpdate(t *testing.T) { _, codec := testScheme(t) server := etcdtesting.NewEtcdTestClientServer(t) diff --git a/pkg/storage/etcd/etcd_watcher_test.go b/pkg/storage/etcd/etcd_watcher_test.go index 423d34eeb6..01423e9972 100644 --- a/pkg/storage/etcd/etcd_watcher_test.go +++ b/pkg/storage/etcd/etcd_watcher_test.go @@ -236,7 +236,7 @@ func TestWatch(t *testing.T) { // Test normal case pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} returnObj := &api.Pod{} - err = h.Set(context.TODO(), key, pod, returnObj, 0) + err = h.Create(context.TODO(), key, pod, returnObj, 0) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -292,7 +292,7 @@ func TestWatchEtcdState(t *testing.T) { Subsets: emptySubsets(), } - err = h.Set(context.TODO(), key, endpoint, endpoint, 0) + err = h.Create(context.TODO(), key, endpoint, endpoint, 0) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -304,9 +304,18 @@ func TestWatchEtcdState(t *testing.T) { subset := makeSubsets("127.0.0.1", 9000) endpoint.Subsets = subset + endpoint.ResourceVersion = "" // CAS the previous value - err = h.Set(context.TODO(), key, endpoint, endpoint, 0) + updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + newObj, err := api.Scheme.DeepCopy(endpoint) + if err != nil { + t.Errorf("unexpected error: %v", err) + return nil, nil, err + } + return newObj.(*api.Endpoints), nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &api.Endpoints{}, false, nil, updateFn) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -317,7 +326,7 @@ func TestWatchEtcdState(t *testing.T) { } if e, a := endpoint, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Unexpected error: expected %v, got %v", e, a) + t.Errorf("Unexpected error: expected %#v, got %#v", e, a) } } @@ -332,14 +341,19 @@ func TestWatchFromZeroIndex(t *testing.T) { h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) // set before the watch and verify events - err := h.Set(context.TODO(), key, pod, pod, 0) + err := h.Create(context.TODO(), key, pod, pod, 0) if err != nil { t.Fatalf("Unexpected error: %v", err) } + pod.ResourceVersion = "" // check for concatenation on watch event with CAS - pod.Name = "bar" - err = h.Set(context.TODO(), key, pod, pod, 0) + updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + pod := input.(*api.Pod) + pod.Name = "bar" + return pod, nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, false, nil, updateFn) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -356,7 +370,13 @@ func TestWatchFromZeroIndex(t *testing.T) { t.Errorf("Unexpected event %#v", event) } - err = h.Set(context.TODO(), key, pod, pod, 0) + pod.Name = "baz" + updateFn = func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + pod := input.(*api.Pod) + pod.Name = "baz" + return pod, nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, false, nil, updateFn) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -367,7 +387,7 @@ func TestWatchFromZeroIndex(t *testing.T) { } if e, a := pod, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Unexpected error: expected %v, got %v", e, a) + t.Errorf("Unexpected error: expected %#v, got %#v", e, a) } } diff --git a/pkg/storage/interfaces.go b/pkg/storage/interfaces.go index 4a76e40522..6e77eb7a2f 100644 --- a/pkg/storage/interfaces.go +++ b/pkg/storage/interfaces.go @@ -98,11 +98,6 @@ type Interface interface { // set to the read value from database. Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error - // Set marshals obj via json and stores in database under key. Will do an atomic update - // if obj's ResourceVersion field is set. 'ttl' is time-to-live in seconds (0 means forever). - // If no error is returned and out is not nil, out will be set to the read value from database. - Set(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error - // Delete removes the specified key and returns the value that existed at that spot. // If key didn't exist, it will return NotFound storage error. Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error diff --git a/pkg/storage/testing/utils.go b/pkg/storage/testing/utils.go index e79ea9adfc..8858e33007 100644 --- a/pkg/storage/testing/utils.go +++ b/pkg/storage/testing/utils.go @@ -27,7 +27,7 @@ import ( // CreateObj will create a single object using the storage interface func CreateObj(helper storage.Interface, name string, obj, out runtime.Object, ttl uint64) error { - return helper.Set(context.TODO(), name, obj, out, ttl) + return helper.Create(context.TODO(), name, obj, out, ttl) } //CreateObjList will create a list from the array of objects diff --git a/test/integration/etcd_tools_test.go b/test/integration/etcd_tools_test.go index 073cf17668..d2641c7f77 100644 --- a/test/integration/etcd_tools_test.go +++ b/test/integration/etcd_tools_test.go @@ -35,14 +35,14 @@ import ( "golang.org/x/net/context" ) -func TestSet(t *testing.T) { +func TestCreate(t *testing.T) { client := framework.NewEtcdClient() keysAPI := etcd.NewKeysAPI(client) etcdStorage := etcdstorage.NewEtcdStorage(client, testapi.Default.Codec(), "", false) ctx := context.TODO() framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} - if err := etcdStorage.Set(ctx, key, &testObject, nil, 0); err != nil { + if err := etcdStorage.Create(ctx, key, &testObject, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } resp, err := keysAPI.Get(ctx, key, nil) @@ -94,7 +94,7 @@ func TestWriteTTL(t *testing.T) { ctx := context.TODO() framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} - if err := etcdStorage.Set(ctx, key, &testObject, nil, 0); err != nil { + if err := etcdStorage.Create(ctx, key, &testObject, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } result := &api.ServiceAccount{}