Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ b9d07587

History | View | Annotate | Download (64.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
from kamaki.clients.image import ImageClient as image
47
from kamaki.clients.astakos import AstakosClient as astakos
48

    
49
TEST_ALL = False
50

    
51
class testAstakos(unittest.TestCase):
52
        def setUp(self):
53
                url='https://accounts.okeanos.grnet.gr'
54
                token = 'Kn+G9dfmlPLR2WFnhfBOow=='
55
                self.client = astakos(url, token)
56
        def tearDown(self):
57
                pass
58
        def test_authenticate(self):
59
                r = self.client.authenticate()
60
                for term in ('username',
61
                        'auth_token_expires',
62
                        'auth_token',
63
                        'auth_token_created', 
64
                        'groups',
65
                        'uniq',
66
                        'has_credits',
67
                        'has_signed_terms'):
68
                        self.assertTrue(r.has_key(term))
69

    
70
class testImage(unittest.TestCase):
71
        def setUp(self):
72
                url = 'https://plankton.okeanos.grnet.gr'
73
                token = 'Kn+G9dfmlPLR2WFnhfBOow=='
74
                self.client = image(url, token)
75

    
76
        def tearDown(self):
77
                pass
78

    
79
        def test_list_public(self):
80
                r = self.client.list_public()
81
                print(r)
82

    
83
class testCyclades(unittest.TestCase):
84
        """Set up a Cyclades thorough test"""
85
        def setUp(self):
86
                """okeanos"""
87
                url='https://cyclades.okeanos.grnet.gr/api/v1.1'
88
                token='MI6PT0yrXJ9Ji/x8l9Wmig=='
89
                token='Kn+G9dfmlPLR2WFnhfBOow=='
90
                #account='saxtouri@gmail.com'
91
                account='saxtouri@grnet.gr'
92
                self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
93
                self.img_details= {
94
                        u'status': u'ACTIVE',
95
                        u'updated': u'2012-10-16T09:04:17+00:00',
96
                        u'name': u'Debian Base',
97
                        u'created': u'2012-10-16T09:03:12+00:00',
98
                        u'progress': 100,
99
                        u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
100
                        u'metadata': {
101
                                u'values': {
102
                                        u'kernel': u'2.6.32',
103
                                        u'osfamily': u'linux', 
104
                                        u'users': u'root', 
105
                                        u'gui': u'No GUI', 
106
                                        u'sortorder': u'1', 
107
                                        u'os': u'debian', 
108
                                        u'root_partition': u'1', 
109
                                        u'description': u'Debian 6.0.6 (Squeeze) Base System',
110
                                        u'partition_table': u'msdos'}
111
                                }
112
                        }
113
                self.flavor_details =  {u'name': u'C1R1024D20',
114
                        u'ram': 1024,
115
                        u'id': 1,
116
                        u'SNF:disk_template': u'drbd',
117
                        u'disk': 20,
118
                        u'cpu': 1}
119
                self.PROFILES=('ENABLED', 'DISABLED', 'PROTECTED')
120

    
121
                """okeanos.io"""
122
                #url = 'https://cyclades.okeanos.io/api/v1.1'
123
                #token='0TpoyAXqJSPxLdDuZHiLOA=='
124
                #account='saxtouri@admin.grnet.gr'
125
                #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
126
                #self.img_details= {
127
                #        u'status': u'ACTIVE',
128
                #        u'updated': u'2012-08-21T12:57:39+00:00',
129
                #        u'name': u'Debian Base',
130
                #        u'created': u'2012-08-21T12:56:53+00:00',
131
                #        u'progress': 100,
132
                #        u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
133
                #        u'metadata': {
134
                #                u'values': {
135
                #                        u'kernel': u'2.6.32',
136
                #                        u'osfamily': u'linux', 
137
                #                        u'users': u'root', 
138
                #                        u'gui': u'No GUI', 
139
                #                        u'sortorder': u'1', 
140
                #                        u'os': u'debian', 
141
                #                        u'root_partition': 
142
                #                        u'1', u'description': 
143
                #                        u'Debian Squeeze Base System'}
144
                #                }
145
                #        }
146
                #flavorid = 1
147

    
148
                self.servers = {}
149
                self.now = time.mktime(time.gmtime())
150
                self.servname1 = 'serv'+unicode(self.now)
151
                self.servname2 = self.servname1+'_v2'
152
                self.flavorid = 1
153
                #servers have to be created at the begining...
154
                self.networks={}
155
                self.netname1 = 'net'+unicode(self.now)
156
                self.netname2 = 'net'+unicode(self.now)+'_v2'
157

    
158
                self.client = cyclades(url, token)
159
                pass
160

    
161
        def tearDown(self):
162
                """Destoy servers used in testing"""
163
                print
164
                for netid in self.networks.keys():
165
                        self._delete_network(netid)
166
                if 0 >= len(self.servers):
167
                        return
168
                there_are_servers_running = True
169
                deleted_servers = {}
170
                waitime = 0
171
                print('-> Found %s servers to delete'%len(self.servers))
172
                while there_are_servers_running:
173
                        there_are_servers_running = False
174
                        if waitime > 0:
175
                                c = ['|','/','-','\\']
176
                                suffix = ''
177
                                sys.stdout.write('\t. . . wait %s seconds: '%waitime)
178
                                for i in range(4*waitime):
179
                                        oldlen = len(suffix)
180
                                        suffix = '%ss %s'%(i/4, c[i%4])
181
                                        sys.stdout.write(oldlen*'\b'+suffix)
182
                                        sys.stdout.flush()
183
                                        time.sleep(0.25)
184
                                oldlen = len(': '+suffix)
185
                                print(oldlen*'\b'+oldlen*' ')
186
                                sys.stdout.flush()
187
                        waitime += 3
188
                        dservers = self.client.list_servers(detail=True)
189
                        for server in dservers:
190
                                if server['name'] in self.servers.keys():
191
                                        there_are_servers_running = True
192
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
193
                                        if server['status'] == 'BUILD':
194
                                                print('\twait...')
195
                                        else:
196
                                                print('\tDELETE %s'%server['name'])
197
                                                self._delete_server(server['id'])
198
                                                self.servers.pop(server['name'])
199
                                                deleted_servers[server['name']] = 0
200
                                                waitime =0 
201
                                elif server['name'] in deleted_servers.keys():
202
                                        there_are_servers_running = True
203
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
204
                                        retries = deleted_servers[server['name']]
205
                                        if retries > 10:
206
                                                print('\tretry DELETE %s'%server['name'])
207
                                                self._delete_server(server['id'])
208
                                                retries = 0
209
                                                waitime = 0
210
                                        else:
211
                                                print('\tnot deleted yet ...')
212
                                        deleted_servers[server['name']] = retries + 1
213

    
214
        def _create_server(self, servername, flavorid, imageid, personality=None):
215
                server = self.client.create_server(servername, flavorid, imageid, personality)
216
                self.servers[servername] = server
217
                return server
218

    
219
        def _delete_server(self, servid):
220
                self.client.delete_server(servid)
221

    
222
        def _create_network(self, netname, **kwargs):
223
                net = self.client.create_network(netname, **kwargs)
224
                self.networks[net['id']] = net
225
                return net
226

    
227
        def _delete_network(self, netid):
228
                sys.stdout.write('\tDelete network %s '%netid)
229
                self.client.disconnect_network_nics(netid)
230
                wait = 3
231
                while True:
232
                        try:
233
                                self.client.delete_network(netid)
234
                                print('\n\tSUCCESFULL COMMIT delete network %s'%netid)
235
                                break
236
                        except ClientError as err:
237
                                self.assertEqual(err.status, 421)
238
                                r = self.client.get_network_details(netid)
239
                                time.sleep(wait)
240
                                wait += 3
241
                                sys.stdout.write('.')
242

    
243
        def if_not_all(foo):
244
                global TEST_ALL
245
                if TEST_ALL:
246
                        return None
247
                return foo
248

    
249
        def assert_dicts_are_deeply_equal(self, d1, d2):
250
                for k,v in d1.items():
251
                        self.assertTrue(d2.has_key(k))
252
                        if isinstance(v, dict):
253
                                self.assert_dicts_are_deeply_equal(v, d2[k])
254
                        else:
255
                                self.assertEqual(unicode(v), unicode(d2[k]))
256

    
257
        def test_000(self):
258
                "Prepare a full Cyclades test scenario"
259
                global TEST_ALL
260
                TEST_ALL = True
261

    
262
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
263
                self.server2 = self._create_server(self.servname2, self.flavorid+2, self.img)
264

    
265
                print('testing')
266
                sys.stdout.write(' test create server')
267
                self._test_create_server()
268
                print('...ok')
269

    
270
                sys.stdout.write(' test list servers')
271
                self._test_list_servers()
272
                print('...ok')
273

    
274
                print('- wait for test servers to build')
275
                self._wait_for_status(self.server1['id'], 'BUILD')
276
                self._wait_for_status(self.server2['id'], 'BUILD')
277
                print('- ok')
278

    
279
                sys.stdout.write(' test get server details')
280
                self._test_get_server_details()
281
                print('...ok')
282

    
283
                sys.stdout.write(' test get image details')
284
                self._test_get_image_details()
285
                print('...ok')
286

    
287
                sys.stdout.write(' test update_server_name')
288
                self._test_update_server_name()
289
                print('...ok')
290

    
291

    
292
                sys.stdout.write(' test reboot_server')
293
                self._test_reboot_server()
294
                print('...ok')
295

    
296
                print('- wait for test servers to boot')
297
                self._wait_for_status(self.server1['id'], 'REBOOT')
298
                self._wait_for_status(self.server2['id'], 'REBOOT')
299
                print('- ok')
300

    
301
                sys.stdout.write(' test create_server_metadata')
302
                self._test_create_server_metadata()
303
                print('...ok')
304

    
305
                sys.stdout.write(' test get_server_metadata')
306
                self._test_get_server_metadata()
307
                print('...ok')
308

    
309
                sys.stdout.write(' test update_server_metadata')
310
                self._test_update_server_metadata()
311
                print('...ok')
312

    
313
                sys.stdout.write(' test delete_server_metadata')
314
                self._test_delete_server_metadata()
315
                print('...ok')
316

    
317
                sys.stdout.write(' test list_flavors')
318
                self._test_list_flavors()
319
                print('...ok')
320

    
321
                sys.stdout.write(' test get_flavor_details')
322
                self._test_get_flavor_details()
323
                print('...ok')
324

    
325
                sys.stdout.write(' test list_images')
326
                self._test_list_images()
327
                print('...ok')
328

    
329
                sys.stdout.write(' test get_image_details')
330
                self._test_get_image_details()
331
                print('...ok')
332

    
333
                sys.stdout.write(' test get_image_metadata')
334
                self._test_get_image_metadata()
335
                print('...ok')
336

    
337
                sys.stdout.write(' test shutdown_server')
338
                self._test_shutdown_server()
339
                print('...ok')
340

    
341
                sys.stdout.write(' test start_server')
342
                self._test_start_server()
343
                print('...ok')
344

    
345
                sys.stdout.write(' test get_server_console')
346
                self._test_get_server_console()        
347
                print('...ok')
348

    
349
                sys.stdout.write(' test get_firewall_profile')
350
                self._test_get_firewall_profile()        
351
                print('...ok')
352

    
353
                sys.stdout.write(' test set_firewall_profile')
354
                self._test_set_firewall_profile()        
355
                print('...ok')
356

    
357
                sys.stdout.write(' test get_server_stats')
358
                self._test_get_server_stats()        
359
                print('...ok')
360

    
361
                self.network1 = self._create_network(self.netname1)
362

    
363
                sys.stdout.write(' test create_network')
364
                self._test_create_network()        
365
                print('...ok')
366

    
367
                print('- wait for netowork to be activated')
368
                self._wait_for_network(self.network1['id'], 'ACTIVE')
369
                print('- ok')
370

    
371
                sys.stdout.write(' test connect_server')
372
                self._test_connect_server()        
373
                print('...ok')
374

    
375
                sys.stdout.write(' test disconnect_server')
376
                self._test_disconnect_server()        
377
                print('...ok')
378

    
379
                self.network2 = self._create_network(self.netname2)
380
                print('- wait for netowork to be activated')
381
                self._wait_for_network(self.network2['id'], 'ACTIVE')
382
                print('- ok')
383

    
384
                sys.stdout.write(' test list_server_nics')
385
                self._test_list_server_nics()        
386
                print('...ok')
387

    
388
                sys.stdout.write(' test list_networks')
389
                self._test_list_networks()        
390
                print('...ok')
391

    
392
                sys.stdout.write(' test get_network_details')
393
                self._test_get_network_details()        
394
                print('...ok')
395

    
396
                sys.stdout.write(' test update_network_name')
397
                self._test_update_network_name()        
398
                print('...ok')
399

    
400
                """Don't have auth for these:
401
                sys.stdout.write(' test delete_image')
402
                self._test_delete_image()
403
                print('...ok')
404
                sys.stdout.write(' test create_image_metadata')
405
                self._test_create_image_metadata()
406
                print('...ok')
407
                sys.stdout.write(' test update_image_metadata')
408
                self._test_update_image_metadata()
409
                print('...ok')
410
                sys.stdout.write(' test delete_image_metadata')
411
                self._test_delete_image_metadata()
412
                print('...ok')
413
                """
414

    
415
        def _wait_for_network(self, netid, status):
416
                wait = 3
417
                limit = 50
418
                c=['|','/','-','\\']
419
                sys.stdout.write('\t- make net %s %s  '%(netid, status))
420
                while wait < limit:
421
                        r = self.client.get_network_details(netid)
422
                        if r['status'] == status:
423
                                print('\tOK')
424
                                return True
425
                        sys.stdout.write('\tit is now %s, wait %ss  '%(r['status'], wait))
426
                        for i in range(wait*4):
427
                                sys.stdout.write('\b%s'%c[i%4])
428
                                sys.stdout.flush()
429
                                time.sleep(0.25)
430
                        print('\b ')
431
                        wait += 3
432
                return False
433

    
434
        def _wait_for_nic(self, netid, servid, in_creation=True):
435
                self._wait_for_network(netid, 'ACTIVE')
436
                c=['|','/','-','\\']
437
                limit = 50
438
                wait=3
439
                largetry = 0
440
                while wait < limit:
441
                        nics = self.client.list_server_nics(servid)
442
                        for net in nics:
443
                                found_nic = net['network_id'] == netid
444
                                if (in_creation and found_nic) or not (in_creation or found_nic):
445
                                        return True
446
                        dis = '' if in_creation else 'dis'
447
                        sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
448
                        for i in range(wait*4):
449
                                sys.stdout.write('\b%s'%c[i%4])
450
                                sys.stdout.flush()
451
                                time.sleep(0.25)
452
                        print('\b ')
453
                        wait += 3
454
                        if wait >= limit and largetry < 3:
455
                                wait = 3
456
                                largetry += 1
457
                return False
458

    
459
        def _has_status(self, servid, status):
460
                r = self.client.get_server_details(servid)
461
                return r['status'] == status
462
        def _wait_for_status(self, servid, status):
463
                wait = 0
464
                c=['|','/','-','\\']
465
                while self._has_status(servid, status):
466
                        if wait:
467
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
468
                                for i in range(4*wait):
469
                                        sys.stdout.write('\b%s'%c[i%4])
470
                                        sys.stdout.flush()
471
                                        time.sleep(0.25)
472
                                print('\b ')
473
                        wait = (wait + 3) if wait<60 else 0
474

    
475
        @if_not_all
476
        def test_list_servers(self):
477
                """Test list servers"""
478
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
479
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
480
                self._test_list_servers()
481

    
482
        def _test_list_servers(self):
483
                servers = self.client.list_servers()
484
                dservers = self.client.list_servers(detail=True)
485

    
486
                """detailed and simple are same size"""
487
                self.assertEqual(len(dservers), len(servers))
488
                for i in range(len(servers)):
489
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
490
                                'status', 'updated']:
