mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 22:17:14 +00:00
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.
This commit is contained in:
parent
778c89f65e
commit
7c67cbff04
@ -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
|
||||
}
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user