Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ ec786e22

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

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

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

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

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

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

    
192
        def _delete_network(self, netid):
193
                print('Delete network %s'%netid)
194
                self.client.delete_network(netid)
195

    
196
        def if_not_all(foo):
197
                global TEST_ALL
198
                if TEST_ALL:
199
                        return None
200
                return foo
201

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

    
210
        def test_000(self):
211
                "Prepare a full Cyclades test scenario"
212
                global TEST_ALL
213
                TEST_ALL = True
214

    
215
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
216
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
217

    
218
                print('testing')
219
                sys.stdout.write(' test create server')
220
                self._test_create_server()
221
                print('...ok')
222

    
223
                sys.stdout.write(' test list servers')
224
                self._test_list_servers()
225
                print('...ok')
226

    
227
                self._wait_for_status(self.server1['id'], 'BUILD')
228
                self._wait_for_status(self.server2['id'], 'BUILD')
229

    
230
                sys.stdout.write(' test get server details')
231
                self._test_get_server_details()
232
                print('...ok')
233

    
234
                sys.stdout.write(' test get image details')
235
                self._test_get_image_details()
236
                print('...ok')
237

    
238
                sys.stdout.write(' test update_server_name')
239
                self._test_update_server_name()
240
                print('...ok')
241

    
242

    
243
                sys.stdout.write(' test reboot_server')
244
                self._test_reboot_server()
245
                print('...ok')
246

    
247
                self._wait_for_status(self.server1['id'], 'REBOOT')
248
                self._wait_for_status(self.server2['id'], 'REBOOT')
249

    
250
                sys.stdout.write(' test create_server_metadata')
251
                self._test_create_server_metadata()
252
                print('...ok')
253

    
254
                sys.stdout.write(' test get_server_metadata')
255
                self._test_get_server_metadata()
256
                print('...ok')
257

    
258
                sys.stdout.write(' test update_server_metadata')
259
                self._test_update_server_metadata()
260
                print('...ok')
261

    
262
                sys.stdout.write(' test delete_server_metadata')
263
                self._test_delete_server_metadata()
264
                print('...ok')
265

    
266
                sys.stdout.write(' test list_flavors')
267
                self._test_list_flavors()
268
                print('...ok')
269

    
270
                sys.stdout.write(' test get_flavor_details')
271
                self._test_get_flavor_details()
272
                print('...ok')
273

    
274
                sys.stdout.write(' test list_images')
275
                self._test_list_images()
276
                print('...ok')
277

    
278
                sys.stdout.write(' test get_image_details')
279
                self._test_get_image_details()
280
                print('...ok')
281

    
282
                sys.stdout.write(' test get_image_metadata')
283
                self._test_get_image_metadata()
284
                print('...ok')
285

    
286
                sys.stdout.write(' test shutdown_server')
287
                self._test_shutdown_server()
288
                print('...ok')
289

    
290
                sys.stdout.write(' test start_server')
291
                self._test_start_server()
292
                print('...ok')
293

    
294
                sys.stdout.write(' test get_server_console')
295
                self._test_get_server_console()        
296
                print('...ok')
297

    
298
                sys.stdout.write(' test get_firewall_profile')
299
                self._test_get_firewall_profile()        
300
                print('...ok')
301

    
302
                sys.stdout.write(' test set_firewall_profile')
303
                self._test_set_firewall_profile()        
304
                print('...ok')
305

    
306
                sys.stdout.write(' test get_server_stats')
307
                self._test_get_server_stats()        
308
                print('...ok')
309

    
310
                self.network1 = self._create_network(self.netname1)
311

    
312
                sys.stdout.write(' test list_networks')
313
                self._test_list_networks()        
314
                print('...ok')
315

    
316
                sys.stdout.write(' test connect_server')
317
                self._test_connect_server()        
318
                print('...ok')
319

    
320
                sys.stdout.write(' test list_server_nics')
321
                self._test_list_server_nics()        
322
                print('...ok')
323

    
324

    
325
                """Don't have auth for these:
326
                sys.stdout.write(' test delete_image')
327
                self._test_delete_image()
328
                print('...ok')
329
                sys.stdout.write(' test create_image_metadata')
330
                self._test_create_image_metadata()
331
                print('...ok')
332
                sys.stdout.write(' test update_image_metadata')
333
                self._test_update_image_metadata()
334
                print('...ok')
335
                sys.stdout.write(' test delete_image_metadata')
336
                self._test_delete_image_metadata()
337
                print('...ok')
338
                """
339

    
340
        def _has_status(self, servid, status):
341
                r = self.client.get_server_details(servid)
342
                return r['status'] == status
343
        def _wait_for_status(self, servid, status):
344
                wait = 0
345
                c=['|','/','-','\\']
346
                while self._has_status(servid, status):
347
                        if wait:
348
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
349
                                for i in range(4*wait):
350
                                        sys.stdout.write('\b%s'%c[i%4])
351
                                        sys.stdout.flush()
352
                                        time.sleep(0.25)
353
                                print('\b ')
354
                        wait = (wait + 3) if wait<60 else 0
355

    
356
        @if_not_all
357
        def test_list_servers(self):
358
                """Test list servers"""
359
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
360
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
361
                self._test_list_servers()
362

    
363
        def _test_list_servers(self):
364
                servers = self.client.list_servers()
365
                dservers = self.client.list_servers(detail=True)
366

    
367
                """detailed and simple are same size"""
368
                self.assertEqual(len(dservers), len(servers))
369
                for i in range(len(servers)):
370
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
371
                                'status', 'updated']:
372
                                self.assertFalse(servers[i].has_key(field))
373
                                self.assertTrue(dservers[i].has_key(field))
374

    
375
                """detailed and simple contain same names"""
376
                names = sorted(map(lambda x: x["name"], servers))
377
                dnames = sorted(map(lambda x: x["name"], dservers))
378
                self.assertEqual(names, dnames)
379

    
380
        @if_not_all
381
        def test_create_server(self):
382
                """Test create_server"""
383
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
384
                self._wait_for_status(self.server1['id'], 'BUILD')
385
                self._test_create_server()
386

    
387
        def _test_create_server(self):
388
                self.assertEqual(self.server1["name"], self.servname1)
389
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
390
                self.assertEqual(self.server1["imageRef"], self.img)
391
                self.assertEqual(self.server1["status"], "BUILD")
392

    
393
        @if_not_all
394
        def test_get_server_details(self):
395
                """Test get_server_details"""
396
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
397
                self._wait_for_status(self.server1['id'], 'BUILD')
398
                self._test_get_server_details()
399

    
400
        def _test_get_server_details(self):
401
                r = self.client.get_server_details(self.server1['id'])
402
                self.assertEqual(r["name"], self.servname1)
403
                self.assertEqual(r["flavorRef"], self.flavorid)
404
                self.assertEqual(r["imageRef"], self.img)
