Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 554d18b0

History | View | Annotate | Download (62.9 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
                sys.stdout.write('\tDelete network %s '%netid)
195
                self.client.disconnect_network_nics(netid)
196
                wait = 3
197
                while True:
198
                        try:
199
                                self.client.delete_network(netid)
200
                                break
201
                        except ClientError as err:
202
                                self.assertEqual(err.status, 421)
203
                                r = self.client.get_network_details(netid)
204
                                time.sleep(wait)
205
                                wait += 3
206
                                sys.stdout.write('.')
207
                print(' OK')
208

    
209

    
210
        def if_not_all(foo):
211
                global TEST_ALL
212
                if TEST_ALL:
213
                        return None
214
                return foo
215

    
216
        def assert_dicts_are_deeply_equal(self, d1, d2):
217
                for k,v in d1.items():
218
                        self.assertTrue(d2.has_key(k))
219
                        if isinstance(v, dict):
220
                                self.assert_dicts_are_deeply_equal(v, d2[k])
221
                        else:
222
                                self.assertEqual(unicode(v), unicode(d2[k]))
223

    
224
        def test_000(self):
225
                "Prepare a full Cyclades test scenario"
226
                global TEST_ALL
227
                TEST_ALL = True
228

    
229
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
230
                self.server2 = self._create_server(self.servname2, self.flavorid+2, self.img)
231

    
232
                print('testing')
233
                sys.stdout.write(' test create server')
234
                self._test_create_server()
235
                print('...ok')
236

    
237
                sys.stdout.write(' test list servers')
238
                self._test_list_servers()
239
                print('...ok')
240

    
241
                print('- wait for test servers to build')
242
                self._wait_for_status(self.server1['id'], 'BUILD')
243
                self._wait_for_status(self.server2['id'], 'BUILD')
244
                print('- ok')
245

    
246
                sys.stdout.write(' test get server details')
247
                self._test_get_server_details()
248
                print('...ok')
249

    
250
                sys.stdout.write(' test get image details')
251
                self._test_get_image_details()
252
                print('...ok')
253

    
254
                sys.stdout.write(' test update_server_name')
255
                self._test_update_server_name()
256
                print('...ok')
257

    
258

    
259
                sys.stdout.write(' test reboot_server')
260
                self._test_reboot_server()
261
                print('...ok')
262

    
263
                print('- wait for test servers to boot')
264
                self._wait_for_status(self.server1['id'], 'REBOOT')
265
                self._wait_for_status(self.server2['id'], 'REBOOT')
266
                print('- ok')
267

    
268
                sys.stdout.write(' test create_server_metadata')
269
                self._test_create_server_metadata()
270
                print('...ok')
271

    
272
                sys.stdout.write(' test get_server_metadata')
273
                self._test_get_server_metadata()
274
                print('...ok')
275

    
276
                sys.stdout.write(' test update_server_metadata')
277
                self._test_update_server_metadata()
278
                print('...ok')
279

    
280
                sys.stdout.write(' test delete_server_metadata')
281
                self._test_delete_server_metadata()
282
                print('...ok')
283

    
284
                sys.stdout.write(' test list_flavors')
285
                self._test_list_flavors()
286
                print('...ok')
287

    
288
                sys.stdout.write(' test get_flavor_details')
289
                self._test_get_flavor_details()
290
                print('...ok')
291

    
292
                sys.stdout.write(' test list_images')
293
                self._test_list_images()
294
                print('...ok')
295

    
296
                sys.stdout.write(' test get_image_details')
297
                self._test_get_image_details()
298
                print('...ok')
299

    
300
                sys.stdout.write(' test get_image_metadata')
301
                self._test_get_image_metadata()
302
                print('...ok')
303

    
304
                sys.stdout.write(' test shutdown_server')
305
                self._test_shutdown_server()
306
                print('...ok')
307

    
308
                sys.stdout.write(' test start_server')
309
                self._test_start_server()
310
                print('...ok')
311

    
312
                sys.stdout.write(' test get_server_console')
313
                self._test_get_server_console()        
314
                print('...ok')
315

    
316
                sys.stdout.write(' test get_firewall_profile')
317
                self._test_get_firewall_profile()        
318
                print('...ok')
319

    
320
                sys.stdout.write(' test set_firewall_profile')
321
                #self._test_set_firewall_profile()        
322
                print('...ok')
323

    
324
                sys.stdout.write(' test get_server_stats')
325
                self._test_get_server_stats()        
326
                print('...ok')
327

    
328
                self.network1 = self._create_network(self.netname1)
329

    
330
                sys.stdout.write(' test create_network')
331
                self._test_create_network()        
332
                print('...ok')
333

    
334
                print('- wait for netowrk to be activated')
335
                self._wait_for_network(self.network1['id'], 'ACTIVE')
336
                print('- ok')
337

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

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

    
346
                self.network2 = self._create_network(self.netname2)
347
                print('- wait for netowrk to be activated')
348
                self._wait_for_network(self.network2['id'], 'ACTIVE')
349
                print('- ok')
350

    
351
                sys.stdout.write(' test list_server_nics')
352
                self._test_list_server_nics()        
353
                print('...ok')
354

    
355
                sys.stdout.write(' test list_networks')
356
                self._test_list_networks()        
357
                print('...ok')
358

    
359
                sys.stdout.write(' test get_network_details')
360
                self._test_get_network_details()        
361
                print('...ok')
362

    
363
                sys.stdout.write(' test update_network_name')
364
                self._test_update_network_name()        
365
                print('...ok')
366

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

    
382
        def _wait_for_network(self, netid, status):
383
                wait = 3
384
                limit = 50
385
                c=['|','/','-','\\']
386
                sys.stdout.write(' Wait for net %s to be %s  '%(netid, status))
387
                while wait < limit:
388
                        r = self.client.get_network_details(netid)
389
                        if r['status'] == status:
390
                                print('\tOK')
391
                                return True
392
                        sys.stdout.write('\tit is now %s, wait %ss  '%(r['status'], wait))
393
                        for i in range(wait*4):
394
                                sys.stdout.write('\b%s'%c[i%4])
395
                                sys.stdout.flush()
396
                                time.sleep(0.25)
397
                        print('\b ')
398
                        wait += 3
399
                return False
400

    
401
        def _wait_for_nic(self, netid, servid, in_creation=True):
402
                self._wait_for_network(netid, 'ACTIVE')
403
                c=['|','/','-','\\']
404
                limit = 50
405
                wait=3
406
                largetry = 0
407
                while wait < limit:
408
                        nics = self.client.list_server_nics(servid)
409
                        for net in nics:
410
                                found_nic = net['network_id'] == netid
411
                                if (in_creation and found_nic) or not (in_creation or found_nic):
412
                                        return True
413
                        dis = '' if in_creation else 'dis'
414
                        sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
415
                        for i in range(wait*4):
416
                                sys.stdout.write('\b%s'%c[i%4])
417
                                sys.stdout.flush()
418
                                time.sleep(0.25)
419
                        print('\b ')
420
                        wait += 3
421
                        if wait >= limit and largetry < 3:
422
                                wait = 3
423
                                largetry += 1
424
                return False
425

    
426
        def _has_status(self, servid, status):
427
                r = self.client.get_server_details(servid)
428
                return r['status'] == status
429
        def _wait_for_status(self, servid, status):
430
                wait = 0
431
                c=['|','/','-','\\']
432
                while self._has_status(servid, status):
433
                        if wait:
434
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
435
                                for i in range(4*wait):
436
                                        sys.stdout.write('\b%s'%c[i%4])
437
                                        sys.stdout.flush()
438
                                        time.sleep(0.25)
439
                                print('\b ')
440
                        wait = (wait + 3) if wait<60 else 0
441

    
442
        @if_not_all
443
        def test_list_servers(self):
444
                """Test list servers"""
445
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
446
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
447
                self._test_list_servers()
448

    
449
        def _test_list_servers(self):
450
                servers = self.client.list_servers()
451
                dservers = self.client.list_servers(detail=True)
452

    
453
                """detailed and simple are same size"""
454
                self.assertEqual(len(dservers), len(servers))
455
                for i in range(len(servers)):
456
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
457
                                'status', 'updated']:
