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:
@@ -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
|
||||
}
|
||||
|
@@ -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]) {
|
||||
|
Reference in New Issue
Block a user