Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 19f4195f

History | View | Annotate | Download (61.3 kB)

1
# Copyright 2011 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#          copyright notice, this list of conditions and the following
9
#          disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#          copyright notice, this list of conditions and the following
13
#          disclaimer in the documentation and/or other materials
14
#          provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
import gevent.monkey
35
#Monkey-patch everything for gevent early on
36
gevent.monkey.patch_all()
37

    
38
from argparse import ArgumentParser
39
import unittest
40
import time, datetime, os, sys
41
from shutil import copyfile
42

    
43
from kamaki.clients import ClientError
44
from kamaki.clients.pithos import PithosClient as pithos
45
from kamaki.clients.cyclades import CycladesClient as cyclades
46

    
47
TEST_ALL = False
48

    
49
class testCyclades(unittest.TestCase):
50
        """Set up a Cyclades thorough test"""
51
        def setUp(self):
52
                """okeanos"""
53
                url='https://cyclades.okeanos.grnet.gr/api/v1.1'
54
                token='MI6PT0yrXJ9Ji/x8l9Wmig=='
55
                token='Kn+G9dfmlPLR2WFnhfBOow=='
56
                account='saxtouri@gmail.com'
57
                account='saxtouri@grnet.gr'
58
                self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
59
                self.img_details= {
60
                        u'status': u'ACTIVE',
61
                        u'updated': u'2012-10-16T09:04:17+00:00',
62
                        u'name': u'Debian Base',
63
                        u'created': u'2012-10-16T09:03:12+00:00',
64
                        u'progress': 100,
65
                        u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
66
                        u'metadata': {
67
                                u'values': {
68
                                        u'kernel': u'2.6.32',
69
                                        u'osfamily': u'linux', 
70
                                        u'users': u'root', 
71
                                        u'gui': u'No GUI', 
72
                                        u'sortorder': u'1', 
73
                                        u'os': u'debian', 
74
                                        u'root_partition': u'1', 
75
                                        u'description': u'Debian 6.0.6 (Squeeze) Base System',
76
                                        u'partition_table': u'msdos'}
77
                                }
78
                        }
79
                self.flavor_details =  {u'name': u'C1R1024D20',
80
                        u'ram': 1024,
81
                        u'id': 1,
82
                        u'SNF:disk_template': u'drbd',
83
                        u'disk': 20,
84
                        u'cpu': 1}
85
                self.PROFILES=('ENABLED', 'DISABLED', 'PROTECTED')
86

    
87
                """okeanos.io"""
88
                #url = 'https://cyclades.okeanos.io/api/v1.1'
89
                #token='0TpoyAXqJSPxLdDuZHiLOA=='
90
                #account='saxtouri@admin.grnet.gr'
91
                #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
92
                #self.img_details= {
93
                #        u'status': u'ACTIVE',
94
                #        u'updated': u'2012-08-21T12:57:39+00:00',
95
                #        u'name': u'Debian Base',
96
                #        u'created': u'2012-08-21T12:56:53+00:00',
97
                #        u'progress': 100,
98
                #        u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
99
                #        u'metadata': {
100
                #                u'values': {
101
                #                        u'kernel': u'2.6.32',
102
                #                        u'osfamily': u'linux', 
103
                #                        u'users': u'root', 
104
                #                        u'gui': u'No GUI', 
105
                #                        u'sortorder': u'1', 
106
                #                        u'os': u'debian', 
107
                #                        u'root_partition': 
108
                #                        u'1', u'description': 
109
                #                        u'Debian Squeeze Base System'}
110
                #                }
111
                #        }
112
                #flavorid = 1
113

    
114
                self.servers = {}
115
                self.now = time.mktime(time.gmtime())
116
                self.servname1 = 'serv'+unicode(self.now)
117
                self.servname2 = self.servname1+'_v2'
118
                self.flavorid = 1
119
                #servers have to be created at the begining...
120
                self.networks={}
121
                self.netname1 = 'net'+unicode(self.now)
122
                self.netname2 = 'net'+unicode(self.now)+'_v2'
123

    
124
                self.client = cyclades(url, token)
125
                pass
126

    
127
        def tearDown(self):
128
                """Destoy servers used in testing"""
129
                print
130
                for netid in self.networks.keys():
131
                        self._delete_network(netid)
132
                if 0 >= len(self.servers):
133
                        return
134
                there_are_servers_running = True
135
                deleted_servers = {}
136
                waitime = 0
137
                print('-> Found %s servers to delete'%len(self.servers))
138
                while there_are_servers_running:
139
                        there_are_servers_running = False
140
                        if waitime > 0:
141
                                c = ['|','/','-','\\']
142
                                suffix = ''
143
                                sys.stdout.write('\t. . . wait %s seconds: '%waitime)
144
                                for i in range(4*waitime):
145
                                        oldlen = len(suffix)
146
                                        suffix = '%ss %s'%(i/4, c[i%4])
147
                                        sys.stdout.write(oldlen*'\b'+suffix)
148
                                        sys.stdout.flush()
149
                                        time.sleep(0.25)
150
                                oldlen = len(': '+suffix)
151
                                print(oldlen*'\b'+oldlen*' ')
152
                                sys.stdout.flush()
153
                        waitime += 3
154
                        dservers = self.client.list_servers(detail=True)
155
                        for server in dservers:
156
                                if server['name'] in self.servers.keys():
157
                                        there_are_servers_running = True
158
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
159
                                        if server['status'] == 'BUILD':
160
                                                print('\twait...')
161
                                        else:
162
                                                print('\tDELETE %s'%server['name'])
163
                                                self._delete_server(server['id'])
164
                                                self.servers.pop(server['name'])
165
                                                deleted_servers[server['name']] = 0
166
                                                waitime =0 
167
                                elif server['name'] in deleted_servers.keys():
168
                                        there_are_servers_running = True
169
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
170
                                        retries = deleted_servers[server['name']]
171
                                        if retries > 10:
172
                                                print('\tretry DELETE %s'%server['name'])
173
                                                self._delete_server(server['id'])
174
                                                retries = 0
175
                                                waitime = 0
176
                                        else:
177
                                                print('\tnot deleted yet ...')
178
                                        deleted_servers[server['name']] = retries + 1
179

    
180
        def _create_server(self, servername, flavorid, imageid, personality=None):
181
                server = self.client.create_server(servername, flavorid, imageid, personality)
182
                self.servers[servername] = server
183
                return server
184

    
185
        def _delete_server(self, servid):
186
                self.client.delete_server(servid)
187

    
188
        def _create_network(self, netname, **kwargs):
189
                net = self.client.create_network(netname, **kwargs)
190
                self.networks[net['id']] = net
191
                return net
192

    
193
        def _delete_network(self, netid):
194
                print('\tDelete network %s'%netid)
195
                self.client.delete_network(netid)
196

    
197
        def _wait_for_nic(self, netid, servid, in_creation=True):
198
                c=['|','/','-','\\']
199
                limit = 50
200
                wait=3
201
                while wait < limit:
202
                        nics = self.client.list_server_nics(servid)
203
                        for net in nics:
204
                                found_nic = net['id'] == netid
205
                                if (in_creation and found_nic) or not (in_creation or found_nic):
206
                                        return True
207
                        dis = '' if in_creation else 'dis'
208
                        sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
209
                        for i in range(wait*4):
210
                                sys.stdout.write('\b%s'%c[i%4])
211
                                sys.stdout.flush()
212
                                time.sleep(0.25)
213
                        print('\b ')
214
                        wait += 3
215
                return False
216

    
217
        def if_not_all(foo):
218
                global TEST_ALL
219
                if TEST_ALL:
220
                        return None
221
                return foo
222

    
223
        def assert_dicts_are_deeply_equal(self, d1, d2):
224
                for k,v in d1.items():
225
                        self.assertTrue(d2.has_key(k))
226
                        if isinstance(v, dict):
227
                                self.assert_dicts_are_deeply_equal(v, d2[k])
228
                        else:
229
                                self.assertEqual(unicode(v), unicode(d2[k]))
230

    
231
        def test_000(self):
232
                "Prepare a full Cyclades test scenario"
233
                global TEST_ALL
234
                TEST_ALL = True
235

    
236
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
237
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
238

    
239
                print('testing')
