Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 03fd7ddb

History | View | Annotate | Download (62.1 kB)

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

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

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

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

    
47
TEST_ALL = False
48

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
243

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
313
                sys.stdout.write(' test create_network')
314
                self._test_create_network()        
315
                print('...ok')
316

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

    
321
                sys.stdout.write(' test disconnect_server')
322
                self._test_disconnect_server()        
323
                print('...ok')
324

    
325
                self.network2 = self._create_network(self.netname2)
326

    
327
                sys.stdout.write(' test list_server_nics')
328
                self._test_list_server_nics()        
329
                print('...ok')
330

    
331
                sys.stdout.write(' test list_networks')
332
                self._test_list_networks()        
333
                print('...ok')
334

    
335
                sys.stdout.write(' test get_network_details')
336
                self._test_get_network_details()        
337
                print('...ok')
338

    
339
                sys.stdout.write(' test update_network_name')
340
                self._test_update_network_name()        
341
                print('...ok')
342

    
343
                """Don't have auth for these:
344
                sys.stdout.write(' test delete_image')
345
                self._test_delete_image()
346
                print('...ok')
347
                sys.stdout.write(' test create_image_metadata')
348
                self._test_create_image_metadata()
349
                print('...ok')
350
                sys.stdout.write(' test update_image_metadata')
351
                self._test_update_image_metadata()
352
                print('...ok')
353
                sys.stdout.write(' test delete_image_metadata')
354
                self._test_delete_image_metadata()
355
                print('...ok')
356
                """
357

    
358
        def _wait_for_network(self, netid, status):
359
                wait = 3
360
                limit = 50
361
                c=['|','/','-','\\']
362
                sys.stdout.write('Wait for net %s to be %s  '%(netid, status))
363
                while wait < limit:
364
                        r = self.client.get_network_details(netid)
365
                        if r['status'] == status:
366
                                print('\tOK')
367
                                return True
368
                        print('\tit is now %s, wait %ss  '%(r['status'], wait))
369
                        for i in range(wait*4):
370
                                sys.stdout.write('\b%s'%c[i%4])
371
                                sys.stdout.flush()
372
                                time.sleep(0.25)
373
                        print('\b ')
374
                        wait += 3
375
                return False
376

    
377
        def _wait_for_nic(self, netid, servid, in_creation=True):
378
                c=['|','/','-','\\']
379
                limit = 50
380
                wait=3
381
                largetry = 0
382
                while wait < limit:
383
                        nics = self.client.list_server_nics(servid)
384
                        for net in nics:
385
                                found_nic = net['id'] == netid
386
                                if (in_creation and found_nic) or not (in_creation or found_nic):
387
                                        return True
388
                        dis = '' if in_creation else 'dis'
389
                        sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
390
                        for i in range(wait*4):
391
                                sys.stdout.write('\b%s'%c[i%4])
392
                                sys.stdout.flush()
393
                                time.sleep(0.25)
394
                        print('\b ')
395
                        wait += 3
396
                        if wait >= limit and largetry < 3:
397
                                wait = 3
398
                                largetry += 1
399
                return False
400

    
401
        def _has_status(self, servid, status):
402
                r = self.client.get_server_details(servid)
403
                return r['status'] == status
404
        def _wait_for_status(self, servid, status):
405
                wait = 0
406
                c=['|','/','-','\\']
407
                while self._has_status(servid, status):
408
                        if wait:
409
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
410
                                for i in range(4*wait):
411
                                        sys.stdout.write('\b%s'%c[i%4])
412
                                        sys.stdout.flush()
413
                                        time.sleep(0.25)
414
                                print('\b ')
415
                        wait = (wait + 3) if wait<60 else 0
416

    
417
        @if_not_all
418
        def test_list_servers(self):
419
                """Test list servers"""
420
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
421
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
422
                self._test_list_servers()
423

    
424
        def _test_list_servers(self):
425
                servers = self.client.list_servers()
426
                dservers = self.client.list_servers(detail=True)
427

    
428
                """detailed and simple are same size"""
429
                self.assertEqual(len(dservers), len(servers))
430
                for i in range(len(servers)):
431
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
432
                                'status', 'updated']:
433
                                self.assertFalse(servers[i].has_key(field))
434
                                self.assertTrue(dservers[i].has_key(field))
435

    
436
                """detailed and simple contain same names"""
437
                names = sorted(map(lambda x: x["name"], servers))
438
                dnames = sorted(map(lambda x: x["name"], dservers))
439
                self.assertEqual(names, dnames)
440

    
441
        @if_not_all
442
        def test_create_server(self):
443
                """Test create_server"""
444
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
445
                self._wait_for_status(self.server1['id'], 'BUILD')
446
                self._test_create_server()
447

    
448
        def _test_create_server(self):
449
                self.assertEqual(self.server1["name"], self.servname1)
450
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
451
                self.assertEqual(self.server1["imageRef"], self.img)
452
                self.assertEqual(self.server1["status"], "BUILD")
453

    
454
        @if_not_all
455
        def test_get_server_details(self):
456
                """Test get_server_details"""
457
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
458
                self._wait_for_status(self.server1['id'], 'BUILD')
459
                self._test_get_server_details()
460

    
461
        def _test_get_server_details(self):
462
                r = self.client.get_server_details(self.server1['id'])
463
                self.assertEqual(r["name"], self.servname1)
464
                self.assertEqual(r["flavorRef"], self.flavorid)
465
                self.assertEqual(r["imageRef"], self.img)
466
                self.assertEqual(r["status"], "ACTIVE")
467

    
468
        @if_not_all
469
        def test_get_image_details(self):
470
                """Test get_image_details"""
471
                self._test_get_image_details()
472

    
473
        def _test_get_image_details(self):
474
                r = self.client.get_image_details(self.img)
475
                d = self.img_details
476
                self.assert_dicts_are_deeply_equal(r, d)
477

    
478
        @if_not_all
479
        def test_update_server_name(self):
480
                """Test update_server_name"""
481
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
482
                self._test_update_server_name()
483

    
484
        def _test_update_server_name(self):
485
                new_name = self.servname1+'_new_name'
486
                self.client.update_server_name(self.server1['id'], new_name)
487
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
488
                self.assertEqual(r['name'], new_name)
489
                changed = self.servers.pop(self.servname1)
490
                changed['name'] = new_name
491
                self.servers[new_name] = changed
492

    
493
        @if_not_all
494
        def test_reboot_server(self):
495
                """Test reboot server"""
496
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
497
                self._wait_for_status(self.server1['id'], 'BUILD')
498
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
499
                self._wait_for_status(self.server2['id'], 'BUILD')
500
                self._test_reboot_server()
501
                self._wait_for_status(self.server1['id'], 'REBOOT')
502
                self._wait_for_status(self.server2['id'], 'REBOOT')
503

    
504
        def _test_reboot_server(self):
505
                self.client.reboot_server(self.server1['id'])
506
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
507
                self.client.reboot_server(self.server2['id'], hard=True)
508
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
509

    
510
        @if_not_all