405
                self.assertEqual(r["status"], "ACTIVE")
406

    
407
        @if_not_all
408
        def test_get_image_details(self):
409
                """Test get_image_details"""
410
                self._test_get_image_details()
411

    
412
        def _test_get_image_details(self):
413
                r = self.client.get_image_details(self.img)
414
                d = self.img_details
415
                self.assert_dicts_are_deeply_equal(r, d)
416

    
417
        @if_not_all
418
        def test_update_server_name(self):
419
                """Test update_server_name"""
420
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
421
                self._test_update_server_name()
422

    
423
        def _test_update_server_name(self):
424
                new_name = self.servname1+'_new_name'
425
                self.client.update_server_name(self.server1['id'], new_name)
426
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
427
                self.assertEqual(r['name'], new_name)
428
                changed = self.servers.pop(self.servname1)
429
                changed['name'] = new_name
430
                self.servers[new_name] = changed
431

    
432
        @if_not_all
433
        def test_reboot_server(self):
434
                """Test reboot server"""
435
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
436
                self._wait_for_status(self.server1['id'], 'BUILD')
437
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
438
                self._wait_for_status(self.server2['id'], 'BUILD')
439
                self._test_reboot_server()
440
                self._wait_for_status(self.server1['id'], 'REBOOT')
441
                self._wait_for_status(self.server2['id'], 'REBOOT')
442

    
443
        def _test_reboot_server(self):
444
                self.client.reboot_server(self.server1['id'])
445
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
446
                self.client.reboot_server(self.server2['id'], hard=True)
447
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
448

    
449
        @if_not_all
450
        def test_get_server_metadata(self):
451
                """Test get server_metadata"""
452
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
453
                self._test_get_server_metadata()
454
        def _test_get_server_metadata(self):
455
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
456
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
457
                self.assertEqual(r['mymeta_0'], 'val_0')
458

    
459
        @if_not_all
460
        def test_create_server_metadata(self):
461
                """Test create_server_metadata"""
462
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
463
                self._test_create_server_metadata()
464

    
465
        def _test_create_server_metadata(self):
466
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
467
                self.assertTrue(r1.has_key('mymeta'))
468
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
469
                self.assert_dicts_are_deeply_equal(r1, r2)
470

    
471
        @if_not_all
472
        def test_update_server_metadata(self):
473
                """Test update_server_metadata"""
474
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
475
                self._test_update_server_metadata()
476

    
477
        def _test_update_server_metadata(self):
478
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
479
                self.assertTrue(r1.has_key('mymeta3'))
480
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
481
                self.assertTrue(r2['mymeta3'], 'val3')
482

    
483
        @if_not_all
484
        def test_delete_server_metadata(self):
485
                """Test delete_server_metadata"""
486
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
487
                self._test_delete_server_metadata()
488

    
489
        def _test_delete_server_metadata(self):
490
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
491
                self.assertTrue(r1.has_key('mymeta'))
492
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
493
                try:
494
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
495
                        raise ClientError('Wrong Error', status=100)
496
                except ClientError as err:
497
                        self.assertEqual(err.status, 404)
498

    
499
        @if_not_all
500
        def test_list_flavors(self):
501
                """Test flavors_get"""
502
                self._test_list_flavors()
503

    
504
        def _test_list_flavors(self):
505
                r = self.client.list_flavors()
506
                self.assertTrue(len(r) > 1)
507
                r = self.client.list_flavors(detail=True)
508
                self.assertTrue(r[0].has_key('SNF:disk_template'))
509

    
510
        @if_not_all
511
        def test_get_flavor_details(self):
512
                """Test test_get_flavor_details"""
513
                self._test_get_flavor_details()
514

    
515
        def _test_get_flavor_details(self):
516
                r = self.client.get_flavor_details(self.flavorid)
517
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
518

    
519
        @if_not_all
520
        def test_list_images(self):
521
                """Test list_images"""
522
                self._test_list_images()
523

    
524
        def _test_list_images(self):
525
                r = self.client.list_images()
526
                self.assertTrue(len(r) > 1)
527
                r = self.client.list_images(detail=True)
528
                for detailed_img in r:
529
                        if detailed_img['id'] == self.img:
530
                                break
531
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
532

    
533
        @if_not_all
534
        def test_image_details(self):
535
                """Test image_details"""
536
                self._test_get_image_details
537

    
538
        def _test_get_image_details(self):
539
                r = self.client.get_image_details(self.img)
540
                self.assert_dicts_are_deeply_equal(r, self.img_details)
541

    
542
        @if_not_all
543
        def test_get_image_metadata(self):
544
                """Test get_image_metadata"""
545
                self._test_get_image_metadata()
546

    
547
        def _test_get_image_metadata(self):
548
                r = self.client.get_image_metadata(self.img)
549
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
550
                for key,val in self.img_details['metadata']['values'].items():
551
                        r = self.client.get_image_metadata(self.img, key)
552
                        self.assertEqual(r[key], val)
553

    
554
        @if_not_all
555
        def test_start_server(self):
556
                """Test start_server"""
557
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
558
                self._wait_for_status(self.server1['id'], 'BUILD')
559
                self.client.shutdown_server(self.server1['id'])
560
                self._wait_for_status(self.server1['id'], 'ACTIVE')
561
                self._test_start_server()
562

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

    
569
        @if_not_all
570
        def test_shutdown_server(self):
571
                """Test shutdown_server"""
572
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
573
                self._wait_for_status(self.server1['id'], 'BUILD')
574
                self._test_shutdown_server()
575

    
576
        def _test_shutdown_server(self):
577
                self.client.shutdown_server(self.server1['id'])
578
                self._wait_for_status(self.server1['id'], 'ACTIVE')
579
                r = self.client.get_server_details(self.server1['id'])
580
                self.assertEqual(r['status'], 'STOPPED')
581

    
582
        @if_not_all
583
        def test_get_server_console(self):
584
                """Test get_server_console"""
585
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
586
                self._test_get_server_console()
587

    
588
        def _test_get_server_console(self):
589
                self._wait_for_status(self.server2['id'], 'BUILD')
590
                r = self.client.get_server_console(self.server2['id'])
591
                self.assertTrue(r.has_key('host'))
592
                self.assertTrue(r.has_key('password'))
593
                self.assertTrue(r.has_key('port'))
594
                self.assertTrue(r.has_key('type'))
595

    
596
        @if_not_all
597
        def test_get_firewall_profile(self):
598
                """Test get_firewall_profile"""
599
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
600
                self._test_get_firewall_profile()
601

    
602
        def _test_get_firewall_profile(self):
603
                self._wait_for_status(self.server1['id'], 'BUILD')
604
                fprofile = self.client.get_firewall_profile(self.server1['id'])
605
                self.assertTrue(fprofile in self.PROFILES)
606

    
607
        @if_not_all
608
        def test_set_firewall_profile(self):