240
                sys.stdout.write(' test create server')
241
                self._test_create_server()
242
                print('...ok')
243

    
244
                sys.stdout.write(' test list servers')
245
                self._test_list_servers()
246
                print('...ok')
247

    
248
                self._wait_for_status(self.server1['id'], 'BUILD')
249
                self._wait_for_status(self.server2['id'], 'BUILD')
250

    
251
                sys.stdout.write(' test get server details')
252
                self._test_get_server_details()
253
                print('...ok')
254

    
255
                sys.stdout.write(' test get image details')
256
                self._test_get_image_details()
257
                print('...ok')
258

    
259
                sys.stdout.write(' test update_server_name')
260
                self._test_update_server_name()
261
                print('...ok')
262

    
263

    
264
                sys.stdout.write(' test reboot_server')
265
                self._test_reboot_server()
266
                print('...ok')
267

    
268
                self._wait_for_status(self.server1['id'], 'REBOOT')
269
                self._wait_for_status(self.server2['id'], 'REBOOT')
270

    
271
                sys.stdout.write(' test create_server_metadata')
272
                self._test_create_server_metadata()
273
                print('...ok')
274

    
275
                sys.stdout.write(' test get_server_metadata')
276
                self._test_get_server_metadata()
277
                print('...ok')
278

    
279
                sys.stdout.write(' test update_server_metadata')
280
                self._test_update_server_metadata()
281
                print('...ok')
282

    
283
                sys.stdout.write(' test delete_server_metadata')
284
                self._test_delete_server_metadata()
285
                print('...ok')
286

    
287
                sys.stdout.write(' test list_flavors')
288
                self._test_list_flavors()
289
                print('...ok')
290

    
291
                sys.stdout.write(' test get_flavor_details')
292
                self._test_get_flavor_details()
293
                print('...ok')
294

    
295
                sys.stdout.write(' test list_images')
296
                self._test_list_images()
297
                print('...ok')
298

    
299
                sys.stdout.write(' test get_image_details')
300
                self._test_get_image_details()
301
                print('...ok')
302

    
303
                sys.stdout.write(' test get_image_metadata')
304
                self._test_get_image_metadata()
305
                print('...ok')
306

    
307
                sys.stdout.write(' test shutdown_server')
308
                self._test_shutdown_server()
309
                print('...ok')
310

    
311
                sys.stdout.write(' test start_server')
312
                self._test_start_server()
313
                print('...ok')
314

    
315
                sys.stdout.write(' test get_server_console')
316
                self._test_get_server_console()        
317
                print('...ok')
318

    
319
                sys.stdout.write(' test get_firewall_profile')
320
                self._test_get_firewall_profile()        
321
                print('...ok')
322

    
323
                sys.stdout.write(' test set_firewall_profile')
324
                self._test_set_firewall_profile()        
325
                print('...ok')
326

    
327
                sys.stdout.write(' test get_server_stats')
328
                self._test_get_server_stats()        
329
                print('...ok')
330

    
331
                self.network1 = self._create_network(self.netname1)
332

    
333
                sys.stdout.write(' test create_network')
334
                self._test_create_network()        
335
                print('...ok')
336

    
337
                sys.stdout.write(' test connect_server')
338
                self._test_connect_server()        
339
                print('...ok')
340

    
341
                sys.stdout.write(' test disconnect_server')
342
                self._test_disconnect_server()        
343
                print('...ok')
344

    
345
                self.network2 = self._create_network(self.netname2)
346

    
347
                sys.stdout.write(' test list_server_nics')
348
                self._test_list_server_nics()        
349
                print('...ok')
350

    
351
                sys.stdout.write(' test list_networks')
352
                self._test_list_networks()        
353
                print('...ok')
354

    
355
                sys.stdout.write(' test get_network_details')
356
                self._test_get_network_details()        
357
                print('...ok')
358

    
359
                sys.stdout.write(' test update_network_name')
360
                self._test_update_network_name()        
361
                print('...ok')
362

    
363
                """Don't have auth for these:
364
                sys.stdout.write(' test delete_image')
365
                self._test_delete_image()
366
                print('...ok')
367
                sys.stdout.write(' test create_image_metadata')
368
                self._test_create_image_metadata()
369
                print('...ok')
370
                sys.stdout.write(' test update_image_metadata')
371
                self._test_update_image_metadata()
372
                print('...ok')
373
                sys.stdout.write(' test delete_image_metadata')
374
                self._test_delete_image_metadata()
375
                print('...ok')
376
                """
377

    
378
        def _has_status(self, servid, status):
379
                r = self.client.get_server_details(servid)
380
                return r['status'] == status
381
        def _wait_for_status(self, servid, status):
382
                wait = 0
383
                c=['|','/','-','\\']
384
                while self._has_status(servid, status):
385
                        if wait:
386
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
387
                                for i in range(4*wait):
388
                                        sys.stdout.write('\b%s'%c[i%4])
389
                                        sys.stdout.flush()
390
                                        time.sleep(0.25)
391
                                print('\b ')
392
                        wait = (wait + 3) if wait<60 else 0
393

    
394
        @if_not_all
395
        def test_list_servers(self):
396
                """Test list servers"""
397
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
398
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
399
                self._test_list_servers()
400

    
401
        def _test_list_servers(self):
402
                servers = self.client.list_servers()
403
                dservers = self.client.list_servers(detail=True)
404

    
405
                """detailed and simple are same size"""
406
                self.assertEqual(len(dservers), len(servers))
407
                for i in range(len(servers)):
408
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
409
                                'status', 'updated']:
410
                                self.assertFalse(servers[i].has_key(field))
411
                                self.assertTrue(dservers[i].has_key(field))
412

    
413
                """detailed and simple contain same names"""
414
                names = sorted(map(lambda x: x["name"], servers))
415
                dnames = sorted(map(lambda x: x["name"], dservers))
416
                self.assertEqual(names, dnames)
417

    
418
        @if_not_all
419
        def test_create_server(self):
420
                """Test create_server"""
421
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
422
                self._wait_for_status(self.server1['id'], 'BUILD')
423
                self._test_create_server()
424

    
425
        def _test_create_server(self):
426
                self.assertEqual(self.server1["name"], self.servname1)
427
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
428
                self.assertEqual(self.server1["imageRef"], self.img)
429
                self.assertEqual(self.server1["status"], "BUILD")
430

    
431
        @if_not_all
432
        def test_get_server_details(self):
433
                """Test get_server_details"""
434
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
435
                self._wait_for_status(self.server1['id'], 'BUILD')
436
                self._test_get_server_details()
437

    
438
        def _test_get_server_details(self):
439
                r = self.client.get_server_details(self.server1['id'])
440
                self.assertEqual(r["name"], self.servname1)
441
                self.assertEqual(r["flavorRef"], self.flavorid)
442
                self.assertEqual(r["imageRef"], self.img)
443
                self.assertEqual(r["status"], "ACTIVE")
444

    
445
        @if_not_all
446
        def test_get_image_details(self):
447
                """Test get_image_details"""
448
                self._test_get_image_details()
449

    
450
        def _test_get_image_details(self):
451
                r = self.client.get_image_details(self.img)
452
                d = self.img_details
453
                self.assert_dicts_are_deeply_equal(r, d)
454

    
455
        @if_not_all
456
        def test_update_server_name(self):
457
                """Test update_server_name"""
458
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
459
                self._test_update_server_name()
460

    
461
        def _test_update_server_name(self):
462
                new_name = self.servname1+'_new_name'
463
                self.client.update_server_name(self.server1['id'], new_name)
464
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
465
                self.assertEqual(r['name'], new_name)
466
                changed = self.servers.pop(self.servname1)
467
                changed['name'] = new_name
468
                self.servers[new_name] = changed
469

    
470
        @if_not_all
471
        def test_reboot_server(self):
472
                """Test reboot server"""
473
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
474
                self._wait_for_status(self.server1['id'], 'BUILD')
475
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
476
                self._wait_for_status(self.server2['id'], 'BUILD')
477
                self._test_reboot_server()
478
                self._wait_for_status(self.server1['id'], 'REBOOT')
479
                self._wait_for_status(self.server2['id'], 'REBOOT')
480

    
481
        def _test_reboot_server(self):
