Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 388197fe

History | View | Annotate | Download (56.8 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

    
121
                self.client = cyclades(url, token)
122
                pass
123

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

    
177
        def _create_server(self, servername, flavorid, imageid, personality=None):
178
                server = self.client.create_server(servername, flavorid, imageid, personality)
179
                self.servers[servername] = server
180
                return server
181

    
182
        def _delete_server(self, servid):
183
                self.client.delete_server(servid)
184

    
185
        def _create_network(self, netname, **kwargs):
186
                net = self.client.create_network(netname, **kwargs)
187
                self.networks[net['id']] = net
188
                return net
189

    
190
        def _delete_network(self, netid)
191
                self.client.delete_network(netid)
192

    
193
        def if_not_all(foo):
194
                global TEST_ALL
195
                if TEST_ALL:
196
                        return None
197
                return foo
198

    
199
        def assert_dicts_are_deeply_equal(self, d1, d2):
200
                for k,v in d1.items():
201
                        self.assertTrue(d2.has_key(k))
202
                        if isinstance(v, dict):
203
                                self.assert_dicts_are_deeply_equal(v, d2[k])
204
                        else:
205
                                self.assertEqual(unicode(v), unicode(d2[k]))
206

    
207
        def test_000(self):
208
                "Prepare a full Cyclades test scenario"
209
                global TEST_ALL
210
                TEST_ALL = True
211

    
212
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
213
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
214

    
215
                print('testing')
216
                sys.stdout.write(' test create server')
217
                self._test_create_server()
218
                print('...ok')
219

    
220
                sys.stdout.write(' test list servers')
221
                self._test_list_servers()
222
                print('...ok')
223

    
224
                self._wait_for_status(self.server1['id'], 'BUILD')
225
                self._wait_for_status(self.server2['id'], 'BUILD')
226

    
227
                sys.stdout.write(' test get server details')
228
                self._test_get_server_details()
229
                print('...ok')
230

    
231
                sys.stdout.write(' test get image details')
232
                self._test_get_image_details()
233
                print('...ok')
234

    
235
                sys.stdout.write(' test update_server_name')
236
                self._test_update_server_name()
237
                print('...ok')
238

    
239

    
240
                sys.stdout.write(' test reboot_server')
241
                self._test_reboot_server()
242
                print('...ok')
243

    
244
                self._wait_for_status(self.server1['id'], 'REBOOT')
245
                self._wait_for_status(self.server2['id'], 'REBOOT')
246

    
247
                sys.stdout.write(' test create_server_metadata')
248
                self._test_create_server_metadata()
249
                print('...ok')
250

    
251
                sys.stdout.write(' test get_server_metadata')
252
                self._test_get_server_metadata()
253
                print('...ok')
254

    
255
                sys.stdout.write(' test update_server_metadata')
256
                self._test_update_server_metadata()
257
                print('...ok')
258

    
259
                sys.stdout.write(' test delete_server_metadata')
260
                self._test_delete_server_metadata()
261
                print('...ok')
262

    
263
                sys.stdout.write(' test list_flavors')
264
                self._test_list_flavors()
265
                print('...ok')
266

    
267
                sys.stdout.write(' test get_flavor_details')
268
                self._test_get_flavor_details()
269
                print('...ok')
270

    
271
                sys.stdout.write(' test list_images')
272
                self._test_list_images()
273
                print('...ok')
274

    
275
                sys.stdout.write(' test get_image_details')
276
                self._test_get_image_details()
277
                print('...ok')
278

    
279
                sys.stdout.write(' test get_image_metadata')
280
                self._test_get_image_metadata()
281
                print('...ok')
282

    
283
                sys.stdout.write(' test shutdown_server')
284
                self._test_shutdown_server()
285
                print('...ok')
286

    
287
                sys.stdout.write(' test start_server')
288
                self._test_start_server()
289
                print('...ok')
290

    
291
                sys.stdout.write(' test get_server_console')
292
                self._test_get_server_console()        
293
                print('...ok')
294

    
295
                sys.stdout.write(' test get_firewall_profile')
296
                self._test_get_firewall_profile()        
297
                print('...ok')
298

    
299
                sys.stdout.write(' test set_firewall_profile')
300
                self._test_set_firewall_profile()        
301
                print('...ok')
302

    
303
                sys.stdout.write(' test connect_server')
304
                self._test_connect_server()        
305
                print('...ok')
306

    
307
                sys.stdout.write(' test list_server_nics')
308
                self._test_list_server_nics()        
309
                print('...ok')
310

    
311
                """Don't have auth for these:
312
                sys.stdout.write(' test delete_image')
313
                self._test_delete_image()
314
                print('...ok')
315
                sys.stdout.write(' test create_image_metadata')
316
                self._test_create_image_metadata()
317
                print('...ok')
318
                sys.stdout.write(' test update_image_metadata')
319
                self._test_update_image_metadata()
320
                print('...ok')
321
                sys.stdout.write(' test delete_image_metadata')
322
                self._test_delete_image_metadata()
323
                print('...ok')
324
                """
325

    
326
        def _has_status(self, servid, status):
327
                r = self.client.get_server_details(servid)
328
                return r['status'] == status
329
        def _wait_for_status(self, servid, status):
330
                wait = 0
331
                c=['|','/','-','\\']
332
                while self._has_status(servid, status):
333
                        if wait:
334
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
335
                                for i in range(4*wait):
336
                                        sys.stdout.write('\b%s'%c[i%4])
337
                                        sys.stdout.flush()
338
                                        time.sleep(0.25)
339
                                print('\b ')
340
                        wait = (wait + 3) if wait<60 else 0
341

    
342
        @if_not_all
343
        def test_list_servers(self):
344
                """Test list servers"""
345
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
346
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
347
                self._test_list_servers()
348

    
349
        def _test_list_servers(self):
350
                servers = self.client.list_servers()
351
                dservers = self.client.list_servers(detail=True)
352

    
353
                """detailed and simple are same size"""
354
                self.assertEqual(len(dservers), len(servers))
355
                for i in range(len(servers)):
356
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
357
                                'status', 'updated']:
358
                                self.assertFalse(servers[i].has_key(field))
359
                                self.assertTrue(dservers[i].has_key(field))
360

    
361
                """detailed and simple contain same names"""
362
                names = sorted(map(lambda x: x["name"], servers))
363
                dnames = sorted(map(lambda x: x["name"], dservers))
364
                self.assertEqual(names, dnames)
365

    
366
        @if_not_all
367
        def test_create_server(self):
368
                """Test create_server"""
369
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
370
                self._wait_for_status(self.server1['id'], 'BUILD')
371
                self._test_create_server()
372

    
373
        def _test_create_server(self):
374
                self.assertEqual(self.server1["name"], self.servname1)
375
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
376
                self.assertEqual(self.server1["imageRef"], self.img)
