diff --git a/pkg/tools/etcd_tools.go b/pkg/tools/etcd_tools.go index 7432a49fad4..c15391c9c13 100644 --- a/pkg/tools/etcd_tools.go +++ b/pkg/tools/etcd_tools.go @@ -123,6 +123,7 @@ func (h *EtcdHelper) listEtcdNode(key string) ([]*etcd.Node, uint64, error) { } // ExtractList extracts a go object per etcd node into a slice with the resource version. +// DEPRECATED: Use ExtractToList instead, it's more convenient. func (h *EtcdHelper) ExtractList(key string, slicePtr interface{}, resourceVersion *uint64) error { nodes, index, err := h.listEtcdNode(key) if resourceVersion != nil { @@ -152,6 +153,27 @@ func (h *EtcdHelper) ExtractList(key string, slicePtr interface{}, resourceVersi return nil } +// ExtractToList is just like ExtractList, but it works on a ThingyList api object. +// extracts a go object per etcd node into a slice with the resource version. +func (h *EtcdHelper) ExtractToList(key string, listObj runtime.Object) error { + var resourceVersion uint64 + listPtr, err := runtime.GetItemsPtr(listObj) + if err != nil { + return err + } + err = h.ExtractList(key, listPtr, &resourceVersion) + if err != nil { + return err + } + if h.ResourceVersioner != nil { + err = h.ResourceVersioner.SetResourceVersion(listObj, resourceVersion) + if err != nil { + return err + } + } + return nil +} + // ExtractObj unmarshals json found at key into objPtr. On a not found error, will either return // a zero object of the requested type, or an error, depending on ignoreNotFound. Treats // empty responses and nil response nodes exactly like a not found error. diff --git a/pkg/tools/etcd_tools_test.go b/pkg/tools/etcd_tools_test.go index 32c937c8f2f..8eea5fce8b7 100644 --- a/pkg/tools/etcd_tools_test.go +++ b/pkg/tools/etcd_tools_test.go @@ -65,7 +65,7 @@ func TestIsEtcdNotFound(t *testing.T) { try(fmt.Errorf("some other kind of error"), false) } -func TestExtractList(t *testing.T) { +func TestExtractToList(t *testing.T) { fakeClient := NewFakeEtcdClient(t) fakeClient.Data["/some/key"] = EtcdResponseWithError{ R: &etcd.Response{ @@ -88,27 +88,23 @@ func TestExtractList(t *testing.T) { }, }, } - expect := []api.Pod{ - {JSONBase: api.JSONBase{ID: "foo", ResourceVersion: 1}}, - {JSONBase: api.JSONBase{ID: "bar", ResourceVersion: 2}}, - {JSONBase: api.JSONBase{ID: "baz", ResourceVersion: 3}}, + expect := api.PodList{ + JSONBase: api.JSONBase{ResourceVersion: 10}, + Items: []api.Pod{ + {JSONBase: api.JSONBase{ID: "foo", ResourceVersion: 1}}, + {JSONBase: api.JSONBase{ID: "bar", ResourceVersion: 2}}, + {JSONBase: api.JSONBase{ID: "baz", ResourceVersion: 3}}, + }, } - var got []api.Pod + var got api.PodList helper := EtcdHelper{fakeClient, latest.Codec, versioner} - resourceVersion := uint64(0) - err := helper.ExtractList("/some/key", &got, &resourceVersion) + err := helper.ExtractToList("/some/key", &got) if err != nil { - t.Errorf("Unexpected error %#v", err) + 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]) { - t.Errorf("\nWanted:\n%#v\nGot:\n%#v\n", expect[i], got[i]) - } + if e, a := expect, got; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) } }