482
                self.client.reboot_server(self.server1['id'])
483
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
484
                self.client.reboot_server(self.server2['id'], hard=True)
485
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
486

    
487
        @if_not_all
488
        def test_get_server_metadata(self):
489
                """Test get server_metadata"""
490
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
491
                self._test_get_server_metadata()
492
        def _test_get_server_metadata(self):
493
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
494
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
495
                self.assertEqual(r['mymeta_0'], 'val_0')
496

    
497
        @if_not_all
498
        def test_create_server_metadata(self):
499
                """Test create_server_metadata"""
500
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
501
                self._test_create_server_metadata()
502

    
503
        def _test_create_server_metadata(self):
504
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
505
                self.assertTrue(r1.has_key('mymeta'))
506
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
507
                self.assert_dicts_are_deeply_equal(r1, r2)
508

    
509
        @if_not_all
510
        def test_update_server_metadata(self):
511
                """Test update_server_metadata"""
512
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
513
                self._test_update_server_metadata()
514

    
515
        def _test_update_server_metadata(self):
516
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
517
                self.assertTrue(r1.has_key('mymeta3'))
518
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
519
                self.assertTrue(r2['mymeta3'], 'val3')
520

    
521
        @if_not_all
522
        def test_delete_server_metadata(self):
523
                """Test delete_server_metadata"""
524
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
525
                self._test_delete_server_metadata()
526

    
527
        def _test_delete_server_metadata(self):
528
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
529
                self.assertTrue(r1.has_key('mymeta'))
530
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
531
                try:
532
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
533
                        raise ClientError('Wrong Error', status=100)
534
                except ClientError as err:
535
                        self.assertEqual(err.status, 404)
536

    
537
        @if_not_all
538
        def test_list_flavors(self):
539
                """Test flavors_get"""
540
                self._test_list_flavors()
541

    
542
        def _test_list_flavors(self):
543
                r = self.client.list_flavors()
544
                self.assertTrue(len(r) > 1)
545
                r = self.client.list_flavors(detail=True)
546
                self.assertTrue(r[0].has_key('SNF:disk_template'))
547

    
548
        @if_not_all
549
        def test_get_flavor_details(self):
550
                """Test test_get_flavor_details"""
551
                self._test_get_flavor_details()
552

    
553
        def _test_get_flavor_details(self):
554
                r = self.client.get_flavor_details(self.flavorid)
555
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
556

    
557
        @if_not_all
558
        def test_list_images(self):
559
                """Test list_images"""
560
                self._test_list_images()
561

    
562
        def _test_list_images(self):
563
                r = self.client.list_images()
564
                self.assertTrue(len(r) > 1)
565
                r = self.client.list_images(detail=True)
566
                for detailed_img in r:
567
                        if detailed_img['id'] == self.img:
568
                                break
569
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
570

    
571
        @if_not_all
572
        def test_image_details(self):
573
                """Test image_details"""
574
                self._test_get_image_details
575

    
576
        def _test_get_image_details(self):
577
                r = self.client.get_image_details(self.img)
578
                self.assert_dicts_are_deeply_equal(r, self.img_details)
579

    
580
        @if_not_all
581
        def test_get_image_metadata(self):
582
                """Test get_image_metadata"""
583
                self._test_get_image_metadata()
584

    
585
        def _test_get_image_metadata(self):
586
                r = self.client.get_image_metadata(self.img)
587
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
588
                for key,val in self.img_details['metadata']['values'].items():
589
                        r = self.client.get_image_metadata(self.img, key)
590
                        self.assertEqual(r[key], val)
591

    
592
        @if_not_all
593
        def test_start_server(self):
594
                """Test start_server"""
595
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
596
                self._wait_for_status(self.server1['id'], 'BUILD')
597
                self.client.shutdown_server(self.server1['id'])
598
                self._wait_for_status(self.server1['id'], 'ACTIVE')
599
                self._test_start_server()
600

    
601
        def _test_start_server(self):
602
                self.client.start_server(self.server1['id'])
603
                self._wait_for_status(self.server1['id'], 'STOPPED')
604
                r = self.client.get_server_details(self.server1['id'])
605
                self.assertEqual(r['status'], 'ACTIVE')
606

    
607
        @if_not_all
608
        def test_shutdown_server(self):
609
                """Test shutdown_server"""
610
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
611
                self._wait_for_status(self.server1['id'], 'BUILD')
612
                self._test_shutdown_server()
613

    
614
        def _test_shutdown_server(self):
615
                self.client.shutdown_server(self.server1['id'])
616
                self._wait_for_status(self.server1['id'], 'ACTIVE')
617
                r = self.client.get_server_details(self.server1['id'])
618
                self.assertEqual(r['status'], 'STOPPED')
619

    
620
        @if_not_all
621
        def test_get_server_console(self):
622
                """Test get_server_console"""
623
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
624
                self._test_get_server_console()
625

    
626
        def _test_get_server_console(self):
627
                self._wait_for_status(self.server2['id'], 'BUILD')
628
                r = self.client.get_server_console(self.server2['id'])
629
                self.assertTrue(r.has_key('host'))
630
                self.assertTrue(r.has_key('password'))
631
                self.assertTrue(r.has_key('port'))
632
                self.assertTrue(r.has_key('type'))
633

    
634
        @if_not_all
635
        def test_get_firewall_profile(self):
636
                """Test get_firewall_profile"""
637
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
638
                self._test_get_firewall_profile()
639

    
640
        def _test_get_firewall_profile(self):
641
                self._wait_for_status(self.server1['id'], 'BUILD')
642
                fprofile = self.client.get_firewall_profile(self.server1['id'])
643
                self.assertTrue(fprofile in self.PROFILES)
644

    
645
        @if_not_all
646
        def test_set_firewall_profile(self):
647
                """Test set_firewall_profile"""
648
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
649
                self._test_set_firewall_profile()
650

    
651
        def _test_set_firewall_profile(self):
652
                def next_profile(cur_profile):
653
                        index = self.PROFILES.index(cur_profile)
654
                        new_index = 0 if index >= len(self.PROFILES)-1 else (index+1)
655
                        return self.PROFILES[new_index]
656

    
657
                self._wait_for_status(self.server1['id'], 'BUILD')
658
                fprofile = self.client.get_firewall_profile(self.server1['id'])
659
                for counter in range(1,1+len(self.PROFILES)):
660
                        nprofile = next_profile(fprofile)
661
                        start=fprofile
662
                        print('\tProfile swap %s: %s -> %s'%(counter, fprofile, nprofile))
663
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
664
                        wait = 3
665
                        c=['|','/','-','\\']
666
                        while fprofile != nprofile:
667
                                self.assertEqual(fprofile, start)
668
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
669
                                for i in range(4*wait):
670
                                        sys.stdout.write('\b%s'%c[i%4])
671
                                        sys.stdout.flush()
672
                                        time.sleep(0.25)
673
                                wait += 3
674
                                print('\b ')
675
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
676

    
677
        @if_not_all
678
        def test_get_server_stats(self):
679
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
680
                self._test_get_server_stats()
681

    
682
        def _test_get_server_stats(self):
683
                r = self.client.get_server_stats(self.server1['id'])
684
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
685
                        self.assertTrue(r.has_key(term))
686

    
687
        @if_not_all
688
        def test_list_networks(self):
689
                """Test list_network"""
690
                self.network1 = self._create_network(self.netname1)
691
                self._test_list_networks()
692

    
693
        def _test_list_networks(self):
694
                r = self.client.list_networks()
695
                self.assertTrue(len(r)>1)
696
                ids = [net['id'] for net in r]
697
                names = [net['name'] for net in r]
698
                self.assertTrue('public' in ids)
699
                self.assertTrue('public' in names)
700
                self.assertTrue(self.network1['id'] in ids)
701
                self.assertTrue(self.network1['name'] in names)
702

    
703
                r = self.client.list_networks(detail=True)
704
                ids = [net['id'] for net in r]
705
                names = [net['name'] for net in r]
706
                for net in r:
707
                        self.assertTrue(net['id'] in ids)
708
                        self.assertTrue(net['name'] in names)
709
                        for term in ('status', 'updated', 'created', 'servers'):
710
                                self.assertTrue(term in net.keys())