377
                self.assertEqual(self.server1["status"], "BUILD")
378

    
379
        @if_not_all
380
        def test_get_server_details(self):
381
                """Test get_server_details"""
382
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
383
                self._wait_for_status(self.server1['id'], 'BUILD')
384
                self._test_get_server_details()
385

    
386
        def _test_get_server_details(self):
387
                r = self.client.get_server_details(self.server1['id'])
388
                self.assertEqual(r["name"], self.servname1)
389
                self.assertEqual(r["flavorRef"], self.flavorid)
390
                self.assertEqual(r["imageRef"], self.img)
391
                self.assertEqual(r["status"], "ACTIVE")
392

    
393
        @if_not_all
394
        def test_get_image_details(self):
395
                """Test get_image_details"""
396
                self._test_get_image_details()
397

    
398
        def _test_get_image_details(self):
399
                r = self.client.get_image_details(self.img)
400
                d = self.img_details
401
                self.assert_dicts_are_deeply_equal(r, d)
402

    
403
        @if_not_all
404
        def test_update_server_name(self):
405
                """Test update_server_name"""
406
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
407
                self._test_update_server_name()
408

    
409
        def _test_update_server_name(self):
410
                new_name = self.servname1+'_new_name'
411
                self.client.update_server_name(self.server1['id'], new_name)
412
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
413
                self.assertEqual(r['name'], new_name)
414
                changed = self.servers.pop(self.servname1)
415
                changed['name'] = new_name
416
                self.servers[new_name] = changed
417

    
418
        @if_not_all
419
        def test_reboot_server(self):
420
                """Test reboot server"""
421
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
422
                self._wait_for_status(self.server1['id'], 'BUILD')
423
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
424
                self._wait_for_status(self.server2['id'], 'BUILD')
425
                self._test_reboot_server()
426
                self._wait_for_status(self.server1['id'], 'REBOOT')
427
                self._wait_for_status(self.server2['id'], 'REBOOT')
428

    
429
        def _test_reboot_server(self):
430
                self.client.reboot_server(self.server1['id'])
431
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
432
                self.client.reboot_server(self.server2['id'], hard=True)
433
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
434

    
435
        @if_not_all
436
        def test_get_server_metadata(self):
437
                """Test get server_metadata"""
438
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
439
                self._test_get_server_metadata()
440
        def _test_get_server_metadata(self):
441
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
442
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
443
                self.assertEqual(r['mymeta_0'], 'val_0')
444

    
445
        @if_not_all
446
        def test_create_server_metadata(self):
447
                """Test create_server_metadata"""
448
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
449
                self._test_create_server_metadata()
450

    
451
        def _test_create_server_metadata(self):
452
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
453
                self.assertTrue(r1.has_key('mymeta'))
454
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
455
                self.assert_dicts_are_deeply_equal(r1, r2)
456

    
457
        @if_not_all
458
        def test_update_server_metadata(self):
459
                """Test update_server_metadata"""
460
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
461
                self._test_update_server_metadata()
462

    
463
        def _test_update_server_metadata(self):
464
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
465
                self.assertTrue(r1.has_key('mymeta3'))
466
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
467
                self.assertTrue(r2['mymeta3'], 'val3')
468

    
469
        @if_not_all
470
        def test_delete_server_metadata(self):
471
                """Test delete_server_metadata"""
472
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
473
                self._test_delete_server_metadata()
474

    
475
        def _test_delete_server_metadata(self):
476
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
477
                self.assertTrue(r1.has_key('mymeta'))
478
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
479
                try:
480
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
481
                        raise ClientError('Wrong Error', status=100)
482
                except ClientError as err:
483
                        self.assertEqual(err.status, 404)
484

    
485
        @if_not_all
486
        def test_list_flavors(self):
487
                """Test flavors_get"""
488
                self._test_list_flavors()
489

    
490
        def _test_list_flavors(self):
491
                r = self.client.list_flavors()
492
                self.assertTrue(len(r) > 1)
493
                r = self.client.list_flavors(detail=True)
494
                self.assertTrue(r[0].has_key('SNF:disk_template'))
495

    
496
        @if_not_all
497
        def test_get_flavor_details(self):
498
                """Test test_get_flavor_details"""
499
                self._test_get_flavor_details()
500

    
501
        def _test_get_flavor_details(self):
502
                r = self.client.get_flavor_details(self.flavorid)
503
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
504

    
505
        @if_not_all
506
        def test_list_images(self):
507
                """Test list_images"""
508
                self._test_list_images()
509

    
510
        def _test_list_images(self):
511
                r = self.client.list_images()
512
                self.assertTrue(len(r) > 1)
513
                r = self.client.list_images(detail=True)
514
                for detailed_img in r:
515
                        if detailed_img['id'] == self.img:
516
                                break
517
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
518

    
519
        @if_not_all
520
        def test_image_details(self):
521
                """Test image_details"""
522
                self._test_get_image_details
523

    
524
        def _test_get_image_details(self):
525
                r = self.client.get_image_details(self.img)
526
                self.assert_dicts_are_deeply_equal(r, self.img_details)
527

    
528
        @if_not_all
529
        def test_get_image_metadata(self):
530
                """Test get_image_metadata"""
531
                self._test_get_image_metadata()
532

    
533
        def _test_get_image_metadata(self):
534
                r = self.client.get_image_metadata(self.img)
535
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
536
                for key,val in self.img_details['metadata']['values'].items():
537
                        r = self.client.get_image_metadata(self.img, key)
538
                        self.assertEqual(r[key], val)
539

    
540
        @if_not_all
541
        def test_start_server(self):
542
                """Test start_server"""
543
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
544
                self._wait_for_status(self.server1['id'], 'BUILD')
545
                self.client.shutdown_server(self.server1['id'])
546
                self._wait_for_status(self.server1['id'], 'ACTIVE')
547
                self._test_start_server()
548

    
549
        def _test_start_server(self):
550
                self.client.start_server(self.server1['id'])
551
                self._wait_for_status(self.server1['id'], 'STOPPED')
552
                r = self.client.get_server_details(self.server1['id'])
553
                self.assertEqual(r['status'], 'ACTIVE')
554

    
555
        @if_not_all
556
        def test_shutdown_server(self):
557
                """Test shutdown_server"""
558
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
559
                self._wait_for_status(self.server1['id'], 'BUILD')
560
                self._test_shutdown_server()
561

    
562
        def _test_shutdown_server(self):
563
                self.client.shutdown_server(self.server1['id'])
564
                self._wait_for_status(self.server1['id'], 'ACTIVE')
565
                r = self.client.get_server_details(self.server1['id'])
566
                self.assertEqual(r['status'], 'STOPPED')
567

    
568
        @if_not_all
569
        def test_get_server_console(self):
570
                """Test get_server_console"""