458
                                self.assertFalse(servers[i].has_key(field))
459
                                self.assertTrue(dservers[i].has_key(field))
460

    
461
                """detailed and simple contain same names"""
462
                names = sorted(map(lambda x: x["name"], servers))
463
                dnames = sorted(map(lambda x: x["name"], dservers))
464
                self.assertEqual(names, dnames)
465

    
466
        @if_not_all
467
        def test_create_server(self):
468
                """Test create_server"""
469
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
470
                self._wait_for_status(self.server1['id'], 'BUILD')
471
                self._test_create_server()
472

    
473
        def _test_create_server(self):
474
                self.assertEqual(self.server1["name"], self.servname1)
475
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
476
                self.assertEqual(self.server1["imageRef"], self.img)
477
                self.assertEqual(self.server1["status"], "BUILD")
478

    
479
        @if_not_all
480
        def test_get_server_details(self):
481
                """Test get_server_details"""
482
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
483
                self._wait_for_status(self.server1['id'], 'BUILD')
484
                self._test_get_server_details()
485

    
486
        def _test_get_server_details(self):
487
                r = self.client.get_server_details(self.server1['id'])
488
                self.assertEqual(r["name"], self.servname1)
489
                self.assertEqual(r["flavorRef"], self.flavorid)
490
                self.assertEqual(r["imageRef"], self.img)
491
                self.assertEqual(r["status"], "ACTIVE")
492

    
493
        @if_not_all
494
        def test_get_image_details(self):
495
                """Test get_image_details"""
496
                self._test_get_image_details()
497

    
498
        def _test_get_image_details(self):
499
                r = self.client.get_image_details(self.img)
500
                d = self.img_details
501
                self.assert_dicts_are_deeply_equal(r, d)
502

    
503
        @if_not_all
504
        def test_update_server_name(self):
505
                """Test update_server_name"""
506
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
507
                self._test_update_server_name()
508

    
509
        def _test_update_server_name(self):
510
                new_name = self.servname1+'_new_name'
511
                self.client.update_server_name(self.server1['id'], new_name)
512
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
513
                self.assertEqual(r['name'], new_name)
514
                changed = self.servers.pop(self.servname1)
515
                changed['name'] = new_name
516
                self.servers[new_name] = changed
517

    
518
        @if_not_all
519
        def test_reboot_server(self):
520
                """Test reboot server"""
521
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
522
                self._wait_for_status(self.server1['id'], 'BUILD')
523
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
524
                self._wait_for_status(self.server2['id'], 'BUILD')
525
                self._test_reboot_server()
526
                self._wait_for_status(self.server1['id'], 'REBOOT')
527
                self._wait_for_status(self.server2['id'], 'REBOOT')
528

    
529
        def _test_reboot_server(self):
530
                self.client.reboot_server(self.server1['id'])
531
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
532
                self.client.reboot_server(self.server2['id'], hard=True)
533
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
534

    
535
        @if_not_all
536
        def test_get_server_metadata(self):
537
                """Test get server_metadata"""
538
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
539
                self._test_get_server_metadata()
540
        def _test_get_server_metadata(self):
541
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
542
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
543
                self.assertEqual(r['mymeta_0'], 'val_0')
544

    
545
        @if_not_all
546
        def test_create_server_metadata(self):
547
                """Test create_server_metadata"""
548
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
549
                self._test_create_server_metadata()
550

    
551
        def _test_create_server_metadata(self):
552
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
553
                self.assertTrue(r1.has_key('mymeta'))
554
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
555
                self.assert_dicts_are_deeply_equal(r1, r2)
556

    
557
        @if_not_all
558
        def test_update_server_metadata(self):
559
                """Test update_server_metadata"""
560
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
561
                self._test_update_server_metadata()
562

    
563
        def _test_update_server_metadata(self):
564
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
565
                self.assertTrue(r1.has_key('mymeta3'))
566
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
567
                self.assertTrue(r2['mymeta3'], 'val3')
568

    
569
        @if_not_all
570
        def test_delete_server_metadata(self):
571
                """Test delete_server_metadata"""
572
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
573
                self._test_delete_server_metadata()
574

    
575
        def _test_delete_server_metadata(self):
576
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
577
                self.assertTrue(r1.has_key('mymeta'))
578
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
579
                try:
580
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
581
                        raise ClientError('Wrong Error', status=100)
582
                except ClientError as err:
583
                        self.assertEqual(err.status, 404)
584

    
585
        @if_not_all
586
        def test_list_flavors(self):
587
                """Test flavors_get"""
588
                self._test_list_flavors()
589

    
590
        def _test_list_flavors(self):
591
                r = self.client.list_flavors()
592
                self.assertTrue(len(r) > 1)
593
                r = self.client.list_flavors(detail=True)
594
                self.assertTrue(r[0].has_key('SNF:disk_template'))
595

    
596
        @if_not_all
597
        def test_get_flavor_details(self):
598
                """Test test_get_flavor_details"""
599
                self._test_get_flavor_details()
600

    
601
        def _test_get_flavor_details(self):
602
                r = self.client.get_flavor_details(self.flavorid)
603
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
604

    
605
        @if_not_all
606
        def test_list_images(self):
607
                """Test list_images"""
608
                self._test_list_images()
609

    
610
        def _test_list_images(self):
611
                r = self.client.list_images()
612
                self.assertTrue(len(r) > 1)
613
                r = self.client.list_images(detail=True)
614
                for detailed_img in r:
615
                        if detailed_img['id'] == self.img:
616
                                break
617
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
618

    
619
        @if_not_all
620
        def test_image_details(self):
621
                """Test image_details"""
622
                self._test_get_image_details
623

    
624
        def _test_get_image_details(self):
625
                r = self.client.get_image_details(self.img)
626
                self.assert_dicts_are_deeply_equal(r, self.img_details)
627

    
628
        @if_not_all
629
        def test_get_image_metadata(self):
630
                """Test get_image_metadata"""
631
                self._test_get_image_metadata()
632

    
633
        def _test_get_image_metadata(self):
634
                r = self.client.get_image_metadata(self.img)
635
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
636
                for key,val in self.img_details['metadata']['values'].items():
637
                        r = self.client.get_image_metadata(self.img, key)
638
                        self.assertEqual(r[key], val)
639

    
640
        @if_not_all
641
        def test_start_server(self):
642
                """Test start_server"""
643
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
644
                self._wait_for_status(self.server1['id'], 'BUILD')
645
                self.client.shutdown_server(self.server1['id'])
646
                self._wait_for_status(self.server1['id'], 'ACTIVE')
647
                self._test_start_server()
648

    
649
        def _test_start_server(self):
650
                self.client.start_server(self.server1['id'])
651
                self._wait_for_status(self.server1['id'], 'STOPPED')
652
                r = self.client.get_server_details(self.server1['id'])
653
                self.assertEqual(r['status'], 'ACTIVE')
654

    
655
        @if_not_all
656
        def test_shutdown_server(self):
657
                """Test shutdown_server"""
658
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
659
                self._wait_for_status(self.server1['id'], 'BUILD')