711

    
712
        @if_not_all
713
        def test_create_network(self):
714
                """Test create_network"""
715
                self.network1 = self._create_network(self.netname1)
716
                self._test_create_network()
717

    
718
        def _test_create_network(self):
719
                nets = self.client.list_networks(self.network1['id'])
720
                chosen = [net for net in nets if net['id'] == self.network1['id']]
721
                self.assertTrue(len(chosen)>0)
722
                self.assert_dicts_are_deeply_equal(chosen[0], self.network1)
723

    
724
        @if_not_all
725
        def test_connect_server(self):
726
                """Test connect_server"""
727
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
728
                self.network1 = self._create_network(self.netname1)
729
                self._wait_for_status(self.server1['id'], 'BUILD')
730
                self._test_connect_server()
731

    
732
        def _test_connect_server(self):
733
                self.client.connect_server(self.server1['id'], self.network1['id'])
734
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
735

    
736
        @if_not_all
737
        def test_disconnect_server(self):
738
                """Test disconnect_server"""
739
                self.test_connect_server()
740
                self._test_disconnect_server()
741

    
742
        def _test_disconnect_server(self):
743
                self.client.disconnect_server(self.server1['id'], self.network1['id'])
744
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
745
                        in_creation=False))
746

    
747

    
748
        @if_not_all
749
        def test_list_server_nics(self):
750
                """Test list_server_nics"""
751
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
752
                self.network2 = self._create_network(self.netname2)
753
                self._wait_for_status(self.server1['id'], 'BUILD')
754
                self._test_list_server_nics()
755

    
756
        def _test_list_server_nics(self):
757
                r = self.client.list_server_nics(self.server1['id'])
758
                len0 = len(r)
759
                self.assertTrue(len0>0)
760
                self.assertTrue('public' in [net['id'] for net in r])
761

    
762
                self.client.connect_server(self.server1['id'], self.network2['id'])
763
                self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
764
                r = self.client.list_server_nics(self.server1['id'])
765
                self.assertTrue(len(r)>len0)
766

    
767
        @if_not_all
768
        def test_get_network_details(self):
769
                """Test get_network_details"""
770
                self.network1 = self._create_network(self.netname1)
771
                self._test_get_network_details()
772

    
773
        def _test_get_network_details(self):
774
                r = self.client.get_network_details(self.network1['id'])
775
                self.assert_dicts_are_deeply_equal(self.network1, r)
776

    
777
        @if_not_all
778
        def test_update_network_name(self):
779
                self.network2 = self._create_network(self.netname2)
780
                self._test_update_network_name()
781

    
782
        def _test_update_network_name(self):
783
                updated_name = self.netname2+'_upd'
784
                self.client.update_network_name(self.network2['id'], updated_name)
785
                wait = 3
786
                c=['|','/','-','\\']
787
                r = self.client.get_network_details(self.network2['id'])
788
                while wait < 50:
789
                        if r['name'] == updated_name:
790
                                break
791
                        sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
792
                                self.network2['name'], updated_name, wait))
793
                        for i in range(4*wait):
794
                                sys.stdout.write('\b%s'%c[i%4])
795
                                sys.stdout.flush()
796
                                time.sleep(0.25)
797
                        print('')
798
                        wait += 3
799
                        r = self.client.get_network_details(self.network2['id'])
800
                self.assertEqual(r['name'], updated_name)
801

    
802
        """ Don't have auth to test this
803
        @if_not_all
804
        def test_delete_image(self):
805
                ""Test delete_image""
806
                self._test_delete_image()
807
        def _test_delete_image(self):
808
                images = self.client.list_images()
809
                self.client.delete_image(images[2]['id'])
810
                try:
811
                        r = self.client.get_image_details(images[2]['id'], success=(400))
812
                except ClientError as err:
813
                        self.assertEqual(err.status, 404)
814

815
        @if_not_all
816
        def test_create_image_metadata(self):
817
                ""Test create_image_metadata""
818
                self._test_create_image_metadata()
819
        def _test_create_image_metadata(self):
820
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
821
                self.assertEqual(r['mykey'], 'myval')
822

823
        @if_not_all
824
        def test_update_image_metadata(self):
825
                ""Test update_image_metadata""
826
                self._test_update_image_metadata()
827
        def _test_update_image_metadata(self):
828
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
829
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
830
                self.assertEqual(r['mykey0'], 'myval0')
831

832
        @if_not_all
833
        def test_delete_image_metadata(self):
834
                ""Test delete_image_metadata""
835
                self._test_delete_image_metadata()
836
        def _test_delete_image_metadata(self):
837
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
838
                self.client.delete_image_metadata(self.img, 'mykey1')
839
                r = self.client.get_image_metadata(self.img)
840
                self.assertNotEqual(r.has_key('mykey1'))
841
        """
842

    
843
class testPithos(unittest.TestCase):
844
        """Set up a Pithos+ thorough test"""
845
        def setUp(self):
846
                """
847
                url = 'http://127.0.0.1:8000/v1'
848
                token = 'C/yBXmz3XjTFBnujc2biAg=='
849
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
850
                account = 'admin@adminland.com'
851
                """
852

    
853
                url='https://pithos.okeanos.grnet.gr/v1'
854

    
855
                token='Kn+G9dfmlPLR2WFnhfBOow=='
856
                account='saxtouri@grnet.gr'
857

    
858
                """
859
                url='https://pithos.okeanos.io/v1'
860
                token='0TpoyAXqJSPxLdDuZHiLOA=='
861
                account='saxtouri@admin.grnet.gr'
862
                """
863
                
864
                """
865
                def add_handler(name, level, prefix=''):
866
                        h = logging.StreamHandler()
867
                        fmt = logging.Formatter(prefix + '%(message)s')
868
                        h.setFormatter(fmt)
869
                        logger = logging.getLogger(name)
870
                        logger.addHandler(h)
871
                        logger.setLevel(level)
872
                import logging
873
                sendlog = logging.getLogger('clients.send')
874
                recvlog = logging.getLogger('clients.recv')
875
                add_handler('requests', logging.INFO, prefix='* ')
876
                add_handler('clients.send', logging.INFO, prefix='> ')
877
                add_handler('clients.recv', logging.INFO, prefix='< ')
878
                """
879
                
880
                self.fname = None
881
                container=None
882
                self.client = pithos(url, token, account, container)
883
                self.now = time.mktime(time.gmtime())
884
                self.c1 = 'c1_'+unicode(self.now)
885
                self.c2 = 'c2_'+unicode(self.now)
886
                self.c3 = 'c3_'+unicode(self.now)
887

    
888

    
889
                self.client.create_container(self.c1)
890
                self.client.create_container(self.c2)
891
                self.client.create_container(self.c3)
892
                self.makeNewObject(self.c1, 'test')
893
                self.makeNewObject(self.c2, 'test')
894
                self.now_unformated = datetime.datetime.utcnow()
895
                self.makeNewObject(self.c1, 'test1')
896
                self.makeNewObject(self.c2, 'test1')
897
                """Prepare an object to be shared - also its container"""
898
                self.client.container = self.c1
899
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
900
                
901
                self.makeNewObject(self.c1, 'another.test')
902

    
903
        def makeNewObject(self, container, obj):
904
                self.client.container = container
905
                r = self.client.object_put(obj, content_type='application/octet-stream',
906
                        data= 'file '+obj+' that lives in '+container,
907
                        metadata={'incontainer':container})
908

    
909
        def forceDeleteContainer(self, container):
910
                self.client.container = container
911
                try:
912
                        r = self.client.list_objects()
913
                except ClientError:
914
                        return
915
                for obj in r:
916
                        name = obj['name']
917
                        self.client.del_object(name)
918
                r = self.client.container_delete()
919
                self.container = ''
920

    
921
        def tearDown(self):
922
                """Destroy test cases"""
923
                if self.fname is not None:
924
                        try:
925
                                os.remove(self.fname)
926
                        except OSError:
927
                                pass
928
                        self.fname = None
929
                self.forceDeleteContainer(self.c1)
930
                self.forceDeleteContainer(self.c2)
931
                try:
932
                        self.forceDeleteContainer(self.c3)
933
                except ClientError:
934
                        pass
935
                self.client.container=''