491
                                self.assertFalse(servers[i].has_key(field))
492
                                self.assertTrue(dservers[i].has_key(field))
493

    
494
                """detailed and simple contain same names"""
495
                names = sorted(map(lambda x: x["name"], servers))
496
                dnames = sorted(map(lambda x: x["name"], dservers))
497
                self.assertEqual(names, dnames)
498

    
499
        @if_not_all
500
        def test_create_server(self):
501
                """Test create_server"""
502
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
503
                self._wait_for_status(self.server1['id'], 'BUILD')
504
                self._test_create_server()
505

    
506
        def _test_create_server(self):
507
                self.assertEqual(self.server1["name"], self.servname1)
508
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
509
                self.assertEqual(self.server1["imageRef"], self.img)
510
                self.assertEqual(self.server1["status"], "BUILD")
511

    
512
        @if_not_all
513
        def test_get_server_details(self):
514
                """Test get_server_details"""
515
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
516
                self._wait_for_status(self.server1['id'], 'BUILD')
517
                self._test_get_server_details()
518

    
519
        def _test_get_server_details(self):
520
                r = self.client.get_server_details(self.server1['id'])
521
                self.assertEqual(r["name"], self.servname1)
522
                self.assertEqual(r["flavorRef"], self.flavorid)
523
                self.assertEqual(r["imageRef"], self.img)