609
                """Test set_firewall_profile"""
610
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
611
                self._test_set_firewall_profile()
612

    
613
        def _test_set_firewall_profile(self):
614
                def next_profile(cur_profile):
615
                        index = self.PROFILES.index(cur_profile)
616
                        new_index = 0 if index >= len(self.PROFILES)-1 else (index+1)
617
                        return self.PROFILES[new_index]
618

    
619
                self._wait_for_status(self.server1['id'], 'BUILD')
620
                fprofile = self.client.get_firewall_profile(self.server1['id'])
621
                for counter in range(1,1+len(self.PROFILES)):
622
                        nprofile = next_profile(fprofile)
623
                        start=fprofile
624
                        print('\tProfile swap %s: %s -> %s'%(counter, fprofile, nprofile))
625
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
626
                        wait = 3
627
                        c=['|','/','-','\\']
628
                        while fprofile != nprofile:
629
                                self.assertEqual(fprofile, start)
630
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
631
                                for i in range(4*wait):
632
                                        sys.stdout.write('\b%s'%c[i%4])
633
                                        sys.stdout.flush()
634
                                        time.sleep(0.25)
635
                                wait += 3
636
                                print('\b ')
637
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
638

    
639
        @if_not_all
640
        def test_get_server_stats(self):
641
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
642
                self._test_get_server_stats()
643

    
644
        def _test_get_server_stats(self):
645
                r = self.client.get_server_stats(self.server1['id'])
646
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
647
                        self.assertTrue(r.has_key(term))
648

    
649
        @if_not_all
650
        def test_list_networks(self):
651
                self.network1 = self._create_network(self.netname1)
652
                self._test_list_networks()
653

    
654
        def _test_list_networks(self):
655
                r = self.client.list_networks()
656
                self.assertTrue(len(r)>1)
657
                ids = [net['id'] for net in r]
658
                names = [net['name'] for net in r]
659
                self.assertTrue('public' in ids)
660
                self.assertTrue('public' in names)
661
                self.assertTrue(self.network1['id'] in ids)
662
                self.assertTrue(self.network1['name'] in names)
663

    
664
                r = self.client.list_networks(detail=True)
665
                ids = [net['id'] for net in r]
666
                names = [net['name'] for net in r]
667
                for net in r:
668
                        self.assertTrue(net['id'] in ids)
669
                        self.assertTrue(net['name'] in names)
670
                        for term in ('status', 'updated', 'created', 'servers'):
671
                                self.assertTrue(term in net.keys())
672

    
673
        #untested tests from here:
674
        @if_not_all
675
        def test_connect_server(self):
676
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
677
                self.network1 = self._create_network(self.netname1)
678
                self._test_connect_server()
679

    
680
        def _test_connect_server(self):
681
                self.client.connect_server(self.server1['id'], self.network1['id'])
682
                s1nics = self.list_server_nics(self.server1['id'])
683
                self.assertTrue(self.network1['id'] in s1nics['id'])
684

    
685
        @if_not_all
686
        def test_list_server_nics(self):
687
                """Test list_server_nics"""
688
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
689
                self.network1 = self._create_network(self.netname1)
690
                self._test_list_server_nics()
691

    
692
        def _test_list_server_nics(self):
693
                r = self.client.list_server_nics(self.server1['id'])
694
                len0 = len(r)
695
                self.assertTrue(len0>0)
696
                self.assertTrue('public' in [net['id'] for net in r])
697

    
698
                self.client.connect_server(self.server1['id'], self.network1['id'])
699
                r = self.client.list_server_nics(self.server1['id'])
700
                self.assertTrue(len(r)>len0)
701

    
702

    
703

    
704
        """ Don't have auth to test this
705
        @if_not_all
706
        def test_delete_image(self):
707
                ""Test delete_image""
708
                self._test_delete_image()
709
        def _test_delete_image(self):
710
                images = self.client.list_images()
711
                self.client.delete_image(images[2]['id'])
712
                try:
713
                        r = self.client.get_image_details(images[2]['id'], success=(400))
714
                except ClientError as err:
715
                        self.assertEqual(err.status, 404)
716

717
        @if_not_all
718
        def test_create_image_metadata(self):
719
                ""Test create_image_metadata""
720
                self._test_create_image_metadata()
721
        def _test_create_image_metadata(self):
722
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
723
                self.assertEqual(r['mykey'], 'myval')
724

725
        @if_not_all
726
        def test_update_image_metadata(self):
727
                ""Test update_image_metadata""
728
                self._test_update_image_metadata()
729
        def _test_update_image_metadata(self):
730
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
731
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
732
                self.assertEqual(r['mykey0'], 'myval0')
733

734
        @if_not_all
735
        def test_delete_image_metadata(self):
736
                ""Test delete_image_metadata""
737
                self._test_delete_image_metadata()
738
        def _test_delete_image_metadata(self):
739
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
740
                self.client.delete_image_metadata(self.img, 'mykey1')
741
                r = self.client.get_image_metadata(self.img)
742
                self.assertNotEqual(r.has_key('mykey1'))
743
        """
744

    
745
class testPithos(unittest.TestCase):
746
        """Set up a Pithos+ thorough test"""
747
        def setUp(self):
748
                """
749
                url = 'http://127.0.0.1:8000/v1'
750
                token = 'C/yBXmz3XjTFBnujc2biAg=='
751
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
752
                account = 'admin@adminland.com'
753
                """
754

    
755
                url='https://pithos.okeanos.grnet.gr/v1'
756

    
757
                token='Kn+G9dfmlPLR2WFnhfBOow=='
758
                account='saxtouri@grnet.gr'
759

    
760
                """
761
                url='https://pithos.okeanos.io/v1'
762
                token='0TpoyAXqJSPxLdDuZHiLOA=='
763
                account='saxtouri@admin.grnet.gr'
764
                """
765
                
766
                """
767
                def add_handler(name, level, prefix=''):
768
                        h = logging.StreamHandler()
769
                        fmt = logging.Formatter(prefix + '%(message)s')
770
                        h.setFormatter(fmt)
771
                        logger = logging.getLogger(name)
772
                        logger.addHandler(h)
773
                        logger.setLevel(level)
774
                import logging
775
                sendlog = logging.getLogger('clients.send')
776
                recvlog = logging.getLogger('clients.recv')
777
                add_handler('requests', logging.INFO, prefix='* ')
778
                add_handler('clients.send', logging.INFO, prefix='> ')
779
                add_handler('clients.recv', logging.INFO, prefix='< ')
780
                """
781
                
782
                self.fname = None
783
                container=None
784
                self.client = pithos(url, token, account, container)
785
                self.now = time.mktime(time.gmtime())
786
                self.c1 = 'c1_'+unicode(self.now)
787
                self.c2 = 'c2_'+unicode(self.now)
788
                self.c3 = 'c3_'+unicode(self.now)