936

    
937
        def test_000(self):
938
                """Perform a full Pithos+ kamaki support test"""
939

    
940
        def test_account_head(self):
941
                """Test account_HEAD"""
942
                r = self.client.account_head()
943
                self.assertEqual(r.status_code, 204)
944
                
945
                r = self.client.account_head(until='1000000000')
946
                self.assertEqual(r.status_code, 204)
947
           
948
                r = self.client.get_account_info(until='1000000000') 
949
                datestring = unicode(r['x-account-until-timestamp'])
950
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
951

    
952
                r = self.client.get_account_quota()
953
                self.assertTrue(r.has_key('x-account-policy-quota'))
954

    
955
                r = self.client.get_account_versioning()
956
                self.assertTrue(r.has_key('x-account-policy-versioning'))
957

    
958
                """Check if(un)modified_since"""
959
                for format in self.client.DATE_FORMATS:
960
                        now_formated = self.now_unformated.strftime(format)
961
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
962
                        sc1 = r1.status_code
963
                        r1.release()
964
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
965
                        sc2 = r2.status_code
966
                        r2.release()
967
                        self.assertNotEqual(sc1, sc2)
968

    
969
        def test_account_get(self):
970
                """Test account_GET"""
971
                #r = self.client.account_get()
972
                #self.assertEqual(r.status_code, 200)
973
                r = self.client.list_containers()
974
                fullLen = len(r)
975
                self.assertTrue(fullLen > 2)
976
                
977
                r = self.client.account_get(limit=1)
978
                self.assertEqual(len(r.json), 1)
979
                
980

    
981
                r = self.client.account_get(marker='c2_')
982
                temp_c0 = r.json[0]['name']
983
                temp_c2 = r.json[2]['name']
984
                
985
                r = self.client.account_get(limit=2, marker='c2_')
986
                conames = [container['name'] for container in r.json \
987
                        if container['name'].lower().startswith('c2_')]
988
                self.assertTrue(temp_c0 in conames)
989
                self.assertFalse(temp_c2 in conames)
990
                
991

    
992
                r = self.client.account_get(show_only_shared=True)
993
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
994
                
995
                r = self.client.account_get(until=1342609206)
996
                self.assertTrue(len(r.json) <= fullLen)
997
                
998
                """Check if(un)modified_since"""
999
                for format in self.client.DATE_FORMATS:
1000
                        now_formated = self.now_unformated.strftime(format)
1001
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
1002
                        sc1 = r1.status_code
1003
                        r1.release()
1004
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1005
                        sc2 = r2.status_code
1006
                        r2.release()
1007
                        self.assertNotEqual(sc1, sc2)
1008

    
1009
                """Check sharing_accounts"""
1010
                r = self.client.get_sharing_accounts()
1011
                self.assertTrue(len(r)>0)
1012

    
1013
        def test_account_post(self):
1014
                """Test account_POST"""
1015
                r = self.client.account_post()
1016
                self.assertEqual(r.status_code, 202)
1017
                grpName = 'grp'+unicode(self.now)
1018
                
1019

    
1020
                """Method set/del_account_meta and set_account_groupcall use account_post internally
1021
                """
1022
                self.client.set_account_group(grpName, ['u1', 'u2'])
1023
                r = self.client.get_account_group()
1024
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
1025
                self.client.del_account_group(grpName)
1026
                r = self.client.get_account_group()
1027
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
1028

    
1029
                mprefix = 'meta'+unicode(self.now)
1030
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
1031
                r = self.client.get_account_meta()
1032
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
1033
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
1034

    
1035
                self.client.del_account_meta(mprefix+'1')
1036
                r = self.client.get_account_meta()
1037
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
1038

    
1039
                self.client.del_account_meta(mprefix+'2')
1040
                r = self.client.get_account_meta()
1041
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
1042

    
1043
                """Missing testing for quota, versioning, because normally
1044
                you don't have permitions to modify those at account level
1045
                """
1046

    
1047
                newquota=1000000
1048
                self.client.set_account_quota(newquota)
1049
                #r = self.client.get_account_info()
1050
                #print(unicode(r))
1051
                #r = self.client.get_account_quota()
1052
                #self.assertEqual(r['x-account-policy-quota'], newquota)
1053
                self.client.set_account_versioning('auto')
1054

    
1055
        def test_container_head(self):
1056
                """Test container_HEAD"""
1057
                self.client.container = self.c1
1058

    
1059
                r = self.client.container_head()
1060
                self.assertEqual(r.status_code, 204)
1061
                
1062
                """Check until"""
1063
                r = self.client.container_head(until=1000000, success=(204, 404))
1064
                self.assertEqual(r.status_code, 404)
1065
                
1066
                """Check and if(un)modified_since"""
1067
                for format in self.client.DATE_FORMATS:
1068
                        now_formated = self.now_unformated.strftime(format)
1069
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
1070
                        sc1=r1.status_code
1071
                        r1.release()
1072
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1073
                        sc2=r2.status_code
1074
                        r2.release()
1075
                        self.assertNotEqual(sc1, sc2)
1076

    
1077
                """Check container object meta"""
1078
                r = self.client.get_container_object_meta()
1079
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1080

    
1081
        def test_container_get(self):
1082
                """Test container_GET"""
1083
                self.client.container = self.c1
1084

    
1085
                r = self.client.container_get()
1086
                self.assertEqual(r.status_code, 200)
1087
                fullLen = len(r.json)
1088
                
1089

    
1090
                r = self.client.container_get(prefix='test')
1091
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1092
                self.assertTrue(len(r.json) > 1)
1093
                self.assertEqual(len(r.json), len(lalobjects))
1094
                
1095

    
1096
                r = self.client.container_get(limit=1)
1097
                self.assertEqual(len(r.json), 1)
1098
                
1099

    
1100
                r = self.client.container_get(marker='another')
1101
                self.assertTrue(len(r.json) > 1)
1102
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1103
                self.assertEqual(len(r.json), len(neobjects))
1104
                
1105

    
1106
                r = self.client.container_get(prefix='another.test', delimiter='.')
1107
                self.assertTrue(fullLen > len(r.json))
1108
                
1109

    
1110
                r = self.client.container_get(path='/')
1111
                self.assertEqual(fullLen, len(r.json))
1112
                
1113

    
1114
                r = self.client.container_get(format='xml')
1115
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1116
                
1117

    
1118
                r = self.client.container_get(meta=['incontainer'])
1119
                self.assertTrue(len(r.json) > 0)
1120
                
1121

    
1122
                r = self.client.container_get(show_only_shared=True)
1123
                self.assertTrue(len(r.json) < fullLen)
1124
                
1125

    
1126
                try:
1127
                        r = self.client.container_get(until=1000000000)
1128
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1129
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1130
                        
1131
                except ClientError:
1132
                        
1133
                        pass
1134

    
1135
                """Check and if un/modified_since"""
1136
                for format in self.client.DATE_FORMATS:
1137
                        now_formated = self.now_unformated.strftime(format)
1138
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1139
                        sc1 = r1.status_code
1140
                        r1.release()
1141
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1142
                        sc2 = r2.status_code
1143
                        r2.release()
1144
                        self.assertNotEqual(sc1, sc2)
1145
           
1146
        def test_container_put(self):
1147
                """Test container_PUT"""
1148
                self.client.container = self.c2
1149

    
1150
                r = self.client.container_put()
1151
                self.assertEqual(r.status_code, 202)
1152
                
1153

    
1154
                r = self.client.get_container_quota(self.client.container)
1155
                cquota = r.values()[0]
1156
                newquota = 2*int(cquota)
1157

    
1158
                r = self.client.container_put(quota=newquota)
1159
                self.assertEqual(r.status_code, 202)
1160
                
1161
                r = self.client.get_container_quota(self.client.container)
1162
                xquota = int(r.values()[0])
1163
                self.assertEqual(newquota, xquota)
1164

    
1165
                r = self.client.container_put(versioning='auto')
1166
                self.assertEqual(r.status_code, 202)
1167
                
1168
                r = self.client.get_container_versioning(self.client.container)
1169
                nvers = r.values()[0]
1170
                self.assertEqual('auto', nvers)
1171

    
1172
                r = self.client.container_put(versioning='none')
