// Implements storage.Interface. func (h *etcdHelper) List(key string, listObj runtime.Object) error { trace := util.NewTrace("List " + 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) metrics.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 }
// Implements storage.Interface. func (h *etcdHelper) GetToList(key string, listObj runtime.Object) error { trace := util.NewTrace("GetToList " + 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) metrics.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 }
// 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 { listPtr, err := runtime.GetItemsPtr(listObj) if err != nil { return err } response, err := h.Client.Get(key, false, false) 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 } if h.Versioner != nil { if err := h.Versioner.UpdateList(listObj, response.EtcdIndex); err != nil { return err } } 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 } if err := h.ExtractList(key, listPtr, &resourceVersion); err != nil { return err } if h.ResourceVersioner != nil { if err := h.ResourceVersioner.SetResourceVersion(listObj, resourceVersion); 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 { listPtr, err := runtime.GetItemsPtr(listObj) if err != nil { return err } nodes, index, err := h.listEtcdNode(key) if err != nil { return err } if err := h.decodeNodeList(nodes, listPtr); err != nil { return err } if h.Versioner != nil { if err := h.Versioner.UpdateList(listObj, index); err != nil { return err } } return nil }
// Object returns a single object representing the output of a single visit to all // found resources. If the Builder was a singular context (expected to return a // single resource by user input) and only a single resource was found, the resource // will be returned as is. Otherwise, the returned resources will be part of an // api.List. The ResourceVersion of the api.List will be set only if it is identical // across all infos returned. func (r *Result) Object() (runtime.Object, error) { infos, err := r.Infos() if err != nil { return nil, err } versions := util.StringSet{} objects := []runtime.Object{} for _, info := range infos { if info.Object != nil { objects = append(objects, info.Object) versions.Insert(info.ResourceVersion) } } if len(objects) == 1 { if r.singular { return objects[0], nil } // if the item is a list already, don't create another list if _, err := runtime.GetItemsPtr(objects[0]); err == nil { return objects[0], nil } } version := "" if len(versions) == 1 { version = versions.List()[0] } return &api.List{ ListMeta: api.ListMeta{ ResourceVersion: version, }, Items: objects, }, err }