789

    
790

    
791
                self.client.create_container(self.c1)
792
                self.client.create_container(self.c2)
793
                self.client.create_container(self.c3)
794
                self.makeNewObject(self.c1, 'test')
795
                self.makeNewObject(self.c2, 'test')
796
                self.now_unformated = datetime.datetime.utcnow()
797
                self.makeNewObject(self.c1, 'test1')
798
                self.makeNewObject(self.c2, 'test1')
799
                """Prepare an object to be shared - also its container"""
800
                self.client.container = self.c1
801
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
802
                
803
                self.makeNewObject(self.c1, 'another.test')
804

    
805
        def makeNewObject(self, container, obj):
806
                self.client.container = container
807
                r = self.client.object_put(obj, content_type='application/octet-stream',
808
                        data= 'file '+obj+' that lives in '+container,
809
                        metadata={'incontainer':container})
810

    
811
        def forceDeleteContainer(self, container):
812
                self.client.container = container
813
                try:
814
                        r = self.client.list_objects()
815
                except ClientError:
816
                        return
817
                for obj in r:
818
                        name = obj['name']
819
                        self.client.del_object(name)
820
                r = self.client.container_delete()
821
                self.container = ''
822

    
823
        def tearDown(self):
824
                """Destroy test cases"""
825
                if self.fname is not None:
826
                        try:
827
                                os.remove(self.fname)
828
                        except OSError:
829
                                pass
830
                        self.fname = None
831
                self.forceDeleteContainer(self.c1)
832
                self.forceDeleteContainer(self.c2)
833
                try:
834
                        self.forceDeleteContainer(self.c3)
835
                except ClientError:
836
                        pass
837
                self.client.container=''
838

    
839
        def test_000(self):
840
                """Perform a full Pithos+ kamaki support test"""
841

    
842
        def test_account_head(self):
843
                """Test account_HEAD"""
844
                r = self.client.account_head()
845
                self.assertEqual(r.status_code, 204)
846
                
847
                r = self.client.account_head(until='1000000000')
848
                self.assertEqual(r.status_code, 204)
849
           
850
                r = self.client.get_account_info(until='1000000000') 
851
                datestring = unicode(r['x-account-until-timestamp'])
852
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
853

    
854
                r = self.client.get_account_quota()
855
                self.assertTrue(r.has_key('x-account-policy-quota'))
856

    
857
                r = self.client.get_account_versioning()
858
                self.assertTrue(r.has_key('x-account-policy-versioning'))
859

    
860
                """Check if(un)modified_since"""
861
                for format in self.client.DATE_FORMATS:
862
                        now_formated = self.now_unformated.strftime(format)
863
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
864
                        sc1 = r1.status_code
865
                        r1.release()
866
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
867
                        sc2 = r2.status_code
868
                        r2.release()
869
                        self.assertNotEqual(sc1, sc2)
870

    
871
        def test_account_get(self):
872
                """Test account_GET"""
873
                #r = self.client.account_get()
874
                #self.assertEqual(r.status_code, 200)
875
                r = self.client.list_containers()
876
                fullLen = len(r)
877
                self.assertTrue(fullLen > 2)
878
                
879
                r = self.client.account_get(limit=1)
880
                self.assertEqual(len(r.json), 1)
881
                
882

    
883
                r = self.client.account_get(marker='c2_')
884
                temp_c0 = r.json[0]['name']
885
                temp_c2 = r.json[2]['name']
886
                
887
                r = self.client.account_get(limit=2, marker='c2_')
888
                conames = [container['name'] for container in r.json \
889
                        if container['name'].lower().startswith('c2_')]
890
                self.assertTrue(temp_c0 in conames)
891
                self.assertFalse(temp_c2 in conames)
892
                
893

    
894
                r = self.client.account_get(show_only_shared=True)
895
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
896
                
897
                r = self.client.account_get(until=1342609206)
898
                self.assertTrue(len(r.json) <= fullLen)
899
                
900
                """Check if(un)modified_since"""
901
                for format in self.client.DATE_FORMATS:
902
                        now_formated = self.now_unformated.strftime(format)
903
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
904
                        sc1 = r1.status_code
905
                        r1.release()
906
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
907
                        sc2 = r2.status_code
908
                        r2.release()
909
                        self.assertNotEqual(sc1, sc2)
910

    
911
                """Check sharing_accounts"""
912
                r = self.client.get_sharing_accounts()
913
                self.assertTrue(len(r)>0)
914

    
915
        def test_account_post(self):
916
                """Test account_POST"""
917
                r = self.client.account_post()
918
                self.assertEqual(r.status_code, 202)
919
                grpName = 'grp'+unicode(self.now)
920
                
921

    
922
                """Method set/del_account_meta and set_account_groupcall use account_post internally
923
                """
924
                self.client.set_account_group(grpName, ['u1', 'u2'])
925
                r = self.client.get_account_group()
926
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
927
                self.client.del_account_group(grpName)
928
                r = self.client.get_account_group()
929
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
930

    
931
                mprefix = 'meta'+unicode(self.now)
932
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
933
                r = self.client.get_account_meta()
934
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
935
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
936

    
937
                self.client.del_account_meta(mprefix+'1')
938
                r = self.client.get_account_meta()
939
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
940

    
941
                self.client.del_account_meta(mprefix+'2')
942
                r = self.client.get_account_meta()
943
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
944

    
945
                """Missing testing for quota, versioning, because normally
946
                you don't have permitions to modify those at account level
947
                """
948

    
949
                newquota=1000000
950
                self.client.set_account_quota(newquota)
951
                #r = self.client.get_account_info()
952
                #print(unicode(r))
953
                #r = self.client.get_account_quota()
954
                #self.assertEqual(r['x-account-policy-quota'], newquota)
955
                self.client.set_account_versioning('auto')
956

    
957
        def test_container_head(self):
958
                """Test container_HEAD"""
959
                self.client.container = self.c1
960

    
961
                r = self.client.container_head()
962
                self.assertEqual(r.status_code, 204)
963
                
964
                """Check until"""
965
                r = self.client.container_head(until=1000000, success=(204, 404))
966
                self.assertEqual(r.status_code, 404)
967
                
968
                """Check and if(un)modified_since"""
969
                for format in self.client.DATE_FORMATS:
970
                        now_formated = self.now_unformated.strftime(format)
971
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
972
                        sc1=r1.status_code
973
                        r1.release()
974
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
975
                        sc2=r2.status_code
976
                        r2.release()
977
                        self.assertNotEqual(sc1, sc2)
978

    
979
                """Check container object meta"""
980
                r = self.client.get_container_object_meta()
981
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
982

    
983
        def test_container_get(self):
984
                """Test container_GET"""
985
                self.client.container = self.c1
986

    
987
                r = self.client.container_get()
988
                self.assertEqual(r.status_code, 200)
989
                fullLen = len(r.json)
990
                