511
        def test_get_server_metadata(self):
512
                """Test get server_metadata"""
513
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
514
                self._test_get_server_metadata()
515
        def _test_get_server_metadata(self):
516
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
517
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
518
                self.assertEqual(r['mymeta_0'], 'val_0')
519

    
520
        @if_not_all
521
        def test_create_server_metadata(self):
522
                """Test create_server_metadata"""
523
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
524
                self._test_create_server_metadata()
525

    
526
        def _test_create_server_metadata(self):
527
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
528
                self.assertTrue(r1.has_key('mymeta'))
529
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
530
                self.assert_dicts_are_deeply_equal(r1, r2)
531

    
532
        @if_not_all
533
        def test_update_server_metadata(self):
534
                """Test update_server_metadata"""
535
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
536
                self._test_update_server_metadata()
537

    
538
        def _test_update_server_metadata(self):
539
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
540
                self.assertTrue(r1.has_key('mymeta3'))
541
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
542
                self.assertTrue(r2['mymeta3'], 'val3')
543

    
544
        @if_not_all
545
        def test_delete_server_metadata(self):
546
                """Test delete_server_metadata"""
547
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
548
                self._test_delete_server_metadata()
549

    
550
        def _test_delete_server_metadata(self):
551
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
552
                self.assertTrue(r1.has_key('mymeta'))
553
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
554
                try:
555
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
556
                        raise ClientError('Wrong Error', status=100)
557
                except ClientError as err:
558
                        self.assertEqual(err.status, 404)
559

    
560
        @if_not_all
561
        def test_list_flavors(self):
562
                """Test flavors_get"""
563
                self._test_list_flavors()
564

    
565
        def _test_list_flavors(self):
566
                r = self.client.list_flavors()
567
                self.assertTrue(len(r) > 1)
568
                r = self.client.list_flavors(detail=True)
569
                self.assertTrue(r[0].has_key('SNF:disk_template'))
570

    
571
        @if_not_all
572
        def test_get_flavor_details(self):
573
                """Test test_get_flavor_details"""
574
                self._test_get_flavor_details()
575

    
576
        def _test_get_flavor_details(self):
577
                r = self.client.get_flavor_details(self.flavorid)
578
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
579

    
580
        @if_not_all
581
        def test_list_images(self):
582
                """Test list_images"""
583
                self._test_list_images()
584

    
585
        def _test_list_images(self):
586
                r = self.client.list_images()
587
                self.assertTrue(len(r) > 1)
588
                r = self.client.list_images(detail=True)
589
                for detailed_img in r:
590
                        if detailed_img['id'] == self.img:
591
                                break
592
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
593

    
594
        @if_not_all
595
        def test_image_details(self):
596
                """Test image_details"""
597
                self._test_get_image_details
598

    
599
        def _test_get_image_details(self):
600
                r = self.client.get_image_details(self.img)
601
                self.assert_dicts_are_deeply_equal(r, self.img_details)
602

    
603
        @if_not_all
604
        def test_get_image_metadata(self):
605
                """Test get_image_metadata"""
606
                self._test_get_image_metadata()
607

    
608
        def _test_get_image_metadata(self):
609
                r = self.client.get_image_metadata(self.img)
610
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
611
                for key,val in self.img_details['metadata']['values'].items():
612
                        r = self.client.get_image_metadata(self.img, key)
613
                        self.assertEqual(r[key], val)
614

    
615
        @if_not_all
616
        def test_start_server(self):
617
                """Test start_server"""
618
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
619
                self._wait_for_status(self.server1['id'], 'BUILD')
620
                self.client.shutdown_server(self.server1['id'])
621
                self._wait_for_status(self.server1['id'], 'ACTIVE')
622
                self._test_start_server()
623

    
624
        def _test_start_server(self):
625
                self.client.start_server(self.server1['id'])
626
                self._wait_for_status(self.server1['id'], 'STOPPED')
627
                r = self.client.get_server_details(self.server1['id'])
628
                self.assertEqual(r['status'], 'ACTIVE')
629

    
630
        @if_not_all
631
        def test_shutdown_server(self):
632
                """Test shutdown_server"""
633
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
634
                self._wait_for_status(self.server1['id'], 'BUILD')
635
                self._test_shutdown_server()
636

    
637
        def _test_shutdown_server(self):
638
                self.client.shutdown_server(self.server1['id'])
639
                self._wait_for_status(self.server1['id'], 'ACTIVE')
640
                r = self.client.get_server_details(self.server1['id'])
641
                self.assertEqual(r['status'], 'STOPPED')
642

    
643
        @if_not_all
644
        def test_get_server_console(self):
645
                """Test get_server_console"""
646
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
647
                self._test_get_server_console()
648

    
649
        def _test_get_server_console(self):
650
                self._wait_for_status(self.server2['id'], 'BUILD')
651
                r = self.client.get_server_console(self.server2['id'])
652
                self.assertTrue(r.has_key('host'))
653
                self.assertTrue(r.has_key('password'))
654
                self.assertTrue(r.has_key('port'))
655
                self.assertTrue(r.has_key('type'))
656

    
657
        @if_not_all
658
        def test_get_firewall_profile(self):
659
                """Test get_firewall_profile"""
660
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
661
                self._test_get_firewall_profile()
662

    
663
        def _test_get_firewall_profile(self):
664
                self._wait_for_status(self.server1['id'], 'BUILD')
665
                fprofile = self.client.get_firewall_profile(self.server1['id'])
666
                self.assertTrue(fprofile in self.PROFILES)
667

    
668
        @if_not_all
669
        def test_set_firewall_profile(self):
670
                """Test set_firewall_profile"""
671
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
672
                self._test_set_firewall_profile()
673

    
674
        def _test_set_firewall_profile(self):
675
                def next_profile(cur_profile):
676
                        index = self.PROFILES.index(cur_profile)
677
                        new_index = 0 if index >= len(self.PROFILES)-1 else (index+1)
678
                        return self.PROFILES[new_index]
679

    
680
                self._wait_for_status(self.server1['id'], 'BUILD')
681
                fprofile = self.client.get_firewall_profile(self.server1['id'])
682
                for counter in range(1,1+len(self.PROFILES)):
683
                        nprofile = next_profile(fprofile)
684
                        start=fprofile
685
                        print('\tProfile swap %s: %s -> %s'%(counter, fprofile, nprofile))
686
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
687
                        wait = 3
688
                        c=['|','/','-','\\']
689
                        while fprofile != nprofile:
690
                                self.assertEqual(fprofile, start)
691
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
692
                                for i in range(4*wait):
693
                                        sys.stdout.write('\b%s'%c[i%4])
694
                                        sys.stdout.flush()
695
                                        time.sleep(0.25)
696
                                wait += 3
697
                                print('\b ')
698
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
699

    
700
        @if_not_all
701
        def test_get_server_stats(self):
702
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
703
                self._test_get_server_stats()
704

    
705
        def _test_get_server_stats(self):
706
                r = self.client.get_server_stats(self.server1['id'])
707
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
708
                        self.assertTrue(r.has_key(term))
