//ListObjects calls the OpenStack list object API using previously //obtained token. "Limit", "marker", "prefix", "path", "delim" corresponds //to the API's "limit", "marker", "prefix", "path", and "delimiter". func ListObjects(session *openstack.Session, limit int64, marker, prefix, path, delim, conURL string) ([]byte, error) { var query url.Values = url.Values{} query.Add("format", "json") if limit > 0 { query.Add("limit", strconv.FormatInt(limit, 10)) } if marker != "" { query.Add("marker", url.QueryEscape(marker)) } if prefix != "" { query.Add("prefix", url.QueryEscape(prefix)) } if path != "" { query.Add("path", url.QueryEscape(path)) } if delim != "" { query.Add("delimiter", url.QueryEscape(delim)) } resp, err := session.Get(conURL, &query, nil) if err != nil { return nil, err } defer resp.Body.Close() // CF if err = util.CheckHTTPResponseStatusCode(resp); err != nil { return nil, err } body, err := ioutil.ReadAll(resp.Body) // defer resp.Body.Close() if err != nil { return []byte{}, err } return body, nil }
//GetObjectMeta calls the OpenStack retrieve object metadata API using //previously obtained token. func GetObjectMeta(session *openstack.Session, url string) (http.Header, error) { resp, err := session.Head(url, nil, nil) if err != nil { return nil, err } defer resp.Body.Close() // CF ?? return resp.Header, util.CheckHTTPResponseStatusCode(resp) }
//DeleteObject calls the OpenStack delete object API using //previously obtained token. // //Note from API doc: "A DELETE to a versioned object removes the current version //of the object and replaces it with the next-most current version, moving it //from the non-current container to the current." .. "If you want to completely //remove an object and you have five total versions of it, you must DELETE it //five times." func DeleteObject(session *openstack.Session, url string) (err error) { resp, err := session.Delete(url, nil, nil) if err != nil { return err } defer resp.Body.Close() // CF return util.CheckHTTPResponseStatusCode(resp) }
//PutObject calls the OpenStack create object API using previously //obtained token. //url can be regular storage or CDN-enabled storage URL. func PutObject(session *openstack.Session, fContent *[]byte, url string, headers http.Header) (err error) { resp, err := session.Put(url, nil, &headers, fContent) if err != nil { return err } defer resp.Body.Close() // CF return util.CheckHTTPResponseStatusCode(resp) }
//SetObjectMeta calls the OpenStack API to create/update meta data for //object using previously obtained token. func SetObjectMeta(session *openstack.Session, url string, headers http.Header) (err error) { // headers.Add("X-Auth-Token", token) resp, err := session.Post(url, nil, &headers, zeroByte) if err != nil { return err } defer resp.Body.Close() // CF return util.CheckHTTPResponseStatusCode(resp) }
//CopyObject calls the OpenStack copy object API using previously obtained //token. Note from API doc: "The destination container must exist before //attempting the copy." func CopyObject(session *openstack.Session, srcURL, destURL string) (err error) { var headers http.Header = http.Header{} headers.Add("Destination", destURL) resp, err := session.Request("COPY", srcURL, nil, &headers, zeroByte) if err != nil { return err } defer resp.Body.Close() // CF return util.CheckHTTPResponseStatusCode(resp) }
//GetObject calls the OpenStack retrieve object API using previously //obtained token. It returns http.Header, object / file content downloaded //from the server, and err. // //Since this implementation of GetObject retrieves header info, it //effectively executes GetObjectMeta also in addition to getting the //object content. func GetObject(session *openstack.Session, url string) (http.Header, []byte, error) { resp, err := session.Get(url, nil, nil) if err != nil { return nil, nil, err } defer resp.Body.Close() // CF if err = util.CheckHTTPResponseStatusCode(resp); err != nil { return nil, nil, err } var body []byte if body, err = ioutil.ReadAll(resp.Body); err != nil { return nil, nil, err } // resp.Body.Close() return resp.Header, body, nil }