991

    
992
                r = self.client.container_get(prefix='test')
993
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
994
                self.assertTrue(len(r.json) > 1)
995
                self.assertEqual(len(r.json), len(lalobjects))
996
                
997

    
998
                r = self.client.container_get(limit=1)
999
                self.assertEqual(len(r.json), 1)
1000
                
1001

    
1002
                r = self.client.container_get(marker='another')
1003
                self.assertTrue(len(r.json) > 1)
1004
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1005
                self.assertEqual(len(r.json), len(neobjects))
1006
                
1007

    
1008
                r = self.client.container_get(prefix='another.test', delimiter='.')
1009
                self.assertTrue(fullLen > len(r.json))
1010
                
1011

    
1012
                r = self.client.container_get(path='/')
1013
                self.assertEqual(fullLen, len(r.json))
1014
                
1015

    
1016
                r = self.client.container_get(format='xml')
1017
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1018
                
1019

    
1020
                r = self.client.container_get(meta=['incontainer'])
1021
                self.assertTrue(len(r.json) > 0)
1022
                
1023

    
1024
                r = self.client.container_get(show_only_shared=True)
1025
                self.assertTrue(len(r.json) < fullLen)
1026
                
1027

    
1028
                try:
1029
                        r = self.client.container_get(until=1000000000)
1030
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1031
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1032
                        
1033
                except ClientError:
1034
                        
1035
                        pass
1036

    
1037
                """Check and if un/modified_since"""
1038
                for format in self.client.DATE_FORMATS:
1039
                        now_formated = self.now_unformated.strftime(format)
1040
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1041
                        sc1 = r1.status_code
1042
                        r1.release()
1043
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1044
                        sc2 = r2.status_code
1045
                        r2.release()
1046
                        self.assertNotEqual(sc1, sc2)
1047
           
1048
        def test_container_put(self):
1049
                """Test container_PUT"""
1050
                self.client.container = self.c2
1051

    
1052
                r = self.client.container_put()
1053
                self.assertEqual(r.status_code, 202)
1054
                
1055

    
1056
                r = self.client.get_container_quota(self.client.container)
1057
                cquota = r.values()[0]
1058
                newquota = 2*int(cquota)
1059

    
1060
                r = self.client.container_put(quota=newquota)
1061
                self.assertEqual(r.status_code, 202)
1062
                
1063
                r = self.client.get_container_quota(self.client.container)
1064
                xquota = int(r.values()[0])
1065
                self.assertEqual(newquota, xquota)
1066

    
1067
                r = self.client.container_put(versioning='auto')
1068
                self.assertEqual(r.status_code, 202)
1069
                
1070
                r = self.client.get_container_versioning(self.client.container)
1071
                nvers = r.values()[0]
1072
                self.assertEqual('auto', nvers)
1073

    
1074
                r = self.client.container_put(versioning='none')
1075
                self.assertEqual(r.status_code, 202)
1076
                
1077
                r = self.client.get_container_versioning(self.client.container)
1078
                nvers = r.values()[0]
1079
                self.assertEqual('none', nvers)
1080

    
1081
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1082
                self.assertEqual(r.status_code, 202)
1083
                
1084
                r = self.client.get_container_meta(self.client.container)
1085
                self.assertTrue(r.has_key('x-container-meta-m1'))
1086
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1087
                self.assertTrue(r.has_key('x-container-meta-m2'))
1088
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1089

    
1090
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1091
                self.assertEqual(r.status_code, 202)
1092
                
1093
                r = self.client.get_container_meta(self.client.container)
1094
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1095
                self.assertTrue(r.has_key('x-container-meta-m2'))
1096
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1097
           
1098
                self.client.del_container_meta(self.client.container)
1099

    
1100
        def test_container_post(self):
1101
                """Test container_POST"""
1102
                self.client.container = self.c2
1103

    
1104
                """Simple post"""
1105
                r = self.client.container_post()
1106
                self.assertEqual(r.status_code, 202)
1107
                
1108

    
1109
                """post meta"""
1110
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1111
                r = self.client.get_container_meta(self.client.container)
1112
                self.assertTrue(r.has_key('x-container-meta-m1'))
1113
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1114
                self.assertTrue(r.has_key('x-container-meta-m2'))
1115
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1116

    
1117
                """post/2del meta"""
1118
                r = self.client.del_container_meta('m1')
1119
                r = self.client.set_container_meta({'m2':'v2a'})
1120
                r = self.client.get_container_meta(self.client.container)
1121
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1122
                self.assertTrue(r.has_key('x-container-meta-m2'))
1123
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1124

    
1125
                """check quota"""
1126
                r = self.client.get_container_quota(self.client.container)
1127
                cquota = r.values()[0]
1128
                newquota = 2*int(cquota)
1129
                r = self.client.set_container_quota(newquota)
1130
                r = self.client.get_container_quota(self.client.container)
1131
                xquota = int(r.values()[0])
1132
                self.assertEqual(newquota, xquota)
1133
                r = self.client.set_container_quota(cquota)
1134
                r = self.client.get_container_quota(self.client.container)
1135
                xquota = r.values()[0]
1136
                self.assertEqual(cquota, xquota)
1137

    
1138
                """Check versioning"""
1139
                self.client.set_container_versioning('auto')
1140
                r = self.client.get_container_versioning(self.client.container)
1141
                nvers = r.values()[0]
1142
                self.assertEqual('auto', nvers)
1143
                self.client.set_container_versioning('none')
1144
                r = self.client.get_container_versioning(self.client.container)
1145
                nvers = r.values()[0]
1146
                self.assertEqual('none', nvers)
1147

    
1148
                """put_block uses content_type and content_length to
1149
                post blocks of data 2 container. All that in upload_object"""
1150
                """Change a file at fs"""
1151
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1152
                """Upload it at a directory in container"""
1153
                self.client.create_directory('dir')
1154
                newf = open(self.fname, 'r')
1155
                self.client.upload_object('/dir/sample.file', newf)
1156
                newf.close()
1157
                """Check if file has been uploaded"""
1158
                r = self.client.get_object_info('/dir/sample.file')
1159
                self.assertTrue(int(r['content-length']) > 100000000)
1160

    
1161
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1162
                #TODO
1163

    
1164
                """Check update=False"""
1165
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1166
                
1167
                r = self.client.get_object_info('test')
1168
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1169
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1170

    
1171
                r = self.client.del_container_meta('m2')
1172

    
1173
        def test_container_delete(self):
1174
                """Test container_DELETE"""
1175

    
1176
                """Fail to delete a non-empty container"""
1177
                self.client.container = self.c2
1178
                r = self.client.container_delete(success=409)
1179
                self.assertEqual(r.status_code, 409)
1180
                
1181

    
1182
                """Fail to delete c3 (empty) container"""
1183
                self.client.container = self.c3
1184
                r = self.client.container_delete(until='1000000000')
