blob: df7cc30f6858f13aee2ef53d85e290740ceedc87 [file] [log] [blame]
Jon Perritt816d2a02014-03-11 20:49:46 -05001package containers
2
3import (
4 "github.com/racker/perigee"
Jon Perrittb6b1d022014-04-14 21:50:45 -05005 storage "github.com/rackspace/gophercloud/openstack/storage/v1"
Jon Perritt816d2a02014-03-11 20:49:46 -05006 "github.com/rackspace/gophercloud/openstack/utils"
Jon Perritteb575642014-04-24 15:16:31 -05007 "net/http"
Jon Perritt816d2a02014-03-11 20:49:46 -05008)
9
Jon Perritteb575642014-04-24 15:16:31 -050010type ListResult *http.Response
11type GetResult *http.Response
Jon Perritt816d2a02014-03-11 20:49:46 -050012
13// List is a function that retrieves all objects in a container. It also returns the details
14// for the account. To extract just the container information or names, pass the ListResult
Jon Perritteb575642014-04-24 15:16:31 -050015// response to the ExtractInfo or ExtractNames function, respectively.
Jon Perritt816d2a02014-03-11 20:49:46 -050016func List(c *storage.Client, opts ListOpts) (ListResult, error) {
17 contentType := ""
18
19 h, err := c.GetHeaders()
20 if err != nil {
21 return nil, err
22 }
23
24 query := utils.BuildQuery(opts.Params)
25
26 if !opts.Full {
27 contentType = "text/plain"
28 }
29
30 url := c.GetAccountURL() + query
31 resp, err := perigee.Request("GET", url, perigee.Options{
Jon Perritt816d2a02014-03-11 20:49:46 -050032 MoreHeaders: h,
33 OkCodes: []int{200, 204},
34 Accept: contentType,
35 })
Jon Perritteb575642014-04-24 15:16:31 -050036 return &resp.HttpResponse, err
Jon Perritt816d2a02014-03-11 20:49:46 -050037}
38
39// Create is a function that creates a new container.
Jon Perrittc19adea2014-04-15 16:56:01 -050040func Create(c *storage.Client, opts CreateOpts) (Container, error) {
41 var ci Container
Jon Perritt816d2a02014-03-11 20:49:46 -050042
43 h, err := c.GetHeaders()
44 if err != nil {
Jon Perrittc19adea2014-04-15 16:56:01 -050045 return Container{}, err
Jon Perritt816d2a02014-03-11 20:49:46 -050046 }
47
48 for k, v := range opts.Headers {
49 h[k] = v
50 }
51
52 for k, v := range opts.Metadata {
53 h["X-Container-Meta-"+k] = v
54 }
55
56 url := c.GetContainerURL(opts.Name)
57 _, err = perigee.Request("PUT", url, perigee.Options{
58 MoreHeaders: h,
59 OkCodes: []int{201, 204},
60 })
61 if err == nil {
Jon Perrittc19adea2014-04-15 16:56:01 -050062 ci = Container{
63 "name": opts.Name,
Jon Perritt816d2a02014-03-11 20:49:46 -050064 }
65 }
66 return ci, err
67}
68
69// Delete is a function that deletes a container.
70func Delete(c *storage.Client, opts DeleteOpts) error {
71 h, err := c.GetHeaders()
72 if err != nil {
73 return err
74 }
75
76 query := utils.BuildQuery(opts.Params)
77
78 url := c.GetContainerURL(opts.Name) + query
79 _, err = perigee.Request("DELETE", url, perigee.Options{
80 MoreHeaders: h,
81 OkCodes: []int{204},
82 })
83 return err
84}
85
86// Update is a function that creates, updates, or deletes a container's metadata.
87func Update(c *storage.Client, opts UpdateOpts) error {
88 h, err := c.GetHeaders()
89 if err != nil {
90 return err
91 }
92
93 for k, v := range opts.Headers {
94 h[k] = v
95 }
96
97 for k, v := range opts.Metadata {
98 h["X-Container-Meta-"+k] = v
99 }
100
101 url := c.GetContainerURL(opts.Name)
102 _, err = perigee.Request("POST", url, perigee.Options{
103 MoreHeaders: h,
104 OkCodes: []int{204},
105 })
106 return err
107}
108
109// Get is a function that retrieves the metadata of a container. To extract just the custom
Jon Perritteb575642014-04-24 15:16:31 -0500110// metadata, pass the GetResult response to the ExtractMetadata function.
Jon Perritt816d2a02014-03-11 20:49:46 -0500111func Get(c *storage.Client, opts GetOpts) (GetResult, error) {
112 h, err := c.GetHeaders()
113 if err != nil {
114 return nil, err
115 }
116
117 for k, v := range opts.Metadata {
118 h["X-Container-Meta-"+k] = v
119 }
120
121 url := c.GetContainerURL(opts.Name)
122 resp, err := perigee.Request("HEAD", url, perigee.Options{
123 MoreHeaders: h,
124 OkCodes: []int{204},
125 })
Jon Perritteb575642014-04-24 15:16:31 -0500126 return &resp.HttpResponse, err
Jon Perritt816d2a02014-03-11 20:49:46 -0500127}