Add the resource version to api.*List items from etcd

Allows clients to watch more easily (can invoke Get, then
Watch).
This commit is contained in:
Clayton Coleman
2014-08-28 20:48:07 -04:00
parent c380dd0426
commit bafc422ac0
17 changed files with 120 additions and 89 deletions

View File

@@ -117,22 +117,29 @@ func etcdErrorIndex(err error) (uint64, bool) {
return 0, false
}
func (h *EtcdHelper) listEtcdNode(key string) ([]*etcd.Node, error) {
func (h *EtcdHelper) listEtcdNode(key string) ([]*etcd.Node, uint64, error) {
result, err := h.Client.Get(key, false, true)
if err != nil {
index, ok := etcdErrorIndex(err)
if !ok {
index = 0
}
nodes := make([]*etcd.Node, 0)
if IsEtcdNotFound(err) {
return nodes, nil
return nodes, index, nil
} else {
return nodes, err
return nodes, index, err
}
}
return result.Node.Nodes, nil
return result.Node.Nodes, result.EtcdIndex, nil
}
// Extract a go object per etcd node into a slice.
func (h *EtcdHelper) ExtractList(key string, slicePtr interface{}) error {
nodes, err := h.listEtcdNode(key)
// Extract a go object per etcd node into a slice with the resource version.
func (h *EtcdHelper) ExtractList(key string, slicePtr interface{}, resourceVersion *uint64) error {
nodes, index, err := h.listEtcdNode(key)
if resourceVersion != nil {
*resourceVersion = index
}
if err != nil {
return err
}

View File

@@ -66,6 +66,7 @@ func TestExtractList(t *testing.T) {
fakeClient := NewFakeEtcdClient(t)
fakeClient.Data["/some/key"] = EtcdResponseWithError{
R: &etcd.Response{
EtcdIndex: 10,
Node: &etcd.Node{
Nodes: []*etcd.Node{
{
@@ -92,10 +93,14 @@ func TestExtractList(t *testing.T) {
var got []api.Pod
helper := EtcdHelper{fakeClient, codec, versioner}
err := helper.ExtractList("/some/key", &got)
resourceVersion := uint64(0)
err := helper.ExtractList("/some/key", &got, &resourceVersion)
if err != nil {
t.Errorf("Unexpected error %#v", err)
}
if resourceVersion != 10 {
t.Errorf("Unexpected resource version %d", resourceVersion)
}
for i := 0; i < len(expect); i++ {
if !reflect.DeepEqual(got[i], expect[i]) {