1185
                self.assertEqual(r.status_code, 204)
1186
                
1187

    
1188
                """Delete c3 (empty) container"""
1189
                r = self.client.container_delete()
1190
                self.assertEqual(r.status_code, 204)
1191

    
1192
                """Purge container(empty a container), check versionlist"""
1193
                self.client.container = self.c1
1194
                r = self.client.object_head('test', success=(200, 404))
1195
                self.assertEqual(r.status_code, 200)
1196
                self.client.del_container(delimiter='/')
1197
                r = self.client.object_head('test', success=(200, 404))
1198
                self.assertEqual(r.status_code, 404)
1199
                r = self.client.get_object_versionlist('test')
1200
                self.assertTrue(len(r) > 0)
1201
                self.assertTrue(len(r[0])>1)
1202
                self.client.purge_container()
1203
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1204

    
1205
        def test_object_head(self):
1206
                """Test object_HEAD"""
1207
                self.client.container = self.c2
1208
                obj = 'test'
1209

    
1210
                r = self.client.object_head(obj)
1211
                self.assertEqual(r.status_code, 200)
1212
                etag = r.headers['etag']
1213
                
1214

    
1215
                r = self.client.object_head(obj, version=40)
1216
                self.assertEqual(r.headers['x-object-version'], '40')
1217
                
1218

    
1219
                r = self.client.object_head(obj, if_etag_match=etag)
1220
                self.assertEqual(r.status_code, 200)
1221
                
1222
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1223
                self.assertNotEqual(r.status_code, 200)
1224
                
1225

    
1226
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1227
                self.assertEqual(r.status_code, 412)
1228
                
1229

    
1230
                """Check and if(un)modified_since"""
1231
                for format in self.client.DATE_FORMATS:
1232
                        now_formated = self.now_unformated.strftime(format)
1233
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1234
                                success=(200, 304, 412))
1235
                        sc1 = r1.status_code
1236
                        r1.release()
1237
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1238
                                success=(200, 304, 412))
1239
                        sc2 = r2.status_code
1240
                        r2.release()
1241
                        self.assertNotEqual(sc1, sc2)
1242

    
1243
        def test_object_get(self):
1244
                """Test object_GET"""
1245
                self.client.container = self.c1
1246
                obj = 'test'
1247

    
1248
                r = self.client.object_get(obj)
1249
                self.assertEqual(r.status_code, 200)
1250

    
1251
                osize = int(r.headers['content-length'])
1252
                etag = r.headers['etag']
1253
                
1254

    
1255
                r = self.client.object_get(obj, hashmap=True)
1256
                self.assertTrue(r.json.has_key('hashes') \
1257
                        and r.json.has_key('block_hash') \
1258
                        and r.json.has_key('block_size') \
1259
                        and r.json.has_key('bytes'))
1260
                
1261

    
1262
                r = self.client.object_get(obj, format='xml', hashmap=True)
1263
                self.assertEqual(len(r.text.split('hash>')), 3)
1264
                
1265

    
1266
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1267
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1268
                partsize = int(r.headers['content-length'])
1269
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1270
                
1271

    
1272
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1273
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1274
                partsize = int(r.headers['content-length'])
1275
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1276
                
1277

    
1278
                r = self.client.object_get(obj, if_etag_match=etag)
1279
                self.assertEqual(r.status_code, 200)
1280
                
1281

    
1282
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1283
                self.assertEqual(r.status_code, 200)
1284
                
1285

    
1286
                """Check and if(un)modified_since"""
1287
                for format in self.client.DATE_FORMATS:
1288
                        now_formated = self.now_unformated.strftime(format)
1289
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1290
                                success=(200, 304, 412))
1291
                        sc1 = r1.status_code
1292
                        r1.release()
1293
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1294
                        sc2 = r2.status_code
1295
                        r2.release()
1296
                        self.assertNotEqual(sc1, sc2)
1297

    
1298
        def test_object_put(self):
1299
                """Test object_PUT"""
1300

    
1301
                self.client.container = self.c2
1302
                obj='another.test'
1303

    
1304
                """create the object"""
1305
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1306
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1307
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1308
                        content_disposition='attachment; filename="fname.ext"')
1309
                self.assertEqual(r.status_code, 201)
1310
                etag = r.headers['etag']
1311
                
1312
                """Check content-disposition"""
1313
                r = self.client.get_object_info(obj)
1314
                self.assertTrue(r.has_key('content-disposition'))
1315

    
1316
                """Check permitions"""
1317
                r = self.client.get_object_sharing(obj)
1318
                self.assertTrue('accx:groupa' in r['read'])
1319
                self.assertTrue('u1' in r['read'])
1320
                self.assertTrue('u2' in r['write'])
1321
                self.assertTrue('u3' in r['write'])
1322

    
1323
                """Check metadata"""
1324
                r = self.client.get_object_meta(obj)
1325
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1326
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1327

    
1328
                """Check public and if_etag_match"""
1329
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1330
                        content_type='application/octet-stream', public=True)
1331
                
1332
                r = self.client.object_get(obj)
1333
                self.assertTrue(r.headers.has_key('x-object-public'))
1334
                vers2 = int(r.headers['x-object-version'])
1335
                etag = r.headers['etag']
1336
                self.assertEqual(r.text, 'b')
1337
                
1338
                """Check if_etag_not_match"""
1339
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1340
                        content_type='application/octet-stream', success=(201, 412))
1341
                self.assertEqual(r.status_code, 412)
1342
                
1343

    
1344
                """Check content_type and content_length"""
1345
                tmpdir = 'dir'+unicode(self.now)
1346
                r = self.client.object_put(tmpdir, content_type='application/directory',
1347
                        content_length=0)
1348
                
1349
                r = self.client.get_object_info(tmpdir)
1350
                self.assertEqual(r['content-type'], 'application/directory')
1351

    
1352
                """Check copy_from, content_encoding"""
1353
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1354
                        copy_from='/%s/%s'%(self.client.container, obj),
1355
                        content_encoding='application/octet-stream', 
1356
                        source_account=self.client.account,
1357
                        content_length=0, success=201)
1358
                self.assertEqual(r.status_code, 201)
1359

    
1360
                """Test copy_object for cross-conctainer copy"""
1361
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1362
                        dst_container=self.c1, dst_object=obj)
1363
                self.client.container = self.c1
1364
                r1 = self.client.get_object_info(obj)
1365
                self.client.container = self.c2
1366
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1367
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1368
                
1369
                """Check cross-container copy_from, content_encoding"""
1370
                self.client.container = self.c1
1371
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1372
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1373
                        content_encoding='application/octet-stream', 
1374
                        source_account=self.client.account,
1375
                        content_length=0, success=201)
1376
                
1377
                self.assertEqual(r.status_code, 201)
1378
                r = self.client.get_object_info(obj)
1379
                self.assertEqual(r['etag'], etag)