709

    
710
        @if_not_all
711
        def test_list_networks(self):
712
                """Test list_network"""
713
                self.network1 = self._create_network(self.netname1)
714
                self._test_list_networks()
715

    
716
        def _test_list_networks(self):
717
                r = self.client.list_networks()
718
                self.assertTrue(len(r)>1)
719
                ids = [net['id'] for net in r]
720
                names = [net['name'] for net in r]
721
                self.assertTrue('public' in ids)
722
                self.assertTrue('public' in names)
723
                self.assertTrue(self.network1['id'] in ids)
724
                self.assertTrue(self.network1['name'] in names)
725

    
726
                r = self.client.list_networks(detail=True)
727
                ids = [net['id'] for net in r]
728
                names = [net['name'] for net in r]
729
                for net in r:
730
                        self.assertTrue(net['id'] in ids)
731
                        self.assertTrue(net['name'] in names)
732
                        for term in ('status', 'updated', 'created', 'servers'):
733
                                self.assertTrue(term in net.keys())
734

    
735
        @if_not_all
736
        def test_create_network(self):
737
                """Test create_network"""
738
                self.network1 = self._create_network(self.netname1)
739
                self._test_create_network()
740

    
741
        def _test_create_network(self):
742
                nets = self.client.list_networks(self.network1['id'])
743
                chosen = [net for net in nets if net['id'] == self.network1['id']][0]
744
                chosen.pop('updated')
745
                net1 = dict(self.network1)
746
                net1.pop('updated')
747
                self.assert_dicts_are_deeply_equal(chosen, net1)
748

    
749
        @if_not_all
750
        def test_connect_server(self):
751
                """Test connect_server"""
752
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
753
                self.network1 = self._create_network(self.netname1)
754
                self._wait_for_status(self.server1['id'], 'BUILD')
755
                self._wait_for_network(self.network1['id'], 'ACTIVE')
756
                self._test_connect_server()
757

    
758
        def _test_connect_server(self):
759
                self.client.connect_server(self.server1['id'], self.network1['id'])
760
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
761

    
762
        @if_not_all
763
        def test_disconnect_server(self):
764
                """Test disconnect_server"""
765
                self.test_connect_server()
766
                self._test_disconnect_server()
767

    
768
        def _test_disconnect_server(self):
769
                self.client.disconnect_server(self.server1['id'], self.network1['id'])
770
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
771
                        in_creation=False))
772

    
773

    
774
        @if_not_all
775
        def test_list_server_nics(self):
776
                """Test list_server_nics"""
777
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
778
                self.network2 = self._create_network(self.netname2)
779
                self._wait_for_status(self.server1['id'], 'BUILD')
780
                self._wait_for_network(self.network2['id'], 'ACTIVE')
781
                self._test_list_server_nics()
782

    
783
        def _test_list_server_nics(self):
784
                r = self.client.list_server_nics(self.server1['id'])
785
                len0 = len(r)
786
                self.assertTrue(len0>0)
787
                print(r)
788
                self.assertTrue('1' in [net['network_id'] for net in r])
789

    
790
                self.client.connect_server(self.server1['id'], self.network2['id'])
791
                self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
792
                r = self.client.list_server_nics(self.server1['id'])
793
                self.assertTrue(len(r)>len0)
794

    
795
        @if_not_all
796
        def test_get_network_details(self):
797
                """Test get_network_details"""
798
                self.network1 = self._create_network(self.netname1)
799
                self._test_get_network_details()
800

    
801
        def _test_get_network_details(self):
802
                r = self.client.get_network_details(self.network1['id'])
803
                self.assert_dicts_are_deeply_equal(self.network1, r)
804

    
805
        @if_not_all
806
        def test_update_network_name(self):
807
                self.network2 = self._create_network(self.netname2)
808
                self._test_update_network_name()
809

    
810
        def _test_update_network_name(self):
811
                updated_name = self.netname2+'_upd'
812
                self.client.update_network_name(self.network2['id'], updated_name)
813
                wait = 3
814
                c=['|','/','-','\\']
815
                r = self.client.get_network_details(self.network2['id'])
816
                while wait < 50:
817
                        if r['name'] == updated_name:
818
                                break
819
                        sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
820
                                self.network2['name'], updated_name, wait))
821
                        for i in range(4*wait):
822
                                sys.stdout.write('\b%s'%c[i%4])
823
                                sys.stdout.flush()
824
                                time.sleep(0.25)
825
                        print('')
826
                        wait += 3
827
                        r = self.client.get_network_details(self.network2['id'])
828
                self.assertEqual(r['name'], updated_name)
829

    
830
        """ Don't have auth to test this
831
        @if_not_all
832
        def test_delete_image(self):
833
                ""Test delete_image""
834
                self._test_delete_image()
835
        def _test_delete_image(self):
836
                images = self.client.list_images()
837
                self.client.delete_image(images[2]['id'])
838
                try:
839
                        r = self.client.get_image_details(images[2]['id'], success=(400))
840
                except ClientError as err:
841
                        self.assertEqual(err.status, 404)
842

843
        @if_not_all
844
        def test_create_image_metadata(self):
845
                ""Test create_image_metadata""
846
                self._test_create_image_metadata()
847
        def _test_create_image_metadata(self):
848
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
849
                self.assertEqual(r['mykey'], 'myval')
850

851
        @if_not_all
852
        def test_update_image_metadata(self):
853
                ""Test update_image_metadata""
854
                self._test_update_image_metadata()
855
        def _test_update_image_metadata(self):
856
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
857
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
858
                self.assertEqual(r['mykey0'], 'myval0')
859

860
        @if_not_all
861
        def test_delete_image_metadata(self):
862
                ""Test delete_image_metadata""
863
                self._test_delete_image_metadata()
864
        def _test_delete_image_metadata(self):
865
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
866
                self.client.delete_image_metadata(self.img, 'mykey1')
867
                r = self.client.get_image_metadata(self.img)
868
                self.assertNotEqual(r.has_key('mykey1'))
869
        """
870

    
871
class testPithos(unittest.TestCase):
872
        """Set up a Pithos+ thorough test"""
873
        def setUp(self):
874
                """
875
                url = 'http://127.0.0.1:8000/v1'
876
                token = 'C/yBXmz3XjTFBnujc2biAg=='
877
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
878
                account = 'admin@adminland.com'
879
                """
880

    
881
                url='https://pithos.okeanos.grnet.gr/v1'
882

    
883
                token='Kn+G9dfmlPLR2WFnhfBOow=='
884
                account='saxtouri@grnet.gr'
885

    
886
                """
887
                url='https://pithos.okeanos.io/v1'
888
                token='0TpoyAXqJSPxLdDuZHiLOA=='
889
                account='saxtouri@admin.grnet.gr'
890
                """
891
                
