From 7c67cbff042b47ff8809e426a9af326e64c7f2d1 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 14 Aug 2014 15:51:56 -0400 Subject: [PATCH] Watch should start from next index when getting the initial state Also, the fake response we return should have an Action that is appropriate for the operation. --- pkg/tools/etcd_tools.go | 9 +++-- pkg/tools/etcd_tools_test.go | 65 +++++++++++++++--------------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/pkg/tools/etcd_tools.go b/pkg/tools/etcd_tools.go index a36cd74b628..0ed505ab72d 100644 --- a/pkg/tools/etcd_tools.go +++ b/pkg/tools/etcd_tools.go @@ -419,11 +419,11 @@ func etcdGetInitialWatchState(client EtcdGetSet, key string, recursive bool, inc return } if index, ok := etcdErrorIndex(err); ok { - resourceVersion = index + resourceVersion = index + 1 } return } - resourceVersion = resp.EtcdIndex + resourceVersion = resp.EtcdIndex + 1 convertRecursiveResponse(resp.Node, resp, incoming) return } @@ -438,6 +438,11 @@ func convertRecursiveResponse(node *etcd.Node, response *etcd.Response, incoming return } copied := *response + if node.ModifiedIndex == node.CreatedIndex { + copied.Action = "create" + } else { + copied.Action = "set" + } copied.Node = node incoming <- &copied } diff --git a/pkg/tools/etcd_tools_test.go b/pkg/tools/etcd_tools_test.go index 74deaacbe2a..f94db4364d2 100644 --- a/pkg/tools/etcd_tools_test.go +++ b/pkg/tools/etcd_tools_test.go @@ -464,9 +464,9 @@ func TestWatch(t *testing.T) { } fakeClient.WaitForWatchCompletion() - // when no get can be done AND the server doesn't provide an index, the Watch is 0 (from now) - if fakeClient.WatchIndex != 0 { - t.Errorf("Expected client to be at index %d, got %#v", 0, fakeClient) + // when server returns not found, the watch index starts at the next value (1) + if fakeClient.WatchIndex != 1 { + t.Errorf("Expected client to be at index %d, got %#v", 1, fakeClient) } // Test normal case @@ -507,52 +507,36 @@ func TestWatchFromZeroIndex(t *testing.T) { ExpectedVersion uint64 ExpectedType watch.EventType }{ - "last write was a modify": { + "get value created": { EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: api.EncodeOrDie(pod), + CreatedIndex: 1, ModifiedIndex: 1, }, - Action: "compareAndSwap", + Action: "get", EtcdIndex: 2, }, }, 1, - watch.Modified, - }, - "last write was a delete": { - EtcdResponseWithError{ - R: &etcd.Response{ - Node: &etcd.Node{ - Value: api.EncodeOrDie(pod), - ModifiedIndex: 2, - }, - PrevNode: &etcd.Node{ - Value: api.EncodeOrDie(pod), - ModifiedIndex: 1, - }, - Action: "delete", - EtcdIndex: 3, - }, - }, - 2, - watch.Deleted, - }, - "last write was a create": { - EtcdResponseWithError{ - R: &etcd.Response{ - Node: &etcd.Node{ - Value: api.EncodeOrDie(pod), - ModifiedIndex: 2, - }, - Action: "create", - EtcdIndex: 3, - }, - }, - 2, watch.Added, }, + "get value modified": { + EtcdResponseWithError{ + R: &etcd.Response{ + Node: &etcd.Node{ + Value: api.EncodeOrDie(pod), + CreatedIndex: 1, + ModifiedIndex: 2, + }, + Action: "get", + EtcdIndex: 3, + }, + }, + 2, + watch.Modified, + }, } for k, testCase := range testCases { @@ -566,6 +550,9 @@ func TestWatchFromZeroIndex(t *testing.T) { } fakeClient.WaitForWatchCompletion() + if e, a := testCase.Response.R.EtcdIndex+1, fakeClient.WatchIndex; e != a { + t.Errorf("%s: expected watch index to be %d, got %d", k, e, a) + } // the existing node is detected and the index set event := <-watching.ResultChan() @@ -661,8 +648,8 @@ func TestWatchFromNotFound(t *testing.T) { } fakeClient.WaitForWatchCompletion() - if fakeClient.WatchIndex != 2 { - t.Errorf("Expected client to wait for %d, got %#v", 2, fakeClient) + if fakeClient.WatchIndex != 3 { + t.Errorf("Expected client to wait for %d, got %#v", 3, fakeClient) } watching.Stop()