524
                self.assertEqual(r["status"], "ACTIVE")
525

    
526
        @if_not_all
527
        def test_get_image_details(self):
528
                """Test get_image_details"""
529
                self._test_get_image_details()
530

    
531
        def _test_get_image_details(self):
532
                r = self.client.get_image_details(self.img)
533
                d = self.img_details
534
                self.assert_dicts_are_deeply_equal(r, d)
535

    
536
        @if_not_all
537
        def test_update_server_name(self):
538
                """Test update_server_name"""
539
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
540
                self._test_update_server_name()
541

    
542
        def _test_update_server_name(self):
543
                new_name = self.servname1+'_new_name'
544
                self.client.update_server_name(self.server1['id'], new_name)
545
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
546
                self.assertEqual(r['name'], new_name)
547
                changed = self.servers.pop(self.servname1)
548
                changed['name'] = new_name
549
                self.servers[new_name] = changed
550

    
551
        @if_not_all
552
        def test_reboot_server(self):
553
                """Test reboot server"""
554
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
555
                self._wait_for_status(self.server1['id'], 'BUILD')
556
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
557
                self._wait_for_status(self.server2['id'], 'BUILD')
558
                self._test_reboot_server()
559
                self._wait_for_status(self.server1['id'], 'REBOOT')
560
                self._wait_for_status(self.server2['id'], 'REBOOT')
561

    
562
        def _test_reboot_server(self):
563
                self.client.reboot_server(self.server1['id'])
564
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
565
                self.client.reboot_server(self.server2['id'], hard=True)
566
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
567

    
568
        @if_not_all
569
        def test_get_server_metadata(self):
570
                """Test get server_metadata"""
571
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
572
                self._test_get_server_metadata()
573
        def _test_get_server_metadata(self):
574
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
575
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
576
                self.assertEqual(r['mymeta_0'], 'val_0')
577

    
578
        @if_not_all
579
        def test_create_server_metadata(self):
580
                """Test create_server_metadata"""
581
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
582
                self._test_create_server_metadata()
583

    
584
        def _test_create_server_metadata(self):
585
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
586
                self.assertTrue(r1.has_key('mymeta'))
587
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
588
                self.assert_dicts_are_deeply_equal(r1, r2)
589

    
590
        @if_not_all
591
        def test_update_server_metadata(self):
592
                """Test update_server_metadata"""
593
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
594
                self._test_update_server_metadata()
595

    
596
        def _test_update_server_metadata(self):
597
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
598
                self.assertTrue(r1.has_key('mymeta3'))
599
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
600
                self.assertTrue(r2['mymeta3'], 'val3')
601

    
602
        @if_not_all
603
        def test_delete_server_metadata(self):
604
                """Test delete_server_metadata"""
605
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
606
                self._test_delete_server_metadata()
607

    
608
        def _test_delete_server_metadata(self):
609
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
610
                self.assertTrue(r1.has_key('mymeta'))
611
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
612
                try:
613
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
614
                        raise ClientError('Wrong Error', status=100)
615
                except ClientError as err:
616
                        self.assertEqual(err.status, 404)
617

    
618
        @if_not_all
619
        def test_list_flavors(self):
620
                """Test flavors_get"""
621
                self._test_list_flavors()
622

    
623
        def _test_list_flavors(self):
624
                r = self.client.list_flavors()
625
                self.assertTrue(len(r) > 1)
626
                r = self.client.list_flavors(detail=True)
627
                self.assertTrue(r[0].has_key('SNF:disk_template'))
628

    
629
        @if_not_all
630
        def test_get_flavor_details(self):
631
                """Test test_get_flavor_details"""
632
                self._test_get_flavor_details()
633

    
634
        def _test_get_flavor_details(self):
635
                r = self.client.get_flavor_details(self.flavorid)
636
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
637

    
638
        @if_not_all
639
        def test_list_images(self):
640
                """Test list_images"""
641
                self._test_list_images()
642

    
643
        def _test_list_images(self):
644
                r = self.client.list_images()
645
                self.assertTrue(len(r) > 1)
646
                r = self.client.list_images(detail=True)
647
                for detailed_img in r:
648
                        if detailed_img['id'] == self.img:
649
                                break
650
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
651

    
652
        @if_not_all
653
        def test_image_details(self):
654
                """Test image_details"""
655
                self._test_get_image_details
656

    
657
        def _test_get_image_details(self):
658
                r = self.client.get_image_details(self.img)
659
                self.assert_dicts_are_deeply_equal(r, self.img_details)
660

    
661
        @if_not_all
662
        def test_get_image_metadata(self):
663
                """Test get_image_metadata"""
664
                self._test_get_image_metadata()
665

    
666
        def _test_get_image_metadata(self):
667
                r = self.client.get_image_metadata(self.img)
668
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
669
                for key,val in self.img_details['metadata']['values'].items():
670
                        r = self.client.get_image_metadata(self.img, key)
671
                        self.assertEqual(r[key], val)
672

    
673
        @if_not_all
674
        def test_start_server(self):
675
                """Test start_server"""
676
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
677
                self._wait_for_status(self.server1['id'], 'BUILD')
678
                self.client.shutdown_server(self.server1['id'])
679
                self._wait_for_status(self.server1['id'], 'ACTIVE')
680
                self._test_start_server()
681

    
682
        def _test_start_server(self):
683
                self.client.start_server(self.server1['id'])
684
                self._wait_for_status(self.server1['id'], 'STOPPED')
685
                r = self.client.get_server_details(self.server1['id'])
686
                self.assertEqual(r['status'], 'ACTIVE')
687

    
688
        @if_not_all
689
        def test_shutdown_server(self):
690
                """Test shutdown_server"""
691
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
692
                self._wait_for_status(self.server1['id'], 'BUILD')
693
                self._test_shutdown_server()
694

    
695
        def _test_shutdown_server(self):
696
                self.client.shutdown_server(self.server1['id'])
697
                self._wait_for_status(self.server1['id'], 'ACTIVE')
698
                r = self.client.get_server_details(self.server1['id'])
699
                self.assertEqual(r['status'], 'STOPPED')
700

    
701
        @if_not_all
702
        def test_get_server_console(self):
703
                """Test get_server_console"""
704
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
705
                self._test_get_server_console()
706

    
707
        def _test_get_server_console(self):
708
                self._wait_for_status(self.server2['id'], 'BUILD')
709
                r = self.client.get_server_console(self.server2['id'])
710
                self.assertTrue(r.has_key('host'))
711
                self.assertTrue(r.has_key('password'))
712
                self.assertTrue(r.has_key('port'))
713
                self.assertTrue(r.has_key('type'))
714

    
715
        @if_not_all
716
        def test_get_firewall_profile(self):
717
                """Test get_firewall_profile"""
718
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
719
                self._test_get_firewall_profile()
720

    
721
        def _test_get_firewall_profile(self):
722
                self._wait_for_status(self.server1['id'], 'BUILD')
723
                fprofile = self.client.get_firewall_profile(self.server1['id'])
724
                self.assertTrue(fprofile in self.PROFILES)
725

    
726
        @if_not_all
727
        def test_set_firewall_profile(self):
728
                """Test set_firewall_profile"""
729
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
730
                self._test_set_firewall_profile()
731

    
732
        def _test_set_firewall_profile(self):
733

    
734
                self._wait_for_status(self.server1['id'], 'BUILD')