892
                """
893
                def add_handler(name, level, prefix=''):
894
                        h = logging.StreamHandler()
895
                        fmt = logging.Formatter(prefix + '%(message)s')
896
                        h.setFormatter(fmt)
897
                        logger = logging.getLogger(name)
898
                        logger.addHandler(h)
899
                        logger.setLevel(level)
900
                import logging
901
                sendlog = logging.getLogger('clients.send')
902
                recvlog = logging.getLogger('clients.recv')
903
                add_handler('requests', logging.INFO, prefix='* ')
904
                add_handler('clients.send', logging.INFO, prefix='> ')
905
                add_handler('clients.recv', logging.INFO, prefix='< ')
906
                """
907
                
908
                self.fname = None
909
                container=None
910
                self.client = pithos(url, token, account, container)
911
                self.now = time.mktime(time.gmtime())
912
                self.c1 = 'c1_'+unicode(self.now)
913
                self.c2 = 'c2_'+unicode(self.now)
914
                self.c3 = 'c3_'+unicode(self.now)
915

    
916

    
917
                self.client.create_container(self.c1)
918
                self.client.create_container(self.c2)
919
                self.client.create_container(self.c3)
920
                self.makeNewObject(self.c1, 'test')
921
                self.makeNewObject(self.c2, 'test')
922
                self.now_unformated = datetime.datetime.utcnow()
923
                self.makeNewObject(self.c1, 'test1')
924
                self.makeNewObject(self.c2, 'test1')
925
                """Prepare an object to be shared - also its container"""
926
                self.client.container = self.c1
927
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
928
                
929
                self.makeNewObject(self.c1, 'another.test')
930

    
931
        def makeNewObject(self, container, obj):
932
                self.client.container = container
933
                r = self.client.object_put(obj, content_type='application/octet-stream',
934
                        data= 'file '+obj+' that lives in '+container,
935
                        metadata={'incontainer':container})
936

    
937
        def forceDeleteContainer(self, container):
938
                self.client.container = container
939
                try:
940
                        r = self.client.list_objects()
941
                except ClientError:
942
                        return
943
                for obj in r:
944
                        name = obj['name']
945
                        self.client.del_object(name)
946
                r = self.client.container_delete()
947
                self.container = ''
948

    
949
        def tearDown(self):
950
                """Destroy test cases"""
951
                if self.fname is not None:
952
                        try:
953
                                os.remove(self.fname)
954
                        except OSError:
955
                                pass
956
                        self.fname = None
957
                self.forceDeleteContainer(self.c1)
958
                self.forceDeleteContainer(self.c2)
959
                try:
960
                        self.forceDeleteContainer(self.c3)
961
                except ClientError:
962
                        pass
963
                self.client.container=''
964

    
965
        def test_000(self):
966
                """Perform a full Pithos+ kamaki support test"""
967

    
968
        def test_account_head(self):
969
                """Test account_HEAD"""
970
                r = self.client.account_head()
971
                self.assertEqual(r.status_code, 204)
972
                
973
                r = self.client.account_head(until='1000000000')
974
                self.assertEqual(r.status_code, 204)
975
           
976
                r = self.client.get_account_info(until='1000000000') 
977
                datestring = unicode(r['x-account-until-timestamp'])
978
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
979

    
980
                r = self.client.get_account_quota()
981
                self.assertTrue(r.has_key('x-account-policy-quota'))
982

    
983
                r = self.client.get_account_versioning()
984
                self.assertTrue(r.has_key('x-account-policy-versioning'))
985

    
986
                """Check if(un)modified_since"""
987
                for format in self.client.DATE_FORMATS:
988
                        now_formated = self.now_unformated.strftime(format)
989
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
990
                        sc1 = r1.status_code
991
                        r1.release()
992
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
993
                        sc2 = r2.status_code
994
                        r2.release()
995
                        self.assertNotEqual(sc1, sc2)
996

    
997
        def test_account_get(self):
998
                """Test account_GET"""
999
                #r = self.client.account_get()
1000
                #self.assertEqual(r.status_code, 200)
1001
                r = self.client.list_containers()
1002
                fullLen = len(r)
1003
                self.assertTrue(fullLen > 2)
1004
                
1005
                r = self.client.account_get(limit=1)
1006
                self.assertEqual(len(r.json), 1)
1007
                
1008

    
1009
                r = self.client.account_get(marker='c2_')
1010
                temp_c0 = r.json[0]['name']
1011
                temp_c2 = r.json[2]['name']
1012
                
1013
                r = self.client.account_get(limit=2, marker='c2_')
1014
                conames = [container['name'] for container in r.json \
1015
                        if container['name'].lower().startswith('c2_')]
1016
                self.assertTrue(temp_c0 in conames)
1017
                self.assertFalse(temp_c2 in conames)
1018
                
1019

    
1020
                r = self.client.account_get(show_only_shared=True)
1021
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
1022
                
1023
                r = self.client.account_get(until=1342609206)
1024
                self.assertTrue(len(r.json) <= fullLen)
1025
                
1026
                """Check if(un)modified_since"""
1027
                for format in self.client.DATE_FORMATS:
1028
                        now_formated = self.now_unformated.strftime(format)
1029
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
1030
                        sc1 = r1.status_code
1031
                        r1.release()
1032
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1033
                        sc2 = r2.status_code
1034
                        r2.release()
1035
                        self.assertNotEqual(sc1, sc2)
1036

    
1037
                """Check sharing_accounts"""
1038
                r = self.client.get_sharing_accounts()
1039
                self.assertTrue(len(r)>0)
1040

    
1041
        def test_account_post(self):
1042
                """Test account_POST"""
1043
                r = self.client.account_post()
1044
                self.assertEqual(r.status_code, 202)
1045
                grpName = 'grp'+unicode(self.now)
1046
                
1047

    
1048
                """Method set/del_account_meta and set_account_groupcall use account_post internally
1049
                """
1050
                self.client.set_account_group(grpName, ['u1', 'u2'])
1051
                r = self.client.get_account_group()
1052
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
1053
                self.client.del_account_group(grpName)
1054
                r = self.client.get_account_group()
1055
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
1056

    
1057
                mprefix = 'meta'+unicode(self.now)
1058
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
1059
                r = self.client.get_account_meta()
1060
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
1061
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
1062

    
1063
                self.client.del_account_meta(mprefix+'1')
1064
                r = self.client.get_account_meta()
1065
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
1066

    
1067
                self.client.del_account_meta(mprefix+'2')
1068
                r = self.client.get_account_meta()
1069
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
1070

    
1071
                """Missing testing for quota, versioning, because normally
1072
                you don't have permitions to modify those at account level
1073
                """
1074

    
1075
                newquota=1000000
1076
                self.client.set_account_quota(newquota)
1077
                #r = self.client.get_account_info()
1078
                #print(unicode(r))
1079
                #r = self.client.get_account_quota()
1080
                #self.assertEqual(r['x-account-policy-quota'], newquota)
1081
                self.client.set_account_versioning('auto')
1082

    
1083
        def test_container_head(self):
1084
                """Test container_HEAD"""
1085
                self.client.container = self.c1
1086

    
1087
                r = self.client.container_head()
1088
                self.assertEqual(r.status_code, 204)
1089
                
1090
                """Check until"""