1173
                self.assertEqual(r.status_code, 202)
1174
                
1175
                r = self.client.get_container_versioning(self.client.container)
1176
                nvers = r.values()[0]
1177
                self.assertEqual('none', nvers)
1178

    
1179
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1180
                self.assertEqual(r.status_code, 202)
1181
                
1182
                r = self.client.get_container_meta(self.client.container)
1183
                self.assertTrue(r.has_key('x-container-meta-m1'))
1184
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1185
                self.assertTrue(r.has_key('x-container-meta-m2'))
1186
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1187

    
1188
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1189
                self.assertEqual(r.status_code, 202)
1190
                
1191
                r = self.client.get_container_meta(self.client.container)
1192
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1193
                self.assertTrue(r.has_key('x-container-meta-m2'))
1194
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1195
           
1196
                self.client.del_container_meta(self.client.container)
1197

    
1198
        def test_container_post(self):
1199
                """Test container_POST"""
1200
                self.client.container = self.c2
1201

    
1202
                """Simple post"""
1203
                r = self.client.container_post()
1204
                self.assertEqual(r.status_code, 202)
1205
                
1206

    
1207
                """post meta"""
1208
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1209
                r = self.client.get_container_meta(self.client.container)
1210
                self.assertTrue(r.has_key('x-container-meta-m1'))
1211
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1212
                self.assertTrue(r.has_key('x-container-meta-m2'))
1213
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1214

    
1215
                """post/2del meta"""
1216
                r = self.client.del_container_meta('m1')
1217
                r = self.client.set_container_meta({'m2':'v2a'})
1218
                r = self.client.get_container_meta(self.client.container)
1219
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1220
                self.assertTrue(r.has_key('x-container-meta-m2'))
1221
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1222

    
1223
                """check quota"""
1224
                r = self.client.get_container_quota(self.client.container)
1225
                cquota = r.values()[0]
1226
                newquota = 2*int(cquota)
1227
                r = self.client.set_container_quota(newquota)
1228
                r = self.client.get_container_quota(self.client.container)
1229
                xquota = int(r.values()[0])
1230
                self.assertEqual(newquota, xquota)
1231
                r = self.client.set_container_quota(cquota)
1232
                r = self.client.get_container_quota(self.client.container)
1233
                xquota = r.values()[0]
1234
                self.assertEqual(cquota, xquota)
1235

    
1236
                """Check versioning"""
1237
                self.client.set_container_versioning('auto')
1238
                r = self.client.get_container_versioning(self.client.container)
1239
                nvers = r.values()[0]
1240
                self.assertEqual('auto', nvers)
1241
                self.client.set_container_versioning('none')
1242
                r = self.client.get_container_versioning(self.client.container)
1243
                nvers = r.values()[0]
1244
                self.assertEqual('none', nvers)
1245

    
1246
                """put_block uses content_type and content_length to
1247
                post blocks of data 2 container. All that in upload_object"""
1248
                """Change a file at fs"""
1249
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1250
                """Upload it at a directory in container"""
1251
                self.client.create_directory('dir')
1252
                newf = open(self.fname, 'r')
1253
                self.client.upload_object('/dir/sample.file', newf)
1254
                newf.close()
1255
                """Check if file has been uploaded"""
1256
                r = self.client.get_object_info('/dir/sample.file')
1257
                self.assertTrue(int(r['content-length']) > 100000000)
1258

    
1259
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1260
                #TODO
1261

    
1262
                """Check update=False"""
1263
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1264
                
1265
                r = self.client.get_object_info('test')
1266
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1267
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1268

    
1269
                r = self.client.del_container_meta('m2')
1270

    
1271
        def test_container_delete(self):
1272
                """Test container_DELETE"""
1273

    
1274
                """Fail to delete a non-empty container"""
1275
                self.client.container = self.c2
1276
                r = self.client.container_delete(success=409)
1277
                self.assertEqual(r.status_code, 409)
1278
                
1279

    
1280
                """Fail to delete c3 (empty) container"""
1281
                self.client.container = self.c3
1282
                r = self.client.container_delete(until='1000000000')
1283
                self.assertEqual(r.status_code, 204)
1284
                
1285

    
1286
                """Delete c3 (empty) container"""
1287
                r = self.client.container_delete()
1288
                self.assertEqual(r.status_code, 204)
1289

    
1290
                """Purge container(empty a container), check versionlist"""
1291
                self.client.container = self.c1
1292
                r = self.client.object_head('test', success=(200, 404))
1293
                self.assertEqual(r.status_code, 200)
1294
                self.client.del_container(delimiter='/')
1295
                r = self.client.object_head('test', success=(200, 404))
1296
                self.assertEqual(r.status_code, 404)
1297
                r = self.client.get_object_versionlist('test')
1298
                self.assertTrue(len(r) > 0)
1299
                self.assertTrue(len(r[0])>1)
1300
                self.client.purge_container()
1301
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1302

    
1303
        def test_object_head(self):
1304
                """Test object_HEAD"""
1305
                self.client.container = self.c2
1306
                obj = 'test'
1307

    
1308
                r = self.client.object_head(obj)
1309
                self.assertEqual(r.status_code, 200)
1310
                etag = r.headers['etag']
1311
                
1312

    
1313
                r = self.client.object_head(obj, version=40)
1314
                self.assertEqual(r.headers['x-object-version'], '40')
1315
                
1316

    
1317
                r = self.client.object_head(obj, if_etag_match=etag)
1318
                self.assertEqual(r.status_code, 200)
1319
                
1320
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1321
                self.assertNotEqual(r.status_code, 200)
1322
                
1323

    
1324
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1325
                self.assertEqual(r.status_code, 412)
1326
                
1327

    
1328
                """Check and if(un)modified_since"""
1329
                for format in self.client.DATE_FORMATS:
1330
                        now_formated = self.now_unformated.strftime(format)
1331
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1332
                                success=(200, 304, 412))
1333
                        sc1 = r1.status_code
1334
                        r1.release()
1335
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1336
                                success=(200, 304, 412))
1337
                        sc2 = r2.status_code
1338
                        r2.release()
1339
                        self.assertNotEqual(sc1, sc2)
1340

    
1341
        def test_object_get(self):
1342
                """Test object_GET"""
1343
                self.client.container = self.c1
1344
                obj = 'test'
1345

    
1346
                r = self.client.object_get(obj)
1347
                self.assertEqual(r.status_code, 200)
1348

    
1349
                osize = int(r.headers['content-length'])
1350
                etag = r.headers['etag']
1351
                
1352

    
1353
                r = self.client.object_get(obj, hashmap=True)
1354
                self.assertTrue(r.json.has_key('hashes') \
1355
                        and r.json.has_key('block_hash') \
1356
                        and r.json.has_key('block_size') \
1357
                        and r.json.has_key('bytes'))
1358
                
1359

    
1360
                r = self.client.object_get(obj, format='xml', hashmap=True)
1361
                self.assertEqual(len(r.text.split('hash>')), 3)
1362
                
1363

    
1364
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1365
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1366
                partsize = int(r.headers['content-length'])
1367
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1368
                
1369

    
1370
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1371
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1372
                partsize = int(r.headers['content-length'])
1373
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1374
                
1375

    
1376
                r = self.client.object_get(obj, if_etag_match=etag)
1377
                self.assertEqual(r.status_code, 200)
1378
                
1379

    
1380
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1381
                self.assertEqual(r.status_code, 200)
1382
                
1383

    
1384
                """Check and if(un)modified_since"""
1385
                for format in self.client.DATE_FORMATS:
1386
                        now_formated = self.now_unformated.strftime(format)
1387
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1388
                                success=(200, 304, 412))
1389
                        sc1 = r1.status_code
1390
                        r1.release()
1391
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1392
                        sc2 = r2.status_code
1393
                        r2.release()
1394
                        self.assertNotEqual(sc1, sc2)
1395

    
1396
        def test_object_put(self):
1397
                """Test object_PUT"""
1398

    
1399
                self.client.container = self.c2
1400
                obj='another.test'
1401

    
1402
                """create the object"""
1403
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1404
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1405
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1406
                        content_disposition='attachment; filename="fname.ext"')
1407
                self.assertEqual(r.status_code, 201)
1408
                etag = r.headers['etag']