735
                PROFILES=['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
736
                fprofile = self.client.get_firewall_profile(self.server1['id'])
737
                print('')
738
                for counter, fprofile in enumerate(PROFILES):
739
                        start=fprofile
740
                        npos = counter + 1
741
                        nprofile = PROFILES[npos] if npos<len(PROFILES) else PROFILES[0]
742
                        print('\tprofile swap %s: %s -> %s'%(npos, fprofile, nprofile))
743
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
744
                        wait = 3
745
                        c=['|','/','-','\\']
746
                        while fprofile != nprofile:
747
                                if wait%10 == 0:
748
                                        self.client.set_firewall_profile(self.server1['id'], nprofile)
749
                                self.assertEqual(fprofile, start)
750
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
751
                                for i in range(4*wait):
752
                                        sys.stdout.write('\b%s'%c[i%4])
753
                                        sys.stdout.flush()
754
                                        time.sleep(0.25)
755
                                wait += 3
756
                                print('\b ')
757
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
758

    
759
        @if_not_all
760
        def test_get_server_stats(self):
761
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
762
                self._test_get_server_stats()
763

    
764
        def _test_get_server_stats(self):
765
                r = self.client.get_server_stats(self.server1['id'])
766
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
767
                        self.assertTrue(r.has_key(term))
768

    
769
        @if_not_all
770
        def test_list_networks(self):
771
                """Test list_network"""
772
                self.network1 = self._create_network(self.netname1)
773
                self._wait_for_network(self.network1['id'], 'ACTIVE')
774
                self._test_list_networks()
775

    
776
        def _test_list_networks(self):
777
                r = self.client.list_networks()
778
                self.assertTrue(len(r)>1)
779
                ids = [net['id'] for net in r]
780
                names = [net['name'] for net in r]
781
                self.assertTrue('1' in ids)
782
                self.assertTrue('public' in names)
783
                self.assertTrue(self.network1['id'] in ids)
784
                self.assertTrue(self.network1['name'] in names)
785

    
786
                r = self.client.list_networks(detail=True)
787
                ids = [net['id'] for net in r]
788
                names = [net['name'] for net in r]
789
                for net in r:
790
                        self.assertTrue(net['id'] in ids)
791
                        self.assertTrue(net['name'] in names)
792
                        for term in ('status', 'updated', 'created'):
793
                                self.assertTrue(term in net.keys())
794

    
795
        @if_not_all
796
        def test_create_network(self):
797
                """Test create_network"""
798
                self.network1 = self._create_network(self.netname1)
799
                self._test_create_network()
800

    
801
        def _test_create_network(self):
802
                nets = self.client.list_networks(self.network1['id'])
803
                chosen = [net for net in nets if net['id'] == self.network1['id']][0]
804
                chosen.pop('updated')
805
                net1 = dict(self.network1)
806
                net1.pop('updated')
807
                self.assert_dicts_are_deeply_equal(chosen, net1)
808

    
809
        @if_not_all
810
        def test_connect_server(self):
811
                """Test connect_server"""
812
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
813
                self.network1 = self._create_network(self.netname1)
814
                self._wait_for_status(self.server1['id'], 'BUILD')
815
                self._wait_for_network(self.network1['id'], 'ACTIVE')
816
                self._test_connect_server()
817

    
818
        def _test_connect_server(self):
819
                self.client.connect_server(self.server1['id'], self.network1['id'])
820
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
821

    
822
        @if_not_all
823
        def test_disconnect_server(self):
824
                """Test disconnect_server"""
825
                self.test_connect_server()
826
                self._test_disconnect_server()
827

    
828
        def _test_disconnect_server(self):
829
                self.client.disconnect_server(self.server1['id'], self.network1['id'])
830
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
831
                        in_creation=False))
832

    
833

    
834
        @if_not_all
835
        def test_list_server_nics(self):
836
                """Test list_server_nics"""
837
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
838
                self.network2 = self._create_network(self.netname2)
839
                self._wait_for_status(self.server1['id'], 'BUILD')
840
                self._wait_for_network(self.network2['id'], 'ACTIVE')
841
                self._test_list_server_nics()
842

    
843
        def _test_list_server_nics(self):
844
                r = self.client.list_server_nics(self.server1['id'])
845
                len0 = len(r)
846
                self.assertTrue(len0>0)
847
                self.assertTrue('1' in [net['network_id'] for net in r])
848

    
849
                self.client.connect_server(self.server1['id'], self.network2['id'])
850
                self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
851
                r = self.client.list_server_nics(self.server1['id'])
852
                self.assertTrue(len(r)>len0)
853

    
854
        @if_not_all
855
        def test_get_network_details(self):
856
                """Test get_network_details"""
857
                self.network1 = self._create_network(self.netname1)
858
                self._test_get_network_details()
859

    
860
        def _test_get_network_details(self):
861
                r = self.client.get_network_details(self.network1['id'])
862
                net1 = dict(self.network1)
863
                net1.pop('status')
864
                net1.pop('updated', None)
865
                net1.pop('attachments')
866
                r.pop('status')
867
                r.pop('updated', None)
868
                r.pop('attachments')
869
                self.assert_dicts_are_deeply_equal(net1, r)
870

    
871
        @if_not_all
872
        def test_update_network_name(self):
873
                self.network2 = self._create_network(self.netname2)
874
                self._test_update_network_name()
875

    
876
        def _test_update_network_name(self):
877
                updated_name = self.netname2+'_upd'
878
                self.client.update_network_name(self.network2['id'], updated_name)
879
                wait = 3
880
                c=['|','/','-','\\']
881
                r = self.client.get_network_details(self.network2['id'])
882
                while wait < 50:
883
                        if r['name'] == updated_name:
884
                                break
885
                        sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
886
                                self.network2['name'], updated_name, wait))
887
                        for i in range(4*wait):
888
                                sys.stdout.write('\b%s'%c[i%4])
889
                                sys.stdout.flush()
890
                                time.sleep(0.25)
891
                        print('')
892
                        wait += 3
893
                        r = self.client.get_network_details(self.network2['id'])
894
                self.assertEqual(r['name'], updated_name)
895

    
896
        """ Don't have auth to test this
897
        @if_not_all
898
        def test_delete_image(self):
899
                ""Test delete_image""
900
                self._test_delete_image()
901
        def _test_delete_image(self):
902
                images = self.client.list_images()
903
                self.client.delete_image(images[2]['id'])
904
                try:
905
                        r = self.client.get_image_details(images[2]['id'], success=(400))
906
                except ClientError as err:
907
                        self.assertEqual(err.status, 404)
908

909
        @if_not_all
910
        def test_create_image_metadata(self):
911
                ""Test create_image_metadata""
912
                self._test_create_image_metadata()
913
        def _test_create_image_metadata(self):
914
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
915
                self.assertEqual(r['mykey'], 'myval')
916

917
        @if_not_all
918
        def test_update_image_metadata(self):
919
                ""Test update_image_metadata""
920
                self._test_update_image_metadata()
921
        def _test_update_image_metadata(self):
922
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
923
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
924
                self.assertEqual(r['mykey0'], 'myval0')
925

926
        @if_not_all
927
        def test_delete_image_metadata(self):
928
                ""Test delete_image_metadata""
929
                self._test_delete_image_metadata()
930
        def _test_delete_image_metadata(self):
931
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
932
                self.client.delete_image_metadata(self.img, 'mykey1')
933
                r = self.client.get_image_metadata(self.img)
934
                self.assertNotEqual(r.has_key('mykey1'))
935
        """
936

    
937
class testPithos(unittest.TestCase):
938
        """Set up a Pithos+ thorough test"""
939
        def setUp(self):
940
                """
941
                url = 'http://127.0.0.1:8000/v1'
942
                token = 'C/yBXmz3XjTFBnujc2biAg=='
943
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
944
                account = 'admin@adminland.com'
945
                """
946

    
947
                url='https://pithos.okeanos.grnet.gr/v1'
948

    
949
                token='Kn+G9dfmlPLR2WFnhfBOow=='
950
                account='saxtouri@grnet.gr'
951

    
952
                """
953
                url='https://pithos.okeanos.io/v1'
954
                token='0TpoyAXqJSPxLdDuZHiLOA=='
955
                account='saxtouri@admin.grnet.gr'
956
                """
957
                
958
                """
959
                def add_handler(name, level, prefix=''):
960
                        h = logging.StreamHandler()
961
                        fmt = logging.Formatter(prefix + '%(message)s')
962
                        h.setFormatter(fmt)
963
                        logger = logging.getLogger(name)
964
                        logger.addHandler(h)
965
                        logger.setLevel(level)
966
                import logging
967
                sendlog = logging.getLogger('clients.send')
968
                recvlog = logging.getLogger('clients.recv')
969
                add_handler('requests', logging.INFO, prefix='* ')
970
                add_handler('clients.send', logging.INFO, prefix='> ')
971
                add_handler('clients.recv', logging.INFO, prefix='< ')
972
                """
973
                
974
                self.fname = None
975
                container=None
976
                self.client = pithos(url, token, account, container)
977
                self.now = time.mktime(time.gmtime())
978
                self.c1 = 'c1_'+unicode(self.now)
979
                self.c2 = 'c2_'+unicode(self.now)
980
                self.c3 = 'c3_'+unicode(self.now)
981

    
982

    
983
                self.client.create_container(self.c1)
984
                self.client.create_container(self.c2)
985
                self.client.create_container(self.c3)
986
                self.makeNewObject(self.c1, 'test')
987
                self.makeNewObject(self.c2, 'test')
988
                self.now_unformated = datetime.datetime.utcnow()
989
                self.makeNewObject(self.c1, 'test1')
990
                self.makeNewObject(self.c2, 'test1')
991
                """Prepare an object to be shared - also its container"""
992
                self.client.container = self.c1
993
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
994
                