571
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
572
                self._test_get_server_console()
573

    
574
        def _test_get_server_console(self):
575
                self._wait_for_status(self.server2['id'], 'BUILD')
576
                r = self.client.get_server_console(self.server2['id'])
577
                self.assertTrue(r.has_key('host'))
578
                self.assertTrue(r.has_key('password'))
579
                self.assertTrue(r.has_key('port'))
580
                self.assertTrue(r.has_key('type'))
581

    
582
        @if_not_all
583
        def test_get_firewall_profile(self):
584
                """Test get_firewall_profile"""
585
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
586
                self._test_get_firewall_profile()
587

    
588
        def _test_get_firewall_profile(self):
589
                self._wait_for_status(self.server1['id'], 'BUILD')
590
                fprofile = self.client.get_firewall_profile(self.server1['id'])
591
                self.assertTrue(fprofile in self.PROFILES)
592

    
593
        @if_not_all
594
        def test_set_firewall_profile(self):
595
                """Test set_firewall_profile"""
596
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
597
                self._test_set_firewall_profile()
598

    
599
        def _test_set_firewall_profile(self):
600
                def next_profile(cur_profile):
601
                        index = self.PROFILES.index(cur_profile)
602
                        new_index = 0 if index >= len(self.PROFILES)-1 else (index+1)
603
                        return self.PROFILES[new_index]
604

    
605
                self._wait_for_status(self.server1['id'], 'BUILD')
606
                fprofile = self.client.get_firewall_profile(self.server1['id'])
607
                for counter in range(1,1+len(self.PROFILES)):
608
                        nprofile = next_profile(fprofile)
609
                        start=fprofile
610
                        print('\tProfile swap %s: %s -> %s'%(counter, fprofile, nprofile))
611
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
612
                        wait = 3
613
                        c=['|','/','-','\\']
614
                        while fprofile != nprofile:
615
                                self.assertEqual(fprofile, start)
616
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
617
                                for i in range(4*wait):
618
                                        sys.stdout.write('\b%s'%c[i%4])
619
                                        sys.stdout.flush()
620
                                        time.sleep(0.25)
621
                                wait += 3
622
                                print('\b ')
623
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
624

    
625
        #untested tests from here:
626
        @if_not_all
627
        def test_connect_server(self):
628
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
629
                self._test_connect_server()
630

    
631
        def _test_connect_server(self):
632
                newnet = self._create_network('mynet')
633
                self.client.connect_server(self.server1['id'], newnet['id'])
634
                s1nics = self.list_server_nics(self.server1['id'])
635
                self.assertTrue(newnet['id'] in s1nics['id'])
636

    
637
        @if_not_all
638
        def test_list_server_nics(self):
639
                """Test list_server_nics"""
640
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
641
                self._test_list_server_nics()
642

    
643
        def _test_list_server_nics(self):
644
                r = self.client.list_server_nics(self.server1['id'])
645
                len0 = len(r)
646
                self.assertTrue(len0>0)
647
                self.assertTrue('public' in [net['id'] for net in r])
648

    
649
                newnet = self._create_network('mynet_list_nics')
650
                self.client.connect_server(self.server1['id'], newnet['id'])
651
                r = self.client.list_server_nics(self.server1['id'])
652
                self.assertTrue(len(r)>len0)
653

    
654

    
655
        """ Don't have auth to test this
656
        @if_not_all
657
        def test_delete_image(self):
658
                ""Test delete_image""
659
                self._test_delete_image()
660
        def _test_delete_image(self):
661
                images = self.client.list_images()
662
                self.client.delete_image(images[2]['id'])
663
                try:
664
                        r = self.client.get_image_details(images[2]['id'], success=(400))
665
                except ClientError as err:
666
                        self.assertEqual(err.status, 404)
667

668
        @if_not_all
669
        def test_create_image_metadata(self):
670
                ""Test create_image_metadata""
671
                self._test_create_image_metadata()
672
        def _test_create_image_metadata(self):
673
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
674
                self.assertEqual(r['mykey'], 'myval')
675

676
        @if_not_all
677
        def test_update_image_metadata(self):
678
                ""Test update_image_metadata""
679
                self._test_update_image_metadata()
680
        def _test_update_image_metadata(self):
681
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
682
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
683
                self.assertEqual(r['mykey0'], 'myval0')
684

685
        @if_not_all
686
        def test_delete_image_metadata(self):
687
                ""Test delete_image_metadata""
688
                self._test_delete_image_metadata()
689
        def _test_delete_image_metadata(self):
690
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
691
                self.client.delete_image_metadata(self.img, 'mykey1')
692
                r = self.client.get_image_metadata(self.img)
693
                self.assertNotEqual(r.has_key('mykey1'))
694
        """
695

    
696
class testPithos(unittest.TestCase):
697
        """Set up a Pithos+ thorough test"""
698
        def setUp(self):
699
                """
700
                url = 'http://127.0.0.1:8000/v1'
701
                token = 'C/yBXmz3XjTFBnujc2biAg=='
702
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
703
                account = 'admin@adminland.com'
704
                """
705

    
706
                url='https://pithos.okeanos.grnet.gr/v1'
707

    
708
                token='Kn+G9dfmlPLR2WFnhfBOow=='
709
                account='saxtouri@grnet.gr'
710

    
711
                """
712
                url='https://pithos.okeanos.io/v1'
713
                token='0TpoyAXqJSPxLdDuZHiLOA=='
714
                account='saxtouri@admin.grnet.gr'
715
                """
716
                
717
                """
718
                def add_handler(name, level, prefix=''):
719
                        h = logging.StreamHandler()
720
                        fmt = logging.Formatter(prefix + '%(message)s')
721
                        h.setFormatter(fmt)
722
                        logger = logging.getLogger(name)
723
                        logger.addHandler(h)
724
                        logger.setLevel(level)
725
                import logging
726
                sendlog = logging.getLogger('clients.send')
727
                recvlog = logging.getLogger('clients.recv')
728
                add_handler('requests', logging.INFO, prefix='* ')
729
                add_handler('clients.send', logging.INFO, prefix='> ')
730
                add_handler('clients.recv', logging.INFO, prefix='< ')
731
                """
732
                
733
                self.fname = None
734
                container=None
735
                self.client = pithos(url, token, account, container)
736
                self.now = time.mktime(time.gmtime())
737
                self.c1 = 'c1_'+unicode(self.now)
738
                self.c2 = 'c2_'+unicode(self.now)
739
                self.c3 = 'c3_'+unicode(self.now)
740

    
741

    
742
                self.client.create_container(self.c1)
743
                self.client.create_container(self.c2)
744
                self.client.create_container(self.c3)
745
                self.makeNewObject(self.c1, 'test')
746
                self.makeNewObject(self.c2, 'test')
747
                self.now_unformated = datetime.datetime.utcnow()