1409
                
1410
                """Check content-disposition"""
1411
                r = self.client.get_object_info(obj)
1412
                self.assertTrue(r.has_key('content-disposition'))
1413

    
1414
                """Check permitions"""
1415
                r = self.client.get_object_sharing(obj)
1416
                self.assertTrue('accx:groupa' in r['read'])
1417
                self.assertTrue('u1' in r['read'])
1418
                self.assertTrue('u2' in r['write'])
1419
                self.assertTrue('u3' in r['write'])
1420

    
1421
                """Check metadata"""
1422
                r = self.client.get_object_meta(obj)
1423
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1424
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1425

    
1426
                """Check public and if_etag_match"""
1427
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1428
                        content_type='application/octet-stream', public=True)
1429
                
1430
                r = self.client.object_get(obj)
1431
                self.assertTrue(r.headers.has_key('x-object-public'))
1432
                vers2 = int(r.headers['x-object-version'])
1433
                etag = r.headers['etag']
1434
                self.assertEqual(r.text, 'b')
1435
                
1436
                """Check if_etag_not_match"""
1437
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1438
                        content_type='application/octet-stream', success=(201, 412))
1439
                self.assertEqual(r.status_code, 412)
1440
                
1441

    
1442
                """Check content_type and content_length"""
1443
                tmpdir = 'dir'+unicode(self.now)
1444
                r = self.client.object_put(tmpdir, content_type='application/directory',
1445
                        content_length=0)
1446
                
1447
                r = self.client.get_object_info(tmpdir)
1448
                self.assertEqual(r['content-type'], 'application/directory')
1449

    
1450
                """Check copy_from, content_encoding"""
1451
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1452
                        copy_from='/%s/%s'%(self.client.container, obj),
1453
                        content_encoding='application/octet-stream', 
1454
                        source_account=self.client.account,
1455
                        content_length=0, success=201)
1456
                self.assertEqual(r.status_code, 201)
1457

    
1458
                """Test copy_object for cross-conctainer copy"""
1459
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1460
                        dst_container=self.c1, dst_object=obj)
1461
                self.client.container = self.c1
1462
                r1 = self.client.get_object_info(obj)
1463
                self.client.container = self.c2
1464
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1465
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1466
                
1467
                """Check cross-container copy_from, content_encoding"""
1468
                self.client.container = self.c1
1469
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1470
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1471
                        content_encoding='application/octet-stream', 
1472
                        source_account=self.client.account,
1473
                        content_length=0, success=201)
1474
                
1475
                self.assertEqual(r.status_code, 201)
1476
                r = self.client.get_object_info(obj)
1477
                self.assertEqual(r['etag'], etag)
1478

    
1479
                """Check source_account"""
1480
                self.client.container = self.c2
1481
                fromstr = '/'+self.c1+'/'+obj
1482
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1483
                        content_encoding='application/octet-stream', 
1484
                        source_account='nonExistendAddress@NeverLand.com', 
1485
                        content_length=0, success=(201, 403))
1486
                self.assertEqual(r.status_code, 403)
1487
                
1488
                """Check cross-container move_from"""
1489
                self.client.container = self.c1
1490
                r1 = self.client.get_object_info(obj)
1491
                self.client.container = self.c2
1492
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1493
                dst_object=obj+'v0')
1494
                r0 = self.client.get_object_info(obj+'v0')
1495
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1496

    
1497
                """Check move_from"""
1498
                r = self.client.object_put(obj+'v1', format=None, 
1499
                        move_from='/'+self.c2+'/'+obj,
1500
                        source_version = vers2,
1501
                        content_encoding='application/octet-stream',
1502
                        content_length=0, success=201)
1503
                
1504
                """Check manifest"""
1505
                mobj = 'manifest.test'
1506
                txt = ''
1507
                for i in range(10):
1508
                        txt += '%s'%i
1509
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1510
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1511
                        
1512
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1513
                        manifest='%s/%s'%(self.client.container, mobj))
1514
                
1515
                r = self.client.object_get(mobj)
1516
                self.assertEqual(r.text, txt)
1517
           
1518
                """Upload a local file with one request"""
1519
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1520
                newf = open(self.fname, 'r')
1521
                self.client.upload_object('sample.file', newf)
1522
                newf.close()
1523
                """Check if file has been uploaded"""
1524
                r = self.client.get_object_info('sample.file')
1525
                self.assertEqual(int(r['content-length']), 10260)
1526

    
1527
                """Some problems with transfer-encoding?"""
1528

    
1529
        def test_object_copy(self):
1530
                """Test object_COPY"""
1531
                self.client.container=self.c2
1532
                obj = 'test2'
1533

    
1534
                data= '{"key1":"val1", "key2":"val2"}'
1535
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1536
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1537
                        permitions={
1538
                                'read':['accX:groupA', 'u1', 'u2'],
1539
                                'write':['u2', 'u3']},
1540
                        content_disposition='attachment; filename="fname.ext"')
1541
                
1542
                r = self.client.object_copy(obj+'orig',
1543
                        destination = '/'+self.client.container+'/'+obj,
1544
                        ignore_content_type=False, content_type='application/json', 
1545
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1546
                        permitions={'write':['u5', 'accX:groupB']})
1547
                self.assertEqual(r.status_code, 201)
1548
                
1549
                """Check content-disposition"""
1550
                r = self.client.get_object_info(obj)
1551
                self.assertTrue(r.has_key('content-disposition'))
1552

    
1553
                """Check Metadata"""
1554
                r = self.client.get_object_meta(obj)
1555
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1556
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1557
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1558

    
1559
                """Check permitions"""
1560
                r = self.client.get_object_sharing(obj)
1561
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1562
                self.assertTrue('accx:groupb' in r['write'])
1563

    
1564
                """Check destination account"""
1565
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1566
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1567
                        success=(201, 403))
1568
                self.assertEqual(r.status_code, 403)
1569
                
1570

    
1571
                """Check destination being another container
1572
                and also content_type and content encoding"""
1573
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1574
                        content_encoding='utf8', content_type='application/json')
1575
                self.assertEqual(r.status_code, 201)
1576
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1577
                
1578

    
1579
                """Check ignore_content_type and content_type"""
1580
                r = self.client.object_get(obj)
1581
                etag = r.headers['etag']
1582
                ctype = r.headers['content-type']
1583
                self.assertEqual(ctype, 'application/json')
1584
                
1585
                r = self.client.object_copy(obj+'orig',
1586
                        destination = '/'+self.client.container+'/'+obj+'0',
1587
                        ignore_content_type=True, content_type='application/json')
1588
                self.assertEqual(r.status_code, 201)
1589
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1590
                
1591

    
1592
                """Check if_etag_(not_)match"""
1593
                r = self.client.object_copy(obj,
1594
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1595
                self.assertEqual(r.status_code, 201)
1596
                
1597
                r = self.client.object_copy(obj,
1598
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1599
                self.assertEqual(r.status_code, 201)
1600
                vers2 = r.headers['x-object-version']
1601
                
1602

    
1603
                """Check source_version, public and format """
1604
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1605
                self.assertEqual(r.status_code, 201)
1606
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1607
                
1608
                r = self.client.get_object_info(obj+'3')
1609
                self.assertTrue(r.has_key('x-object-public'))
1610

    
1611
        def test_object_move(self):
1612
                """Test object_MOVE"""
1613
                self.client.container= self.c2
1614
                obj = 'test2'
1615

    
1616
                data= '{"key1":"val1", "key2":"val2"}'
1617
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1618
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1619
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1620
                
1621
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1622
                        ignore_content_type=False, content_type='application/json', 
1623
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1624
                        permitions={'write':['u5', 'accX:groupB']})
1625
                self.assertEqual(r.status_code, 201)
1626
                
1627

    
1628
                """Check Metadata"""
1629
                r = self.client.get_object_meta(obj)
1630
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1631
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1632
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1633

    
1634
                """Check permitions"""
1635
                r = self.client.get_object_sharing(obj)
1636
                self.assertFalse(r.has_key('read'))
1637
                self.assertTrue('u5' in r['write'])
1638
                self.assertTrue('accx:groupb' in r['write'])
1639

    
1640
                """Check destination account"""
1641
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1642
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1643
                        success=(201, 403))