995
                self.makeNewObject(self.c1, 'another.test')
996

    
997
        def makeNewObject(self, container, obj):
998
                self.client.container = container
999
                r = self.client.object_put(obj, content_type='application/octet-stream',
1000
                        data= 'file '+obj+' that lives in '+container,
1001
                        metadata={'incontainer':container})
1002

    
1003
        def forceDeleteContainer(self, container):
1004
                self.client.container = container
1005
                try:
1006
                        r = self.client.list_objects()
1007
                except ClientError:
1008
                        return
1009
                for obj in r:
1010
                        name = obj['name']
1011
                        self.client.del_object(name)
1012
                r = self.client.container_delete()
1013
                self.container = ''
1014

    
1015
        def tearDown(self):
1016
                """Destroy test cases"""
1017
                if self.fname is not None:
1018
                        try:
1019
                                os.remove(self.fname)
1020
                        except OSError:
1021
                                pass
1022
                        self.fname = None
1023
                self.forceDeleteContainer(self.c1)
1024
                self.forceDeleteContainer(self.c2)
1025
                try:
1026
                        self.forceDeleteContainer(self.c3)
1027
                except ClientError:
1028
                        pass
1029
                self.client.container=''
1030

    
1031
        def test_000(self):
1032
                """Perform a full Pithos+ kamaki support test"""
1033

    
1034
        def test_account_head(self):
1035
                """Test account_HEAD"""
1036
                r = self.client.account_head()
1037
                self.assertEqual(r.status_code, 204)
1038
                
1039
                r = self.client.account_head(until='1000000000')
1040
                self.assertEqual(r.status_code, 204)
1041
           
1042
                r = self.client.get_account_info(until='1000000000') 
1043
                datestring = unicode(r['x-account-until-timestamp'])
1044
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1045

    
1046
                r = self.client.get_account_quota()
1047
                self.assertTrue(r.has_key('x-account-policy-quota'))
1048

    
1049
                r = self.client.get_account_versioning()
1050
                self.assertTrue(r.has_key('x-account-policy-versioning'))
1051

    
1052
                """Check if(un)modified_since"""
1053
                for format in self.client.DATE_FORMATS:
1054
                        now_formated = self.now_unformated.strftime(format)
1055
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
1056
                        sc1 = r1.status_code
1057
                        r1.release()
1058
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1059
                        sc2 = r2.status_code
1060
                        r2.release()
1061
                        self.assertNotEqual(sc1, sc2)
1062

    
1063
        def test_account_get(self):
1064
                """Test account_GET"""
1065
                #r = self.client.account_get()
1066
                #self.assertEqual(r.status_code, 200)
1067
                r = self.client.list_containers()
1068
                fullLen = len(r)
1069
                self.assertTrue(fullLen > 2)
1070
                
1071
                r = self.client.account_get(limit=1)
1072
                self.assertEqual(len(r.json), 1)
1073
                
1074

    
1075
                r = self.client.account_get(marker='c2_')
1076
                temp_c0 = r.json[0]['name']
1077
                temp_c2 = r.json[2]['name']
1078
                
1079
                r = self.client.account_get(limit=2, marker='c2_')
1080
                conames = [container['name'] for container in r.json \
1081
                        if container['name'].lower().startswith('c2_')]
1082
                self.assertTrue(temp_c0 in conames)
1083
                self.assertFalse(temp_c2 in conames)
1084
                
1085

    
1086
                r = self.client.account_get(show_only_shared=True)
1087
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
1088
                
1089
                r = self.client.account_get(until=1342609206)
1090
                self.assertTrue(len(r.json) <= fullLen)
1091
                
1092
                """Check if(un)modified_since"""
1093
                for format in self.client.DATE_FORMATS:
1094
                        now_formated = self.now_unformated.strftime(format)
1095
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
1096
                        sc1 = r1.status_code
1097
                        r1.release()
1098
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1099
                        sc2 = r2.status_code
1100
                        r2.release()
1101
                        self.assertNotEqual(sc1, sc2)
1102

    
1103
                """Check sharing_accounts"""
1104
                r = self.client.get_sharing_accounts()
1105
                self.assertTrue(len(r)>0)
1106

    
1107
        def test_account_post(self):
1108
                """Test account_POST"""
1109
                r = self.client.account_post()
1110
                self.assertEqual(r.status_code, 202)
1111
                grpName = 'grp'+unicode(self.now)
1112
                
1113

    
1114
                """Method set/del_account_meta and set_account_groupcall use account_post internally
1115
                """
1116
                self.client.set_account_group(grpName, ['u1', 'u2'])
1117
                r = self.client.get_account_group()
1118
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
1119
                self.client.del_account_group(grpName)
1120
                r = self.client.get_account_group()
1121
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
1122

    
1123
                mprefix = 'meta'+unicode(self.now)
1124
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
1125
                r = self.client.get_account_meta()
1126
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
1127
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
1128

    
1129
                self.client.del_account_meta(mprefix+'1')
1130
                r = self.client.get_account_meta()
1131
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
1132

    
1133
                self.client.del_account_meta(mprefix+'2')
1134
                r = self.client.get_account_meta()
1135
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
1136

    
1137
                """Missing testing for quota, versioning, because normally
1138
                you don't have permitions to modify those at account level
1139
                """
1140

    
1141
                newquota=1000000
1142
                self.client.set_account_quota(newquota)
1143
                #r = self.client.get_account_info()
1144
                #print(unicode(r))
1145
                #r = self.client.get_account_quota()
1146
                #self.assertEqual(r['x-account-policy-quota'], newquota)
1147
                self.client.set_account_versioning('auto')
1148

    
1149
        def test_container_head(self):
1150
                """Test container_HEAD"""
1151
                self.client.container = self.c1
1152

    
1153
                r = self.client.container_head()
1154
                self.assertEqual(r.status_code, 204)
1155
                
1156
                """Check until"""
1157
                r = self.client.container_head(until=1000000, success=(204, 404))
1158
                self.assertEqual(r.status_code, 404)
1159
                
1160
                """Check and if(un)modified_since"""
1161
                for format in self.client.DATE_FORMATS:
1162
                        now_formated = self.now_unformated.strftime(format)
1163
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
1164
                        sc1=r1.status_code
1165
                        r1.release()
1166
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1167
                        sc2=r2.status_code
1168
                        r2.release()
1169
                        self.assertNotEqual(sc1, sc2)
1170

    
1171
                """Check container object meta"""
1172
                r = self.client.get_container_object_meta()
1173
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1174

    
1175
        def test_container_get(self):
1176
                """Test container_GET"""
1177
                self.client.container = self.c1
1178

    
1179
                r = self.client.container_get()
1180
                self.assertEqual(r.status_code, 200)
1181
                fullLen = len(r.json)
1182
                
1183

    
1184
                r = self.client.container_get(prefix='test')
1185
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1186
                self.assertTrue(len(r.json) > 1)
1187
                self.assertEqual(len(r.json), len(lalobjects))
1188
                
1189

    
1190
                r = self.client.container_get(limit=1)
1191
                self.assertEqual(len(r.json), 1)
1192
                
1193

    
1194
                r = self.client.container_get(marker='another')
1195
                self.assertTrue(len(r.json) > 1)
1196
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1197
                self.assertEqual(len(r.json), len(neobjects))
1198
                
1199

    
1200
                r = self.client.container_get(prefix='another.test', delimiter='.')
1201
                self.assertTrue(fullLen > len(r.json))
1202
                
1203

    
1204
                r = self.client.container_get(path='/')
1205
                self.assertEqual(fullLen, len(r.json))
1206
                
1207

    
1208
                r = self.client.container_get(format='xml')
1209
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1210
                
1211

    
1212
                r = self.client.container_get(meta=['incontainer'])
1213
                self.assertTrue(len(r.json) > 0)
1214
                
1215

    
1216
                r = self.client.container_get(show_only_shared=True)
1217
                self.assertTrue(len(r.json) < fullLen)
1218
                
1219

    
1220
                try:
1221
                        r = self.client.container_get(until=1000000000)
1222
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1223
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1224
                        
1225
                except ClientError:
1226
                        
1227
                        pass
1228

    
1229
                """Check and if un/modified_since"""
1230
                for format in self.client.DATE_FORMATS:
1231
                        now_formated = self.now_unformated.strftime(format)
1232
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1233
                        sc1 = r1.status_code
1234
                        r1.release()
1235
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1236
                        sc2 = r2.status_code
1237
                        r2.release()
1238
                        self.assertNotEqual(sc1, sc2)
1239
           
1240
        def test_container_put(self):
1241
                """Test container_PUT"""
1242
                self.client.container = self.c2
1243

    
1244
                r = self.client.container_put()