748
                self.makeNewObject(self.c1, 'test1')
749
                self.makeNewObject(self.c2, 'test1')
750
                """Prepare an object to be shared - also its container"""
751
                self.client.container = self.c1
752
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
753
                
754
                self.makeNewObject(self.c1, 'another.test')
755

    
756
        def makeNewObject(self, container, obj):
757
                self.client.container = container
758
                r = self.client.object_put(obj, content_type='application/octet-stream',
759
                        data= 'file '+obj+' that lives in '+container,
760
                        metadata={'incontainer':container})
761

    
762
        def forceDeleteContainer(self, container):
763
                self.client.container = container
764
                try:
765
                        r = self.client.list_objects()
766
                except ClientError:
767
                        return
768
                for obj in r:
769
                        name = obj['name']
770
                        self.client.del_object(name)
771
                r = self.client.container_delete()
772
                self.container = ''
773

    
774
        def tearDown(self):
775
                """Destroy test cases"""
776
                if self.fname is not None:
777
                        try:
778
                                os.remove(self.fname)
779
                        except OSError:
780
                                pass
781
                        self.fname = None
782
                self.forceDeleteContainer(self.c1)
783
                self.forceDeleteContainer(self.c2)
784
                try:
785
                        self.forceDeleteContainer(self.c3)
786
                except ClientError:
787
                        pass
788
                self.client.container=''
789

    
790
        def test_000(self):
791
                """Perform a full Pithos+ kamaki support test"""
792

    
793
        def test_account_head(self):
794
                """Test account_HEAD"""
795
                r = self.client.account_head()
796
                self.assertEqual(r.status_code, 204)
797
                
798
                r = self.client.account_head(until='1000000000')
799
                self.assertEqual(r.status_code, 204)
800
           
801
                r = self.client.get_account_info(until='1000000000') 
802
                datestring = unicode(r['x-account-until-timestamp'])
803
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
804

    
805
                r = self.client.get_account_quota()
806
                self.assertTrue(r.has_key('x-account-policy-quota'))
807

    
808
                r = self.client.get_account_versioning()
809
                self.assertTrue(r.has_key('x-account-policy-versioning'))
810

    
811
                """Check if(un)modified_since"""
812
                for format in self.client.DATE_FORMATS:
813
                        now_formated = self.now_unformated.strftime(format)
814
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
815
                        sc1 = r1.status_code
816
                        r1.release()
817
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
818
                        sc2 = r2.status_code
819
                        r2.release()
820
                        self.assertNotEqual(sc1, sc2)
821

    
822
        def test_account_get(self):
823
                """Test account_GET"""
824
                #r = self.client.account_get()
825
                #self.assertEqual(r.status_code, 200)
826
                r = self.client.list_containers()
827
                fullLen = len(r)
828
                self.assertTrue(fullLen > 2)
829
                
830
                r = self.client.account_get(limit=1)
831
                self.assertEqual(len(r.json), 1)
832
                
833

    
834
                r = self.client.account_get(marker='c2_')
835
                temp_c0 = r.json[0]['name']
836
                temp_c2 = r.json[2]['name']
837
                
838
                r = self.client.account_get(limit=2, marker='c2_')
839
                conames = [container['name'] for container in r.json \
840
                        if container['name'].lower().startswith('c2_')]
841
                self.assertTrue(temp_c0 in conames)
842
                self.assertFalse(temp_c2 in conames)
843
                
844

    
845
                r = self.client.account_get(show_only_shared=True)
846
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
847
                
848
                r = self.client.account_get(until=1342609206)
849
                self.assertTrue(len(r.json) <= fullLen)
850
                
851
                """Check if(un)modified_since"""
852
                for format in self.client.DATE_FORMATS:
853
                        now_formated = self.now_unformated.strftime(format)
854
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
855
                        sc1 = r1.status_code
856
                        r1.release()
857
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
858
                        sc2 = r2.status_code
859
                        r2.release()
860
                        self.assertNotEqual(sc1, sc2)
861

    
862
                """Check sharing_accounts"""
863
                r = self.client.get_sharing_accounts()
864
                self.assertTrue(len(r)>0)
865

    
866
        def test_account_post(self):
867
                """Test account_POST"""
868
                r = self.client.account_post()
869
                self.assertEqual(r.status_code, 202)
870
                grpName = 'grp'+unicode(self.now)
871
                
872

    
873
                """Method set/del_account_meta and set_account_groupcall use account_post internally
874
                """
875
                self.client.set_account_group(grpName, ['u1', 'u2'])
876
                r = self.client.get_account_group()
877
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
878
                self.client.del_account_group(grpName)
879
                r = self.client.get_account_group()
880
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
881

    
882
                mprefix = 'meta'+unicode(self.now)
883
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
884
                r = self.client.get_account_meta()
885
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
886
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
887

    
888
                self.client.del_account_meta(mprefix+'1')
889
                r = self.client.get_account_meta()
890
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
891

    
892
                self.client.del_account_meta(mprefix+'2')
893
                r = self.client.get_account_meta()
894
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
895

    
896
                """Missing testing for quota, versioning, because normally
897
                you don't have permitions to modify those at account level
898
                """
899

    
900
                newquota=1000000
901
                self.client.set_account_quota(newquota)
902
                #r = self.client.get_account_info()
903
                #print(unicode(r))
904
                #r = self.client.get_account_quota()
905
                #self.assertEqual(r['x-account-policy-quota'], newquota)
906
                self.client.set_account_versioning('auto')
907

    
908
        def test_container_head(self):
909
                """Test container_HEAD"""
910
                self.client.container = self.c1
911

    
912
                r = self.client.container_head()
913
                self.assertEqual(r.status_code, 204)
914
                
915
                """Check until"""
916
                r = self.client.container_head(until=1000000, success=(204, 404))
917
                self.assertEqual(r.status_code, 404)
918
                
919
                """Check and if(un)modified_since"""
920
                for format in self.client.DATE_FORMATS:
921
                        now_formated = self.now_unformated.strftime(format)
922
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
923
                        sc1=r1.status_code
924
                        r1.release()
925
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
926
                        sc2=r2.status_code
927
                        r2.release()
928
                        self.assertNotEqual(sc1, sc2)
929

    
930
                """Check container object meta"""
931
                r = self.client.get_container_object_meta()
932
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
933

    
934
        def test_container_get(self):
935
                """Test container_GET"""
936
                self.client.container = self.c1
937

    
938
                r = self.client.container_get()
939
                self.assertEqual(r.status_code, 200)
940
                fullLen = len(r.json)
941
                
942

    
943
                r = self.client.container_get(prefix='test')
944
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
945
                self.assertTrue(len(r.json) > 1)
946
                self.assertEqual(len(r.json), len(lalobjects))
947
                
948

    
949
                r = self.client.container_get(limit=1)