660
                self._test_shutdown_server()
661

    
662
        def _test_shutdown_server(self):
663
                self.client.shutdown_server(self.server1['id'])
664
                self._wait_for_status(self.server1['id'], 'ACTIVE')
665
                r = self.client.get_server_details(self.server1['id'])
666
                self.assertEqual(r['status'], 'STOPPED')
667

    
668
        @if_not_all
669
        def test_get_server_console(self):
670
                """Test get_server_console"""
671
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
672
                self._test_get_server_console()
673

    
674
        def _test_get_server_console(self):
675
                self._wait_for_status(self.server2['id'], 'BUILD')
676
                r = self.client.get_server_console(self.server2['id'])
677
                self.assertTrue(r.has_key('host'))
678
                self.assertTrue(r.has_key('password'))
679
                self.assertTrue(r.has_key('port'))
680
                self.assertTrue(r.has_key('type'))
681

    
682
        @if_not_all
683
        def test_get_firewall_profile(self):
684
                """Test get_firewall_profile"""
685
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
686
                self._test_get_firewall_profile()
687

    
688
        def _test_get_firewall_profile(self):
689
                self._wait_for_status(self.server1['id'], 'BUILD')
690
                fprofile = self.client.get_firewall_profile(self.server1['id'])
691
                self.assertTrue(fprofile in self.PROFILES)
692

    
693
        @if_not_all
694
        def test_set_firewall_profile(self):
695
                """Test set_firewall_profile"""
696
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
697
                self._test_set_firewall_profile()
698

    
699
        def _test_set_firewall_profile(self):
700
                def next_profile(cur_profile):
701
                        index = self.PROFILES.index(cur_profile)
702
                        new_index = 0 if index >= len(self.PROFILES)-1 else (index+1)
703
                        return self.PROFILES[new_index]
704

    
705
                self._wait_for_status(self.server1['id'], 'BUILD')
706
                fprofile = self.client.get_firewall_profile(self.server1['id'])
707
                for counter in range(1,1+len(self.PROFILES)):
708
                        nprofile = next_profile(fprofile)
709
                        start=fprofile
710
                        print('\tProfile swap %s: %s -> %s'%(counter, fprofile, nprofile))
711
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
712
                        wait = 3
713
                        c=['|','/','-','\\']
714
                        while fprofile != nprofile:
715
                                self.assertEqual(fprofile, start)
716
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
717
                                for i in range(4*wait):
718
                                        sys.stdout.write('\b%s'%c[i%4])
719
                                        sys.stdout.flush()
720
                                        time.sleep(0.25)
721
                                wait += 3
722
                                print('\b ')
723
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
724

    
725
        @if_not_all
726
        def test_get_server_stats(self):
727
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
728
                self._test_get_server_stats()
729

    
730
        def _test_get_server_stats(self):
731
                r = self.client.get_server_stats(self.server1['id'])
732
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
733
                        self.assertTrue(r.has_key(term))
734

    
735
        @if_not_all
736
        def test_list_networks(self):
737
                """Test list_network"""
738
                self.network1 = self._create_network(self.netname1)
739
                self._wait_for_network(self.network1['id'], 'ACTIVE')
740
                self._test_list_networks()
741

    
742
        def _test_list_networks(self):
743
                r = self.client.list_networks()
744
                self.assertTrue(len(r)>1)
745
                ids = [net['id'] for net in r]
746
                names = [net['name'] for net in r]
747
                self.assertTrue('1' in ids)
748
                self.assertTrue('public' in names)
749
                self.assertTrue(self.network1['id'] in ids)
750
                self.assertTrue(self.network1['name'] in names)
751

    
752
                r = self.client.list_networks(detail=True)
753
                ids = [net['id'] for net in r]
754
                names = [net['name'] for net in r]
755
                for net in r:
756
                        self.assertTrue(net['id'] in ids)
757
                        self.assertTrue(net['name'] in names)
758
                        for term in ('status', 'updated', 'created'):
759
                                self.assertTrue(term in net.keys())
760

    
761
        @if_not_all
762
        def test_create_network(self):
763
                """Test create_network"""
764
                self.network1 = self._create_network(self.netname1)
765
                self._test_create_network()
766

    
767
        def _test_create_network(self):
768
                nets = self.client.list_networks(self.network1['id'])
769
                chosen = [net for net in nets if net['id'] == self.network1['id']][0]
770
                chosen.pop('updated')
771
                net1 = dict(self.network1)
772
                net1.pop('updated')
773
                self.assert_dicts_are_deeply_equal(chosen, net1)
774

    
775
        @if_not_all
776
        def test_connect_server(self):
777
                """Test connect_server"""
778
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
779
                self.network1 = self._create_network(self.netname1)
780
                self._wait_for_status(self.server1['id'], 'BUILD')
781
                self._wait_for_network(self.network1['id'], 'ACTIVE')
782
                self._test_connect_server()
783

    
784
        def _test_connect_server(self):
785
                self.client.connect_server(self.server1['id'], self.network1['id'])
786
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
787

    
788
        @if_not_all
789
        def test_disconnect_server(self):
790
                """Test disconnect_server"""
791
                self.test_connect_server()
792
                self._test_disconnect_server()
793

    
794
        def _test_disconnect_server(self):
795
                self.client.disconnect_server(self.server1['id'], self.network1['id'])
796
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
797
                        in_creation=False))
798

    
799

    
800
        @if_not_all
801
        def test_list_server_nics(self):
802
                """Test list_server_nics"""
803
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
804
                self.network2 = self._create_network(self.netname2)
805
                self._wait_for_status(self.server1['id'], 'BUILD')
806
                self._wait_for_network(self.network2['id'], 'ACTIVE')
807
                self._test_list_server_nics()
808

    
809
        def _test_list_server_nics(self):
810
                r = self.client.list_server_nics(self.server1['id'])
811
                len0 = len(r)
812
                self.assertTrue(len0>0)
813
                self.assertTrue('1' in [net['network_id'] for net in r])
814

    
815
                self.client.connect_server(self.server1['id'], self.network2['id'])
816
                self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
817
                r = self.client.list_server_nics(self.server1['id'])
818
                self.assertTrue(len(r)>len0)
819

    
820
        @if_not_all
821
        def test_get_network_details(self):
822
                """Test get_network_details"""
823
                self.network1 = self._create_network(self.netname1)
824
                self._test_get_network_details()
825

    
826
        def _test_get_network_details(self):
827
                r = self.client.get_network_details(self.network1['id'])
828
                net1 = dict(self.network1)
829
                net1.pop('status')
830
                net1.pop('updated', None)
831
                net1.pop('attachments')
832
                r.pop('status')
833
                r.pop('updated', None)
834
                r.pop('attachments')
835
                self.assert_dicts_are_deeply_equal(net1, r)
836

    
837
        @if_not_all
838
        def test_update_network_name(self):
839
                self.network2 = self._create_network(self.netname2)
840
                self._test_update_network_name()
841

    
842
        def _test_update_network_name(self):
843
                updated_name = self.netname2+'_upd'
844
                self.client.update_network_name(self.network2['id'], updated_name)
845
                wait = 3
846
                c=['|','/','-','\\']
847
                r = self.client.get_network_details(self.network2['id'])
848
                while wait < 50:
849
                        if r['name'] == updated_name:
850
                                break
851
                        sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
852
                                self.network2['name'], updated_name, wait))
853
                        for i in range(4*wait):
854
                                sys.stdout.write('\b%s'%c[i%4])
855
                                sys.stdout.flush()
856
                                time.sleep(0.25)
857
                        print('')