1245
                self.assertEqual(r.status_code, 202)
1246
                
1247

    
1248
                r = self.client.get_container_quota(self.client.container)
1249
                cquota = r.values()[0]
1250
                newquota = 2*int(cquota)
1251

    
1252
                r = self.client.container_put(quota=newquota)
1253
                self.assertEqual(r.status_code, 202)
1254
                
1255
                r = self.client.get_container_quota(self.client.container)
1256
                xquota = int(r.values()[0])
1257
                self.assertEqual(newquota, xquota)
1258

    
1259
                r = self.client.container_put(versioning='auto')
1260
                self.assertEqual(r.status_code, 202)
1261
                
1262
                r = self.client.get_container_versioning(self.client.container)
1263
                nvers = r.values()[0]
1264
                self.assertEqual('auto', nvers)
1265

    
1266
                r = self.client.container_put(versioning='none')
1267
                self.assertEqual(r.status_code, 202)
1268
                
1269
                r = self.client.get_container_versioning(self.client.container)
1270
                nvers = r.values()[0]
1271
                self.assertEqual('none', nvers)
1272

    
1273
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1274
                self.assertEqual(r.status_code, 202)
1275
                
1276
                r = self.client.get_container_meta(self.client.container)
1277
                self.assertTrue(r.has_key('x-container-meta-m1'))
1278
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1279
                self.assertTrue(r.has_key('x-container-meta-m2'))
1280
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1281

    
1282
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1283
                self.assertEqual(r.status_code, 202)
1284
                
1285
                r = self.client.get_container_meta(self.client.container)
1286
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1287
                self.assertTrue(r.has_key('x-container-meta-m2'))
1288
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1289
           
1290
                self.client.del_container_meta(self.client.container)
1291

    
1292
        def test_container_post(self):
1293
                """Test container_POST"""
1294
                self.client.container = self.c2
1295

    
1296
                """Simple post"""
1297
                r = self.client.container_post()
1298
                self.assertEqual(r.status_code, 202)
1299
                
1300

    
1301
                """post meta"""
1302
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1303
                r = self.client.get_container_meta(self.client.container)
1304
                self.assertTrue(r.has_key('x-container-meta-m1'))
1305
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1306
                self.assertTrue(r.has_key('x-container-meta-m2'))
1307
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1308

    
1309
                """post/2del meta"""
1310
                r = self.client.del_container_meta('m1')
1311
                r = self.client.set_container_meta({'m2':'v2a'})
1312
                r = self.client.get_container_meta(self.client.container)
1313
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1314
                self.assertTrue(r.has_key('x-container-meta-m2'))
1315
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1316

    
1317
                """check quota"""
1318
                r = self.client.get_container_quota(self.client.container)
1319
                cquota = r.values()[0]
1320
                newquota = 2*int(cquota)
1321
                r = self.client.set_container_quota(newquota)
1322
                r = self.client.get_container_quota(self.client.container)
1323
                xquota = int(r.values()[0])
1324
                self.assertEqual(newquota, xquota)
1325
                r = self.client.set_container_quota(cquota)
1326
                r = self.client.get_container_quota(self.client.container)
1327
                xquota = r.values()[0]
1328
                self.assertEqual(cquota, xquota)
1329

    
1330
                """Check versioning"""
1331
                self.client.set_container_versioning('auto')
1332
                r = self.client.get_container_versioning(self.client.container)
1333
                nvers = r.values()[0]
1334
                self.assertEqual('auto', nvers)
1335
                self.client.set_container_versioning('none')
1336
                r = self.client.get_container_versioning(self.client.container)
1337
                nvers = r.values()[0]
1338
                self.assertEqual('none', nvers)
1339

    
1340
                """put_block uses content_type and content_length to
1341
                post blocks of data 2 container. All that in upload_object"""
1342
                """Change a file at fs"""
1343
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1344
                """Upload it at a directory in container"""
1345
                self.client.create_directory('dir')
1346
                newf = open(self.fname, 'r')
1347
                self.client.upload_object('/dir/sample.file', newf)
1348
                newf.close()
1349
                """Check if file has been uploaded"""
1350
                r = self.client.get_object_info('/dir/sample.file')
1351
                self.assertTrue(int(r['content-length']) > 100000000)
1352

    
1353
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1354
                #TODO
1355

    
1356
                """Check update=False"""
1357
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1358
                
1359
                r = self.client.get_object_info('test')
1360
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1361
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1362

    
1363
                r = self.client.del_container_meta('m2')
1364

    
1365
        def test_container_delete(self):
1366
                """Test container_DELETE"""
1367

    
1368
                """Fail to delete a non-empty container"""
1369
                self.client.container = self.c2
1370
                r = self.client.container_delete(success=409)
1371
                self.assertEqual(r.status_code, 409)
1372
                
1373

    
1374
                """Fail to delete c3 (empty) container"""
1375
                self.client.container = self.c3
1376
                r = self.client.container_delete(until='1000000000')
1377
                self.assertEqual(r.status_code, 204)
1378
                
1379

    
1380
                """Delete c3 (empty) container"""
1381
                r = self.client.container_delete()
1382
                self.assertEqual(r.status_code, 204)
1383

    
1384
                """Purge container(empty a container), check versionlist"""
1385
                self.client.container = self.c1
1386
                r = self.client.object_head('test', success=(200, 404))
1387
                self.assertEqual(r.status_code, 200)
1388
                self.client.del_container(delimiter='/')
1389
                r = self.client.object_head('test', success=(200, 404))
1390
                self.assertEqual(r.status_code, 404)
1391
                r = self.client.get_object_versionlist('test')
1392
                self.assertTrue(len(r) > 0)
1393
                self.assertTrue(len(r[0])>1)
1394
                self.client.purge_container()
1395
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1396

    
1397
        def test_object_head(self):
1398
                """Test object_HEAD"""
1399
                self.client.container = self.c2
1400
                obj = 'test'
1401

    
1402
                r = self.client.object_head(obj)
1403
                self.assertEqual(r.status_code, 200)
1404
                etag = r.headers['etag']
1405
                
1406

    
1407
                r = self.client.object_head(obj, version=40)
1408
                self.assertEqual(r.headers['x-object-version'], '40')
1409
                
1410

    
1411
                r = self.client.object_head(obj, if_etag_match=etag)
1412
                self.assertEqual(r.status_code, 200)
1413
                
1414
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1415
                self.assertNotEqual(r.status_code, 200)
1416
                
1417

    
1418
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1419
                self.assertEqual(r.status_code, 412)
1420
                
1421

    
1422
                """Check and if(un)modified_since"""
1423
                for format in self.client.DATE_FORMATS:
1424
                        now_formated = self.now_unformated.strftime(format)
1425
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1426
                                success=(200, 304, 412))
1427
                        sc1 = r1.status_code
1428
                        r1.release()
1429
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1430
                                success=(200, 304, 412))
1431
                        sc2 = r2.status_code
1432
                        r2.release()
1433
                        self.assertNotEqual(sc1, sc2)
1434

    
1435
        def test_object_get(self):
1436
                """Test object_GET"""
1437
                self.client.container = self.c1
1438
                obj = 'test'
1439

    
1440
                r = self.client.object_get(obj)
1441
                self.assertEqual(r.status_code, 200)
1442

    
1443
                osize = int(r.headers['content-length'])
1444
                etag = r.headers['etag']
1445
                
1446

    
1447
                r = self.client.object_get(obj, hashmap=True)
1448
                self.assertTrue(r.json.has_key('hashes') \
1449
                        and r.json.has_key('block_hash') \
1450
                        and r.json.has_key('block_size') \
1451
                        and r.json.has_key('bytes'))
1452
                
1453

    
1454
                r = self.client.object_get(obj, format='xml', hashmap=True)
1455
                self.assertEqual(len(r.text.split('hash>')), 3)
1456
                
1457

    
1458
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1459
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1460
                partsize = int(r.headers['content-length'])
1461
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1462
                
1463

    
1464
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1465
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1466
                partsize = int(r.headers['content-length'])
1467
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1468
                
1469

    
1470
                r = self.client.object_get(obj, if_etag_match=etag)
1471
                self.assertEqual(r.status_code, 200)
1472
                
1473

    
1474
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1475
                self.assertEqual(r.status_code, 200)
1476
                
1477

    
1478
                """Check and if(un)modified_since"""
1479
                for format in self.client.DATE_FORMATS:
1480
                        now_formated = self.now_unformated.strftime(format)
1481
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1482
                                success=(200, 304, 412))
1483
                        sc1 = r1.status_code
1484
                        r1.release()
1485
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1486
                        sc2 = r2.status_code
1487
                        r2.release()