950
                self.assertEqual(len(r.json), 1)
951
                
952

    
953
                r = self.client.container_get(marker='another')
954
                self.assertTrue(len(r.json) > 1)
955
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
956
                self.assertEqual(len(r.json), len(neobjects))
957
                
958

    
959
                r = self.client.container_get(prefix='another.test', delimiter='.')
960
                self.assertTrue(fullLen > len(r.json))
961
                
962

    
963
                r = self.client.container_get(path='/')
964
                self.assertEqual(fullLen, len(r.json))
965
                
966

    
967
                r = self.client.container_get(format='xml')
968
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
969
                
970

    
971
                r = self.client.container_get(meta=['incontainer'])
972
                self.assertTrue(len(r.json) > 0)
973
                
974

    
975
                r = self.client.container_get(show_only_shared=True)
976
                self.assertTrue(len(r.json) < fullLen)
977
                
978

    
979
                try:
980
                        r = self.client.container_get(until=1000000000)
981
                        datestring = unicode(r.headers['x-account-until-timestamp'])
982
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
983
                        
984
                except ClientError:
985
                        
986
                        pass
987

    
988
                """Check and if un/modified_since"""
989
                for format in self.client.DATE_FORMATS:
990
                        now_formated = self.now_unformated.strftime(format)
991
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
992
                        sc1 = r1.status_code
993
                        r1.release()
994
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
995
                        sc2 = r2.status_code
996
                        r2.release()
997
                        self.assertNotEqual(sc1, sc2)
998
           
999
        def test_container_put(self):
1000
                """Test container_PUT"""
1001
                self.client.container = self.c2
1002

    
1003
                r = self.client.container_put()
1004
                self.assertEqual(r.status_code, 202)
1005
                
1006

    
1007
                r = self.client.get_container_quota(self.client.container)
1008
                cquota = r.values()[0]
1009
                newquota = 2*int(cquota)
1010

    
1011
                r = self.client.container_put(quota=newquota)
1012
                self.assertEqual(r.status_code, 202)
1013
                
1014
                r = self.client.get_container_quota(self.client.container)
1015
                xquota = int(r.values()[0])
1016
                self.assertEqual(newquota, xquota)
1017

    
1018
                r = self.client.container_put(versioning='auto')
1019
                self.assertEqual(r.status_code, 202)
1020
                
1021
                r = self.client.get_container_versioning(self.client.container)
1022
                nvers = r.values()[0]
1023
                self.assertEqual('auto', nvers)
1024

    
1025
                r = self.client.container_put(versioning='none')
1026
                self.assertEqual(r.status_code, 202)
1027
                
1028
                r = self.client.get_container_versioning(self.client.container)
1029
                nvers = r.values()[0]
1030
                self.assertEqual('none', nvers)
1031

    
1032
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1033
                self.assertEqual(r.status_code, 202)
1034
                
1035
                r = self.client.get_container_meta(self.client.container)
1036
                self.assertTrue(r.has_key('x-container-meta-m1'))
1037
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1038
                self.assertTrue(r.has_key('x-container-meta-m2'))
1039
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1040

    
1041
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1042
                self.assertEqual(r.status_code, 202)
1043
                
1044
                r = self.client.get_container_meta(self.client.container)
1045
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1046
                self.assertTrue(r.has_key('x-container-meta-m2'))
1047
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1048
           
1049
                self.client.del_container_meta(self.client.container)
1050

    
1051
        def test_container_post(self):
1052
                """Test container_POST"""
1053
                self.client.container = self.c2
1054

    
1055
                """Simple post"""
1056
                r = self.client.container_post()
1057
                self.assertEqual(r.status_code, 202)
1058
                
1059

    
1060
                """post meta"""
1061
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1062
                r = self.client.get_container_meta(self.client.container)
1063
                self.assertTrue(r.has_key('x-container-meta-m1'))
1064
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1065
                self.assertTrue(r.has_key('x-container-meta-m2'))
1066
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1067

    
1068
                """post/2del meta"""
1069
                r = self.client.del_container_meta('m1')
1070
                r = self.client.set_container_meta({'m2':'v2a'})
1071
                r = self.client.get_container_meta(self.client.container)
1072
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1073
                self.assertTrue(r.has_key('x-container-meta-m2'))
1074
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1075

    
1076
                """check quota"""
1077
                r = self.client.get_container_quota(self.client.container)
1078
                cquota = r.values()[0]
1079
                newquota = 2*int(cquota)
1080
                r = self.client.set_container_quota(newquota)
1081
                r = self.client.get_container_quota(self.client.container)
1082
                xquota = int(r.values()[0])
1083
                self.assertEqual(newquota, xquota)
1084
                r = self.client.set_container_quota(cquota)
1085
                r = self.client.get_container_quota(self.client.container)
1086
                xquota = r.values()[0]
1087
                self.assertEqual(cquota, xquota)
1088

    
1089
                """Check versioning"""
1090
                self.client.set_container_versioning('auto')
1091
                r = self.client.get_container_versioning(self.client.container)
1092
                nvers = r.values()[0]
1093
                self.assertEqual('auto', nvers)
1094
                self.client.set_container_versioning('none')
1095
                r = self.client.get_container_versioning(self.client.container)
1096
                nvers = r.values()[0]
1097
                self.assertEqual('none', nvers)
1098

    
1099
                """put_block uses content_type and content_length to
1100
                post blocks of data 2 container. All that in upload_object"""
1101
                """Change a file at fs"""
1102
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1103
                """Upload it at a directory in container"""
1104
                self.client.create_directory('dir')
1105
                newf = open(self.fname, 'r')
1106
                self.client.upload_object('/dir/sample.file', newf)
1107
                newf.close()
1108
                """Check if file has been uploaded"""
1109
                r = self.client.get_object_info('/dir/sample.file')
1110
                self.assertTrue(int(r['content-length']) > 100000000)
1111

    
1112
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1113
                #TODO
1114

    
1115
                """Check update=False"""
1116
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1117
                
1118
                r = self.client.get_object_info('test')
1119
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1120
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1121

    
1122
                r = self.client.del_container_meta('m2')
1123

    
1124
        def test_container_delete(self):
1125
                """Test container_DELETE"""
1126

    
1127
                """Fail to delete a non-empty container"""
1128
                self.client.container = self.c2
1129
                r = self.client.container_delete(success=409)
1130
                self.assertEqual(r.status_code, 409)
1131
                
1132

    
1133
                """Fail to delete c3 (empty) container"""
1134
                self.client.container = self.c3
1135
                r = self.client.container_delete(until='1000000000')
1136
                self.assertEqual(r.status_code, 204)
1137
                
1138

    
1139
                """Delete c3 (empty) container"""
1140
                r = self.client.container_delete()
1141
                self.assertEqual(r.status_code, 204)