858
                        wait += 3
859
                        r = self.client.get_network_details(self.network2['id'])
860
                self.assertEqual(r['name'], updated_name)
861

    
862
        """ Don't have auth to test this
863
        @if_not_all
864
        def test_delete_image(self):
865
                ""Test delete_image""
866
                self._test_delete_image()
867
        def _test_delete_image(self):
868
                images = self.client.list_images()
869
                self.client.delete_image(images[2]['id'])
870
                try:
871
                        r = self.client.get_image_details(images[2]['id'], success=(400))
872
                except ClientError as err:
873
                        self.assertEqual(err.status, 404)
874

875
        @if_not_all
876
        def test_create_image_metadata(self):
877
                ""Test create_image_metadata""
878
                self._test_create_image_metadata()
879
        def _test_create_image_metadata(self):
880
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
881
                self.assertEqual(r['mykey'], 'myval')
882

883
        @if_not_all
884
        def test_update_image_metadata(self):
885
                ""Test update_image_metadata""
886
                self._test_update_image_metadata()
887
        def _test_update_image_metadata(self):
888
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
889
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
890
                self.assertEqual(r['mykey0'], 'myval0')
891

892
        @if_not_all
893
        def test_delete_image_metadata(self):
894
                ""Test delete_image_metadata""
895
                self._test_delete_image_metadata()
896
        def _test_delete_image_metadata(self):
897
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
898
                self.client.delete_image_metadata(self.img, 'mykey1')
899
                r = self.client.get_image_metadata(self.img)
900
                self.assertNotEqual(r.has_key('mykey1'))
901
        """
902

    
903
class testPithos(unittest.TestCase):
904
        """Set up a Pithos+ thorough test"""
905
        def setUp(self):
906
                """
907
                url = 'http://127.0.0.1:8000/v1'
908
                token = 'C/yBXmz3XjTFBnujc2biAg=='
909
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
910
                account = 'admin@adminland.com'
911
                """
912

    
913
                url='https://pithos.okeanos.grnet.gr/v1'
914

    
915
                token='Kn+G9dfmlPLR2WFnhfBOow=='
916
                account='saxtouri@grnet.gr'
917

    
918
                """
919
                url='https://pithos.okeanos.io/v1'
920
                token='0TpoyAXqJSPxLdDuZHiLOA=='
921
                account='saxtouri@admin.grnet.gr'
922
                """
923
                
924
                """
925
                def add_handler(name, level, prefix=''):
926
                        h = logging.StreamHandler()
927
                        fmt = logging.Formatter(prefix + '%(message)s')
928
                        h.setFormatter(fmt)
929
                        logger = logging.getLogger(name)
930
                        logger.addHandler(h)
931
                        logger.setLevel(level)
932
                import logging
933
                sendlog = logging.getLogger('clients.send')
934
                recvlog = logging.getLogger('clients.recv')
935
                add_handler('requests', logging.INFO, prefix='* ')
936
                add_handler('clients.send', logging.INFO, prefix='> ')
937
                add_handler('clients.recv', logging.INFO, prefix='< ')
938
                """
939
                
940
                self.fname = None
941
                container=None
942
                self.client = pithos(url, token, account, container)
943
                self.now = time.mktime(time.gmtime())
944
                self.c1 = 'c1_'+unicode(self.now)
945
                self.c2 = 'c2_'+unicode(self.now)
946
                self.c3 = 'c3_'+unicode(self.now)
947

    
948

    
949
                self.client.create_container(self.c1)
950
                self.client.create_container(self.c2)
951
                self.client.create_container(self.c3)
952
                self.makeNewObject(self.c1, 'test')
953
                self.makeNewObject(self.c2, 'test')
954
                self.now_unformated = datetime.datetime.utcnow()
955
                self.makeNewObject(self.c1, 'test1')
956
                self.makeNewObject(self.c2, 'test1')
957
                """Prepare an object to be shared - also its container"""
958
                self.client.container = self.c1
959
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
960
                
961
                self.makeNewObject(self.c1, 'another.test')
962

    
963
        def makeNewObject(self, container, obj):
964
                self.client.container = container
965
                r = self.client.object_put(obj, content_type='application/octet-stream',
966
                        data= 'file '+obj+' that lives in '+container,
967
                        metadata={'incontainer':container})
968

    
969
        def forceDeleteContainer(self, container):
970
                self.client.container = container
971
                try:
972
                        r = self.client.list_objects()
973
                except ClientError:
974
                        return
975
                for obj in r:
976
                        name = obj['name']
977
                        self.client.del_object(name)
978
                r = self.client.container_delete()
979
                self.container = ''
980

    
981
        def tearDown(self):
982
                """Destroy test cases"""
983
                if self.fname is not None:
984
                        try:
985
                                os.remove(self.fname)
986
                        except OSError:
987
                                pass
988
                        self.fname = None
989
                self.forceDeleteContainer(self.c1)
990
                self.forceDeleteContainer(self.c2)
991
                try:
992
                        self.forceDeleteContainer(self.c3)
993
                except ClientError:
994
                        pass
995
                self.client.container=''
996

    
997
        def test_000(self):
998
                """Perform a full Pithos+ kamaki support test"""
999

    
1000
        def test_account_head(self):
1001
                """Test account_HEAD"""
1002
                r = self.client.account_head()
1003
                self.assertEqual(r.status_code, 204)
1004
                
1005
                r = self.client.account_head(until='1000000000')
1006
                self.assertEqual(r.status_code, 204)
1007
           
1008
                r = self.client.get_account_info(until='1000000000') 
1009
                datestring = unicode(r['x-account-until-timestamp'])
1010
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1011

    
1012
                r = self.client.get_account_quota()
1013
                self.assertTrue(r.has_key('x-account-policy-quota'))
1014

    
1015
                r = self.client.get_account_versioning()
1016
                self.assertTrue(r.has_key('x-account-policy-versioning'))
1017

    
1018
                """Check if(un)modified_since"""
1019
                for format in self.client.DATE_FORMATS:
1020
                        now_formated = self.now_unformated.strftime(format)
1021
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
1022
                        sc1 = r1.status_code
1023
                        r1.release()
1024
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1025
                        sc2 = r2.status_code
1026
                        r2.release()
1027
                        self.assertNotEqual(sc1, sc2)
1028

    
1029
        def test_account_get(self):
1030
                """Test account_GET"""
1031
                #r = self.client.account_get()
1032
                #self.assertEqual(r.status_code, 200)
1033
                r = self.client.list_containers()
1034
                fullLen = len(r)
1035
                self.assertTrue(fullLen > 2)
1036
                
1037
                r = self.client.account_get(limit=1)
1038
                self.assertEqual(len(r.json), 1)
1039
                
1040

    
1041
                r = self.client.account_get(marker='c2_')
1042
                temp_c0 = r.json[0]['name']
1043
                temp_c2 = r.json[2]['name']
1044
                
1045
                r = self.client.account_get(limit=2, marker='c2_')
1046
                conames = [container['name'] for container in r.json \
1047
                        if container['name'].lower().startswith('c2_')]
1048
                self.assertTrue(temp_c0 in conames)
1049
                self.assertFalse(temp_c2 in conames)
1050
                
1051

    
1052
                r = self.client.account_get(show_only_shared=True)
1053
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
1054
                
1055
                r = self.client.account_get(until=1342609206)
1056
                self.assertTrue(len(r.json) <= fullLen)
1057
                
1058
                """Check if(un)modified_since"""
1059
                for format in self.client.DATE_FORMATS:
1060
                        now_formated = self.now_unformated.strftime(format)
1061
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
1062
                        sc1 = r1.status_code