1488
                        self.assertNotEqual(sc1, sc2)
1489

    
1490
        def test_object_put(self):
1491
                """Test object_PUT"""
1492

    
1493
                self.client.container = self.c2
1494
                obj='another.test'
1495

    
1496
                """create the object"""
1497
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1498
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1499
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1500
                        content_disposition='attachment; filename="fname.ext"')
1501
                self.assertEqual(r.status_code, 201)
1502
                etag = r.headers['etag']
1503
                
1504
                """Check content-disposition"""
1505
                r = self.client.get_object_info(obj)
1506
                self.assertTrue(r.has_key('content-disposition'))
1507

    
1508
                """Check permitions"""
1509
                r = self.client.get_object_sharing(obj)
1510
                self.assertTrue('accx:groupa' in r['read'])
1511
                self.assertTrue('u1' in r['read'])
1512
                self.assertTrue('u2' in r['write'])
1513
                self.assertTrue('u3' in r['write'])
1514

    
1515
                """Check metadata"""
1516
                r = self.client.get_object_meta(obj)
1517
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1518
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1519

    
1520
                """Check public and if_etag_match"""
1521
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1522
                        content_type='application/octet-stream', public=True)
1523
                
1524
                r = self.client.object_get(obj)
1525
                self.assertTrue(r.headers.has_key('x-object-public'))
1526
                vers2 = int(r.headers['x-object-version'])
1527
                etag = r.headers['etag']
1528
                self.assertEqual(r.text, 'b')
1529
                
1530
                """Check if_etag_not_match"""
1531
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1532
                        content_type='application/octet-stream', success=(201, 412))
1533
                self.assertEqual(r.status_code, 412)
1534
                
1535

    
1536
                """Check content_type and content_length"""
1537
                tmpdir = 'dir'+unicode(self.now)
1538
                r = self.client.object_put(tmpdir, content_type='application/directory',
1539
                        content_length=0)
1540
                
1541
                r = self.client.get_object_info(tmpdir)
1542
                self.assertEqual(r['content-type'], 'application/directory')
1543

    
1544
                """Check copy_from, content_encoding"""
1545
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1546
                        copy_from='/%s/%s'%(self.client.container, obj),
1547
                        content_encoding='application/octet-stream', 
1548
                        source_account=self.client.account,
1549
                        content_length=0, success=201)
1550
                self.assertEqual(r.status_code, 201)
1551

    
1552
                """Test copy_object for cross-conctainer copy"""
1553
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1554
                        dst_container=self.c1, dst_object=obj)
1555
                self.client.container = self.c1
1556
                r1 = self.client.get_object_info(obj)
1557
                self.client.container = self.c2
1558
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1559
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1560
                
1561
                """Check cross-container copy_from, content_encoding"""
1562
                self.client.container = self.c1
1563
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1564
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1565
                        content_encoding='application/octet-stream', 
1566
                        source_account=self.client.account,
1567
                        content_length=0, success=201)
1568
                
1569
                self.assertEqual(r.status_code, 201)
1570
                r = self.client.get_object_info(obj)
1571
                self.assertEqual(r['etag'], etag)
1572

    
1573
                """Check source_account"""
1574
                self.client.container = self.c2
1575
                fromstr = '/'+self.c1+'/'+obj
1576
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1577
                        content_encoding='application/octet-stream', 
1578
                        source_account='nonExistendAddress@NeverLand.com', 
1579
                        content_length=0, success=(201, 403))
1580
                self.assertEqual(r.status_code, 403)
1581
                
1582
                """Check cross-container move_from"""
1583
                self.client.container = self.c1
1584
                r1 = self.client.get_object_info(obj)
1585
                self.client.container = self.c2
1586
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1587
                dst_object=obj+'v0')
1588
                r0 = self.client.get_object_info(obj+'v0')
1589
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1590

    
1591
                """Check move_from"""
1592
                r = self.client.object_put(obj+'v1', format=None, 
1593
                        move_from='/'+self.c2+'/'+obj,
1594
                        source_version = vers2,
1595
                        content_encoding='application/octet-stream',
1596
                        content_length=0, success=201)
1597
                
1598
                """Check manifest"""
1599
                mobj = 'manifest.test'
1600
                txt = ''
1601
                for i in range(10):
1602
                        txt += '%s'%i
1603
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1604
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1605
                        
1606
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1607
                        manifest='%s/%s'%(self.client.container, mobj))
1608
                
1609
                r = self.client.object_get(mobj)
1610
                self.assertEqual(r.text, txt)
1611
           
1612
                """Upload a local file with one request"""
1613
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1614
                newf = open(self.fname, 'r')
1615
                self.client.upload_object('sample.file', newf)
1616
                newf.close()
1617
                """Check if file has been uploaded"""
1618
                r = self.client.get_object_info('sample.file')
1619
                self.assertEqual(int(r['content-length']), 10260)
1620

    
1621
                """Some problems with transfer-encoding?"""
1622

    
1623
        def test_object_copy(self):
1624
                """Test object_COPY"""
1625
                self.client.container=self.c2
1626
                obj = 'test2'
1627

    
1628
                data= '{"key1":"val1", "key2":"val2"}'
1629
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1630
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1631
                        permitions={
1632
                                'read':['accX:groupA', 'u1', 'u2'],
1633
                                'write':['u2', 'u3']},
1634
                        content_disposition='attachment; filename="fname.ext"')
1635
                
1636
                r = self.client.object_copy(obj+'orig',
1637
                        destination = '/'+self.client.container+'/'+obj,
1638
                        ignore_content_type=False, content_type='application/json', 
1639
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1640
                        permitions={'write':['u5', 'accX:groupB']})
1641
                self.assertEqual(r.status_code, 201)
1642
                
1643
                """Check content-disposition"""
1644
                r = self.client.get_object_info(obj)
1645
                self.assertTrue(r.has_key('content-disposition'))
1646

    
1647
                """Check Metadata"""
1648
                r = self.client.get_object_meta(obj)
1649
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1650
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1651
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1652

    
1653
                """Check permitions"""
1654
                r = self.client.get_object_sharing(obj)
1655
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1656
                self.assertTrue('accx:groupb' in r['write'])
1657

    
1658
                """Check destination account"""
1659
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1660
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1661
                        success=(201, 403))
1662
                self.assertEqual(r.status_code, 403)
1663
                
1664

    
1665
                """Check destination being another container
1666
                and also content_type and content encoding"""
1667
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1668
                        content_encoding='utf8', content_type='application/json')
1669
                self.assertEqual(r.status_code, 201)
1670
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1671
                
1672

    
1673
                """Check ignore_content_type and content_type"""
1674
                r = self.client.object_get(obj)
1675
                etag = r.headers['etag']
1676
                ctype = r.headers['content-type']
1677
                self.assertEqual(ctype, 'application/json')
1678
                
1679
                r = self.client.object_copy(obj+'orig',
1680
                        destination = '/'+self.client.container+'/'+obj+'0',
1681
                        ignore_content_type=True, content_type='application/json')
1682
                self.assertEqual(r.status_code, 201)
1683
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1684
                
1685

    
1686
                """Check if_etag_(not_)match"""
1687
                r = self.client.object_copy(obj,
1688
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1689
                self.assertEqual(r.status_code, 201)
1690
                
1691
                r = self.client.object_copy(obj,
1692
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1693
                self.assertEqual(r.status_code, 201)
1694
                vers2 = r.headers['x-object-version']
1695
                
1696

    
1697
                """Check source_version, public and format """
1698
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1699
                self.assertEqual(r.status_code, 201)
1700
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1701
                
1702
                r = self.client.get_object_info(obj+'3')
1703
                self.assertTrue(r.has_key('x-object-public'))
1704

    
1705
        def test_object_move(self):
1706
                """Test object_MOVE"""
1707
                self.client.container= self.c2
1708
                obj = 'test2'
1709

    
1710
                data= '{"key1":"val1", "key2":"val2"}'
1711
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1712
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1713
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1714
                
1715
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1716
                        ignore_content_type=False, content_type='application/json', 
1717
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1718
                        permitions={'write':['u5', 'accX:groupB']})
1719
                self.assertEqual(r.status_code, 201)
1720
                
1721

    
1722
                """Check Metadata"""
1723
                r = self.client.get_object_meta(obj)
1724
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1725
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1726
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1727

    
1728
                """Check permitions"""
1729
                r = self.client.get_object_sharing(obj)
1730
                self.assertFalse(r.has_key('read'))
1731
                self.assertTrue('u5' in r['write'])
1732
                self.assertTrue('accx:groupb' in r['write'])
1733

    
1734
                """Check destination account"""
1735
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1736
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1737
                        success=(201, 403))