1644
                self.assertEqual(r.status_code, 403)
1645
                
1646

    
1647
                """Check destination being another container and also
1648
                content_type, content_disposition and content encoding"""
1649
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1650
                        content_encoding='utf8', content_type='application/json',
1651
                        content_disposition='attachment; filename="fname.ext"')
1652
                self.assertEqual(r.status_code, 201)
1653
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1654
                self.client.container=self.c1
1655
                r = self.client.get_object_info(obj)
1656
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1657
                etag = r['etag']
1658
                ctype = r['content-type']
1659
                self.assertEqual(ctype, 'application/json')
1660

    
1661
                """Check ignore_content_type and content_type"""
1662
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1663
                        ignore_content_type=True, content_type='application/json')
1664
                self.assertEqual(r.status_code, 201)
1665
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1666
                
1667

    
1668
                """Check if_etag_(not_)match"""
1669
                self.client.container=self.c2
1670
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1671
                        if_etag_match=etag)
1672
                self.assertEqual(r.status_code, 201)
1673
                
1674
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1675
                        if_etag_not_match='lalala')
1676
                self.assertEqual(r.status_code, 201)
1677
                
1678

    
1679
                """Check public and format """
1680
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1681
                        format='xml', public=True)
1682
                self.assertEqual(r.status_code, 201)
1683
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1684
                
1685
                r = self.client.get_object_info(obj+'2')
1686
                self.assertTrue(r.has_key('x-object-public'))
1687

    
1688
        def test_object_post(self):
1689
                """Test object_POST"""
1690
                self.client.container=self.c2
1691
                obj = 'test2'
1692
                """create a filesystem file"""
1693
                self.fname = obj
1694
                newf = open(self.fname, 'w')
1695
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1696
                newf.close()
1697
                """create a file on container"""
1698
                r = self.client.object_put(obj, content_type='application/octet-stream',
1699
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1700
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1701
                
1702

    
1703
                """Append tests update, content_range, content_type, content_length"""
1704
                newf = open(obj, 'r')
1705
                self.client.append_object(obj, newf)
1706
                r = self.client.object_get(obj)
1707
                self.assertTrue(r.text.startswith('Hello!'))
1708
                
1709

    
1710
                """Overwrite tests update, content_type, content_length, content_range"""
1711
                newf.seek(0)
1712
                r = self.client.overwrite_object(obj, 0, 10, newf)
1713
                r = self.client.object_get(obj)
1714
                self.assertTrue(r.text.startswith('ello!'))
1715
                newf.close()
1716
                
1717
                
1718
                """Truncate tests update, content_range, content_type,
1719
                object_bytes and source_object"""
1720
                r = self.client.truncate_object(obj, 5)
1721
                r = self.client.object_get(obj)
1722
                self.assertEqual(r.text, 'ello!')
1723
                
1724

    
1725
                """Check metadata"""
1726
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1727
                r = self.client.get_object_meta(obj)
1728
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1729
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1730
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1731
                self.client.del_object_meta('mkey1', obj)
1732
                r = self.client.get_object_meta(obj)
1733
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1734

    
1735
                """Check permitions"""
1736
                self.client.set_object_sharing(obj,
1737
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1738
                r = self.client.get_object_sharing(obj)
1739
                self.assertTrue(r.has_key('read'))
1740
                self.assertTrue('u5' in r['read'])
1741
                self.assertTrue(r.has_key('write'))
1742
                self.assertTrue('u4' in r['write'])
1743
                self.client.del_object_sharing(obj)
1744
                r = self.client.get_object_sharing(obj)
1745
                self.assertTrue(len(r) == 0)
1746

    
1747
                """Check publish"""
1748
                self.client.publish_object(obj)
1749
                r = self.client.get_object_info(obj)
1750
                self.assertTrue(r.has_key('x-object-public'))
1751
                self.client.unpublish_object(obj)
1752
                r = self.client.get_object_info(obj)
1753
                self.assertFalse(r.has_key('x-object-public'))
1754

    
1755
                """Check if_etag_(not)match"""
1756
                etag = r['etag']
1757
                #r = self.client.object_post(obj, update=True, public=True,
1758
                #        if_etag_not_match=etag, success=(412,202,204))
1759
                #self.assertEqual(r.status_code, 412)
1760
                
1761
                r = self.client.object_post(obj, update=True, public=True,
1762
                        if_etag_match=etag, content_encoding='application/json')
1763
                
1764
                r = self.client.get_object_info(obj)
1765
                helloVersion = r['x-object-version']
1766
                self.assertTrue(r.has_key('x-object-public'))
1767
                self.assertEqual(r['content-encoding'], 'application/json')
1768

    
1769
                """Check source_version and source_account and content_disposition"""
1770
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1771
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1772
                        source_account='thisAccountWillNeverExist@adminland.com',
1773
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1774
                self.assertEqual(r.status_code, 403)
1775
                
1776
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1777
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1778
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1779
                        content_disposition='attachment; filename="fname.ext"')
1780
                
1781
                r = self.client.object_get(obj)
1782
                self.assertEqual(r.text, 'eello!')
1783
                self.assertTrue(r.headers.has_key('content-disposition')
1784
                        and 'fname.ext' in r.headers['content-disposition'])
1785
                
1786

    
1787
                """Check manifest"""
1788
                mobj = 'manifest.test'
1789
                txt = ''
1790
                for i in range(10):
1791
                        txt += '%s'%i
1792
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1793
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1794
                        
1795
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1796
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1797
                
1798
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1799
                
1800
                r = self.client.object_get(mobj)
1801
                self.assertEqual(r.text, txt)
1802
                
1803

    
1804
                """We need to check transfer_encoding """
1805

    
1806
        def test_object_delete(self):
1807
                """Test object_DELETE"""
1808
                self.client.container=self.c2
1809
                obj = 'test2'
1810
                """create a file on container"""
1811
                r = self.client.object_put(obj, content_type='application/octet-stream',
1812
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1813
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1814
                
1815

    
1816
                """Check with false until"""
1817
                r = self.client.object_delete(obj, until=1000000)
1818
                
1819
                r = self.client.object_get(obj, success=(200, 404))
1820
                self.assertEqual(r.status_code, 200)
1821
                
1822

    
1823
                """Check normal case"""
1824
                r = self.client.object_delete(obj)
1825
                self.assertEqual(r.status_code, 204)
1826
                
1827
                r = self.client.object_get(obj, success=(200, 404))
1828
                self.assertEqual(r.status_code, 404)
1829
                
1830

    
1831
        def create_large_file(self, size, name):
1832
                """Create a large file at fs"""
1833
                self.fname = name
1834
                import random
1835
                random.seed(self.now)
1836
                f = open(self.fname, 'w')
1837
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1838
                for hobyte_id in range(size/8):
1839
                        sss = 'hobt%s'%random.randint(1000, 9999)
1840
                        f.write(sss)
1841
                        if 0 == (hobyte_id*800)%size:
1842
                                f.write('\n')
1843
                                sys.stdout.write('\b\b')
1844
                                prs = (hobyte_id*800)//size
1845
                                if prs > 10:
1846
                                        sys.stdout.write('\b')
1847
                                sys.stdout.write('%s'%prs+'%')
1848
                                sys.stdout.flush()
1849
                print('\b\b\b100%')
1850
                f.close()
1851
                """"""
1852

    
1853
def init_parser():
1854
        parser = ArgumentParser(add_help=False)
1855
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1856
                help="Show this help message and exit")
1857
        return parser
1858

    
1859
if __name__ == '__main__':
1860
        parser = init_parser()
1861
        args, argv = parser.parse_known_args()
1862

    
1863
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1864
                raise Exception('\tusage: tests.py <group> [command]')
1865
        suiteFew = unittest.TestSuite()
1866

    
1867
        if len(argv) == 0 or argv[0] == 'pithos':
1868
                if len(argv) == 1:
1869
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1870
                else:
1871
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1872
        if len(argv) == 0 or argv[0] == 'cyclades':
1873
                if len(argv) == 1:
1874
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1875
                        suiteFew.addTest(testCyclades('test_000'))
1876
                else:
1877
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1878

    
1879
        unittest.TextTestRunner(verbosity = 2).run(suiteFew)