1091
                r = self.client.container_head(until=1000000, success=(204, 404))
1092
                self.assertEqual(r.status_code, 404)
1093
                
1094
                """Check and if(un)modified_since"""
1095
                for format in self.client.DATE_FORMATS:
1096
                        now_formated = self.now_unformated.strftime(format)
1097
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
1098
                        sc1=r1.status_code
1099
                        r1.release()
1100
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1101
                        sc2=r2.status_code
1102
                        r2.release()
1103
                        self.assertNotEqual(sc1, sc2)
1104

    
1105
                """Check container object meta"""
1106
                r = self.client.get_container_object_meta()
1107
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1108

    
1109
        def test_container_get(self):
1110
                """Test container_GET"""
1111
                self.client.container = self.c1
1112

    
1113
                r = self.client.container_get()
1114
                self.assertEqual(r.status_code, 200)
1115
                fullLen = len(r.json)
1116
                
1117

    
1118
                r = self.client.container_get(prefix='test')
1119
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1120
                self.assertTrue(len(r.json) > 1)
1121
                self.assertEqual(len(r.json), len(lalobjects))
1122
                
1123

    
1124
                r = self.client.container_get(limit=1)
1125
                self.assertEqual(len(r.json), 1)
1126
                
1127

    
1128
                r = self.client.container_get(marker='another')
1129
                self.assertTrue(len(r.json) > 1)
1130
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1131
                self.assertEqual(len(r.json), len(neobjects))
1132
                
1133

    
1134
                r = self.client.container_get(prefix='another.test', delimiter='.')
1135
                self.assertTrue(fullLen > len(r.json))
1136
                
1137

    
1138
                r = self.client.container_get(path='/')
1139
                self.assertEqual(fullLen, len(r.json))
1140
                
1141

    
1142
                r = self.client.container_get(format='xml')
1143
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1144
                
1145

    
1146
                r = self.client.container_get(meta=['incontainer'])
1147
                self.assertTrue(len(r.json) > 0)
1148
                
1149

    
1150
                r = self.client.container_get(show_only_shared=True)
1151
                self.assertTrue(len(r.json) < fullLen)
1152
                
1153

    
1154
                try:
1155
                        r = self.client.container_get(until=1000000000)
1156
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1157
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1158
                        
1159
                except ClientError:
1160
                        
1161
                        pass
1162

    
1163
                """Check and if un/modified_since"""
1164
                for format in self.client.DATE_FORMATS:
1165
                        now_formated = self.now_unformated.strftime(format)
1166
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1167
                        sc1 = r1.status_code
1168
                        r1.release()
1169
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1170
                        sc2 = r2.status_code
1171
                        r2.release()
1172
                        self.assertNotEqual(sc1, sc2)
1173
           
1174
        def test_container_put(self):
1175
                """Test container_PUT"""
1176
                self.client.container = self.c2
1177

    
1178
                r = self.client.container_put()
1179
                self.assertEqual(r.status_code, 202)
1180
                
1181

    
1182
                r = self.client.get_container_quota(self.client.container)
1183
                cquota = r.values()[0]
1184
                newquota = 2*int(cquota)
1185

    
1186
                r = self.client.container_put(quota=newquota)
1187
                self.assertEqual(r.status_code, 202)
1188
                
1189
                r = self.client.get_container_quota(self.client.container)
1190
                xquota = int(r.values()[0])
1191
                self.assertEqual(newquota, xquota)
1192

    
1193
                r = self.client.container_put(versioning='auto')
1194
                self.assertEqual(r.status_code, 202)
1195
                
1196
                r = self.client.get_container_versioning(self.client.container)
1197
                nvers = r.values()[0]
1198
                self.assertEqual('auto', nvers)
1199

    
1200
                r = self.client.container_put(versioning='none')
1201
                self.assertEqual(r.status_code, 202)
1202
                
1203
                r = self.client.get_container_versioning(self.client.container)
1204
                nvers = r.values()[0]
1205
                self.assertEqual('none', nvers)
1206

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

    
1216
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1217
                self.assertEqual(r.status_code, 202)
1218
                
1219
                r = self.client.get_container_meta(self.client.container)
1220
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1221
                self.assertTrue(r.has_key('x-container-meta-m2'))
1222
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1223
           
1224
                self.client.del_container_meta(self.client.container)
1225

    
1226
        def test_container_post(self):
1227
                """Test container_POST"""
1228
                self.client.container = self.c2
1229

    
1230
                """Simple post"""
1231
                r = self.client.container_post()
1232
                self.assertEqual(r.status_code, 202)
1233
                
1234

    
1235
                """post meta"""
1236
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1237
                r = self.client.get_container_meta(self.client.container)
1238
                self.assertTrue(r.has_key('x-container-meta-m1'))
1239
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1240
                self.assertTrue(r.has_key('x-container-meta-m2'))
1241
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1242

    
1243
                """post/2del meta"""
1244
                r = self.client.del_container_meta('m1')
1245
                r = self.client.set_container_meta({'m2':'v2a'})
1246
                r = self.client.get_container_meta(self.client.container)
1247
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1248
                self.assertTrue(r.has_key('x-container-meta-m2'))
1249
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1250

    
1251
                """check quota"""
1252
                r = self.client.get_container_quota(self.client.container)
1253
                cquota = r.values()[0]
1254
                newquota = 2*int(cquota)
1255
                r = self.client.set_container_quota(newquota)
1256
                r = self.client.get_container_quota(self.client.container)
1257
                xquota = int(r.values()[0])
1258
                self.assertEqual(newquota, xquota)
1259
                r = self.client.set_container_quota(cquota)
1260
                r = self.client.get_container_quota(self.client.container)
1261
                xquota = r.values()[0]
1262
                self.assertEqual(cquota, xquota)
1263

    
1264
                """Check versioning"""
1265
                self.client.set_container_versioning('auto')
1266
                r = self.client.get_container_versioning(self.client.container)
1267
                nvers = r.values()[0]
1268
                self.assertEqual('auto', nvers)
1269
                self.client.set_container_versioning('none')
1270
                r = self.client.get_container_versioning(self.client.container)
1271
                nvers = r.values()[0]
1272
                self.assertEqual('none', nvers)
1273

    
1274
                """put_block uses content_type and content_length to
1275
                post blocks of data 2 container. All that in upload_object"""
1276
                """Change a file at fs"""
1277
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1278
                """Upload it at a directory in container"""
1279
                self.client.create_directory('dir')
1280
                newf = open(self.fname, 'r')
1281
                self.client.upload_object('/dir/sample.file', newf)
1282
                newf.close()
1283
                """Check if file has been uploaded"""
1284
                r = self.client.get_object_info('/dir/sample.file')
1285
                self.assertTrue(int(r['content-length']) > 100000000)
1286

    
1287
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1288
                #TODO
1289

    
1290
                """Check update=False"""
1291
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1292
                
1293
                r = self.client.get_object_info('test')
1294
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1295
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1296

    
1297
                r = self.client.del_container_meta('m2')