1142

    
1143
                """Purge container(empty a container), check versionlist"""
1144
                self.client.container = self.c1
1145
                r = self.client.object_head('test', success=(200, 404))
1146
                self.assertEqual(r.status_code, 200)
1147
                self.client.del_container(delimiter='/')
1148
                r = self.client.object_head('test', success=(200, 404))
1149
                self.assertEqual(r.status_code, 404)
1150
                r = self.client.get_object_versionlist('test')
1151
                self.assertTrue(len(r) > 0)
1152
                self.assertTrue(len(r[0])>1)
1153
                self.client.purge_container()
1154
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1155

    
1156
        def test_object_head(self):
1157
                """Test object_HEAD"""
1158
                self.client.container = self.c2
1159
                obj = 'test'
1160

    
1161
                r = self.client.object_head(obj)
1162
                self.assertEqual(r.status_code, 200)
1163
                etag = r.headers['etag']
1164
                
1165

    
1166
                r = self.client.object_head(obj, version=40)
1167
                self.assertEqual(r.headers['x-object-version'], '40')
1168
                
1169

    
1170
                r = self.client.object_head(obj, if_etag_match=etag)
1171
                self.assertEqual(r.status_code, 200)
1172
                
1173
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1174
                self.assertNotEqual(r.status_code, 200)
1175
                
1176

    
1177
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1178
                self.assertEqual(r.status_code, 412)
1179
                
1180

    
1181
                """Check and if(un)modified_since"""
1182
                for format in self.client.DATE_FORMATS:
1183
                        now_formated = self.now_unformated.strftime(format)
1184
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1185
                                success=(200, 304, 412))
1186
                        sc1 = r1.status_code
1187
                        r1.release()
1188
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1189
                                success=(200, 304, 412))
1190
                        sc2 = r2.status_code
1191
                        r2.release()
1192
                        self.assertNotEqual(sc1, sc2)
1193

    
1194
        def test_object_get(self):
1195
                """Test object_GET"""
1196
                self.client.container = self.c1
1197
                obj = 'test'
1198

    
1199
                r = self.client.object_get(obj)
1200
                self.assertEqual(r.status_code, 200)
1201

    
1202
                osize = int(r.headers['content-length'])
1203
                etag = r.headers['etag']
1204
                
1205

    
1206
                r = self.client.object_get(obj, hashmap=True)
1207
                self.assertTrue(r.json.has_key('hashes') \
1208
                        and r.json.has_key('block_hash') \
1209
                        and r.json.has_key('block_size') \
1210
                        and r.json.has_key('bytes'))
1211
                
1212

    
1213
                r = self.client.object_get(obj, format='xml', hashmap=True)
1214
                self.assertEqual(len(r.text.split('hash>')), 3)
1215
                
1216

    
1217
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1218
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1219
                partsize = int(r.headers['content-length'])
1220
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1221
                
1222

    
1223
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1224
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1225
                partsize = int(r.headers['content-length'])
1226
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1227
                
1228

    
1229
                r = self.client.object_get(obj, if_etag_match=etag)
1230
                self.assertEqual(r.status_code, 200)
1231
                
1232

    
1233
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1234
                self.assertEqual(r.status_code, 200)
1235
                
1236

    
1237
                """Check and if(un)modified_since"""
1238
                for format in self.client.DATE_FORMATS:
1239
                        now_formated = self.now_unformated.strftime(format)
1240
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1241
                                success=(200, 304, 412))
1242
                        sc1 = r1.status_code
1243
                        r1.release()
1244
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1245
                        sc2 = r2.status_code
1246
                        r2.release()
1247
                        self.assertNotEqual(sc1, sc2)
1248

    
1249
        def test_object_put(self):
1250
                """Test object_PUT"""
1251

    
1252
                self.client.container = self.c2
1253
                obj='another.test'
1254

    
1255
                """create the object"""
1256
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1257
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1258
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1259
                        content_disposition='attachment; filename="fname.ext"')
1260
                self.assertEqual(r.status_code, 201)
1261
                etag = r.headers['etag']
1262
                
1263
                """Check content-disposition"""
1264
                r = self.client.get_object_info(obj)
1265
                self.assertTrue(r.has_key('content-disposition'))
1266

    
1267
                """Check permitions"""
1268
                r = self.client.get_object_sharing(obj)
1269
                self.assertTrue('accx:groupa' in r['read'])
1270
                self.assertTrue('u1' in r['read'])
1271
                self.assertTrue('u2' in r['write'])
1272
                self.assertTrue('u3' in r['write'])
1273

    
1274
                """Check metadata"""
1275
                r = self.client.get_object_meta(obj)
1276
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1277
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1278

    
1279
                """Check public and if_etag_match"""
1280
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1281
                        content_type='application/octet-stream', public=True)
1282
                
1283
                r = self.client.object_get(obj)
1284
                self.assertTrue(r.headers.has_key('x-object-public'))
1285
                vers2 = int(r.headers['x-object-version'])
1286
                etag = r.headers['etag']
1287
                self.assertEqual(r.text, 'b')
1288
                
1289
                """Check if_etag_not_match"""
1290
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1291
                        content_type='application/octet-stream', success=(201, 412))
1292
                self.assertEqual(r.status_code, 412)
1293
                
1294

    
1295
                """Check content_type and content_length"""
1296
                tmpdir = 'dir'+unicode(self.now)
1297
                r = self.client.object_put(tmpdir, content_type='application/directory',
1298
                        content_length=0)
1299
                
1300
                r = self.client.get_object_info(tmpdir)
1301
                self.assertEqual(r['content-type'], 'application/directory')
1302

    
1303
                """Check copy_from, content_encoding"""
1304
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1305
                        copy_from='/%s/%s'%(self.client.container, obj),
1306
                        content_encoding='application/octet-stream', 
1307
                        source_account=self.client.account,
1308
                        content_length=0, success=201)
1309
                self.assertEqual(r.status_code, 201)
1310

    
1311
                """Test copy_object for cross-conctainer copy"""
1312
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1313
                        dst_container=self.c1, dst_object=obj)
1314
                self.client.container = self.c1
1315
                r1 = self.client.get_object_info(obj)
1316
                self.client.container = self.c2
1317
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1318
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1319
                
1320
                """Check cross-container copy_from, content_encoding"""
1321
                self.client.container = self.c1
1322
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1323
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1324
                        content_encoding='application/octet-stream', 
1325
                        source_account=self.client.account,
1326
                        content_length=0, success=201)
1327
                
1328
                self.assertEqual(r.status_code, 201)
1329
                r = self.client.get_object_info(obj)
1330
                self.assertEqual(r['etag'], etag)
1331

    
1332
                """Check source_account"""
1333
                self.client.container = self.c2
1334
                fromstr = '/'+self.c1+'/'+obj
1335
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1336
                        content_encoding='application/octet-stream', 