1063
                        r1.release()
1064
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1065
                        sc2 = r2.status_code
1066
                        r2.release()
1067
                        self.assertNotEqual(sc1, sc2)
1068

    
1069
                """Check sharing_accounts"""
1070
                r = self.client.get_sharing_accounts()
1071
                self.assertTrue(len(r)>0)
1072

    
1073
        def test_account_post(self):
1074
                """Test account_POST"""
1075
                r = self.client.account_post()
1076
                self.assertEqual(r.status_code, 202)
1077
                grpName = 'grp'+unicode(self.now)
1078
                
1079

    
1080
                """Method set/del_account_meta and set_account_groupcall use account_post internally
1081
                """
1082
                self.client.set_account_group(grpName, ['u1', 'u2'])
1083
                r = self.client.get_account_group()
1084
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
1085
                self.client.del_account_group(grpName)
1086
                r = self.client.get_account_group()
1087
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
1088

    
1089
                mprefix = 'meta'+unicode(self.now)
1090
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
1091
                r = self.client.get_account_meta()
1092
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
1093
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
1094

    
1095
                self.client.del_account_meta(mprefix+'1')
1096
                r = self.client.get_account_meta()
1097
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
1098

    
1099
                self.client.del_account_meta(mprefix+'2')
1100
                r = self.client.get_account_meta()
1101
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
1102

    
1103
                """Missing testing for quota, versioning, because normally
1104
                you don't have permitions to modify those at account level
1105
                """
1106

    
1107
                newquota=1000000
1108
                self.client.set_account_quota(newquota)
1109
                #r = self.client.get_account_info()
1110
                #print(unicode(r))
1111
                #r = self.client.get_account_quota()
1112
                #self.assertEqual(r['x-account-policy-quota'], newquota)
1113
                self.client.set_account_versioning('auto')
1114

    
1115
        def test_container_head(self):
1116
                """Test container_HEAD"""
1117
                self.client.container = self.c1
1118

    
1119
                r = self.client.container_head()
1120
                self.assertEqual(r.status_code, 204)
1121
                
1122
                """Check until"""
1123
                r = self.client.container_head(until=1000000, success=(204, 404))
1124
                self.assertEqual(r.status_code, 404)
1125
                
1126
                """Check and if(un)modified_since"""
1127
                for format in self.client.DATE_FORMATS:
1128
                        now_formated = self.now_unformated.strftime(format)
1129
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
1130
                        sc1=r1.status_code
1131
                        r1.release()
1132
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1133
                        sc2=r2.status_code
1134
                        r2.release()
1135
                        self.assertNotEqual(sc1, sc2)
1136

    
1137
                """Check container object meta"""
1138
                r = self.client.get_container_object_meta()
1139
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1140

    
1141
        def test_container_get(self):
1142
                """Test container_GET"""
1143
                self.client.container = self.c1
1144

    
1145
                r = self.client.container_get()
1146
                self.assertEqual(r.status_code, 200)
1147
                fullLen = len(r.json)
1148
                
1149

    
1150
                r = self.client.container_get(prefix='test')
1151
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1152
                self.assertTrue(len(r.json) > 1)
1153
                self.assertEqual(len(r.json), len(lalobjects))
1154
                
1155

    
1156
                r = self.client.container_get(limit=1)
1157
                self.assertEqual(len(r.json), 1)
1158
                
1159

    
1160
                r = self.client.container_get(marker='another')
1161
                self.assertTrue(len(r.json) > 1)
1162
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1163
                self.assertEqual(len(r.json), len(neobjects))
1164
                
1165

    
1166
                r = self.client.container_get(prefix='another.test', delimiter='.')
1167
                self.assertTrue(fullLen > len(r.json))
1168
                
1169

    
1170
                r = self.client.container_get(path='/')
1171
                self.assertEqual(fullLen, len(r.json))
1172
                
1173

    
1174
                r = self.client.container_get(format='xml')
1175
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1176
                
1177

    
1178
                r = self.client.container_get(meta=['incontainer'])
1179
                self.assertTrue(len(r.json) > 0)
1180
                
1181

    
1182
                r = self.client.container_get(show_only_shared=True)
1183
                self.assertTrue(len(r.json) < fullLen)
1184
                
1185

    
1186
                try:
1187
                        r = self.client.container_get(until=1000000000)
1188
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1189
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1190
                        
1191
                except ClientError:
1192
                        
1193
                        pass
1194

    
1195
                """Check and if un/modified_since"""
1196
                for format in self.client.DATE_FORMATS:
1197
                        now_formated = self.now_unformated.strftime(format)
1198
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1199
                        sc1 = r1.status_code
1200
                        r1.release()
1201
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1202
                        sc2 = r2.status_code
1203
                        r2.release()
1204
                        self.assertNotEqual(sc1, sc2)
1205
           
1206
        def test_container_put(self):
1207
                """Test container_PUT"""
1208
                self.client.container = self.c2
1209

    
1210
                r = self.client.container_put()
1211
                self.assertEqual(r.status_code, 202)
1212
                
1213

    
1214
                r = self.client.get_container_quota(self.client.container)
1215
                cquota = r.values()[0]
1216
                newquota = 2*int(cquota)
1217

    
1218
                r = self.client.container_put(quota=newquota)
1219
                self.assertEqual(r.status_code, 202)
1220
                
1221
                r = self.client.get_container_quota(self.client.container)
1222
                xquota = int(r.values()[0])
1223
                self.assertEqual(newquota, xquota)
1224

    
1225
                r = self.client.container_put(versioning='auto')
1226
                self.assertEqual(r.status_code, 202)
1227
                
1228
                r = self.client.get_container_versioning(self.client.container)
1229
                nvers = r.values()[0]
1230
                self.assertEqual('auto', nvers)
1231

    
1232
                r = self.client.container_put(versioning='none')
1233
                self.assertEqual(r.status_code, 202)
1234
                
1235
                r = self.client.get_container_versioning(self.client.container)
1236
                nvers = r.values()[0]
1237
                self.assertEqual('none', nvers)
1238

    
1239
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1240
                self.assertEqual(r.status_code, 202)
1241
                
1242
                r = self.client.get_container_meta(self.client.container)
1243
                self.assertTrue(r.has_key('x-container-meta-m1'))
1244
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1245
                self.assertTrue(r.has_key('x-container-meta-m2'))
1246
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1247

    
1248
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1249
                self.assertEqual(r.status_code, 202)
1250
                
1251
                r = self.client.get_container_meta(self.client.container)
1252
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1253
                self.assertTrue(r.has_key('x-container-meta-m2'))
1254
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1255
           
1256
                self.client.del_container_meta(self.client.container)
1257

    
1258
        def test_container_post(self):
1259
                """Test container_POST"""
1260
                self.client.container = self.c2
1261

    
1262
                """Simple post"""
1263
                r = self.client.container_post()
1264
                self.assertEqual(r.status_code, 202)
1265
                
1266

    
1267
                """post meta"""
1268
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1269
                r = self.client.get_container_meta(self.client.container)
1270
                self.assertTrue(r.has_key('x-container-meta-m1'))
1271
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1272
                self.assertTrue(r.has_key('x-container-meta-m2'))
1273
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1274

    
1275
                """post/2del meta"""
1276
                r = self.client.del_container_meta('m1')
1277
                r = self.client.set_container_meta({'m2':'v2a'})
1278
                r = self.client.get_container_meta(self.client.container)
1279
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1280
                self.assertTrue(r.has_key('x-container-meta-m2'))
1281
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1282

    
1283
                """check quota"""
1284
                r = self.client.get_container_quota(self.client.container)