1298

    
1299
        def test_container_delete(self):
1300
                """Test container_DELETE"""
1301

    
1302
                """Fail to delete a non-empty container"""
1303
                self.client.container = self.c2
1304
                r = self.client.container_delete(success=409)
1305
                self.assertEqual(r.status_code, 409)
1306
                
1307

    
1308
                """Fail to delete c3 (empty) container"""
1309
                self.client.container = self.c3
1310
                r = self.client.container_delete(until='1000000000')
1311
                self.assertEqual(r.status_code, 204)
1312
                
1313

    
1314
                """Delete c3 (empty) container"""
1315
                r = self.client.container_delete()
1316
                self.assertEqual(r.status_code, 204)
1317

    
1318
                """Purge container(empty a container), check versionlist"""
1319
                self.client.container = self.c1
1320
                r = self.client.object_head('test', success=(200, 404))
1321
                self.assertEqual(r.status_code, 200)
1322
                self.client.del_container(delimiter='/')
1323
                r = self.client.object_head('test', success=(200, 404))
1324
                self.assertEqual(r.status_code, 404)
1325
                r = self.client.get_object_versionlist('test')
1326
                self.assertTrue(len(r) > 0)
1327
                self.assertTrue(len(r[0])>1)
1328
                self.client.purge_container()
1329
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1330

    
1331
        def test_object_head(self):
1332
                """Test object_HEAD"""
1333
                self.client.container = self.c2
1334
                obj = 'test'
1335

    
1336
                r = self.client.object_head(obj)
1337
                self.assertEqual(r.status_code, 200)
1338
                etag = r.headers['etag']
1339
                
1340

    
1341
                r = self.client.object_head(obj, version=40)
1342
                self.assertEqual(r.headers['x-object-version'], '40')
1343
                
1344

    
1345
                r = self.client.object_head(obj, if_etag_match=etag)
1346
                self.assertEqual(r.status_code, 200)
1347
                
1348
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1349
                self.assertNotEqual(r.status_code, 200)
1350
                
1351

    
1352
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1353
                self.assertEqual(r.status_code, 412)
1354
                
1355

    
1356
                """Check and if(un)modified_since"""
1357
                for format in self.client.DATE_FORMATS:
1358
                        now_formated = self.now_unformated.strftime(format)
1359
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1360
                                success=(200, 304, 412))
1361
                        sc1 = r1.status_code
1362
                        r1.release()
1363
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1364
                                success=(200, 304, 412))
1365
                        sc2 = r2.status_code
1366
                        r2.release()
1367
                        self.assertNotEqual(sc1, sc2)
1368

    
1369
        def test_object_get(self):
1370
                """Test object_GET"""
1371
                self.client.container = self.c1
1372
                obj = 'test'
1373

    
1374
                r = self.client.object_get(obj)
1375
                self.assertEqual(r.status_code, 200)
1376

    
1377
                osize = int(r.headers['content-length'])
1378
                etag = r.headers['etag']
1379
                
1380

    
1381
                r = self.client.object_get(obj, hashmap=True)
1382
                self.assertTrue(r.json.has_key('hashes') \
1383
                        and r.json.has_key('block_hash') \
1384
                        and r.json.has_key('block_size') \
1385
                        and r.json.has_key('bytes'))
1386
                
1387

    
1388
                r = self.client.object_get(obj, format='xml', hashmap=True)
1389
                self.assertEqual(len(r.text.split('hash>')), 3)
1390
                
1391

    
1392
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1393
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1394
                partsize = int(r.headers['content-length'])
1395
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1396
                
1397

    
1398
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1399
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1400
                partsize = int(r.headers['content-length'])
1401
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1402
                
1403

    
1404
                r = self.client.object_get(obj, if_etag_match=etag)
1405
                self.assertEqual(r.status_code, 200)
1406
                
1407

    
1408
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1409
                self.assertEqual(r.status_code, 200)
1410
                
1411

    
1412
                """Check and if(un)modified_since"""
1413
                for format in self.client.DATE_FORMATS:
1414
                        now_formated = self.now_unformated.strftime(format)
1415
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1416
                                success=(200, 304, 412))
1417
                        sc1 = r1.status_code
1418
                        r1.release()
1419
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1420
                        sc2 = r2.status_code
1421
                        r2.release()
1422
                        self.assertNotEqual(sc1, sc2)
1423

    
1424
        def test_object_put(self):
1425
                """Test object_PUT"""
1426

    
1427
                self.client.container = self.c2
1428
                obj='another.test'
1429

    
1430
                """create the object"""
1431
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1432
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1433
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1434
                        content_disposition='attachment; filename="fname.ext"')
1435
                self.assertEqual(r.status_code, 201)
1436
                etag = r.headers['etag']
1437
                
1438
                """Check content-disposition"""
1439
                r = self.client.get_object_info(obj)
1440
                self.assertTrue(r.has_key('content-disposition'))
1441

    
1442
                """Check permitions"""
1443
                r = self.client.get_object_sharing(obj)
1444
                self.assertTrue('accx:groupa' in r['read'])
1445
                self.assertTrue('u1' in r['read'])
1446
                self.assertTrue('u2' in r['write'])
1447
                self.assertTrue('u3' in r['write'])
1448

    
1449
                """Check metadata"""
1450
                r = self.client.get_object_meta(obj)
1451
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1452
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1453

    
1454
                """Check public and if_etag_match"""
1455
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1456
                        content_type='application/octet-stream', public=True)
1457
                
1458
                r = self.client.object_get(obj)
1459
                self.assertTrue(r.headers.has_key('x-object-public'))
1460
                vers2 = int(r.headers['x-object-version'])
1461
                etag = r.headers['etag']
1462
                self.assertEqual(r.text, 'b')
1463
                
1464
                """Check if_etag_not_match"""
1465
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1466
                        content_type='application/octet-stream', success=(201, 412))
1467
                self.assertEqual(r.status_code, 412)
1468
                
1469

    
1470
                """Check content_type and content_length"""
1471
                tmpdir = 'dir'+unicode(self.now)
1472
                r = self.client.object_put(tmpdir, content_type='application/directory',
1473
                        content_length=0)
1474
                
1475
                r = self.client.get_object_info(tmpdir)
1476
                self.assertEqual(r['content-type'], 'application/directory')
1477

    
1478
                """Check copy_from, content_encoding"""
1479
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1480
                        copy_from='/%s/%s'%(self.client.container, obj),
1481
                        content_encoding='application/octet-stream', 
1482
                        source_account=self.client.account,
1483
                        content_length=0, success=201)
1484
                self.assertEqual(r.status_code, 201)
1485

    
1486
                """Test copy_object for cross-conctainer copy"""
1487
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1488
                        dst_container=self.c1, dst_object=obj)
1489
                self.client.container = self.c1
1490
                r1 = self.client.get_object_info(obj)
1491
                self.client.container = self.c2
1492
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1493
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1494
                
1495
                """Check cross-container copy_from, content_encoding"""
1496
                self.client.container = self.c1
1497
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1498
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1499
                        content_encoding='application/octet-stream', 
