Add "Update Event" to Kubernetes API

This commit is contained in:
saadali
2015-02-05 00:05:36 -08:00
parent 5de2e916e5
commit a41f520bf0
12 changed files with 330 additions and 35 deletions

View File

@@ -281,22 +281,22 @@ func (h *EtcdHelper) Delete(key string, recursive bool) error {
return err
}
// SetObj marshals obj via json, and stores under key. Will do an
// atomic update if obj's ResourceVersion field is set.
func (h *EtcdHelper) SetObj(key string, obj runtime.Object) error {
// SetObj marshals obj via json, and stores under key. Will do an atomic update if obj's ResourceVersion
// field is set. 'ttl' is time-to-live in seconds, and 0 means forever.
func (h *EtcdHelper) SetObj(key string, obj runtime.Object, ttl uint64) error {
data, err := h.Codec.Encode(obj)
if err != nil {
return err
}
if h.ResourceVersioner != nil {
if version, err := h.ResourceVersioner.ResourceVersion(obj); err == nil && version != 0 {
_, err = h.Client.CompareAndSwap(key, string(data), 0, "", version)
_, err = h.Client.CompareAndSwap(key, string(data), ttl, "", version)
return err // err is shadowed!
}
}
// Create will fail if a key already exists.
_, err = h.Client.Create(key, string(data), 0)
_, err = h.Client.Create(key, string(data), ttl)
return err
}

View File

@@ -375,7 +375,7 @@ func TestSetObj(t *testing.T) {
obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
fakeClient := NewFakeEtcdClient(t)
helper := EtcdHelper{fakeClient, testapi.Codec(), versioner}
err := helper.SetObj("/some/key", obj)
err := helper.SetObj("/some/key", obj, 5)
if err != nil {
t.Errorf("Unexpected error %#v", err)
}
@@ -388,6 +388,10 @@ func TestSetObj(t *testing.T) {
if expect != got {
t.Errorf("Wanted %v, got %v", expect, got)
}
if e, a := uint64(5), fakeClient.LastSetTTL; e != a {
t.Errorf("Wanted %v, got %v", e, a)
}
}
func TestSetObjWithVersion(t *testing.T) {
@@ -404,7 +408,7 @@ func TestSetObjWithVersion(t *testing.T) {
}
helper := EtcdHelper{fakeClient, testapi.Codec(), versioner}
err := helper.SetObj("/some/key", obj)
err := helper.SetObj("/some/key", obj, 7)
if err != nil {
t.Fatalf("Unexpected error %#v", err)
}
@@ -417,13 +421,16 @@ func TestSetObjWithVersion(t *testing.T) {
if expect != got {
t.Errorf("Wanted %v, got %v", expect, got)
}
if e, a := uint64(7), fakeClient.LastSetTTL; e != a {
t.Errorf("Wanted %v, got %v", e, a)
}
}
func TestSetObjWithoutResourceVersioner(t *testing.T) {
obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
fakeClient := NewFakeEtcdClient(t)
helper := EtcdHelper{fakeClient, testapi.Codec(), nil}
err := helper.SetObj("/some/key", obj)
err := helper.SetObj("/some/key", obj, 3)
if err != nil {
t.Errorf("Unexpected error %#v", err)
}
@@ -436,6 +443,9 @@ func TestSetObjWithoutResourceVersioner(t *testing.T) {
if expect != got {
t.Errorf("Wanted %v, got %v", expect, got)
}
if e, a := uint64(3), fakeClient.LastSetTTL; e != a {
t.Errorf("Wanted %v, got %v", e, a)
}
}
func TestAtomicUpdate(t *testing.T) {

View File

@@ -173,6 +173,7 @@ func (f *FakeEtcdClient) setLocked(key, value string, ttl uint64) (*etcd.Respons
Value: value,
CreatedIndex: createdIndex,
ModifiedIndex: i,
TTL: int64(ttl),
},
},
}