1738
                self.assertEqual(r.status_code, 403)
1739
                
1740

    
1741
                """Check destination being another container and also
1742
                content_type, content_disposition and content encoding"""
1743
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1744
                        content_encoding='utf8', content_type='application/json',
1745
                        content_disposition='attachment; filename="fname.ext"')
1746
                self.assertEqual(r.status_code, 201)
1747
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1748
                self.client.container=self.c1
1749
                r = self.client.get_object_info(obj)
1750
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1751
                etag = r['etag']
1752
                ctype = r['content-type']
1753
                self.assertEqual(ctype, 'application/json')
1754

    
1755
                """Check ignore_content_type and content_type"""
1756
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1757
                        ignore_content_type=True, content_type='application/json')
1758
                self.assertEqual(r.status_code, 201)
1759
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1760
                
1761

    
1762
                """Check if_etag_(not_)match"""
1763
                self.client.container=self.c2
1764
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1765
                        if_etag_match=etag)
1766
                self.assertEqual(r.status_code, 201)
1767
                
1768
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1769
                        if_etag_not_match='lalala')
1770
                self.assertEqual(r.status_code, 201)
1771
                
1772

    
1773
                """Check public and format """
1774
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1775
                        format='xml', public=True)
1776
                self.assertEqual(r.status_code, 201)
1777
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1778
                
1779
                r = self.client.get_object_info(obj+'2')
1780
                self.assertTrue(r.has_key('x-object-public'))
1781

    
1782
        def test_object_post(self):
1783
                """Test object_POST"""
1784
                self.client.container=self.c2
1785
                obj = 'test2'
1786
                """create a filesystem file"""
1787
                self.fname = obj
1788
                newf = open(self.fname, 'w')
1789
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1790
                newf.close()
1791
                """create a file on container"""
1792
                r = self.client.object_put(obj, content_type='application/octet-stream',
1793
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1794
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1795
                
1796

    
1797
                """Append tests update, content_range, content_type, content_length"""
1798
                newf = open(obj, 'r')
1799
                self.client.append_object(obj, newf)
1800
                r = self.client.object_get(obj)
1801
                self.assertTrue(r.text.startswith('Hello!'))
1802
                
1803

    
1804
                """Overwrite tests update, content_type, content_length, content_range"""
1805
                newf.seek(0)
1806
                r = self.client.overwrite_object(obj, 0, 10, newf)
1807
                r = self.client.object_get(obj)
1808
                self.assertTrue(r.text.startswith('ello!'))
1809
                newf.close()
1810
                
1811
                
1812
                """Truncate tests update, content_range, content_type,
1813
                object_bytes and source_object"""
1814
                r = self.client.truncate_object(obj, 5)
1815
                r = self.client.object_get(obj)
1816
                self.assertEqual(r.text, 'ello!')
1817
                
1818

    
1819
                """Check metadata"""
1820
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1821
                r = self.client.get_object_meta(obj)
1822
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1823
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1824
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1825
                self.client.del_object_meta('mkey1', obj)
1826
                r = self.client.get_object_meta(obj)
1827
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1828

    
1829
                """Check permitions"""
1830
                self.client.set_object_sharing(obj,
1831
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1832
                r = self.client.get_object_sharing(obj)
1833
                self.assertTrue(r.has_key('read'))
1834
                self.assertTrue('u5' in r['read'])
1835
                self.assertTrue(r.has_key('write'))
1836
                self.assertTrue('u4' in r['write'])
1837
                self.client.del_object_sharing(obj)
1838
                r = self.client.get_object_sharing(obj)
1839
                self.assertTrue(len(r) == 0)
1840

    
1841
                """Check publish"""
1842
                self.client.publish_object(obj)
1843
                r = self.client.get_object_info(obj)
1844
                self.assertTrue(r.has_key('x-object-public'))
1845
                self.client.unpublish_object(obj)
1846
                r = self.client.get_object_info(obj)
1847
                self.assertFalse(r.has_key('x-object-public'))
1848

    
1849
                """Check if_etag_(not)match"""
1850
                etag = r['etag']
1851
                #r = self.client.object_post(obj, update=True, public=True,
1852
                #        if_etag_not_match=etag, success=(412,202,204))
1853
                #self.assertEqual(r.status_code, 412)
1854
                
1855
                r = self.client.object_post(obj, update=True, public=True,
1856
                        if_etag_match=etag, content_encoding='application/json')
1857
                
1858
                r = self.client.get_object_info(obj)
1859
                helloVersion = r['x-object-version']
1860
                self.assertTrue(r.has_key('x-object-public'))
1861
                self.assertEqual(r['content-encoding'], 'application/json')
1862

    
1863
                """Check source_version and source_account and content_disposition"""
1864
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1865
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1866
                        source_account='thisAccountWillNeverExist@adminland.com',
1867
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1868
                self.assertEqual(r.status_code, 403)
1869
                
1870
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1871
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1872
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1873
                        content_disposition='attachment; filename="fname.ext"')
1874
                
1875
                r = self.client.object_get(obj)
1876
                self.assertEqual(r.text, 'eello!')
1877
                self.assertTrue(r.headers.has_key('content-disposition')
1878
                        and 'fname.ext' in r.headers['content-disposition'])
1879
                
1880

    
1881
                """Check manifest"""
1882
                mobj = 'manifest.test'
1883
                txt = ''
1884
                for i in range(10):
1885
                        txt += '%s'%i
1886
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1887
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1888
                        
1889
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1890
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1891
                
1892
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1893
                
1894
                r = self.client.object_get(mobj)
1895
                self.assertEqual(r.text, txt)
1896
                
1897

    
1898
                """We need to check transfer_encoding """
1899

    
1900
        def test_object_delete(self):
1901
                """Test object_DELETE"""
1902
                self.client.container=self.c2
1903
                obj = 'test2'
1904
                """create a file on container"""
1905
                r = self.client.object_put(obj, content_type='application/octet-stream',
1906
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1907
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1908
                
1909

    
1910
                """Check with false until"""
1911
                r = self.client.object_delete(obj, until=1000000)
1912
                
1913
                r = self.client.object_get(obj, success=(200, 404))
1914
                self.assertEqual(r.status_code, 200)
1915
                
1916

    
1917
                """Check normal case"""
1918
                r = self.client.object_delete(obj)
1919
                self.assertEqual(r.status_code, 204)
1920
                
1921
                r = self.client.object_get(obj, success=(200, 404))
1922
                self.assertEqual(r.status_code, 404)
1923
                
1924

    
1925
        def create_large_file(self, size, name):
1926
                """Create a large file at fs"""
1927
                self.fname = name
1928
                import random
1929
                random.seed(self.now)
1930
                f = open(self.fname, 'w')
1931
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1932
                for hobyte_id in range(size/8):
1933
                        sss = 'hobt%s'%random.randint(1000, 9999)
1934
                        f.write(sss)
1935
                        if 0 == (hobyte_id*800)%size:
1936
                                f.write('\n')
1937
                                sys.stdout.write('\b\b')
1938
                                prs = (hobyte_id*800)//size
1939
                                if prs > 10:
1940
                                        sys.stdout.write('\b')
1941
                                sys.stdout.write('%s'%prs+'%')
1942
                                sys.stdout.flush()
1943
                print('\b\b\b100%')
1944
                f.close()
1945
                """"""
1946

    
1947
def init_parser():
1948
        parser = ArgumentParser(add_help=False)
1949
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1950
                help="Show this help message and exit")
1951
        return parser
1952

    
1953
if __name__ == '__main__':
1954
        parser = init_parser()
1955
        args, argv = parser.parse_known_args()
1956

    
1957
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1958
                raise Exception('\tusage: tests.py <group> [command]')
1959
        suiteFew = unittest.TestSuite()
1960

    
1961
        if len(argv) == 0 or argv[0] == 'pithos':
1962
                if len(argv) == 1:
1963
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1964
                else:
1965
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1966
        if len(argv) == 0 or argv[0] == 'cyclades':
1967
                if len(argv) == 1:
1968
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1969
                        suiteFew.addTest(testCyclades('test_000'))
1970
                else:
1971
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1972
        if len(argv) == 0 or argv[0] == 'image':
1973
                if len(argv) == 1:
1974
                        suiteFew.addTest(unittest.makeSuite(testImage))
1975
                else:
1976
                        suiteFew.addTest(testImage('test'+argv[1]))
1977
        if len(argv) == 0 or argv[0] == 'astakos':
1978
                if len(argv) == 1:
1979
                        suiteFew.addTest(unittest.makeSuite(testAstakos))
1980
                else:
1981
                        suiteFew.addTest(testAstakos('test'+argv[1]))
1982

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