// ExtractObjToList unmarshals json found at key and opaques it into a *List api object // (an object that satisfies the runtime.IsList definition). func (h *EtcdHelper) ExtractObjToList(key string, listObj runtime.Object) error { trace := util.NewTrace("ExtractObjToList " + getTypeName(listObj)) listPtr, err := runtime.GetItemsPtr(listObj) if err != nil { return err } key = h.PrefixEtcdKey(key) startTime := time.Now() trace.Step("About to read etcd node") response, err := h.Client.Get(key, false, false) recordEtcdRequestLatency("get", getTypeName(listPtr), startTime) trace.Step("Etcd node read") if err != nil { if IsEtcdNotFound(err) { return nil } return err } nodes := make([]*etcd.Node, 0) nodes = append(nodes, response.Node) if err := h.decodeNodeList(nodes, listPtr); err != nil { return err } trace.Step("Object decoded") if h.Versioner != nil { if err := h.Versioner.UpdateList(listObj, response.EtcdIndex); err != nil { return err } } return nil }
// ExtractToList works on a *List api object (an object that satisfies the runtime.IsList // definition) and extracts a go object per etcd node into a slice with the resource version. func (h *EtcdHelper) ExtractToList(key string, listObj runtime.Object) error { trace := util.NewTrace("ExtractToList " + getTypeName(listObj)) defer trace.LogIfLong(time.Second) listPtr, err := runtime.GetItemsPtr(listObj) if err != nil { return err } key = h.PrefixEtcdKey(key) startTime := time.Now() trace.Step("About to list etcd node") nodes, index, err := h.listEtcdNode(key) recordEtcdRequestLatency("list", getTypeName(listPtr), startTime) trace.Step("Etcd node listed") if err != nil { return err } if err := h.decodeNodeList(nodes, listPtr); err != nil { return err } trace.Step("Node list decoded") if h.Versioner != nil { if err := h.Versioner.UpdateList(listObj, index); err != nil { return err } } return nil }