1337
                        source_account='nonExistendAddress@NeverLand.com', 
1338
                        content_length=0, success=(201, 403))
1339
                self.assertEqual(r.status_code, 403)
1340
                
1341
                """Check cross-container move_from"""
1342
                self.client.container = self.c1
1343
                r1 = self.client.get_object_info(obj)
1344
                self.client.container = self.c2
1345
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1346
                dst_object=obj+'v0')
1347
                r0 = self.client.get_object_info(obj+'v0')
1348
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1349

    
1350
                """Check move_from"""
1351
                r = self.client.object_put(obj+'v1', format=None, 
1352
                        move_from='/'+self.c2+'/'+obj,
1353
                        source_version = vers2,
1354
                        content_encoding='application/octet-stream',
1355
                        content_length=0, success=201)
1356
                
1357
                """Check manifest"""
1358
                mobj = 'manifest.test'
1359
                txt = ''
1360
                for i in range(10):
1361
                        txt += '%s'%i
1362
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1363
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1364
                        
1365
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1366
                        manifest='%s/%s'%(self.client.container, mobj))
1367
                
1368
                r = self.client.object_get(mobj)
1369
                self.assertEqual(r.text, txt)
1370
           
1371
                """Upload a local file with one request"""
1372
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1373
                newf = open(self.fname, 'r')
1374
                self.client.upload_object('sample.file', newf)
1375
                newf.close()
1376
                """Check if file has been uploaded"""
1377
                r = self.client.get_object_info('sample.file')
1378
                self.assertEqual(int(r['content-length']), 10260)
1379

    
1380
                """Some problems with transfer-encoding?"""
1381

    
1382
        def test_object_copy(self):
1383
                """Test object_COPY"""
1384
                self.client.container=self.c2
1385
                obj = 'test2'
1386

    
1387
                data= '{"key1":"val1", "key2":"val2"}'
1388
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1389
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1390
                        permitions={
1391
                                'read':['accX:groupA', 'u1', 'u2'],
1392
                                'write':['u2', 'u3']},
1393
                        content_disposition='attachment; filename="fname.ext"')
1394
                
1395
                r = self.client.object_copy(obj+'orig',
1396
                        destination = '/'+self.client.container+'/'+obj,
1397
                        ignore_content_type=False, content_type='application/json', 
1398
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1399
                        permitions={'write':['u5', 'accX:groupB']})
1400
                self.assertEqual(r.status_code, 201)
1401
                
1402
                """Check content-disposition"""
1403
                r = self.client.get_object_info(obj)
1404
                self.assertTrue(r.has_key('content-disposition'))
1405

    
1406
                """Check Metadata"""
1407
                r = self.client.get_object_meta(obj)
1408
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1409
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1410
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1411

    
1412
                """Check permitions"""
1413
                r = self.client.get_object_sharing(obj)
1414
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1415
                self.assertTrue('accx:groupb' in r['write'])
1416

    
1417
                """Check destination account"""
1418
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1419
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1420
                        success=(201, 403))
1421
                self.assertEqual(r.status_code, 403)
1422
                
1423

    
1424
                """Check destination being another container
1425
                and also content_type and content encoding"""
1426
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1427
                        content_encoding='utf8', content_type='application/json')
1428
                self.assertEqual(r.status_code, 201)
1429
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1430
                
1431

    
1432
                """Check ignore_content_type and content_type"""
1433
                r = self.client.object_get(obj)
1434
                etag = r.headers['etag']
1435
                ctype = r.headers['content-type']
1436
                self.assertEqual(ctype, 'application/json')
1437
                
1438
                r = self.client.object_copy(obj+'orig',
1439
                        destination = '/'+self.client.container+'/'+obj+'0',
1440
                        ignore_content_type=True, content_type='application/json')
1441
                self.assertEqual(r.status_code, 201)
1442
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1443
                
1444

    
1445
                """Check if_etag_(not_)match"""
1446
                r = self.client.object_copy(obj,
1447
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1448
                self.assertEqual(r.status_code, 201)
1449
                
1450
                r = self.client.object_copy(obj,
1451
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1452
                self.assertEqual(r.status_code, 201)
1453
                vers2 = r.headers['x-object-version']
1454
                
1455

    
1456
                """Check source_version, public and format """
1457
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1458
                self.assertEqual(r.status_code, 201)
1459
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1460
                
1461
                r = self.client.get_object_info(obj+'3')
1462
                self.assertTrue(r.has_key('x-object-public'))
1463

    
1464
        def test_object_move(self):
1465
                """Test object_MOVE"""
1466
                self.client.container= self.c2
1467
                obj = 'test2'
1468

    
1469
                data= '{"key1":"val1", "key2":"val2"}'
1470
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1471
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1472
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1473
                
1474
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1475
                        ignore_content_type=False, content_type='application/json', 
1476
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1477
                        permitions={'write':['u5', 'accX:groupB']})
1478
                self.assertEqual(r.status_code, 201)
1479
                
1480

    
1481
                """Check Metadata"""
1482
                r = self.client.get_object_meta(obj)
1483
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1484
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1485
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1486

    
1487
                """Check permitions"""
1488
                r = self.client.get_object_sharing(obj)
1489
                self.assertFalse(r.has_key('read'))
1490
                self.assertTrue('u5' in r['write'])
1491
                self.assertTrue('accx:groupb' in r['write'])
1492

    
1493
                """Check destination account"""
1494
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1495
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1496
                        success=(201, 403))
1497
                self.assertEqual(r.status_code, 403)
1498
                
1499

    
1500
                """Check destination being another container and also
1501
                content_type, content_disposition and content encoding"""
1502
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1503
                        content_encoding='utf8', content_type='application/json',
1504
                        content_disposition='attachment; filename="fname.ext"')
1505
                self.assertEqual(r.status_code, 201)
1506
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1507
                self.client.container=self.c1
1508
                r = self.client.get_object_info(obj)
1509
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1510
                etag = r['etag']
1511
                ctype = r['content-type']
1512
                self.assertEqual(ctype, 'application/json')
1513

    
1514
                """Check ignore_content_type and content_type"""
1515
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1516
                        ignore_content_type=True, content_type='application/json')
1517
                self.assertEqual(r.status_code, 201)
1518
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1519
                
1520

    
1521
                """Check if_etag_(not_)match"""
1522
                self.client.container=self.c2
1523
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1524
                        if_etag_match=etag)
1525
                self.assertEqual(r.status_code, 201)
1526
                
1527
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1528
                        if_etag_not_match='lalala')
1529
                self.assertEqual(r.status_code, 201)
1530
                
1531

    
1532
                """Check public and format """
1533
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1534
                        format='xml', public=True)
1535
                self.assertEqual(r.status_code, 201)
1536
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1537
                
1538
                r = self.client.get_object_info(obj+'2')