1380

    
1381
                """Check source_account"""
1382
                self.client.container = self.c2
1383
                fromstr = '/'+self.c1+'/'+obj
1384
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1385
                        content_encoding='application/octet-stream', 
1386
                        source_account='nonExistendAddress@NeverLand.com', 
1387
                        content_length=0, success=(201, 403))
1388
                self.assertEqual(r.status_code, 403)
1389
                
1390
                """Check cross-container move_from"""
1391
                self.client.container = self.c1
1392
                r1 = self.client.get_object_info(obj)
1393
                self.client.container = self.c2
1394
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1395
                dst_object=obj+'v0')
1396
                r0 = self.client.get_object_info(obj+'v0')
1397
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1398

    
1399
                """Check move_from"""
1400
                r = self.client.object_put(obj+'v1', format=None, 
1401
                        move_from='/'+self.c2+'/'+obj,
1402
                        source_version = vers2,
1403
                        content_encoding='application/octet-stream',
1404
                        content_length=0, success=201)
1405
                
1406
                """Check manifest"""
1407
                mobj = 'manifest.test'
1408
                txt = ''
1409
                for i in range(10):
1410
                        txt += '%s'%i
1411
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1412
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1413
                        
1414
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1415
                        manifest='%s/%s'%(self.client.container, mobj))
1416
                
1417
                r = self.client.object_get(mobj)
1418
                self.assertEqual(r.text, txt)
1419
           
1420
                """Upload a local file with one request"""
1421
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1422
                newf = open(self.fname, 'r')
1423
                self.client.upload_object('sample.file', newf)
1424
                newf.close()
1425
                """Check if file has been uploaded"""
1426
                r = self.client.get_object_info('sample.file')
1427
                self.assertEqual(int(r['content-length']), 10260)
1428

    
1429
                """Some problems with transfer-encoding?"""
1430

    
1431
        def test_object_copy(self):
1432
                """Test object_COPY"""
1433
                self.client.container=self.c2
1434
                obj = 'test2'
1435

    
1436
                data= '{"key1":"val1", "key2":"val2"}'
1437
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1438
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1439
                        permitions={
1440
                                'read':['accX:groupA', 'u1', 'u2'],
1441
                                'write':['u2', 'u3']},
1442
                        content_disposition='attachment; filename="fname.ext"')
1443
                
1444
                r = self.client.object_copy(obj+'orig',
1445
                        destination = '/'+self.client.container+'/'+obj,
1446
                        ignore_content_type=False, content_type='application/json', 
1447
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1448
                        permitions={'write':['u5', 'accX:groupB']})
1449
                self.assertEqual(r.status_code, 201)
1450
                
1451
                """Check content-disposition"""
1452
                r = self.client.get_object_info(obj)
1453
                self.assertTrue(r.has_key('content-disposition'))
1454

    
1455
                """Check Metadata"""
1456
                r = self.client.get_object_meta(obj)
1457
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1458
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1459
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1460

    
1461
                """Check permitions"""
1462
                r = self.client.get_object_sharing(obj)
1463
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1464
                self.assertTrue('accx:groupb' in r['write'])
1465

    
1466
                """Check destination account"""
1467
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1468
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1469
                        success=(201, 403))
1470
                self.assertEqual(r.status_code, 403)
1471
                
1472

    
1473
                """Check destination being another container
1474
                and also content_type and content encoding"""
1475
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1476
                        content_encoding='utf8', content_type='application/json')
1477
                self.assertEqual(r.status_code, 201)
1478
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1479
                
1480

    
1481
                """Check ignore_content_type and content_type"""
1482
                r = self.client.object_get(obj)
1483
                etag = r.headers['etag']
1484
                ctype = r.headers['content-type']
1485
                self.assertEqual(ctype, 'application/json')
1486
                
1487
                r = self.client.object_copy(obj+'orig',
1488
                        destination = '/'+self.client.container+'/'+obj+'0',
1489
                        ignore_content_type=True, content_type='application/json')
1490
                self.assertEqual(r.status_code, 201)
1491
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1492
                
1493

    
1494
                """Check if_etag_(not_)match"""
1495
                r = self.client.object_copy(obj,
1496
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1497
                self.assertEqual(r.status_code, 201)
1498
                
1499
                r = self.client.object_copy(obj,
1500
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1501
                self.assertEqual(r.status_code, 201)
1502
                vers2 = r.headers['x-object-version']
1503
                
1504

    
1505
                """Check source_version, public and format """
1506
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1507
                self.assertEqual(r.status_code, 201)
1508
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1509
                
1510
                r = self.client.get_object_info(obj+'3')
1511
                self.assertTrue(r.has_key('x-object-public'))
1512

    
1513
        def test_object_move(self):
1514
                """Test object_MOVE"""
1515
                self.client.container= self.c2
1516
                obj = 'test2'
1517

    
1518
                data= '{"key1":"val1", "key2":"val2"}'
1519
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1520
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1521
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1522
                
1523
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1524
                        ignore_content_type=False, content_type='application/json', 
1525
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1526
                        permitions={'write':['u5', 'accX:groupB']})
1527
                self.assertEqual(r.status_code, 201)
1528
                
1529

    
1530
                """Check Metadata"""
1531
                r = self.client.get_object_meta(obj)
1532
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1533
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1534
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1535

    
1536
                """Check permitions"""
1537
                r = self.client.get_object_sharing(obj)
1538
                self.assertFalse(r.has_key('read'))
1539
                self.assertTrue('u5' in r['write'])
1540
                self.assertTrue('accx:groupb' in r['write'])
1541

    
1542
                """Check destination account"""
1543
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1544
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1545
                        success=(201, 403))
1546
                self.assertEqual(r.status_code, 403)
1547
                
1548

    
1549
                """Check destination being another container and also
1550
                content_type, content_disposition and content encoding"""
1551
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1552
                        content_encoding='utf8', content_type='application/json',
1553
                        content_disposition='attachment; filename="fname.ext"')
1554
                self.assertEqual(r.status_code, 201)
1555
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1556
                self.client.container=self.c1
1557
                r = self.client.get_object_info(obj)
1558
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1559
                etag = r['etag']
1560
                ctype = r['content-type']
1561
                self.assertEqual(ctype, 'application/json')
1562

    
1563
                """Check ignore_content_type and content_type"""
1564
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1565
                        ignore_content_type=True, content_type='application/json')
1566
                self.assertEqual(r.status_code, 201)
1567
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1568
                
1569

    
1570
                """Check if_etag_(not_)match"""
1571
                self.client.container=self.c2
1572
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1573
                        if_etag_match=etag)
1574
                self.assertEqual(r.status_code, 201)
1575
                
1576
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1577
                        if_etag_not_match='lalala')
1578
                self.assertEqual(r.status_code, 201)
1579
                
1580

    
1581
                """Check public and format """
1582
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1583
                        format='xml', public=True)
