blob: d194936c67807e5e74ebd4717af85b5beea525ad [file] [log] [blame]
Jon Perritt816d2a02014-03-11 20:49:46 -05001// +build acceptance
2
3package openstack
4
5import (
6 "bytes"
Jon Perrittb6b1d022014-04-14 21:50:45 -05007 storage "github.com/rackspace/gophercloud/openstack/storage/v1"
8 "github.com/rackspace/gophercloud/openstack/storage/v1/accounts"
9 "github.com/rackspace/gophercloud/openstack/storage/v1/containers"
10 "github.com/rackspace/gophercloud/openstack/storage/v1/objects"
Jon Perritt816d2a02014-03-11 20:49:46 -050011 "os"
12 "strings"
13 "testing"
14)
15
16var objectStorage = "object-store"
17var metadata = map[string]string{"gopher": "cloud"}
18var numContainers = 2
19var numObjects = 2
20
21func TestAccount(t *testing.T) {
22 ts, err := setupForList(objectStorage)
23 if err != nil {
24 t.Error(err)
25 return
26 }
27
28 region := os.Getenv("OS_REGION_NAME")
29 for _, ep := range ts.eps {
30 if (region != "") && (region != ep.Region) {
31 continue
32 }
33
34 client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
35
36 err := accounts.Update(client, accounts.UpdateOpts{
37 Metadata: metadata,
38 })
39 if err != nil {
40 t.Error(err)
41 return
42 }
43 defer func() {
44 tempMap := make(map[string]string)
45 for k := range metadata {
46 tempMap[k] = ""
47 }
48 err = accounts.Update(client, accounts.UpdateOpts{
49 Metadata: tempMap,
50 })
51 if err != nil {
52 t.Error(err)
53 return
54 }
55 }()
56
57 gr, err := accounts.Get(client, accounts.GetOpts{})
58 if err != nil {
59 t.Error(err)
60 return
61 }
Jon Perritteb575642014-04-24 15:16:31 -050062 am := accounts.ExtractMetadata(gr)
Jon Perritt816d2a02014-03-11 20:49:46 -050063 for k := range metadata {
64 if am[k] != metadata[strings.Title(k)] {
65 t.Errorf("Expected custom metadata with key: %s", k)
66 return
67 }
68 }
69 }
70}
71
72func TestContainers(t *testing.T) {
73 ts, err := setupForList(objectStorage)
74 if err != nil {
75 t.Error(err)
76 return
77 }
78
79 region := os.Getenv("OS_REGION_NAME")
80 for _, ep := range ts.eps {
81 if (region != "") && (region != ep.Region) {
82 continue
83 }
84
85 client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
86
87 cNames := make([]string, numContainers)
88 for i := 0; i < numContainers; i++ {
89 cNames[i] = randomString("test-container-", 8)
90 }
91
92 for i := 0; i < len(cNames); i++ {
93 _, err := containers.Create(client, containers.CreateOpts{
94 Name: cNames[i],
95 })
96 if err != nil {
97 t.Error(err)
98 return
99 }
100 }
101 defer func() {
102 for i := 0; i < len(cNames); i++ {
103 err = containers.Delete(client, containers.DeleteOpts{
104 Name: cNames[i],
105 })
106 if err != nil {
107 t.Error(err)
108 return
109 }
110 }
111 }()
112
113 lr, err := containers.List(client, containers.ListOpts{
114 Full: false,
115 })
116 if err != nil {
117 t.Error(err)
118 return
119 }
Jon Perritteb575642014-04-24 15:16:31 -0500120 cns, err := containers.ExtractNames(lr)
Jon Perritt816d2a02014-03-11 20:49:46 -0500121 if err != nil {
122 t.Error(err)
123 return
124 }
125 if len(cns) != len(cNames) {
126 t.Errorf("Expected %d names and got %d", len(cNames), len(cns))
127 return
128 }
129
130 lr, err = containers.List(client, containers.ListOpts{
131 Full: true,
132 })
133 if err != nil {
134 t.Error(err)
135 return
136 }
Jon Perritteb575642014-04-24 15:16:31 -0500137 cis, err := containers.ExtractInfo(lr)
Jon Perritt816d2a02014-03-11 20:49:46 -0500138 if err != nil {
139 t.Error(err)
140 return
141 }
142 if len(cis) != len(cNames) {
143 t.Errorf("Expected %d containers and got %d", len(cNames), len(cis))
144 return
145 }
146
147 err = containers.Update(client, containers.UpdateOpts{
148 Name: cNames[0],
149 Metadata: metadata,
150 })
151 if err != nil {
152 t.Error(err)
153 return
154 }
155 defer func() {
156 tempMap := make(map[string]string)
157 for k := range metadata {
158 tempMap[k] = ""
159 }
160 err = containers.Update(client, containers.UpdateOpts{
161 Name: cNames[0],
162 Metadata: tempMap,
163 })
164 if err != nil {
165 t.Error(err)
166 return
167 }
168 }()
169
170 gr, err := containers.Get(client, containers.GetOpts{})
171 if err != nil {
172 t.Error(err)
173 return
174 }
Jon Perritteb575642014-04-24 15:16:31 -0500175 cm := containers.ExtractMetadata(gr)
Jon Perritt816d2a02014-03-11 20:49:46 -0500176 for k := range metadata {
177 if cm[k] != metadata[strings.Title(k)] {
178 t.Errorf("Expected custom metadata with key: %s", k)
179 return
180 }
181 }
182 }
183}
184
185func TestObjects(t *testing.T) {
186 ts, err := setupForList(objectStorage)
187 if err != nil {
188 t.Error(err)
189 return
190 }
191
192 region := os.Getenv("OS_REGION_NAME")
193
194 for _, ep := range ts.eps {
195 if (region != "") && (region != ep.Region) {
196 continue
197 }
198
199 client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
200
201 oNames := make([]string, numObjects)
202 for i := 0; i < len(oNames); i++ {
203 oNames[i] = randomString("test-object-", 8)
204 }
205
206 cName := randomString("test-container-", 8)
207 _, err := containers.Create(client, containers.CreateOpts{
208 Name: cName,
209 })
210 if err != nil {
211 t.Error(err)
212 return
213 }
214 defer func() {
215 err = containers.Delete(client, containers.DeleteOpts{
216 Name: cName,
217 })
218 if err != nil {
219 t.Error(err)
220 return
221 }
222 }()
223
224 oContents := make([]*bytes.Buffer, numObjects)
225 for i := 0; i < numObjects; i++ {
226 oContents[i] = bytes.NewBuffer([]byte(randomString("", 10)))
227 err = objects.Create(client, objects.CreateOpts{
228 Container: cName,
229 Name: oNames[i],
230 Content: oContents[i],
231 })
232 if err != nil {
233 t.Error(err)
234 return
235 }
236 }
237 defer func() {
238 for i := 0; i < numObjects; i++ {
239 err = objects.Delete(client, objects.DeleteOpts{
240 Container: cName,
241 Name: oNames[i],
242 })
243 }
244 }()
245
246 lr, err := objects.List(client, objects.ListOpts{
247 Full: false,
248 Container: cName,
249 })
250 if err != nil {
251 t.Error(err)
252 return
253 }
Jon Perritteb575642014-04-24 15:16:31 -0500254 ons, err := objects.ExtractNames(lr)
255 if err != nil {
256 t.Error(err)
257 return
258 }
Jon Perritt816d2a02014-03-11 20:49:46 -0500259 if len(ons) != len(oNames) {
260 t.Errorf("Expected %d names and got %d", len(oNames), len(ons))
261 return
262 }
263
264 lr, err = objects.List(client, objects.ListOpts{
265 Full: true,
266 Container: cName,
267 })
268 if err != nil {
269 t.Error(err)
270 return
271 }
Jon Perritteb575642014-04-24 15:16:31 -0500272 ois, err := objects.ExtractInfo(lr)
Jon Perritt816d2a02014-03-11 20:49:46 -0500273 if err != nil {
274 t.Error(err)
275 return
276 }
277 if len(ois) != len(oNames) {
278 t.Errorf("Expected %d containers and got %d", len(oNames), len(ois))
279 return
280 }
281
282 err = objects.Copy(client, objects.CopyOpts{
283 Container: cName,
284 Name: oNames[0],
285 NewContainer: cName,
286 NewName: oNames[1],
287 })
288 if err != nil {
289 t.Error(err)
290 return
291 }
292
293 dr, err := objects.Download(client, objects.DownloadOpts{
294 Container: cName,
295 Name: oNames[1],
296 })
297 if err != nil {
298 t.Error(err)
299 return
300 }
Jon Perritteb575642014-04-24 15:16:31 -0500301 o2Content, err := objects.ExtractContent(dr)
302 if err != nil {
303 t.Error(err)
304 }
Jon Perritt816d2a02014-03-11 20:49:46 -0500305 dr, err = objects.Download(client, objects.DownloadOpts{
306 Container: cName,
307 Name: oNames[0],
308 })
309 if err != nil {
310 t.Error(err)
311 return
312 }
Jon Perritteb575642014-04-24 15:16:31 -0500313 o1Content, err := objects.ExtractContent(dr)
314 if err != nil {
315 t.Error(err)
316 return
317 }
Jon Perritt816d2a02014-03-11 20:49:46 -0500318 if string(o2Content) != string(o1Content) {
319 t.Errorf("Copy failed. Expected\n%s\nand got\n%s", string(o1Content), string(o2Content))
320 return
321 }
322
323 err = objects.Update(client, objects.UpdateOpts{
324 Container: cName,
325 Name: oNames[0],
326 Metadata: metadata,
327 })
328 if err != nil {
329 t.Error(err)
330 return
331 }
332 defer func() {
333 tempMap := make(map[string]string)
334 for k := range metadata {
335 tempMap[k] = ""
336 }
337 err = objects.Update(client, objects.UpdateOpts{
338 Container: cName,
339 Name: oNames[0],
340 Metadata: tempMap,
341 })
342 if err != nil {
343 t.Error(err)
344 return
345 }
346 }()
347
348 gr, err := objects.Get(client, objects.GetOpts{})
349 if err != nil {
350 t.Error(err)
351 return
352 }
Jon Perritteb575642014-04-24 15:16:31 -0500353 om := objects.ExtractMetadata(gr)
Jon Perritt816d2a02014-03-11 20:49:46 -0500354 for k := range metadata {
355 if om[k] != metadata[strings.Title(k)] {
356 t.Errorf("Expected custom metadata with key: %s", k)
357 return
358 }
359 }
360 }
361}