1285
                cquota = r.values()[0]
1286
                newquota = 2*int(cquota)
1287
                r = self.client.set_container_quota(newquota)
1288
                r = self.client.get_container_quota(self.client.container)
1289
                xquota = int(r.values()[0])
1290
                self.assertEqual(newquota, xquota)
1291
                r = self.client.set_container_quota(cquota)
1292
                r = self.client.get_container_quota(self.client.container)
1293
                xquota = r.values()[0]
1294
                self.assertEqual(cquota, xquota)
1295

    
1296
                """Check versioning"""
1297
                self.client.set_container_versioning('auto')
1298
                r = self.client.get_container_versioning(self.client.container)
1299
                nvers = r.values()[0]
1300
                self.assertEqual('auto', nvers)
1301
                self.client.set_container_versioning('none')
1302
                r = self.client.get_container_versioning(self.client.container)
1303
                nvers = r.values()[0]
1304
                self.assertEqual('none', nvers)
1305

    
1306
                """put_block uses content_type and content_length to
1307
                post blocks of data 2 container. All that in upload_object"""
1308
                """Change a file at fs"""
1309
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1310
                """Upload it at a directory in container"""
1311
                self.client.create_directory('dir')
1312
                newf = open(self.fname, 'r')
1313
                self.client.upload_object('/dir/sample.file', newf)
1314
                newf.close()
1315
                """Check if file has been uploaded"""
1316
                r = self.client.get_object_info('/dir/sample.file')
1317
                self.assertTrue(int(r['content-length']) > 100000000)
1318

    
1319
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1320
                #TODO
1321

    
1322
                """Check update=False"""
1323
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1324
                
1325
                r = self.client.get_object_info('test')
1326
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1327
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1328

    
1329
                r = self.client.del_container_meta('m2')
1330

    
1331
        def test_container_delete(self):
1332
                """Test container_DELETE"""
1333

    
1334
                """Fail to delete a non-empty container"""
1335
                self.client.container = self.c2
1336
                r = self.client.container_delete(success=409)
1337
                self.assertEqual(r.status_code, 409)
1338
                
1339

    
1340
                """Fail to delete c3 (empty) container"""
1341
                self.client.container = self.c3
1342
                r = self.client.container_delete(until='1000000000')
1343
                self.assertEqual(r.status_code, 204)
1344
                
1345

    
1346
                """Delete c3 (empty) container"""
1347
                r = self.client.container_delete()
1348
                self.assertEqual(r.status_code, 204)
1349

    
1350
                """Purge container(empty a container), check versionlist"""
1351
                self.client.container = self.c1
1352
                r = self.client.object_head('test', success=(200, 404))
1353
                self.assertEqual(r.status_code, 200)
1354
                self.client.del_container(delimiter='/')
1355
                r = self.client.object_head('test', success=(200, 404))
1356
                self.assertEqual(r.status_code, 404)
1357
                r = self.client.get_object_versionlist('test')
1358
                self.assertTrue(len(r) > 0)
1359
                self.assertTrue(len(r[0])>1)
1360
                self.client.purge_container()
1361
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1362

    
1363
        def test_object_head(self):
1364
                """Test object_HEAD"""
1365
                self.client.container = self.c2
1366
                obj = 'test'
1367

    
1368
                r = self.client.object_head(obj)
1369
                self.assertEqual(r.status_code, 200)
1370
                etag = r.headers['etag']
1371
                
1372

    
1373
                r = self.client.object_head(obj, version=40)
1374
                self.assertEqual(r.headers['x-object-version'], '40')
1375
                
1376

    
1377
                r = self.client.object_head(obj, if_etag_match=etag)
1378
                self.assertEqual(r.status_code, 200)
1379
                
1380
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1381
                self.assertNotEqual(r.status_code, 200)
1382
                
1383

    
1384
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1385
                self.assertEqual(r.status_code, 412)
1386
                
1387

    
1388
                """Check and if(un)modified_since"""
1389
                for format in self.client.DATE_FORMATS:
1390
                        now_formated = self.now_unformated.strftime(format)
1391
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1392
                                success=(200, 304, 412))
1393
                        sc1 = r1.status_code
1394
                        r1.release()
1395
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1396
                                success=(200, 304, 412))
1397
                        sc2 = r2.status_code
1398
                        r2.release()
1399
                        self.assertNotEqual(sc1, sc2)
1400

    
1401
        def test_object_get(self):
1402
                """Test object_GET"""
1403
                self.client.container = self.c1
1404
                obj = 'test'
1405

    
1406
                r = self.client.object_get(obj)
1407
                self.assertEqual(r.status_code, 200)
1408

    
1409
                osize = int(r.headers['content-length'])
1410
                etag = r.headers['etag']
1411
                
1412

    
1413
                r = self.client.object_get(obj, hashmap=True)
1414
                self.assertTrue(r.json.has_key('hashes') \
1415
                        and r.json.has_key('block_hash') \
1416
                        and r.json.has_key('block_size') \
1417
                        and r.json.has_key('bytes'))
1418
                
1419

    
1420
                r = self.client.object_get(obj, format='xml', hashmap=True)
1421
                self.assertEqual(len(r.text.split('hash>')), 3)
1422
                
1423

    
1424
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1425
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1426
                partsize = int(r.headers['content-length'])
1427
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1428
                
1429

    
1430
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1431
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1432
                partsize = int(r.headers['content-length'])
1433
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1434
                
1435

    
1436
                r = self.client.object_get(obj, if_etag_match=etag)
1437
                self.assertEqual(r.status_code, 200)
1438
                
1439

    
1440
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1441
                self.assertEqual(r.status_code, 200)
1442
                
1443

    
1444
                """Check and if(un)modified_since"""
1445
                for format in self.client.DATE_FORMATS:
1446
                        now_formated = self.now_unformated.strftime(format)
1447
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1448
                                success=(200, 304, 412))
1449
                        sc1 = r1.status_code
1450
                        r1.release()
1451
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1452
                        sc2 = r2.status_code
1453
                        r2.release()
1454
                        self.assertNotEqual(sc1, sc2)
1455

    
1456
        def test_object_put(self):
1457
                """Test object_PUT"""
1458

    
1459
                self.client.container = self.c2
1460
                obj='another.test'
1461

    
1462
                """create the object"""
1463
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1464
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1465
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1466
                        content_disposition='attachment; filename="fname.ext"')
1467
                self.assertEqual(r.status_code, 201)
1468
                etag = r.headers['etag']
1469
                
1470
                """Check content-disposition"""
1471
                r = self.client.get_object_info(obj)
1472
                self.assertTrue(r.has_key('content-disposition'))
1473

    
1474
                """Check permitions"""
1475
                r = self.client.get_object_sharing(obj)
1476
                self.assertTrue('accx:groupa' in r['read'])
1477
                self.assertTrue('u1' in r['read'])
1478
                self.assertTrue('u2' in r['write'])
1479
                self.assertTrue('u3' in r['write'])
1480

    
1481
                """Check metadata"""
1482
                r = self.client.get_object_meta(obj)
1483
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1484
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1485

    
1486
                """Check public and if_etag_match"""
1487
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1488
                        content_type='application/octet-stream', public=True)
1489
                
1490
                r = self.client.object_get(obj)
1491
                self.assertTrue(r.headers.has_key('x-object-public'))
1492
                vers2 = int(r.headers['x-object-version'])
1493
                etag = r.headers['etag']
1494
                self.assertEqual(r.text, 'b')
1495
                
1496
                """Check if_etag_not_match"""
1497
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1498
                        content_type='application/octet-stream', success=(201, 412))