1500
                        source_account=self.client.account,
1501
                        content_length=0, success=201)
1502
                
1503
                self.assertEqual(r.status_code, 201)
1504
                r = self.client.get_object_info(obj)
1505
                self.assertEqual(r['etag'], etag)
1506

    
1507
                """Check source_account"""
1508
                self.client.container = self.c2
1509
                fromstr = '/'+self.c1+'/'+obj
1510
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1511
                        content_encoding='application/octet-stream', 
1512
                        source_account='nonExistendAddress@NeverLand.com', 
1513
                        content_length=0, success=(201, 403))
1514
                self.assertEqual(r.status_code, 403)
1515
                
1516
                """Check cross-container move_from"""
1517
                self.client.container = self.c1
1518
                r1 = self.client.get_object_info(obj)
1519
                self.client.container = self.c2
1520
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1521
                dst_object=obj+'v0')
1522
                r0 = self.client.get_object_info(obj+'v0')
1523
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1524

    
1525
                """Check move_from"""
1526
                r = self.client.object_put(obj+'v1', format=None, 
1527
                        move_from='/'+self.c2+'/'+obj,
1528
                        source_version = vers2,
1529
                        content_encoding='application/octet-stream',
1530
                        content_length=0, success=201)
1531
                
1532
                """Check manifest"""
1533
                mobj = 'manifest.test'
1534
                txt = ''
1535
                for i in range(10):
1536
                        txt += '%s'%i
1537
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1538
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1539
                        
1540
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1541
                        manifest='%s/%s'%(self.client.container, mobj))
1542
                
1543
                r = self.client.object_get(mobj)
1544
                self.assertEqual(r.text, txt)
1545
           
1546
                """Upload a local file with one request"""
1547
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1548
                newf = open(self.fname, 'r')
1549
                self.client.upload_object('sample.file', newf)
1550
                newf.close()
1551
                """Check if file has been uploaded"""
1552
                r = self.client.get_object_info('sample.file')
1553
                self.assertEqual(int(r['content-length']), 10260)
1554

    
1555
                """Some problems with transfer-encoding?"""
1556

    
1557
        def test_object_copy(self):
1558
                """Test object_COPY"""
1559
                self.client.container=self.c2
1560
                obj = 'test2'
1561

    
1562
                data= '{"key1":"val1", "key2":"val2"}'
1563
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1564
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1565
                        permitions={
1566
                                'read':['accX:groupA', 'u1', 'u2'],
1567
                                'write':['u2', 'u3']},
1568
                        content_disposition='attachment; filename="fname.ext"')
1569
                
1570
                r = self.client.object_copy(obj+'orig',
1571
                        destination = '/'+self.client.container+'/'+obj,
1572
                        ignore_content_type=False, content_type='application/json', 
1573
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1574
                        permitions={'write':['u5', 'accX:groupB']})
1575
                self.assertEqual(r.status_code, 201)
1576
                
1577
                """Check content-disposition"""
1578
                r = self.client.get_object_info(obj)
1579
                self.assertTrue(r.has_key('content-disposition'))
1580

    
1581
                """Check Metadata"""
1582
                r = self.client.get_object_meta(obj)
1583
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1584
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1585
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1586

    
1587
                """Check permitions"""
1588
                r = self.client.get_object_sharing(obj)
1589
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1590
                self.assertTrue('accx:groupb' in r['write'])
1591

    
1592
                """Check destination account"""
1593
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1594
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1595
                        success=(201, 403))
1596
                self.assertEqual(r.status_code, 403)
1597
                
1598

    
1599
                """Check destination being another container
1600
                and also content_type and content encoding"""
1601
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1602
                        content_encoding='utf8', content_type='application/json')
1603
                self.assertEqual(r.status_code, 201)
1604
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1605
                
1606

    
1607
                """Check ignore_content_type and content_type"""
1608
                r = self.client.object_get(obj)
1609
                etag = r.headers['etag']
1610
                ctype = r.headers['content-type']
1611
                self.assertEqual(ctype, 'application/json')
1612
                
1613
                r = self.client.object_copy(obj+'orig',
1614
                        destination = '/'+self.client.container+'/'+obj+'0',
1615
                        ignore_content_type=True, content_type='application/json')
1616
                self.assertEqual(r.status_code, 201)
1617
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1618
                
1619

    
1620
                """Check if_etag_(not_)match"""
1621
                r = self.client.object_copy(obj,
1622
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1623
                self.assertEqual(r.status_code, 201)
1624
                
1625
                r = self.client.object_copy(obj,
1626
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1627
                self.assertEqual(r.status_code, 201)
1628
                vers2 = r.headers['x-object-version']
1629
                
1630

    
1631
                """Check source_version, public and format """
1632
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1633
                self.assertEqual(r.status_code, 201)
1634
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1635
                
1636
                r = self.client.get_object_info(obj+'3')
1637
                self.assertTrue(r.has_key('x-object-public'))
1638

    
1639
        def test_object_move(self):
1640
                """Test object_MOVE"""
1641
                self.client.container= self.c2
1642
                obj = 'test2'
1643

    
1644
                data= '{"key1":"val1", "key2":"val2"}'
1645
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1646
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1647
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1648
                
1649
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1650
                        ignore_content_type=False, content_type='application/json', 
1651
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1652
                        permitions={'write':['u5', 'accX:groupB']})
1653
                self.assertEqual(r.status_code, 201)
1654
                
1655

    
1656
                """Check Metadata"""
1657
                r = self.client.get_object_meta(obj)
1658
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1659
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1660
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1661

    
1662
                """Check permitions"""
1663
                r = self.client.get_object_sharing(obj)
1664
                self.assertFalse(r.has_key('read'))
1665
                self.assertTrue('u5' in r['write'])
1666
                self.assertTrue('accx:groupb' in r['write'])
1667

    
1668
                """Check destination account"""
1669
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1670
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1671
                        success=(201, 403))
1672
                self.assertEqual(r.status_code, 403)
1673
                
1674

    
1675
                """Check destination being another container and also
1676
                content_type, content_disposition and content encoding"""
1677
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1678
                        content_encoding='utf8', content_type='application/json',
1679
                        content_disposition='attachment; filename="fname.ext"')
1680
                self.assertEqual(r.status_code, 201)
1681
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1682
                self.client.container=self.c1
1683
                r = self.client.get_object_info(obj)
1684
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1685
                etag = r['etag']
1686
                ctype = r['content-type']
1687
                self.assertEqual(ctype, 'application/json')
1688

    
1689
                """Check ignore_content_type and content_type"""
1690
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1691
                        ignore_content_type=True, content_type='application/json')
1692
                self.assertEqual(r.status_code, 201)
1693
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1694
                
1695

    
1696
                """Check if_etag_(not_)match"""
1697
                self.client.container=self.c2
1698
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1699
                        if_etag_match=etag)
1700
                self.assertEqual(r.status_code, 201)
1701
                
1702
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1703
                        if_etag_not_match='lalala')
1704
                self.assertEqual(r.status_code, 201)