1584
                self.assertEqual(r.status_code, 201)
1585
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1586
                
1587
                r = self.client.get_object_info(obj+'2')
1588
                self.assertTrue(r.has_key('x-object-public'))
1589

    
1590
        def test_object_post(self):
1591
                """Test object_POST"""
1592
                self.client.container=self.c2
1593
                obj = 'test2'
1594
                """create a filesystem file"""
1595
                self.fname = obj
1596
                newf = open(self.fname, 'w')
1597
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1598
                newf.close()
1599
                """create a file on container"""
1600
                r = self.client.object_put(obj, content_type='application/octet-stream',
1601
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1602
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1603
                
1604

    
1605
                """Append tests update, content_range, content_type, content_length"""
1606
                newf = open(obj, 'r')
1607
                self.client.append_object(obj, newf)
1608
                r = self.client.object_get(obj)
1609
                self.assertTrue(r.text.startswith('Hello!'))
1610
                
1611

    
1612
                """Overwrite tests update, content_type, content_length, content_range"""
1613
                newf.seek(0)
1614
                r = self.client.overwrite_object(obj, 0, 10, newf)
1615
                r = self.client.object_get(obj)
1616
                self.assertTrue(r.text.startswith('ello!'))
1617
                newf.close()
1618
                
1619
                
1620
                """Truncate tests update, content_range, content_type,
1621
                object_bytes and source_object"""
1622
                r = self.client.truncate_object(obj, 5)
1623
                r = self.client.object_get(obj)
1624
                self.assertEqual(r.text, 'ello!')
1625
                
1626

    
1627
                """Check metadata"""
1628
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
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
                self.client.del_object_meta('mkey1', obj)
1634
                r = self.client.get_object_meta(obj)
1635
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1636

    
1637
                """Check permitions"""
1638
                self.client.set_object_sharing(obj,
1639
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1640
                r = self.client.get_object_sharing(obj)
1641
                self.assertTrue(r.has_key('read'))
1642
                self.assertTrue('u5' in r['read'])
1643
                self.assertTrue(r.has_key('write'))
1644
                self.assertTrue('u4' in r['write'])
1645
                self.client.del_object_sharing(obj)
1646
                r = self.client.get_object_sharing(obj)
1647
                self.assertTrue(len(r) == 0)
1648

    
1649
                """Check publish"""
1650
                self.client.publish_object(obj)
1651
                r = self.client.get_object_info(obj)
1652
                self.assertTrue(r.has_key('x-object-public'))
1653
                self.client.unpublish_object(obj)
1654
                r = self.client.get_object_info(obj)
1655
                self.assertFalse(r.has_key('x-object-public'))
1656

    
1657
                """Check if_etag_(not)match"""
1658
                etag = r['etag']
1659
                #r = self.client.object_post(obj, update=True, public=True,
1660
                #        if_etag_not_match=etag, success=(412,202,204))
1661
                #self.assertEqual(r.status_code, 412)
1662
                
1663
                r = self.client.object_post(obj, update=True, public=True,
1664
                        if_etag_match=etag, content_encoding='application/json')
1665
                
1666
                r = self.client.get_object_info(obj)
1667
                helloVersion = r['x-object-version']
1668
                self.assertTrue(r.has_key('x-object-public'))
1669
                self.assertEqual(r['content-encoding'], 'application/json')
1670

    
1671
                """Check source_version and source_account and content_disposition"""
1672
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1673
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1674
                        source_account='thisAccountWillNeverExist@adminland.com',
1675
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1676
                self.assertEqual(r.status_code, 403)
1677
                
1678
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1679
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1680
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1681
                        content_disposition='attachment; filename="fname.ext"')
1682
                
1683
                r = self.client.object_get(obj)
1684
                self.assertEqual(r.text, 'eello!')
1685
                self.assertTrue(r.headers.has_key('content-disposition')
1686
                        and 'fname.ext' in r.headers['content-disposition'])
1687
                
1688

    
1689
                """Check manifest"""
1690
                mobj = 'manifest.test'
1691
                txt = ''
1692
                for i in range(10):
1693
                        txt += '%s'%i
1694
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1695
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1696
                        
1697
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1698
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1699
                
1700
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1701
                
1702
                r = self.client.object_get(mobj)
1703
                self.assertEqual(r.text, txt)
1704
                
1705

    
1706
                """We need to check transfer_encoding """
1707

    
1708
        def test_object_delete(self):
1709
                """Test object_DELETE"""
1710
                self.client.container=self.c2
1711
                obj = 'test2'
1712
                """create a file on container"""
1713
                r = self.client.object_put(obj, content_type='application/octet-stream',
1714
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1715
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1716
                
1717

    
1718
                """Check with false until"""
1719
                r = self.client.object_delete(obj, until=1000000)
1720
                
1721
                r = self.client.object_get(obj, success=(200, 404))
1722
                self.assertEqual(r.status_code, 200)
1723
                
1724

    
1725
                """Check normal case"""
1726
                r = self.client.object_delete(obj)
1727
                self.assertEqual(r.status_code, 204)
1728
                
1729
                r = self.client.object_get(obj, success=(200, 404))
1730
                self.assertEqual(r.status_code, 404)
1731
                
1732

    
1733
        def create_large_file(self, size, name):
1734
                """Create a large file at fs"""
1735
                self.fname = name
1736
                import random
1737
                random.seed(self.now)
1738
                f = open(self.fname, 'w')
1739
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1740
                for hobyte_id in range(size/8):
1741
                        sss = 'hobt%s'%random.randint(1000, 9999)
1742
                        f.write(sss)
1743
                        if 0 == (hobyte_id*800)%size:
1744
                                f.write('\n')
1745
                                sys.stdout.write('\b\b')
1746
                                prs = (hobyte_id*800)//size
1747
                                if prs > 10:
1748
                                        sys.stdout.write('\b')
1749
                                sys.stdout.write('%s'%prs+'%')
1750
                                sys.stdout.flush()
1751
                print('\b\b\b100%')
1752
                f.close()
1753
                """"""
1754

    
1755
def init_parser():
1756
        parser = ArgumentParser(add_help=False)
1757
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1758
                help="Show this help message and exit")
1759
        return parser
1760

    
1761
if __name__ == '__main__':
1762
        parser = init_parser()
1763
        args, argv = parser.parse_known_args()
1764

    
1765
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1766
                raise Exception('\tusage: tests.py <group> [command]')
1767
        suiteFew = unittest.TestSuite()
1768

    
1769
        if len(argv) == 0 or argv[0] == 'pithos':
1770
                if len(argv) == 1:
1771
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1772
                else:
1773
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1774
        if len(argv) == 0 or argv[0] == 'cyclades':
1775
                if len(argv) == 1:
1776
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1777
                        suiteFew.addTest(testCyclades('test_000'))
1778
                else:
1779
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1780

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