blob: c282255b437515be3574421b87b272846eb674e6 [file] [log] [blame]
Jon Perritt816d2a02014-03-11 20:49:46 -05001package containers
2
3import (
Ash Wilson604320e2014-09-10 16:02:28 -04004 "github.com/rackspace/gophercloud"
Ash Wilson0faafcc2014-09-16 15:20:17 -04005 "github.com/rackspace/gophercloud/pagination"
Jon Perritt816d2a02014-03-11 20:49:46 -05006)
7
Jon Perritte90aced2014-10-12 23:24:06 -05008// ListOptsBuilder allows extensions to add additional parameters to the List
9// request.
10type ListOptsBuilder interface {
11 ToContainerListParams() (bool, string, error)
12}
13
Jon Perritt8c93a302014-09-28 22:35:57 -050014// ListOpts is a structure that holds options for listing containers.
15type ListOpts struct {
16 Full bool
Jon Perritt04851d32014-10-14 02:07:13 -050017 Limit int `q:"limit"`
18 Marker string `q:"marker"`
19 EndMarker string `q:"end_marker"`
20 Format string `q:"format"`
21 Prefix string `q:"prefix"`
22 Delimiter string `q:"delimiter"`
Ash Wilson0faafcc2014-09-16 15:20:17 -040023}
24
Jon Perritte90aced2014-10-12 23:24:06 -050025// ToContainerListParams formats a ListOpts into a query string and boolean
26// representing whether to list complete information for each container.
27func (opts ListOpts) ToContainerListParams() (bool, string, error) {
28 q, err := gophercloud.BuildQueryString(opts)
29 if err != nil {
30 return false, "", err
31 }
32 return opts.Full, q.String(), nil
33}
34
35// List is a function that retrieves containers associated with the account as
36// well as account metadata. It returns a pager which can be iterated with the
37// EachPage function.
38func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
39 headers := map[string]string{"Accept": "text/plain", "Content-Type": "text/plain"}
Jon Perritt816d2a02014-03-11 20:49:46 -050040
Jon Perrittb3461402014-10-09 21:36:17 -050041 url := listURL(c)
Jon Perrittde47eac2014-09-30 15:34:17 -050042 if opts != nil {
Jon Perritte90aced2014-10-12 23:24:06 -050043 full, query, err := opts.ToContainerListParams()
Jon Perrittde47eac2014-09-30 15:34:17 -050044 if err != nil {
45 return pagination.Pager{Err: err}
46 }
Jon Perritte90aced2014-10-12 23:24:06 -050047 url += query
Jon Perrittde47eac2014-09-30 15:34:17 -050048
Jon Perritte90aced2014-10-12 23:24:06 -050049 if full {
50 headers = map[string]string{"Accept": "application/json", "Content-Type": "application/json"}
Jon Perrittde47eac2014-09-30 15:34:17 -050051 }
Ash Wilson0faafcc2014-09-16 15:20:17 -040052 }
53
Ash Wilsonb8b16f82014-10-20 10:19:49 -040054 createPage := func(r pagination.PageResult) pagination.Page {
55 p := ContainerPage{pagination.MarkerPageBase{PageResult: r}}
Ash Wilson0faafcc2014-09-16 15:20:17 -040056 p.MarkerPageBase.Owner = p
57 return p
Jon Perritt816d2a02014-03-11 20:49:46 -050058 }
59
Jon Perritt584c94f2014-09-24 18:00:16 -050060 pager := pagination.NewPager(c, url, createPage)
Jon Perrittfe5e7352015-02-18 13:51:01 -070061 pager.PageType = ContainerPage{}
Jon Perritt584c94f2014-09-24 18:00:16 -050062 pager.Headers = headers
63 return pager
Jon Perritt816d2a02014-03-11 20:49:46 -050064}
65
Jon Perritte90aced2014-10-12 23:24:06 -050066// CreateOptsBuilder allows extensions to add additional parameters to the
67// Create request.
68type CreateOptsBuilder interface {
Jon Perritt04851d32014-10-14 02:07:13 -050069 ToContainerCreateMap() (map[string]string, error)
Jon Perritte90aced2014-10-12 23:24:06 -050070}
71
Jon Perritt8c93a302014-09-28 22:35:57 -050072// CreateOpts is a structure that holds parameters for creating a container.
73type CreateOpts struct {
74 Metadata map[string]string
75 ContainerRead string `h:"X-Container-Read"`
76 ContainerSyncTo string `h:"X-Container-Sync-To"`
77 ContainerSyncKey string `h:"X-Container-Sync-Key"`
78 ContainerWrite string `h:"X-Container-Write"`
79 ContentType string `h:"Content-Type"`
80 DetectContentType bool `h:"X-Detect-Content-Type"`
81 IfNoneMatch string `h:"If-None-Match"`
82 VersionsLocation string `h:"X-Versions-Location"`
83}
Jon Perritt816d2a02014-03-11 20:49:46 -050084
Jon Perritt04851d32014-10-14 02:07:13 -050085// ToContainerCreateMap formats a CreateOpts into a map of headers.
86func (opts CreateOpts) ToContainerCreateMap() (map[string]string, error) {
Jon Perritte90aced2014-10-12 23:24:06 -050087 h, err := gophercloud.BuildHeaders(opts)
88 if err != nil {
89 return nil, err
90 }
91 for k, v := range opts.Metadata {
92 h["X-Container-Meta-"+k] = v
93 }
94 return h, nil
95}
96
Jon Perritt8c93a302014-09-28 22:35:57 -050097// Create is a function that creates a new container.
Jon Perritte90aced2014-10-12 23:24:06 -050098func Create(c *gophercloud.ServiceClient, containerName string, opts CreateOptsBuilder) CreateResult {
Jon Perritt5db08922014-09-30 21:32:48 -050099 var res CreateResult
Ash Wilson77857dc2014-10-22 09:09:02 -0400100 h := c.AuthenticatedHeaders()
Jon Perritt816d2a02014-03-11 20:49:46 -0500101
Jon Perrittde47eac2014-09-30 15:34:17 -0500102 if opts != nil {
Jon Perritt04851d32014-10-14 02:07:13 -0500103 headers, err := opts.ToContainerCreateMap()
Jon Perrittde47eac2014-09-30 15:34:17 -0500104 if err != nil {
Jon Perritt5db08922014-09-30 21:32:48 -0500105 res.Err = err
106 return res
Jon Perrittde47eac2014-09-30 15:34:17 -0500107 }
108
109 for k, v := range headers {
110 h[k] = v
111 }
Jon Perritt8c93a302014-09-28 22:35:57 -0500112 }
113
Ash Wilson59fb6c42015-02-12 16:21:13 -0500114 resp, err := c.Request("PUT", createURL(c, containerName), gophercloud.RequestOpts{
Jon Perritt816d2a02014-03-11 20:49:46 -0500115 MoreHeaders: h,
Jon Perritta77ba0d2014-10-17 01:15:29 -0500116 OkCodes: []int{201, 202, 204},
Jon Perritt816d2a02014-03-11 20:49:46 -0500117 })
Ash Wilson59fb6c42015-02-12 16:21:13 -0500118 res.Header = resp.Header
Jon Perritt5db08922014-09-30 21:32:48 -0500119 res.Err = err
120 return res
Jon Perritt816d2a02014-03-11 20:49:46 -0500121}
122
123// Delete is a function that deletes a container.
Jon Perritt5db08922014-09-30 21:32:48 -0500124func Delete(c *gophercloud.ServiceClient, containerName string) DeleteResult {
125 var res DeleteResult
Ash Wilson59fb6c42015-02-12 16:21:13 -0500126 _, res.Err = c.Request("DELETE", deleteURL(c, containerName), gophercloud.RequestOpts{
127 OkCodes: []int{202, 204},
Jon Perritt816d2a02014-03-11 20:49:46 -0500128 })
Jon Perritt5db08922014-09-30 21:32:48 -0500129 return res
Jon Perritt816d2a02014-03-11 20:49:46 -0500130}
131
Jon Perritte90aced2014-10-12 23:24:06 -0500132// UpdateOptsBuilder allows extensions to add additional parameters to the
133// Update request.
134type UpdateOptsBuilder interface {
Jon Perritt04851d32014-10-14 02:07:13 -0500135 ToContainerUpdateMap() (map[string]string, error)
Jon Perritte90aced2014-10-12 23:24:06 -0500136}
137
138// UpdateOpts is a structure that holds parameters for updating, creating, or
139// deleting a container's metadata.
Jon Perritt8c93a302014-09-28 22:35:57 -0500140type UpdateOpts struct {
141 Metadata map[string]string
142 ContainerRead string `h:"X-Container-Read"`
143 ContainerSyncTo string `h:"X-Container-Sync-To"`
144 ContainerSyncKey string `h:"X-Container-Sync-Key"`
145 ContainerWrite string `h:"X-Container-Write"`
146 ContentType string `h:"Content-Type"`
147 DetectContentType bool `h:"X-Detect-Content-Type"`
148 RemoveVersionsLocation string `h:"X-Remove-Versions-Location"`
149 VersionsLocation string `h:"X-Versions-Location"`
150}
151
Jon Perritt04851d32014-10-14 02:07:13 -0500152// ToContainerUpdateMap formats a CreateOpts into a map of headers.
153func (opts UpdateOpts) ToContainerUpdateMap() (map[string]string, error) {
Jon Perritte90aced2014-10-12 23:24:06 -0500154 h, err := gophercloud.BuildHeaders(opts)
155 if err != nil {
156 return nil, err
157 }
158 for k, v := range opts.Metadata {
159 h["X-Container-Meta-"+k] = v
160 }
161 return h, nil
162}
163
164// Update is a function that creates, updates, or deletes a container's
165// metadata.
166func Update(c *gophercloud.ServiceClient, containerName string, opts UpdateOptsBuilder) UpdateResult {
Jon Perritt5db08922014-09-30 21:32:48 -0500167 var res UpdateResult
Ash Wilson77857dc2014-10-22 09:09:02 -0400168 h := c.AuthenticatedHeaders()
Jon Perritt816d2a02014-03-11 20:49:46 -0500169
Jon Perrittde47eac2014-09-30 15:34:17 -0500170 if opts != nil {
Jon Perritt04851d32014-10-14 02:07:13 -0500171 headers, err := opts.ToContainerUpdateMap()
Jon Perrittde47eac2014-09-30 15:34:17 -0500172 if err != nil {
Jon Perritt5db08922014-09-30 21:32:48 -0500173 res.Err = err
174 return res
Jon Perrittde47eac2014-09-30 15:34:17 -0500175 }
176
177 for k, v := range headers {
178 h[k] = v
179 }
Jon Perritt8c93a302014-09-28 22:35:57 -0500180 }
181
Ash Wilson59fb6c42015-02-12 16:21:13 -0500182 resp, err := c.Request("POST", updateURL(c, containerName), gophercloud.RequestOpts{
Jon Perritt816d2a02014-03-11 20:49:46 -0500183 MoreHeaders: h,
Jon Perritt33ed7412014-10-17 19:35:32 -0500184 OkCodes: []int{202, 204},
Jon Perritt816d2a02014-03-11 20:49:46 -0500185 })
Ash Wilson59fb6c42015-02-12 16:21:13 -0500186 res.Header = resp.Header
Jon Perritt5db08922014-09-30 21:32:48 -0500187 res.Err = err
188 return res
Jon Perritt816d2a02014-03-11 20:49:46 -0500189}
190
Jon Perritte90aced2014-10-12 23:24:06 -0500191// Get is a function that retrieves the metadata of a container. To extract just
192// the custom metadata, pass the GetResult response to the ExtractMetadata
193// function.
Jon Perritt8c93a302014-09-28 22:35:57 -0500194func Get(c *gophercloud.ServiceClient, containerName string) GetResult {
Jon Perritt5db08922014-09-30 21:32:48 -0500195 var res GetResult
Ash Wilson59fb6c42015-02-12 16:21:13 -0500196 resp, err := c.Request("HEAD", getURL(c, containerName), gophercloud.RequestOpts{
197 OkCodes: []int{200, 204},
Jon Perritt816d2a02014-03-11 20:49:46 -0500198 })
Ash Wilson59fb6c42015-02-12 16:21:13 -0500199 res.Header = resp.Header
Jon Perritt5db08922014-09-30 21:32:48 -0500200 res.Err = err
201 return res
Jon Perritt816d2a02014-03-11 20:49:46 -0500202}