1499
                self.assertEqual(r.status_code, 412)
1500
                
1501

    
1502
                """Check content_type and content_length"""
1503
                tmpdir = 'dir'+unicode(self.now)
1504
                r = self.client.object_put(tmpdir, content_type='application/directory',
1505
                        content_length=0)
1506
                
1507
                r = self.client.get_object_info(tmpdir)
1508
                self.assertEqual(r['content-type'], 'application/directory')
1509

    
1510
                """Check copy_from, content_encoding"""
1511
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1512
                        copy_from='/%s/%s'%(self.client.container, obj),
1513
                        content_encoding='application/octet-stream', 
1514
                        source_account=self.client.account,
1515
                        content_length=0, success=201)
1516
                self.assertEqual(r.status_code, 201)
1517

    
1518
                """Test copy_object for cross-conctainer copy"""
1519
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1520
                        dst_container=self.c1, dst_object=obj)
1521
                self.client.container = self.c1
1522
                r1 = self.client.get_object_info(obj)
1523
                self.client.container = self.c2
1524
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1525
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1526
                
1527
                """Check cross-container copy_from, content_encoding"""
1528
                self.client.container = self.c1
1529
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1530
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1531
                        content_encoding='application/octet-stream', 
1532
                        source_account=self.client.account,
1533
                        content_length=0, success=201)
1534
                
1535
                self.assertEqual(r.status_code, 201)
1536
                r = self.client.get_object_info(obj)
1537
                self.assertEqual(r['etag'], etag)
1538

    
1539
                """Check source_account"""
1540
                self.client.container = self.c2
1541
                fromstr = '/'+self.c1+'/'+obj
1542
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1543
                        content_encoding='application/octet-stream', 
1544
                        source_account='nonExistendAddress@NeverLand.com', 
1545
                        content_length=0, success=(201, 403))
1546
                self.assertEqual(r.status_code, 403)
1547
                
1548
                """Check cross-container move_from"""
1549
                self.client.container = self.c1
1550
                r1 = self.client.get_object_info(obj)
1551
                self.client.container = self.c2
1552
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1553
                dst_object=obj+'v0')
1554
                r0 = self.client.get_object_info(obj+'v0')
1555
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1556

    
1557
                """Check move_from"""
1558
                r = self.client.object_put(obj+'v1', format=None, 
1559
                        move_from='/'+self.c2+'/'+obj,
1560
                        source_version = vers2,
1561
                        content_encoding='application/octet-stream',
1562
                        content_length=0, success=201)
1563
                
1564
                """Check manifest"""
1565
                mobj = 'manifest.test'
1566
                txt = ''
1567
                for i in range(10):
1568
                        txt += '%s'%i
1569
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1570
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1571
                        
1572
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1573
                        manifest='%s/%s'%(self.client.container, mobj))
1574
                
1575
                r = self.client.object_get(mobj)
1576
                self.assertEqual(r.text, txt)
1577
           
1578
                """Upload a local file with one request"""
1579
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1580
                newf = open(self.fname, 'r')
1581
                self.client.upload_object('sample.file', newf)
1582
                newf.close()
1583
                """Check if file has been uploaded"""
1584
                r = self.client.get_object_info('sample.file')
1585
                self.assertEqual(int(r['content-length']), 10260)
1586

    
1587
                """Some problems with transfer-encoding?"""
1588

    
1589
        def test_object_copy(self):
1590
                """Test object_COPY"""
1591
                self.client.container=self.c2
1592
                obj = 'test2'
1593

    
1594
                data= '{"key1":"val1", "key2":"val2"}'
1595
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1596
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1597
                        permitions={
1598
                                'read':['accX:groupA', 'u1', 'u2'],
1599
                                'write':['u2', 'u3']},
1600
                        content_disposition='attachment; filename="fname.ext"')
1601
                
1602
                r = self.client.object_copy(obj+'orig',
1603
                        destination = '/'+self.client.container+'/'+obj,
1604
                        ignore_content_type=False, content_type='application/json', 
1605
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1606
                        permitions={'write':['u5', 'accX:groupB']})
1607
                self.assertEqual(r.status_code, 201)
1608
                
1609
                """Check content-disposition"""
1610
                r = self.client.get_object_info(obj)
1611
                self.assertTrue(r.has_key('content-disposition'))
1612

    
1613
                """Check Metadata"""
1614
                r = self.client.get_object_meta(obj)
1615
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1616
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1617
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1618

    
1619
                """Check permitions"""
1620
                r = self.client.get_object_sharing(obj)
1621
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1622
                self.assertTrue('accx:groupb' in r['write'])
1623

    
1624
                """Check destination account"""
1625
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1626
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1627
                        success=(201, 403))
1628
                self.assertEqual(r.status_code, 403)
1629
                
1630

    
1631
                """Check destination being another container
1632
                and also content_type and content encoding"""
1633
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1634
                        content_encoding='utf8', content_type='application/json')
1635
                self.assertEqual(r.status_code, 201)
1636
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1637
                
1638

    
1639
                """Check ignore_content_type and content_type"""
1640
                r = self.client.object_get(obj)
1641
                etag = r.headers['etag']
1642
                ctype = r.headers['content-type']
1643
                self.assertEqual(ctype, 'application/json')
1644
                
1645
                r = self.client.object_copy(obj+'orig',
1646
                        destination = '/'+self.client.container+'/'+obj+'0',
1647
                        ignore_content_type=True, content_type='application/json')
1648
                self.assertEqual(r.status_code, 201)
1649
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1650
                
1651

    
1652
                """Check if_etag_(not_)match"""
1653
                r = self.client.object_copy(obj,
1654
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1655
                self.assertEqual(r.status_code, 201)
1656
                
1657
                r = self.client.object_copy(obj,
1658
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1659
                self.assertEqual(r.status_code, 201)
1660
                vers2 = r.headers['x-object-version']
1661
                
1662

    
1663
                """Check source_version, public and format """
1664
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1665
                self.assertEqual(r.status_code, 201)
1666
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1667
                
1668
                r = self.client.get_object_info(obj+'3')
1669
                self.assertTrue(r.has_key('x-object-public'))
1670

    
1671
        def test_object_move(self):
1672
                """Test object_MOVE"""
1673
                self.client.container= self.c2
1674
                obj = 'test2'
1675

    
1676
                data= '{"key1":"val1", "key2":"val2"}'
1677
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1678
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1679
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1680
                
1681
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1682
                        ignore_content_type=False, content_type='application/json', 
1683
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1684
                        permitions={'write':['u5', 'accX:groupB']})
1685
                self.assertEqual(r.status_code, 201)
1686
                
1687

    
1688
                """Check Metadata"""
1689
                r = self.client.get_object_meta(obj)
1690
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1691
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1692
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1693

    
1694
                """Check permitions"""
1695
                r = self.client.get_object_sharing(obj)
1696
                self.assertFalse(r.has_key('read'))
1697
                self.assertTrue('u5' in r['write'])
1698
                self.assertTrue('accx:groupb' in r['write'])
1699

    
1700
                """Check destination account"""
1701
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1702
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1703
                        success=(201, 403))
1704
                self.assertEqual(r.status_code, 403)
1705
                
1706

    
1707
                """Check destination being another container and also
1708
                content_type, content_disposition and content encoding"""
1709
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1710
                        content_encoding='utf8', content_type='application/json',
1711
                        content_disposition='attachment; filename="fname.ext"')
1712
                self.assertEqual(r.status_code, 201)
1713
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1714
                self.client.container=self.c1
1715
                r = self.client.get_object_info(obj)
1716
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1717
                etag = r['etag']
1718
                ctype = r['content-type']