1539
                self.assertTrue(r.has_key('x-object-public'))
1540

    
1541
        def test_object_post(self):
1542
                """Test object_POST"""
1543
                self.client.container=self.c2
1544
                obj = 'test2'
1545
                """create a filesystem file"""
1546
                self.fname = obj
1547
                newf = open(self.fname, 'w')
1548
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1549
                newf.close()
1550
                """create a file on container"""
1551
                r = self.client.object_put(obj, content_type='application/octet-stream',
1552
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1553
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1554
                
1555

    
1556
                """Append tests update, content_range, content_type, content_length"""
1557
                newf = open(obj, 'r')
1558
                self.client.append_object(obj, newf)
1559
                r = self.client.object_get(obj)
1560
                self.assertTrue(r.text.startswith('Hello!'))
1561
                
1562

    
1563
                """Overwrite tests update, content_type, content_length, content_range"""
1564
                newf.seek(0)
1565
                r = self.client.overwrite_object(obj, 0, 10, newf)
1566
                r = self.client.object_get(obj)
1567
                self.assertTrue(r.text.startswith('ello!'))
1568
                newf.close()
1569
                
1570
                
1571
                """Truncate tests update, content_range, content_type,
1572
                object_bytes and source_object"""
1573
                r = self.client.truncate_object(obj, 5)
1574
                r = self.client.object_get(obj)
1575
                self.assertEqual(r.text, 'ello!')
1576
                
1577

    
1578
                """Check metadata"""
1579
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1580
                r = self.client.get_object_meta(obj)
1581
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1582
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1583
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1584
                self.client.del_object_meta('mkey1', obj)
1585
                r = self.client.get_object_meta(obj)
1586
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1587

    
1588
                """Check permitions"""
1589
                self.client.set_object_sharing(obj,
1590
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1591
                r = self.client.get_object_sharing(obj)
1592
                self.assertTrue(r.has_key('read'))
1593
                self.assertTrue('u5' in r['read'])
1594
                self.assertTrue(r.has_key('write'))
1595
                self.assertTrue('u4' in r['write'])
1596
                self.client.del_object_sharing(obj)
1597
                r = self.client.get_object_sharing(obj)
1598
                self.assertTrue(len(r) == 0)
1599

    
1600
                """Check publish"""
1601
                self.client.publish_object(obj)
1602
                r = self.client.get_object_info(obj)
1603
                self.assertTrue(r.has_key('x-object-public'))
1604
                self.client.unpublish_object(obj)
1605
                r = self.client.get_object_info(obj)
1606
                self.assertFalse(r.has_key('x-object-public'))
1607

    
1608
                """Check if_etag_(not)match"""
1609
                etag = r['etag']
1610
                #r = self.client.object_post(obj, update=True, public=True,
1611
                #        if_etag_not_match=etag, success=(412,202,204))
1612
                #self.assertEqual(r.status_code, 412)
1613
                
1614
                r = self.client.object_post(obj, update=True, public=True,
1615
                        if_etag_match=etag, content_encoding='application/json')
1616
                
1617
                r = self.client.get_object_info(obj)
1618
                helloVersion = r['x-object-version']
1619
                self.assertTrue(r.has_key('x-object-public'))
1620
                self.assertEqual(r['content-encoding'], 'application/json')
1621

    
1622
                """Check source_version and source_account and content_disposition"""
1623
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1624
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1625
                        source_account='thisAccountWillNeverExist@adminland.com',
1626
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1627
                self.assertEqual(r.status_code, 403)
1628
                
1629
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1630
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1631
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1632
                        content_disposition='attachment; filename="fname.ext"')
1633
                
1634
                r = self.client.object_get(obj)
1635
                self.assertEqual(r.text, 'eello!')
1636
                self.assertTrue(r.headers.has_key('content-disposition')
1637
                        and 'fname.ext' in r.headers['content-disposition'])
1638
                
1639

    
1640
                """Check manifest"""
1641
                mobj = 'manifest.test'
1642
                txt = ''
1643
                for i in range(10):
1644
                        txt += '%s'%i
1645
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1646
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1647
                        
1648
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1649
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1650
                
1651
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1652
                
1653
                r = self.client.object_get(mobj)
1654
                self.assertEqual(r.text, txt)
1655
                
1656

    
1657
                """We need to check transfer_encoding """
1658

    
1659
        def test_object_delete(self):
1660
                """Test object_DELETE"""
1661
                self.client.container=self.c2
1662
                obj = 'test2'
1663
                """create a file on container"""
1664
                r = self.client.object_put(obj, content_type='application/octet-stream',
1665
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1666
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1667
                
1668

    
1669
                """Check with false until"""
1670
                r = self.client.object_delete(obj, until=1000000)
1671
                
1672
                r = self.client.object_get(obj, success=(200, 404))
1673
                self.assertEqual(r.status_code, 200)
1674
                
1675

    
1676
                """Check normal case"""
1677
                r = self.client.object_delete(obj)
1678
                self.assertEqual(r.status_code, 204)
1679
                
1680
                r = self.client.object_get(obj, success=(200, 404))
1681
                self.assertEqual(r.status_code, 404)
1682
                
1683

    
1684
        def create_large_file(self, size, name):
1685
                """Create a large file at fs"""
1686
                self.fname = name
1687
                import random
1688
                random.seed(self.now)
1689
                f = open(self.fname, 'w')
1690
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1691
                for hobyte_id in range(size/8):
1692
                        sss = 'hobt%s'%random.randint(1000, 9999)
1693
                        f.write(sss)
1694
                        if 0 == (hobyte_id*800)%size:
1695
                                f.write('\n')
1696
                                sys.stdout.write('\b\b')
1697
                                prs = (hobyte_id*800)//size
1698
                                if prs > 10:
1699
                                        sys.stdout.write('\b')
1700
                                sys.stdout.write('%s'%prs+'%')
1701
                                sys.stdout.flush()
1702
                print('\b\b\b100%')
1703
                f.close()
1704
                """"""
1705

    
1706
def init_parser():
1707
        parser = ArgumentParser(add_help=False)
1708
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1709
                help="Show this help message and exit")
1710
        return parser
1711

    
1712
if __name__ == '__main__':
1713
        parser = init_parser()
1714
        args, argv = parser.parse_known_args()
1715

    
1716
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1717
                raise Exception('\tusage: tests.py <group> [command]')
1718
        suiteFew = unittest.TestSuite()
1719

    
1720
        if len(argv) == 0 or argv[0] == 'pithos':
1721
                if len(argv) == 1:
1722
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1723
                else:
1724
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1725
        if len(argv) == 0 or argv[0] == 'cyclades':
1726
                if len(argv) == 1:
1727
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1728
                        suiteFew.addTest(testCyclades('test_000'))
1729
                else:
1730
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1731

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