1705
                
1706

    
1707
                """Check public and format """
1708
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1709
                        format='xml', public=True)
1710
                self.assertEqual(r.status_code, 201)
1711
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1712
                
1713
                r = self.client.get_object_info(obj+'2')
1714
                self.assertTrue(r.has_key('x-object-public'))
1715

    
1716
        def test_object_post(self):
1717
                """Test object_POST"""
1718
                self.client.container=self.c2
1719
                obj = 'test2'
1720
                """create a filesystem file"""
1721
                self.fname = obj
1722
                newf = open(self.fname, 'w')
1723
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1724
                newf.close()
1725
                """create a file on container"""
1726
                r = self.client.object_put(obj, content_type='application/octet-stream',
1727
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1728
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1729
                
1730

    
1731
                """Append tests update, content_range, content_type, content_length"""
1732
                newf = open(obj, 'r')
1733
                self.client.append_object(obj, newf)
1734
                r = self.client.object_get(obj)
1735
                self.assertTrue(r.text.startswith('Hello!'))
1736
                
1737

    
1738
                """Overwrite tests update, content_type, content_length, content_range"""
1739
                newf.seek(0)
1740
                r = self.client.overwrite_object(obj, 0, 10, newf)
1741
                r = self.client.object_get(obj)
1742
                self.assertTrue(r.text.startswith('ello!'))
1743
                newf.close()
1744
                
1745
                
1746
                """Truncate tests update, content_range, content_type,
1747
                object_bytes and source_object"""
1748
                r = self.client.truncate_object(obj, 5)
1749
                r = self.client.object_get(obj)
1750
                self.assertEqual(r.text, 'ello!')
1751
                
1752

    
1753
                """Check metadata"""
1754
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1755
                r = self.client.get_object_meta(obj)
1756
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1757
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1758
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1759
                self.client.del_object_meta('mkey1', obj)
1760
                r = self.client.get_object_meta(obj)
1761
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1762

    
1763
                """Check permitions"""
1764
                self.client.set_object_sharing(obj,
1765
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1766
                r = self.client.get_object_sharing(obj)
1767
                self.assertTrue(r.has_key('read'))
1768
                self.assertTrue('u5' in r['read'])
1769
                self.assertTrue(r.has_key('write'))
1770
                self.assertTrue('u4' in r['write'])
1771
                self.client.del_object_sharing(obj)
1772
                r = self.client.get_object_sharing(obj)
1773
                self.assertTrue(len(r) == 0)
1774

    
1775
                """Check publish"""
1776
                self.client.publish_object(obj)
1777
                r = self.client.get_object_info(obj)
1778
                self.assertTrue(r.has_key('x-object-public'))
1779
                self.client.unpublish_object(obj)
1780
                r = self.client.get_object_info(obj)
1781
                self.assertFalse(r.has_key('x-object-public'))
1782

    
1783
                """Check if_etag_(not)match"""
1784
                etag = r['etag']
1785
                #r = self.client.object_post(obj, update=True, public=True,
1786
                #        if_etag_not_match=etag, success=(412,202,204))
1787
                #self.assertEqual(r.status_code, 412)
1788
                
1789
                r = self.client.object_post(obj, update=True, public=True,
1790
                        if_etag_match=etag, content_encoding='application/json')
1791
                
1792
                r = self.client.get_object_info(obj)
1793
                helloVersion = r['x-object-version']
1794
                self.assertTrue(r.has_key('x-object-public'))
1795
                self.assertEqual(r['content-encoding'], 'application/json')
1796

    
1797
                """Check source_version and source_account and content_disposition"""
1798
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1799
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1800
                        source_account='thisAccountWillNeverExist@adminland.com',
1801
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1802
                self.assertEqual(r.status_code, 403)
1803
                
1804
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1805
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1806
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1807
                        content_disposition='attachment; filename="fname.ext"')
1808
                
1809
                r = self.client.object_get(obj)
1810
                self.assertEqual(r.text, 'eello!')
1811
                self.assertTrue(r.headers.has_key('content-disposition')
1812
                        and 'fname.ext' in r.headers['content-disposition'])
1813
                
1814

    
1815
                """Check manifest"""
1816
                mobj = 'manifest.test'
1817
                txt = ''
1818
                for i in range(10):
1819
                        txt += '%s'%i
1820
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1821
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1822
                        
1823
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1824
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1825
                
1826
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1827
                
1828
                r = self.client.object_get(mobj)
1829
                self.assertEqual(r.text, txt)
1830
                
1831

    
1832
                """We need to check transfer_encoding """
1833

    
1834
        def test_object_delete(self):
1835
                """Test object_DELETE"""
1836
                self.client.container=self.c2
1837
                obj = 'test2'
1838
                """create a file on container"""
1839
                r = self.client.object_put(obj, content_type='application/octet-stream',
1840
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1841
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1842
                
1843

    
1844
                """Check with false until"""
1845
                r = self.client.object_delete(obj, until=1000000)
1846
                
1847
                r = self.client.object_get(obj, success=(200, 404))
1848
                self.assertEqual(r.status_code, 200)
1849
                
1850

    
1851
                """Check normal case"""
1852
                r = self.client.object_delete(obj)
1853
                self.assertEqual(r.status_code, 204)
1854
                
1855
                r = self.client.object_get(obj, success=(200, 404))
1856
                self.assertEqual(r.status_code, 404)
1857
                
1858

    
1859
        def create_large_file(self, size, name):
1860
                """Create a large file at fs"""
1861
                self.fname = name
1862
                import random
1863
                random.seed(self.now)
1864
                f = open(self.fname, 'w')
1865
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1866
                for hobyte_id in range(size/8):
1867
                        sss = 'hobt%s'%random.randint(1000, 9999)
1868
                        f.write(sss)
1869
                        if 0 == (hobyte_id*800)%size:
1870
                                f.write('\n')
1871
                                sys.stdout.write('\b\b')
1872
                                prs = (hobyte_id*800)//size
1873
                                if prs > 10:
1874
                                        sys.stdout.write('\b')
1875
                                sys.stdout.write('%s'%prs+'%')
1876
                                sys.stdout.flush()
1877
                print('\b\b\b100%')
1878
                f.close()
1879
                """"""
1880

    
1881
def init_parser():
1882
        parser = ArgumentParser(add_help=False)
1883
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1884
                help="Show this help message and exit")
1885
        return parser
1886

    
1887
if __name__ == '__main__':
1888
        parser = init_parser()
1889
        args, argv = parser.parse_known_args()
1890

    
1891
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1892
                raise Exception('\tusage: tests.py <group> [command]')
1893
        suiteFew = unittest.TestSuite()
1894

    
1895
        if len(argv) == 0 or argv[0] == 'pithos':
1896
                if len(argv) == 1:
1897
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1898
                else:
1899
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1900
        if len(argv) == 0 or argv[0] == 'cyclades':
1901
                if len(argv) == 1:
1902
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1903
                        suiteFew.addTest(testCyclades('test_000'))
1904
                else:
1905
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1906

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