1719
                self.assertEqual(ctype, 'application/json')
1720

    
1721
                """Check ignore_content_type and content_type"""
1722
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1723
                        ignore_content_type=True, content_type='application/json')
1724
                self.assertEqual(r.status_code, 201)
1725
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1726
                
1727

    
1728
                """Check if_etag_(not_)match"""
1729
                self.client.container=self.c2
1730
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1731
                        if_etag_match=etag)
1732
                self.assertEqual(r.status_code, 201)
1733
                
1734
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1735
                        if_etag_not_match='lalala')
1736
                self.assertEqual(r.status_code, 201)
1737
                
1738

    
1739
                """Check public and format """
1740
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1741
                        format='xml', public=True)
1742
                self.assertEqual(r.status_code, 201)
1743
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1744
                
1745
                r = self.client.get_object_info(obj+'2')
1746
                self.assertTrue(r.has_key('x-object-public'))
1747

    
1748
        def test_object_post(self):
1749
                """Test object_POST"""
1750
                self.client.container=self.c2
1751
                obj = 'test2'
1752
                """create a filesystem file"""
1753
                self.fname = obj
1754
                newf = open(self.fname, 'w')
1755
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1756
                newf.close()
1757
                """create a file on container"""
1758
                r = self.client.object_put(obj, content_type='application/octet-stream',
1759
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1760
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1761
                
1762

    
1763
                """Append tests update, content_range, content_type, content_length"""
1764
                newf = open(obj, 'r')
1765
                self.client.append_object(obj, newf)
1766
                r = self.client.object_get(obj)
1767
                self.assertTrue(r.text.startswith('Hello!'))
1768
                
1769

    
1770
                """Overwrite tests update, content_type, content_length, content_range"""
1771
                newf.seek(0)
1772
                r = self.client.overwrite_object(obj, 0, 10, newf)
1773
                r = self.client.object_get(obj)
1774
                self.assertTrue(r.text.startswith('ello!'))
1775
                newf.close()
1776
                
1777
                
1778
                """Truncate tests update, content_range, content_type,
1779
                object_bytes and source_object"""
1780
                r = self.client.truncate_object(obj, 5)
1781
                r = self.client.object_get(obj)
1782
                self.assertEqual(r.text, 'ello!')
1783
                
1784

    
1785
                """Check metadata"""
1786
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1787
                r = self.client.get_object_meta(obj)
1788
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1789
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1790
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1791
                self.client.del_object_meta('mkey1', obj)
1792
                r = self.client.get_object_meta(obj)
1793
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1794

    
1795
                """Check permitions"""
1796
                self.client.set_object_sharing(obj,
1797
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1798
                r = self.client.get_object_sharing(obj)
1799
                self.assertTrue(r.has_key('read'))
1800
                self.assertTrue('u5' in r['read'])
1801
                self.assertTrue(r.has_key('write'))
1802
                self.assertTrue('u4' in r['write'])
1803
                self.client.del_object_sharing(obj)
1804
                r = self.client.get_object_sharing(obj)
1805
                self.assertTrue(len(r) == 0)
1806

    
1807
                """Check publish"""
1808
                self.client.publish_object(obj)
1809
                r = self.client.get_object_info(obj)
1810
                self.assertTrue(r.has_key('x-object-public'))
1811
                self.client.unpublish_object(obj)
1812
                r = self.client.get_object_info(obj)
1813
                self.assertFalse(r.has_key('x-object-public'))
1814

    
1815
                """Check if_etag_(not)match"""
1816
                etag = r['etag']
1817
                #r = self.client.object_post(obj, update=True, public=True,
1818
                #        if_etag_not_match=etag, success=(412,202,204))
1819
                #self.assertEqual(r.status_code, 412)
1820
                
1821
                r = self.client.object_post(obj, update=True, public=True,
1822
                        if_etag_match=etag, content_encoding='application/json')
1823
                
1824
                r = self.client.get_object_info(obj)
1825
                helloVersion = r['x-object-version']
1826
                self.assertTrue(r.has_key('x-object-public'))
1827
                self.assertEqual(r['content-encoding'], 'application/json')
1828

    
1829
                """Check source_version and source_account and content_disposition"""
1830
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1831
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1832
                        source_account='thisAccountWillNeverExist@adminland.com',
1833
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1834
                self.assertEqual(r.status_code, 403)
1835
                
1836
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1837
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1838
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1839
                        content_disposition='attachment; filename="fname.ext"')
1840
                
1841
                r = self.client.object_get(obj)
1842
                self.assertEqual(r.text, 'eello!')
1843
                self.assertTrue(r.headers.has_key('content-disposition')
1844
                        and 'fname.ext' in r.headers['content-disposition'])
1845
                
1846

    
1847
                """Check manifest"""
1848
                mobj = 'manifest.test'
1849
                txt = ''
1850
                for i in range(10):
1851
                        txt += '%s'%i
1852
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1853
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1854
                        
1855
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1856
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1857
                
1858
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1859
                
1860
                r = self.client.object_get(mobj)
1861
                self.assertEqual(r.text, txt)
1862
                
1863

    
1864
                """We need to check transfer_encoding """
1865

    
1866
        def test_object_delete(self):
1867
                """Test object_DELETE"""
1868
                self.client.container=self.c2
1869
                obj = 'test2'
1870
                """create a file on container"""
1871
                r = self.client.object_put(obj, content_type='application/octet-stream',
1872
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1873
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1874
                
1875

    
1876
                """Check with false until"""
1877
                r = self.client.object_delete(obj, until=1000000)
1878
                
1879
                r = self.client.object_get(obj, success=(200, 404))
1880
                self.assertEqual(r.status_code, 200)
1881
                
1882

    
1883
                """Check normal case"""
1884
                r = self.client.object_delete(obj)
1885
                self.assertEqual(r.status_code, 204)
1886
                
1887
                r = self.client.object_get(obj, success=(200, 404))
1888
                self.assertEqual(r.status_code, 404)
1889
                
1890

    
1891
        def create_large_file(self, size, name):
1892
                """Create a large file at fs"""
1893
                self.fname = name
1894
                import random
1895
                random.seed(self.now)
1896
                f = open(self.fname, 'w')
1897
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1898
                for hobyte_id in range(size/8):
1899
                        sss = 'hobt%s'%random.randint(1000, 9999)
1900
                        f.write(sss)
1901
                        if 0 == (hobyte_id*800)%size:
1902
                                f.write('\n')
1903
                                sys.stdout.write('\b\b')
1904
                                prs = (hobyte_id*800)//size
1905
                                if prs > 10:
1906
                                        sys.stdout.write('\b')
1907
                                sys.stdout.write('%s'%prs+'%')
1908
                                sys.stdout.flush()
1909
                print('\b\b\b100%')
1910
                f.close()
1911
                """"""
1912

    
1913
def init_parser():
1914
        parser = ArgumentParser(add_help=False)
1915
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1916
                help="Show this help message and exit")
1917
        return parser
1918

    
1919
if __name__ == '__main__':
1920
        parser = init_parser()
1921
        args, argv = parser.parse_known_args()
1922

    
1923
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1924
                raise Exception('\tusage: tests.py <group> [command]')
1925
        suiteFew = unittest.TestSuite()
1926

    
1927
        if len(argv) == 0 or argv[0] == 'pithos':
1928
                if len(argv) == 1:
1929
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1930
                else:
1931
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1932
        if len(argv) == 0 or argv[0] == 'cyclades':
1933
                if len(argv) == 1:
1934
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1935
                        suiteFew.addTest(testCyclades('test_000'))
1936
                else:
1937
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1938

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