Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ f7e38cbb

History | View | Annotate | Download (65.6 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 #Monkey-patch everything for gevent early on
35
gevent.monkey.patch_all()
36

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

    
42
from kamaki.clients import ClientError
43
from kamaki.clients.pithos import PithosClient as pithos
44
from kamaki.clients.cyclades import CycladesClient as cyclades
45
from kamaki.clients.image import ImageClient as image
46
from kamaki.clients.astakos import AstakosClient as astakos
47

    
48
TEST_ALL = False
49

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

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

    
75
        def tearDown(self):
76
                pass
77

    
78
        def assert_dicts_are_deeply_equal(self, d1, d2):
79
                for k,v in d1.items():
80
                        self.assertTrue(d2.has_key(k))
81
                        if isinstance(v, dict):
82
                                self.assert_dicts_are_deeply_equal(v, d2[k])
83
                        else:
84
                                self.assertEqual(unicode(v), unicode(d2[k]))        
85

    
86
        def test_list_public(self):
87
                """Test list_public"""
88
                r = self.client.list_public()
89
                r0 = self.client.list_public(order='-')
90
                self.assertTrue(len(r)>0)
91
                for img in r:
92
                        for term in ('status',
93
                                'name', 
94
                                'container_format', 
95
                                'disk_format', 
96
                                'id', 
97
                                'size'):
98
                                self.assertTrue(img.has_key(term))
99
                self.assertTrue(len(r), len(r0))
100
                r0.reverse()
101
                for i, img in enumerate(r):
102
                        self.assert_dicts_are_deeply_equal(img, r0[i])
103
                r1 = self.client.list_public(detail=True)
104
                for img in r1:
105
                        for term in ('status',
106
                                'name',
107
                                'checksum',
108
                                'created_at',
109
                                'disk_format',
110
                                'updated_at',
111
                                'id',
112
                                'location',
113
                                'container_format',
114
                                'owner',
115
                                'is_public',
116
                                'deleted_at',
117
                                'properties',
118
                                'size'):
119
                                self.assertTrue(img.has_key(term))
120
                                for interm in ('kernel',
121
                                        'osfamily',
122
                                        'users',
123
                                        'gui',
124
                                        'sortorder',
125
                                        'os',
126
                                        'root_partition',
127
                                        'description'):
128
                                        self.assertTrue(img['properties'].has_key(interm))
129
                size_max = 1000000000
130
                r2 = self.client.list_public(filters=dict(size_max=size_max))
131
                self.assertTrue(len(r2) <= len(r))
132
                for img in r2:
133
                        self.assertTrue(int(img['size'])<=size_max)
134

    
135
        def test_get_meta(self):
136
                """Test get_meta"""
137
                pass
138

    
139
class testCyclades(unittest.TestCase):
140
        """Set up a Cyclades thorough test"""
141
        def setUp(self):
142
                """okeanos"""
143
                url='https://cyclades.okeanos.grnet.gr/api/v1.1'
144
                token='MI6PT0yrXJ9Ji/x8l9Wmig=='
145
                token='Kn+G9dfmlPLR2WFnhfBOow=='
146
                #account='saxtouri@gmail.com'
147
                account='saxtouri@grnet.gr'
148
                self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
149
                self.img_details= {
150
                        u'status': u'ACTIVE',
151
                        u'updated': u'2012-10-16T09:04:17+00:00',
152
                        u'name': u'Debian Base',
153
                        u'created': u'2012-10-16T09:03:12+00:00',
154
                        u'progress': 100,
155
                        u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
156
                        u'metadata': {
157
                                u'values': {
158
                                        u'kernel': u'2.6.32',
159
                                        u'osfamily': u'linux', 
160
                                        u'users': u'root', 
161
                                        u'gui': u'No GUI', 
162
                                        u'sortorder': u'1', 
163
                                        u'os': u'debian', 
164
                                        u'root_partition': u'1', 
165
                                        u'description': u'Debian 6.0.6 (Squeeze) Base System',
166
                                        u'partition_table': u'msdos'}
167
                                }
168
                        }
169
                self.flavor_details =  {u'name': u'C1R1024D20',
170
                        u'ram': 1024,
171
                        u'id': 1,
172
                        u'SNF:disk_template': u'drbd',
173
                        u'disk': 20,
174
                        u'cpu': 1}
175
                self.PROFILES=('ENABLED', 'DISABLED', 'PROTECTED')
176

    
177
                """okeanos.io"""
178
                #url = 'https://cyclades.okeanos.io/api/v1.1'
179
                #token='0TpoyAXqJSPxLdDuZHiLOA=='
180
                #account='saxtouri@admin.grnet.gr'
181
                #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
182
                #self.img_details= {
183
                #        u'status': u'ACTIVE',
184
                #        u'updated': u'2012-08-21T12:57:39+00:00',
185
                #        u'name': u'Debian Base',
186
                #        u'created': u'2012-08-21T12:56:53+00:00',
187
                #        u'progress': 100,
188
                #        u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
189
                #        u'metadata': {
190
                #                u'values': {
191
                #                        u'kernel': u'2.6.32',
192
                #                        u'osfamily': u'linux', 
193
                #                        u'users': u'root', 
194
                #                        u'gui': u'No GUI', 
195
                #                        u'sortorder': u'1', 
196
                #                        u'os': u'debian', 
197
                #                        u'root_partition': 
198
                #                        u'1', u'description': 
199
                #                        u'Debian Squeeze Base System'}
200
                #                }
201
                #        }
202
                #flavorid = 1
203

    
204
                self.servers = {}
205
                self.now = time.mktime(time.gmtime())
206
                self.servname1 = 'serv'+unicode(self.now)
207
                self.servname2 = self.servname1+'_v2'
208
                self.flavorid = 1
209
                #servers have to be created at the begining...
210
                self.networks={}
211
                self.netname1 = 'net'+unicode(self.now)
212
                self.netname2 = 'net'+unicode(self.now)+'_v2'
213

    
214
                self.client = cyclades(url, token)
215
                pass
216

    
217
        def tearDown(self):
218
                """Destoy servers used in testing"""
219
                print
220
                for netid in self.networks.keys():
221
                        self._delete_network(netid)
222
                if 0 >= len(self.servers):
223
                        return
224
                there_are_servers_running = True
225
                deleted_servers = {}
226
                waitime = 0
227
                print('-> Found %s servers to delete'%len(self.servers))
228
                while there_are_servers_running:
229
                        there_are_servers_running = False
230
                        if waitime > 0:
231
                                c = ['|','/','-','\\']
232
                                suffix = ''
233
                                sys.stdout.write('\t. . . wait %s seconds: '%waitime)
234
                                for i in range(4*waitime):
235
                                        oldlen = len(suffix)
236
                                        suffix = '%ss %s'%(i/4, c[i%4])
237
                                        sys.stdout.write(oldlen*'\b'+suffix)
238
                                        sys.stdout.flush()
239
                                        time.sleep(0.25)
240
                                oldlen = len(': '+suffix)
241
                                print(oldlen*'\b'+oldlen*' ')
242
                                sys.stdout.flush()
243
                        waitime += 3
244
                        dservers = self.client.list_servers(detail=True)
245
                        for server in dservers:
246
                                if server['name'] in self.servers.keys():
247
                                        there_are_servers_running = True
248
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
249
                                        if server['status'] == 'BUILD':
250
                                                print('\twait...')
251
                                        else:
252
                                                print('\tDELETE %s'%server['name'])
253
                                                self._delete_server(server['id'])
254
                                                self.servers.pop(server['name'])
255
                                                deleted_servers[server['name']] = 0
256
                                                waitime =0 
257
                                elif server['name'] in deleted_servers.keys():
258
                                        there_are_servers_running = True
259
                                        sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
260
                                        retries = deleted_servers[server['name']]
261
                                        if retries > 10:
262
                                                print('\tretry DELETE %s'%server['name'])
263
                                                self._delete_server(server['id'])
264
                                                retries = 0
265
                                                waitime = 0
266
                                        else:
267
                                                print('\tnot deleted yet ...')
268
                                        deleted_servers[server['name']] = retries + 1
269

    
270
        def _create_server(self, servername, flavorid, imageid, personality=None):
271
                server = self.client.create_server(servername, flavorid, imageid, personality)
272
                self.servers[servername] = server
273
                return server
274

    
275
        def _delete_server(self, servid):
276
                self.client.delete_server(servid)
277

    
278
        def _create_network(self, netname, **kwargs):
279
                net = self.client.create_network(netname, **kwargs)
280
                self.networks[net['id']] = net
281
                return net
282

    
283
        def _delete_network(self, netid):
284
                sys.stdout.write('\tDelete network %s '%netid)
285
                self.client.disconnect_network_nics(netid)
286
                wait = 3
287
                while True:
288
                        try:
289
                                self.client.delete_network(netid)
290
                                print('\n\tSUCCESFULL COMMIT delete network %s'%netid)
291
                                break
292
                        except ClientError as err:
293
                                self.assertEqual(err.status, 421)
294
                                r = self.client.get_network_details(netid)
295
                                time.sleep(wait)
296
                                wait += 3
297
                                sys.stdout.write('.')
298

    
299
        def if_not_all(foo):
300
                global TEST_ALL
301
                if TEST_ALL:
302
                        return None
303
                return foo
304

    
305
        def assert_dicts_are_deeply_equal(self, d1, d2):
306
                for k,v in d1.items():
307
                        self.assertTrue(d2.has_key(k))
308
                        if isinstance(v, dict):
309
                                self.assert_dicts_are_deeply_equal(v, d2[k])
310
                        else:
311
                                self.assertEqual(unicode(v), unicode(d2[k]))
312

    
313
        def test_000(self):
314
                "Prepare a full Cyclades test scenario"
315
                global TEST_ALL
316
                TEST_ALL = True
317

    
318
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
319
                self.server2 = self._create_server(self.servname2, self.flavorid+2, self.img)
320

    
321
                print('testing')
322
                sys.stdout.write(' test create server')
323
                self._test_create_server()
324
                print('...ok')
325

    
326
                sys.stdout.write(' test list servers')
327
                self._test_list_servers()
328
                print('...ok')
329

    
330
                print('- wait for test servers to build')
331
                self._wait_for_status(self.server1['id'], 'BUILD')
332
                self._wait_for_status(self.server2['id'], 'BUILD')
333
                print('- ok')
334

    
335
                sys.stdout.write(' test get server details')
336
                self._test_get_server_details()
337
                print('...ok')
338

    
339
                sys.stdout.write(' test get image details')
340
                self._test_get_image_details()
341
                print('...ok')
342

    
343
                sys.stdout.write(' test update_server_name')
344
                self._test_update_server_name()
345
                print('...ok')
346

    
347

    
348
                sys.stdout.write(' test reboot_server')
349
                self._test_reboot_server()
350
                print('...ok')
351

    
352
                print('- wait for test servers to boot')
353
                self._wait_for_status(self.server1['id'], 'REBOOT')
354
                self._wait_for_status(self.server2['id'], 'REBOOT')
355
                print('- ok')
356

    
357
                sys.stdout.write(' test create_server_metadata')
358
                self._test_create_server_metadata()
359
                print('...ok')
360

    
361
                sys.stdout.write(' test get_server_metadata')
362
                self._test_get_server_metadata()
363
                print('...ok')
364

    
365
                sys.stdout.write(' test update_server_metadata')
366
                self._test_update_server_metadata()
367
                print('...ok')
368

    
369
                sys.stdout.write(' test delete_server_metadata')
370
                self._test_delete_server_metadata()
371
                print('...ok')
372

    
373
                sys.stdout.write(' test list_flavors')
374
                self._test_list_flavors()
375
                print('...ok')
376

    
377
                sys.stdout.write(' test get_flavor_details')
378
                self._test_get_flavor_details()
379
                print('...ok')
380

    
381
                sys.stdout.write(' test list_images')
382
                self._test_list_images()
383
                print('...ok')
384

    
385
                sys.stdout.write(' test get_image_details')
386
                self._test_get_image_details()
387
                print('...ok')
388

    
389
                sys.stdout.write(' test get_image_metadata')
390
                self._test_get_image_metadata()
391
                print('...ok')
392

    
393
                sys.stdout.write(' test shutdown_server')
394
                self._test_shutdown_server()
395
                print('...ok')
396

    
397
                sys.stdout.write(' test start_server')
398
                self._test_start_server()
399
                print('...ok')
400

    
401
                sys.stdout.write(' test get_server_console')
402
                self._test_get_server_console()        
403
                print('...ok')
404

    
405
                sys.stdout.write(' test get_firewall_profile')
406
                self._test_get_firewall_profile()        
407
                print('...ok')
408

    
409
                sys.stdout.write(' test set_firewall_profile')
410
                self._test_set_firewall_profile()        
411
                print('...ok')
412

    
413
                sys.stdout.write(' test get_server_stats')
414
                self._test_get_server_stats()        
415
                print('...ok')
416

    
417
                self.network1 = self._create_network(self.netname1)
418

    
419
                sys.stdout.write(' test create_network')
420
                self._test_create_network()        
421
                print('...ok')
422

    
423
                print('- wait for netowork to be activated')
424
                self._wait_for_network(self.network1['id'], 'ACTIVE')
425
                print('- ok')
426

    
427
                sys.stdout.write(' test connect_server')
428
                self._test_connect_server()        
429
                print('...ok')
430

    
431
                sys.stdout.write(' test disconnect_server')
432
                self._test_disconnect_server()        
433
                print('...ok')
434

    
435
                self.network2 = self._create_network(self.netname2)
436
                print('- wait for netowork to be activated')
437
                self._wait_for_network(self.network2['id'], 'ACTIVE')
438
                print('- ok')
439

    
440
                sys.stdout.write(' test list_server_nics')
441
                self._test_list_server_nics()        
442
                print('...ok')
443

    
444
                sys.stdout.write(' test list_networks')
445
                self._test_list_networks()        
446
                print('...ok')
447

    
448
                sys.stdout.write(' test get_network_details')
449
                self._test_get_network_details()        
450
                print('...ok')
451

    
452
                sys.stdout.write(' test update_network_name')
453
                self._test_update_network_name()        
454
                print('...ok')
455

    
456
                """Don't have auth for these:
457
                sys.stdout.write(' test delete_image')
458
                self._test_delete_image()
459
                print('...ok')
460
                sys.stdout.write(' test create_image_metadata')
461
                self._test_create_image_metadata()
462
                print('...ok')
463
                sys.stdout.write(' test update_image_metadata')
464
                self._test_update_image_metadata()
465
                print('...ok')
466
                sys.stdout.write(' test delete_image_metadata')
467
                self._test_delete_image_metadata()
468
                print('...ok')
469
                """
470

    
471
        def _wait_for_network(self, netid, status):
472
                wait = 3
473
                limit = 50
474
                c=['|','/','-','\\']
475
                sys.stdout.write('\t- make net %s %s  '%(netid, status))
476
                while wait < limit:
477
                        r = self.client.get_network_details(netid)
478
                        if r['status'] == status:
479
                                print('\tOK')
480
                                return True
481
                        sys.stdout.write('\tit is now %s, wait %ss  '%(r['status'], wait))
482
                        for i in range(wait*4):
483
                                sys.stdout.write('\b%s'%c[i%4])
484
                                sys.stdout.flush()
485
                                time.sleep(0.25)
486
                        print('\b ')
487
                        wait += 3
488
                return False
489

    
490
        def _wait_for_nic(self, netid, servid, in_creation=True):
491
                self._wait_for_network(netid, 'ACTIVE')
492
                c=['|','/','-','\\']
493
                limit = 50
494
                wait=3
495
                largetry = 0
496
                while wait < limit:
497
                        nics = self.client.list_server_nics(servid)
498
                        for net in nics:
499
                                found_nic = net['network_id'] == netid
500
                                if (in_creation and found_nic) or not (in_creation or found_nic):
501
                                        return True
502
                        dis = '' if in_creation else 'dis'
503
                        sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
504
                        for i in range(wait*4):
505
                                sys.stdout.write('\b%s'%c[i%4])
506
                                sys.stdout.flush()
507
                                time.sleep(0.25)
508
                        print('\b ')
509
                        wait += 3
510
                        if wait >= limit and largetry < 3:
511
                                wait = 3
512
                                largetry += 1
513
                return False
514

    
515
        def _has_status(self, servid, status):
516
                r = self.client.get_server_details(servid)
517
                return r['status'] == status
518
        def _wait_for_status(self, servid, status):
519
                wait = 0
520
                c=['|','/','-','\\']
521
                while self._has_status(servid, status):
522
                        if wait:
523
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
524
                                for i in range(4*wait):
525
                                        sys.stdout.write('\b%s'%c[i%4])
526
                                        sys.stdout.flush()
527
                                        time.sleep(0.25)
528
                                print('\b ')
529
                        wait = (wait + 3) if wait<60 else 0
530

    
531
        @if_not_all
532
        def test_list_servers(self):
533
                """Test list servers"""
534
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
535
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
536
                self._test_list_servers()
537

    
538
        def _test_list_servers(self):
539
                servers = self.client.list_servers()
540
                dservers = self.client.list_servers(detail=True)
541

    
542
                """detailed and simple are same size"""
543
                self.assertEqual(len(dservers), len(servers))
544
                for i in range(len(servers)):
545
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
546
                                'status', 'updated']:
547
                                self.assertFalse(servers[i].has_key(field))
548
                                self.assertTrue(dservers[i].has_key(field))
549

    
550
                """detailed and simple contain same names"""
551
                names = sorted(map(lambda x: x["name"], servers))
552
                dnames = sorted(map(lambda x: x["name"], dservers))
553
                self.assertEqual(names, dnames)
554

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

    
562
        def _test_create_server(self):
563
                self.assertEqual(self.server1["name"], self.servname1)
564
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
565
                self.assertEqual(self.server1["imageRef"], self.img)
566
                self.assertEqual(self.server1["status"], "BUILD")
567

    
568
        @if_not_all
569
        def test_get_server_details(self):
570
                """Test get_server_details"""
571
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
572
                self._wait_for_status(self.server1['id'], 'BUILD')
573
                self._test_get_server_details()
574

    
575
        def _test_get_server_details(self):
576
                r = self.client.get_server_details(self.server1['id'])
577
                self.assertEqual(r["name"], self.servname1)
578
                self.assertEqual(r["flavorRef"], self.flavorid)
579
                self.assertEqual(r["imageRef"], self.img)
580
                self.assertEqual(r["status"], "ACTIVE")
581

    
582
        @if_not_all
583
        def test_get_image_details(self):
584
                """Test get_image_details"""
585
                self._test_get_image_details()
586

    
587
        def _test_get_image_details(self):
588
                r = self.client.get_image_details(self.img)
589
                d = self.img_details
590
                self.assert_dicts_are_deeply_equal(r, d)
591

    
592
        @if_not_all
593
        def test_update_server_name(self):
594
                """Test update_server_name"""
595
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
596
                self._test_update_server_name()
597

    
598
        def _test_update_server_name(self):
599
                new_name = self.servname1+'_new_name'
600
                self.client.update_server_name(self.server1['id'], new_name)
601
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
602
                self.assertEqual(r['name'], new_name)
603
                changed = self.servers.pop(self.servname1)
604
                changed['name'] = new_name
605
                self.servers[new_name] = changed
606

    
607
        @if_not_all
608
        def test_reboot_server(self):
609
                """Test reboot server"""
610
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
611
                self._wait_for_status(self.server1['id'], 'BUILD')
612
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
613
                self._wait_for_status(self.server2['id'], 'BUILD')
614
                self._test_reboot_server()
615
                self._wait_for_status(self.server1['id'], 'REBOOT')
616
                self._wait_for_status(self.server2['id'], 'REBOOT')
617

    
618
        def _test_reboot_server(self):
619
                self.client.reboot_server(self.server1['id'])
620
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
621
                self.client.reboot_server(self.server2['id'], hard=True)
622
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
623

    
624
        @if_not_all
625
        def test_get_server_metadata(self):
626
                """Test get server_metadata"""
627
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
628
                self._test_get_server_metadata()
629
        def _test_get_server_metadata(self):
630
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
631
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
632
                self.assertEqual(r['mymeta_0'], 'val_0')
633

    
634
        @if_not_all
635
        def test_create_server_metadata(self):
636
                """Test create_server_metadata"""
637
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
638
                self._test_create_server_metadata()
639

    
640
        def _test_create_server_metadata(self):
641
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
642
                self.assertTrue(r1.has_key('mymeta'))
643
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
644
                self.assert_dicts_are_deeply_equal(r1, r2)
645

    
646
        @if_not_all
647
        def test_update_server_metadata(self):
648
                """Test update_server_metadata"""
649
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
650
                self._test_update_server_metadata()
651

    
652
        def _test_update_server_metadata(self):
653
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
654
                self.assertTrue(r1.has_key('mymeta3'))
655
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
656
                self.assertTrue(r2['mymeta3'], 'val3')
657

    
658
        @if_not_all
659
        def test_delete_server_metadata(self):
660
                """Test delete_server_metadata"""
661
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
662
                self._test_delete_server_metadata()
663

    
664
        def _test_delete_server_metadata(self):
665
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
666
                self.assertTrue(r1.has_key('mymeta'))
667
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
668
                try:
669
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
670
                        raise ClientError('Wrong Error', status=100)
671
                except ClientError as err:
672
                        self.assertEqual(err.status, 404)
673

    
674
        @if_not_all
675
        def test_list_flavors(self):
676
                """Test flavors_get"""
677
                self._test_list_flavors()
678

    
679
        def _test_list_flavors(self):
680
                r = self.client.list_flavors()
681
                self.assertTrue(len(r) > 1)
682
                r = self.client.list_flavors(detail=True)
683
                self.assertTrue(r[0].has_key('SNF:disk_template'))
684

    
685
        @if_not_all
686
        def test_get_flavor_details(self):
687
                """Test test_get_flavor_details"""
688
                self._test_get_flavor_details()
689

    
690
        def _test_get_flavor_details(self):
691
                r = self.client.get_flavor_details(self.flavorid)
692
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
693

    
694
        @if_not_all
695
        def test_list_images(self):
696
                """Test list_images"""
697
                self._test_list_images()
698

    
699
        def _test_list_images(self):
700
                r = self.client.list_images()
701
                self.assertTrue(len(r) > 1)
702
                r = self.client.list_images(detail=True)
703
                for detailed_img in r:
704
                        if detailed_img['id'] == self.img:
705
                                break
706
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
707

    
708
        @if_not_all
709
        def test_image_details(self):
710
                """Test image_details"""
711
                self._test_get_image_details
712

    
713
        def _test_get_image_details(self):
714
                r = self.client.get_image_details(self.img)
715
                self.assert_dicts_are_deeply_equal(r, self.img_details)
716

    
717
        @if_not_all
718
        def test_get_image_metadata(self):
719
                """Test get_image_metadata"""
720
                self._test_get_image_metadata()
721

    
722
        def _test_get_image_metadata(self):
723
                r = self.client.get_image_metadata(self.img)
724
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
725
                for key,val in self.img_details['metadata']['values'].items():
726
                        r = self.client.get_image_metadata(self.img, key)
727
                        self.assertEqual(r[key], val)
728

    
729
        @if_not_all
730
        def test_start_server(self):
731
                """Test start_server"""
732
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
733
                self._wait_for_status(self.server1['id'], 'BUILD')
734
                self.client.shutdown_server(self.server1['id'])
735
                self._wait_for_status(self.server1['id'], 'ACTIVE')
736
                self._test_start_server()
737

    
738
        def _test_start_server(self):
739
                self.client.start_server(self.server1['id'])
740
                self._wait_for_status(self.server1['id'], 'STOPPED')
741
                r = self.client.get_server_details(self.server1['id'])
742
                self.assertEqual(r['status'], 'ACTIVE')
743

    
744
        @if_not_all
745
        def test_shutdown_server(self):
746
                """Test shutdown_server"""
747
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
748
                self._wait_for_status(self.server1['id'], 'BUILD')
749
                self._test_shutdown_server()
750

    
751
        def _test_shutdown_server(self):
752
                self.client.shutdown_server(self.server1['id'])
753
                self._wait_for_status(self.server1['id'], 'ACTIVE')
754
                r = self.client.get_server_details(self.server1['id'])
755
                self.assertEqual(r['status'], 'STOPPED')
756

    
757
        @if_not_all
758
        def test_get_server_console(self):
759
                """Test get_server_console"""
760
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
761
                self._test_get_server_console()
762

    
763
        def _test_get_server_console(self):
764
                self._wait_for_status(self.server2['id'], 'BUILD')
765
                r = self.client.get_server_console(self.server2['id'])
766
                self.assertTrue(r.has_key('host'))
767
                self.assertTrue(r.has_key('password'))
768
                self.assertTrue(r.has_key('port'))
769
                self.assertTrue(r.has_key('type'))
770

    
771
        @if_not_all
772
        def test_get_firewall_profile(self):
773
                """Test get_firewall_profile"""
774
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
775
                self._test_get_firewall_profile()
776

    
777
        def _test_get_firewall_profile(self):
778
                self._wait_for_status(self.server1['id'], 'BUILD')
779
                fprofile = self.client.get_firewall_profile(self.server1['id'])
780
                self.assertTrue(fprofile in self.PROFILES)
781

    
782
        @if_not_all
783
        def test_set_firewall_profile(self):
784
                """Test set_firewall_profile"""
785
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
786
                self._test_set_firewall_profile()
787

    
788
        def _test_set_firewall_profile(self):
789

    
790
                self._wait_for_status(self.server1['id'], 'BUILD')
791
                PROFILES=['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
792
                fprofile = self.client.get_firewall_profile(self.server1['id'])
793
                print('')
794
                for counter, fprofile in enumerate(PROFILES):
795
                        start=fprofile
796
                        npos = counter + 1
797
                        nprofile = PROFILES[npos] if npos<len(PROFILES) else PROFILES[0]
798
                        print('\tprofile swap %s: %s -> %s'%(npos, fprofile, nprofile))
799
                        self.client.set_firewall_profile(self.server1['id'], nprofile)
800
                        wait = 3
801
                        c=['|','/','-','\\']
802
                        while fprofile != nprofile:
803
                                if wait%10 == 0:
804
                                        self.client.set_firewall_profile(self.server1['id'], nprofile)
805
                                self.assertEqual(fprofile, start)
806
                                sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
807
                                for i in range(4*wait):
808
                                        sys.stdout.write('\b%s'%c[i%4])
809
                                        sys.stdout.flush()
810
                                        time.sleep(0.25)
811
                                wait += 3
812
                                print('\b ')
813
                                fprofile = self.client.get_firewall_profile(self.server1['id'])
814

    
815
        @if_not_all
816
        def test_get_server_stats(self):
817
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
818
                self._test_get_server_stats()
819

    
820
        def _test_get_server_stats(self):
821
                r = self.client.get_server_stats(self.server1['id'])
822
                for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
823
                        self.assertTrue(r.has_key(term))
824

    
825
        @if_not_all
826
        def test_list_networks(self):
827
                """Test list_network"""
828
                self.network1 = self._create_network(self.netname1)
829
                self._wait_for_network(self.network1['id'], 'ACTIVE')
830
                self._test_list_networks()
831

    
832
        def _test_list_networks(self):
833
                r = self.client.list_networks()
834
                self.assertTrue(len(r)>1)
835
                ids = [net['id'] for net in r]
836
                names = [net['name'] for net in r]
837
                self.assertTrue('1' in ids)
838
                self.assertTrue('public' in names)
839
                self.assertTrue(self.network1['id'] in ids)
840
                self.assertTrue(self.network1['name'] in names)
841

    
842
                r = self.client.list_networks(detail=True)
843
                ids = [net['id'] for net in r]
844
                names = [net['name'] for net in r]
845
                for net in r:
846
                        self.assertTrue(net['id'] in ids)
847
                        self.assertTrue(net['name'] in names)
848
                        for term in ('status', 'updated', 'created'):
849
                                self.assertTrue(term in net.keys())
850

    
851
        @if_not_all
852
        def test_create_network(self):
853
                """Test create_network"""
854
                self.network1 = self._create_network(self.netname1)
855
                self._test_create_network()
856

    
857
        def _test_create_network(self):
858
                nets = self.client.list_networks(self.network1['id'])
859
                chosen = [net for net in nets if net['id'] == self.network1['id']][0]
860
                chosen.pop('updated')
861
                net1 = dict(self.network1)
862
                net1.pop('updated')
863
                self.assert_dicts_are_deeply_equal(chosen, net1)
864

    
865
        @if_not_all
866
        def test_connect_server(self):
867
                """Test connect_server"""
868
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
869
                self.network1 = self._create_network(self.netname1)
870
                self._wait_for_status(self.server1['id'], 'BUILD')
871
                self._wait_for_network(self.network1['id'], 'ACTIVE')
872
                self._test_connect_server()
873

    
874
        def _test_connect_server(self):
875
                self.client.connect_server(self.server1['id'], self.network1['id'])
876
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
877

    
878
        @if_not_all
879
        def test_disconnect_server(self):
880
                """Test disconnect_server"""
881
                self.test_connect_server()
882
                self._test_disconnect_server()
883

    
884
        def _test_disconnect_server(self):
885
                self.client.disconnect_server(self.server1['id'], self.network1['id'])
886
                self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
887
                        in_creation=False))
888

    
889

    
890
        @if_not_all
891
        def test_list_server_nics(self):
892
                """Test list_server_nics"""
893
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
894
                self.network2 = self._create_network(self.netname2)
895
                self._wait_for_status(self.server1['id'], 'BUILD')
896
                self._wait_for_network(self.network2['id'], 'ACTIVE')
897
                self._test_list_server_nics()
898

    
899
        def _test_list_server_nics(self):
900
                r = self.client.list_server_nics(self.server1['id'])
901
                len0 = len(r)
902
                self.assertTrue(len0>0)
903
                self.assertTrue('1' in [net['network_id'] for net in r])
904

    
905
                self.client.connect_server(self.server1['id'], self.network2['id'])
906
                self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
907
                r = self.client.list_server_nics(self.server1['id'])
908
                self.assertTrue(len(r)>len0)
909

    
910
        @if_not_all
911
        def test_get_network_details(self):
912
                """Test get_network_details"""
913
                self.network1 = self._create_network(self.netname1)
914
                self._test_get_network_details()
915

    
916
        def _test_get_network_details(self):
917
                r = self.client.get_network_details(self.network1['id'])
918
                net1 = dict(self.network1)
919
                net1.pop('status')
920
                net1.pop('updated', None)
921
                net1.pop('attachments')
922
                r.pop('status')
923
                r.pop('updated', None)
924
                r.pop('attachments')
925
                self.assert_dicts_are_deeply_equal(net1, r)
926

    
927
        @if_not_all
928
        def test_update_network_name(self):
929
                self.network2 = self._create_network(self.netname2)
930
                self._test_update_network_name()
931

    
932
        def _test_update_network_name(self):
933
                updated_name = self.netname2+'_upd'
934
                self.client.update_network_name(self.network2['id'], updated_name)
935
                wait = 3
936
                c=['|','/','-','\\']
937
                r = self.client.get_network_details(self.network2['id'])
938
                while wait < 50:
939
                        if r['name'] == updated_name:
940
                                break
941
                        sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
942
                                self.network2['name'], updated_name, wait))
943
                        for i in range(4*wait):
944
                                sys.stdout.write('\b%s'%c[i%4])
945
                                sys.stdout.flush()
946
                                time.sleep(0.25)
947
                        print('')
948
                        wait += 3
949
                        r = self.client.get_network_details(self.network2['id'])
950
                self.assertEqual(r['name'], updated_name)
951

    
952
        """ Don't have auth to test this
953
        @if_not_all
954
        def test_delete_image(self):
955
                ""Test delete_image""
956
                self._test_delete_image()
957
        def _test_delete_image(self):
958
                images = self.client.list_images()
959
                self.client.delete_image(images[2]['id'])
960
                try:
961
                        r = self.client.get_image_details(images[2]['id'], success=(400))
962
                except ClientError as err:
963
                        self.assertEqual(err.status, 404)
964

965
        @if_not_all
966
        def test_create_image_metadata(self):
967
                ""Test create_image_metadata""
968
                self._test_create_image_metadata()
969
        def _test_create_image_metadata(self):
970
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
971
                self.assertEqual(r['mykey'], 'myval')
972

973
        @if_not_all
974
        def test_update_image_metadata(self):
975
                ""Test update_image_metadata""
976
                self._test_update_image_metadata()
977
        def _test_update_image_metadata(self):
978
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
979
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
980
                self.assertEqual(r['mykey0'], 'myval0')
981

982
        @if_not_all
983
        def test_delete_image_metadata(self):
984
                ""Test delete_image_metadata""
985
                self._test_delete_image_metadata()
986
        def _test_delete_image_metadata(self):
987
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
988
                self.client.delete_image_metadata(self.img, 'mykey1')
989
                r = self.client.get_image_metadata(self.img)
990
                self.assertNotEqual(r.has_key('mykey1'))
991
        """
992

    
993
class testPithos(unittest.TestCase):
994
        """Set up a Pithos+ thorough test"""
995
        def setUp(self):
996
                """
997
                url = 'http://127.0.0.1:8000/v1'
998
                token = 'C/yBXmz3XjTFBnujc2biAg=='
999
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
1000
                account = 'admin@adminland.com'
1001
                """
1002

    
1003
                url='https://pithos.okeanos.grnet.gr/v1'
1004

    
1005
                token='Kn+G9dfmlPLR2WFnhfBOow=='
1006
                account='saxtouri@grnet.gr'
1007

    
1008
                """
1009
                url='https://pithos.okeanos.io/v1'
1010
                token='0TpoyAXqJSPxLdDuZHiLOA=='
1011
                account='saxtouri@admin.grnet.gr'
1012
                """
1013
                
1014
                """
1015
                def add_handler(name, level, prefix=''):
1016
                        h = logging.StreamHandler()
1017
                        fmt = logging.Formatter(prefix + '%(message)s')
1018
                        h.setFormatter(fmt)
1019
                        logger = logging.getLogger(name)
1020
                        logger.addHandler(h)
1021
                        logger.setLevel(level)
1022
                import logging
1023
                sendlog = logging.getLogger('clients.send')
1024
                recvlog = logging.getLogger('clients.recv')
1025
                add_handler('requests', logging.INFO, prefix='* ')
1026
                add_handler('clients.send', logging.INFO, prefix='> ')
1027
                add_handler('clients.recv', logging.INFO, prefix='< ')
1028
                """
1029
                
1030
                self.fname = None
1031
                container=None
1032
                self.client = pithos(url, token, account, container)
1033
                self.now = time.mktime(time.gmtime())
1034
                self.c1 = 'c1_'+unicode(self.now)
1035
                self.c2 = 'c2_'+unicode(self.now)
1036
                self.c3 = 'c3_'+unicode(self.now)
1037

    
1038

    
1039
                self.client.create_container(self.c1)
1040
                self.client.create_container(self.c2)
1041
                self.client.create_container(self.c3)
1042
                self.makeNewObject(self.c1, 'test')
1043
                self.makeNewObject(self.c2, 'test')
1044
                self.now_unformated = datetime.datetime.utcnow()
1045
                self.makeNewObject(self.c1, 'test1')
1046
                self.makeNewObject(self.c2, 'test1')
1047
                """Prepare an object to be shared - also its container"""
1048
                self.client.container = self.c1
1049
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
1050
                
1051
                self.makeNewObject(self.c1, 'another.test')
1052

    
1053
        def makeNewObject(self, container, obj):
1054
                self.client.container = container
1055
                r = self.client.object_put(obj, content_type='application/octet-stream',
1056
                        data= 'file '+obj+' that lives in '+container,
1057
                        metadata={'incontainer':container})
1058

    
1059
        def forceDeleteContainer(self, container):
1060
                self.client.container = container
1061
                try:
1062
                        r = self.client.list_objects()
1063
                except ClientError:
1064
                        return
1065
                for obj in r:
1066
                        name = obj['name']
1067
                        self.client.del_object(name)
1068
                r = self.client.container_delete()
1069
                self.container = ''
1070

    
1071
        def tearDown(self):
1072
                """Destroy test cases"""
1073
                if self.fname is not None:
1074
                        try:
1075
                                os.remove(self.fname)
1076
                        except OSError:
1077
                                pass
1078
                        self.fname = None
1079
                self.forceDeleteContainer(self.c1)
1080
                self.forceDeleteContainer(self.c2)
1081
                try:
1082
                        self.forceDeleteContainer(self.c3)
1083
                except ClientError:
1084
                        pass
1085
                self.client.container=''
1086

    
1087
        def test_000(self):
1088
                """Perform a full Pithos+ kamaki support test"""
1089

    
1090
        def test_account_head(self):
1091
                """Test account_HEAD"""
1092
                r = self.client.account_head()
1093
                self.assertEqual(r.status_code, 204)
1094
                
1095
                r = self.client.account_head(until='1000000000')
1096
                self.assertEqual(r.status_code, 204)
1097
           
1098
                r = self.client.get_account_info(until='1000000000') 
1099
                datestring = unicode(r['x-account-until-timestamp'])
1100
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1101

    
1102
                r = self.client.get_account_quota()
1103
                self.assertTrue(r.has_key('x-account-policy-quota'))
1104

    
1105
                r = self.client.get_account_versioning()
1106
                self.assertTrue(r.has_key('x-account-policy-versioning'))
1107

    
1108
                """Check if(un)modified_since"""
1109
                for format in self.client.DATE_FORMATS:
1110
                        now_formated = self.now_unformated.strftime(format)
1111
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
1112
                        sc1 = r1.status_code
1113
                        r1.release()
1114
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1115
                        sc2 = r2.status_code
1116
                        r2.release()
1117
                        self.assertNotEqual(sc1, sc2)
1118

    
1119
        def test_account_get(self):
1120
                """Test account_GET"""
1121
                #r = self.client.account_get()
1122
                #self.assertEqual(r.status_code, 200)
1123
                r = self.client.list_containers()
1124
                fullLen = len(r)
1125
                self.assertTrue(fullLen > 2)
1126
                
1127
                r = self.client.account_get(limit=1)
1128
                self.assertEqual(len(r.json), 1)
1129
                
1130

    
1131
                r = self.client.account_get(marker='c2_')
1132
                temp_c0 = r.json[0]['name']
1133
                temp_c2 = r.json[2]['name']
1134
                
1135
                r = self.client.account_get(limit=2, marker='c2_')
1136
                conames = [container['name'] for container in r.json \
1137
                        if container['name'].lower().startswith('c2_')]
1138
                self.assertTrue(temp_c0 in conames)
1139
                self.assertFalse(temp_c2 in conames)
1140
                
1141

    
1142
                r = self.client.account_get(show_only_shared=True)
1143
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
1144
                
1145
                r = self.client.account_get(until=1342609206)
1146
                self.assertTrue(len(r.json) <= fullLen)
1147
                
1148
                """Check if(un)modified_since"""
1149
                for format in self.client.DATE_FORMATS:
1150
                        now_formated = self.now_unformated.strftime(format)
1151
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
1152
                        sc1 = r1.status_code
1153
                        r1.release()
1154
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1155
                        sc2 = r2.status_code
1156
                        r2.release()
1157
                        self.assertNotEqual(sc1, sc2)
1158

    
1159
                """Check sharing_accounts"""
1160
                r = self.client.get_sharing_accounts()
1161
                self.assertTrue(len(r)>0)
1162

    
1163
        def test_account_post(self):
1164
                """Test account_POST"""
1165
                r = self.client.account_post()
1166
                self.assertEqual(r.status_code, 202)
1167
                grpName = 'grp'+unicode(self.now)
1168
                
1169

    
1170
                """Method set/del_account_meta and set_account_groupcall use account_post internally
1171
                """
1172
                self.client.set_account_group(grpName, ['u1', 'u2'])
1173
                r = self.client.get_account_group()
1174
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
1175
                self.client.del_account_group(grpName)
1176
                r = self.client.get_account_group()
1177
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
1178

    
1179
                mprefix = 'meta'+unicode(self.now)
1180
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
1181
                r = self.client.get_account_meta()
1182
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
1183
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
1184

    
1185
                self.client.del_account_meta(mprefix+'1')
1186
                r = self.client.get_account_meta()
1187
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
1188

    
1189
                self.client.del_account_meta(mprefix+'2')
1190
                r = self.client.get_account_meta()
1191
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
1192

    
1193
                """Missing testing for quota, versioning, because normally
1194
                you don't have permitions to modify those at account level
1195
                """
1196

    
1197
                newquota=1000000
1198
                self.client.set_account_quota(newquota)
1199
                #r = self.client.get_account_info()
1200
                #print(unicode(r))
1201
                #r = self.client.get_account_quota()
1202
                #self.assertEqual(r['x-account-policy-quota'], newquota)
1203
                self.client.set_account_versioning('auto')
1204

    
1205
        def test_container_head(self):
1206
                """Test container_HEAD"""
1207
                self.client.container = self.c1
1208

    
1209
                r = self.client.container_head()
1210
                self.assertEqual(r.status_code, 204)
1211
                
1212
                """Check until"""
1213
                r = self.client.container_head(until=1000000, success=(204, 404))
1214
                self.assertEqual(r.status_code, 404)
1215
                
1216
                """Check and if(un)modified_since"""
1217
                for format in self.client.DATE_FORMATS:
1218
                        now_formated = self.now_unformated.strftime(format)
1219
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
1220
                        sc1=r1.status_code
1221
                        r1.release()
1222
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
1223
                        sc2=r2.status_code
1224
                        r2.release()
1225
                        self.assertNotEqual(sc1, sc2)
1226

    
1227
                """Check container object meta"""
1228
                r = self.client.get_container_object_meta()
1229
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1230

    
1231
        def test_container_get(self):
1232
                """Test container_GET"""
1233
                self.client.container = self.c1
1234

    
1235
                r = self.client.container_get()
1236
                self.assertEqual(r.status_code, 200)
1237
                fullLen = len(r.json)
1238
                
1239

    
1240
                r = self.client.container_get(prefix='test')
1241
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1242
                self.assertTrue(len(r.json) > 1)
1243
                self.assertEqual(len(r.json), len(lalobjects))
1244
                
1245

    
1246
                r = self.client.container_get(limit=1)
1247
                self.assertEqual(len(r.json), 1)
1248
                
1249

    
1250
                r = self.client.container_get(marker='another')
1251
                self.assertTrue(len(r.json) > 1)
1252
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
1253
                self.assertEqual(len(r.json), len(neobjects))
1254
                
1255

    
1256
                r = self.client.container_get(prefix='another.test', delimiter='.')
1257
                self.assertTrue(fullLen > len(r.json))
1258
                
1259

    
1260
                r = self.client.container_get(path='/')
1261
                self.assertEqual(fullLen, len(r.json))
1262
                
1263

    
1264
                r = self.client.container_get(format='xml')
1265
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
1266
                
1267

    
1268
                r = self.client.container_get(meta=['incontainer'])
1269
                self.assertTrue(len(r.json) > 0)
1270
                
1271

    
1272
                r = self.client.container_get(show_only_shared=True)
1273
                self.assertTrue(len(r.json) < fullLen)
1274
                
1275

    
1276
                try:
1277
                        r = self.client.container_get(until=1000000000)
1278
                        datestring = unicode(r.headers['x-account-until-timestamp'])
1279
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1280
                        
1281
                except ClientError:
1282
                        
1283
                        pass
1284

    
1285
                """Check and if un/modified_since"""
1286
                for format in self.client.DATE_FORMATS:
1287
                        now_formated = self.now_unformated.strftime(format)
1288
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
1289
                        sc1 = r1.status_code
1290
                        r1.release()
1291
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
1292
                        sc2 = r2.status_code
1293
                        r2.release()
1294
                        self.assertNotEqual(sc1, sc2)
1295
           
1296
        def test_container_put(self):
1297
                """Test container_PUT"""
1298
                self.client.container = self.c2
1299

    
1300
                r = self.client.container_put()
1301
                self.assertEqual(r.status_code, 202)
1302
                
1303

    
1304
                r = self.client.get_container_quota(self.client.container)
1305
                cquota = r.values()[0]
1306
                newquota = 2*int(cquota)
1307

    
1308
                r = self.client.container_put(quota=newquota)
1309
                self.assertEqual(r.status_code, 202)
1310
                
1311
                r = self.client.get_container_quota(self.client.container)
1312
                xquota = int(r.values()[0])
1313
                self.assertEqual(newquota, xquota)
1314

    
1315
                r = self.client.container_put(versioning='auto')
1316
                self.assertEqual(r.status_code, 202)
1317
                
1318
                r = self.client.get_container_versioning(self.client.container)
1319
                nvers = r.values()[0]
1320
                self.assertEqual('auto', nvers)
1321

    
1322
                r = self.client.container_put(versioning='none')
1323
                self.assertEqual(r.status_code, 202)
1324
                
1325
                r = self.client.get_container_versioning(self.client.container)
1326
                nvers = r.values()[0]
1327
                self.assertEqual('none', nvers)
1328

    
1329
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
1330
                self.assertEqual(r.status_code, 202)
1331
                
1332
                r = self.client.get_container_meta(self.client.container)
1333
                self.assertTrue(r.has_key('x-container-meta-m1'))
1334
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1335
                self.assertTrue(r.has_key('x-container-meta-m2'))
1336
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1337

    
1338
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
1339
                self.assertEqual(r.status_code, 202)
1340
                
1341
                r = self.client.get_container_meta(self.client.container)
1342
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1343
                self.assertTrue(r.has_key('x-container-meta-m2'))
1344
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1345
           
1346
                self.client.del_container_meta(self.client.container)
1347

    
1348
        def test_container_post(self):
1349
                """Test container_POST"""
1350
                self.client.container = self.c2
1351

    
1352
                """Simple post"""
1353
                r = self.client.container_post()
1354
                self.assertEqual(r.status_code, 202)
1355
                
1356

    
1357
                """post meta"""
1358
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
1359
                r = self.client.get_container_meta(self.client.container)
1360
                self.assertTrue(r.has_key('x-container-meta-m1'))
1361
                self.assertEqual(r['x-container-meta-m1'], 'v1')
1362
                self.assertTrue(r.has_key('x-container-meta-m2'))
1363
                self.assertEqual(r['x-container-meta-m2'], 'v2')
1364

    
1365
                """post/2del meta"""
1366
                r = self.client.del_container_meta('m1')
1367
                r = self.client.set_container_meta({'m2':'v2a'})
1368
                r = self.client.get_container_meta(self.client.container)
1369
                self.assertTrue(not r.has_key('x-container-meta-m1'))
1370
                self.assertTrue(r.has_key('x-container-meta-m2'))
1371
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
1372

    
1373
                """check quota"""
1374
                r = self.client.get_container_quota(self.client.container)
1375
                cquota = r.values()[0]
1376
                newquota = 2*int(cquota)
1377
                r = self.client.set_container_quota(newquota)
1378
                r = self.client.get_container_quota(self.client.container)
1379
                xquota = int(r.values()[0])
1380
                self.assertEqual(newquota, xquota)
1381
                r = self.client.set_container_quota(cquota)
1382
                r = self.client.get_container_quota(self.client.container)
1383
                xquota = r.values()[0]
1384
                self.assertEqual(cquota, xquota)
1385

    
1386
                """Check versioning"""
1387
                self.client.set_container_versioning('auto')
1388
                r = self.client.get_container_versioning(self.client.container)
1389
                nvers = r.values()[0]
1390
                self.assertEqual('auto', nvers)
1391
                self.client.set_container_versioning('none')
1392
                r = self.client.get_container_versioning(self.client.container)
1393
                nvers = r.values()[0]
1394
                self.assertEqual('none', nvers)
1395

    
1396
                """put_block uses content_type and content_length to
1397
                post blocks of data 2 container. All that in upload_object"""
1398
                """Change a file at fs"""
1399
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
1400
                """Upload it at a directory in container"""
1401
                self.client.create_directory('dir')
1402
                newf = open(self.fname, 'r')
1403
                self.client.upload_object('/dir/sample.file', newf)
1404
                newf.close()
1405
                """Check if file has been uploaded"""
1406
                r = self.client.get_object_info('/dir/sample.file')
1407
                self.assertTrue(int(r['content-length']) > 100000000)
1408

    
1409
                """WTF is tranfer_encoding? What should I check about th** s**t? """
1410
                #TODO
1411

    
1412
                """Check update=False"""
1413
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1414
                
1415
                r = self.client.get_object_info('test')
1416
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1417
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1418

    
1419
                r = self.client.del_container_meta('m2')
1420

    
1421
        def test_container_delete(self):
1422
                """Test container_DELETE"""
1423

    
1424
                """Fail to delete a non-empty container"""
1425
                self.client.container = self.c2
1426
                r = self.client.container_delete(success=409)
1427
                self.assertEqual(r.status_code, 409)
1428
                
1429

    
1430
                """Fail to delete c3 (empty) container"""
1431
                self.client.container = self.c3
1432
                r = self.client.container_delete(until='1000000000')
1433
                self.assertEqual(r.status_code, 204)
1434
                
1435

    
1436
                """Delete c3 (empty) container"""
1437
                r = self.client.container_delete()
1438
                self.assertEqual(r.status_code, 204)
1439

    
1440
                """Purge container(empty a container), check versionlist"""
1441
                self.client.container = self.c1
1442
                r = self.client.object_head('test', success=(200, 404))
1443
                self.assertEqual(r.status_code, 200)
1444
                self.client.del_container(delimiter='/')
1445
                r = self.client.object_head('test', success=(200, 404))
1446
                self.assertEqual(r.status_code, 404)
1447
                r = self.client.get_object_versionlist('test')
1448
                self.assertTrue(len(r) > 0)
1449
                self.assertTrue(len(r[0])>1)
1450
                self.client.purge_container()
1451
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1452

    
1453
        def test_object_head(self):
1454
                """Test object_HEAD"""
1455
                self.client.container = self.c2
1456
                obj = 'test'
1457

    
1458
                r = self.client.object_head(obj)
1459
                self.assertEqual(r.status_code, 200)
1460
                etag = r.headers['etag']
1461
                
1462

    
1463
                r = self.client.object_head(obj, version=40)
1464
                self.assertEqual(r.headers['x-object-version'], '40')
1465
                
1466

    
1467
                r = self.client.object_head(obj, if_etag_match=etag)
1468
                self.assertEqual(r.status_code, 200)
1469
                
1470
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1471
                self.assertNotEqual(r.status_code, 200)
1472
                
1473

    
1474
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1475
                self.assertEqual(r.status_code, 412)
1476
                
1477

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

    
1491
        def test_object_get(self):
1492
                """Test object_GET"""
1493
                self.client.container = self.c1
1494
                obj = 'test'
1495

    
1496
                r = self.client.object_get(obj)
1497
                self.assertEqual(r.status_code, 200)
1498

    
1499
                osize = int(r.headers['content-length'])
1500
                etag = r.headers['etag']
1501
                
1502

    
1503
                r = self.client.object_get(obj, hashmap=True)
1504
                self.assertTrue(r.json.has_key('hashes') \
1505
                        and r.json.has_key('block_hash') \
1506
                        and r.json.has_key('block_size') \
1507
                        and r.json.has_key('bytes'))
1508
                
1509

    
1510
                r = self.client.object_get(obj, format='xml', hashmap=True)
1511
                self.assertEqual(len(r.text.split('hash>')), 3)
1512
                
1513

    
1514
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1515
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1516
                partsize = int(r.headers['content-length'])
1517
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1518
                
1519

    
1520
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1521
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1522
                partsize = int(r.headers['content-length'])
1523
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1524
                
1525

    
1526
                r = self.client.object_get(obj, if_etag_match=etag)
1527
                self.assertEqual(r.status_code, 200)
1528
                
1529

    
1530
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1531
                self.assertEqual(r.status_code, 200)
1532
                
1533

    
1534
                """Check and if(un)modified_since"""
1535
                for format in self.client.DATE_FORMATS:
1536
                        now_formated = self.now_unformated.strftime(format)
1537
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1538
                                success=(200, 304, 412))
1539
                        sc1 = r1.status_code
1540
                        r1.release()
1541
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1542
                        sc2 = r2.status_code
1543
                        r2.release()
1544
                        self.assertNotEqual(sc1, sc2)
1545

    
1546
        def test_object_put(self):
1547
                """Test object_PUT"""
1548

    
1549
                self.client.container = self.c2
1550
                obj='another.test'
1551

    
1552
                """create the object"""
1553
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1554
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1555
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1556
                        content_disposition='attachment; filename="fname.ext"')
1557
                self.assertEqual(r.status_code, 201)
1558
                etag = r.headers['etag']
1559
                
1560
                """Check content-disposition"""
1561
                r = self.client.get_object_info(obj)
1562
                self.assertTrue(r.has_key('content-disposition'))
1563

    
1564
                """Check permitions"""
1565
                r = self.client.get_object_sharing(obj)
1566
                self.assertTrue('accx:groupa' in r['read'])
1567
                self.assertTrue('u1' in r['read'])
1568
                self.assertTrue('u2' in r['write'])
1569
                self.assertTrue('u3' in r['write'])
1570

    
1571
                """Check metadata"""
1572
                r = self.client.get_object_meta(obj)
1573
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1574
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1575

    
1576
                """Check public and if_etag_match"""
1577
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1578
                        content_type='application/octet-stream', public=True)
1579
                
1580
                r = self.client.object_get(obj)
1581
                self.assertTrue(r.headers.has_key('x-object-public'))
1582
                vers2 = int(r.headers['x-object-version'])
1583
                etag = r.headers['etag']
1584
                self.assertEqual(r.text, 'b')
1585
                
1586
                """Check if_etag_not_match"""
1587
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1588
                        content_type='application/octet-stream', success=(201, 412))
1589
                self.assertEqual(r.status_code, 412)
1590
                
1591

    
1592
                """Check content_type and content_length"""
1593
                tmpdir = 'dir'+unicode(self.now)
1594
                r = self.client.object_put(tmpdir, content_type='application/directory',
1595
                        content_length=0)
1596
                
1597
                r = self.client.get_object_info(tmpdir)
1598
                self.assertEqual(r['content-type'], 'application/directory')
1599

    
1600
                """Check copy_from, content_encoding"""
1601
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1602
                        copy_from='/%s/%s'%(self.client.container, obj),
1603
                        content_encoding='application/octet-stream', 
1604
                        source_account=self.client.account,
1605
                        content_length=0, success=201)
1606
                self.assertEqual(r.status_code, 201)
1607

    
1608
                """Test copy_object for cross-conctainer copy"""
1609
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1610
                        dst_container=self.c1, dst_object=obj)
1611
                self.client.container = self.c1
1612
                r1 = self.client.get_object_info(obj)
1613
                self.client.container = self.c2
1614
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1615
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1616
                
1617
                """Check cross-container copy_from, content_encoding"""
1618
                self.client.container = self.c1
1619
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1620
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1621
                        content_encoding='application/octet-stream', 
1622
                        source_account=self.client.account,
1623
                        content_length=0, success=201)
1624
                
1625
                self.assertEqual(r.status_code, 201)
1626
                r = self.client.get_object_info(obj)
1627
                self.assertEqual(r['etag'], etag)
1628

    
1629
                """Check source_account"""
1630
                self.client.container = self.c2
1631
                fromstr = '/'+self.c1+'/'+obj
1632
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1633
                        content_encoding='application/octet-stream', 
1634
                        source_account='nonExistendAddress@NeverLand.com', 
1635
                        content_length=0, success=(201, 403))
1636
                self.assertEqual(r.status_code, 403)
1637
                
1638
                """Check cross-container move_from"""
1639
                self.client.container = self.c1
1640
                r1 = self.client.get_object_info(obj)
1641
                self.client.container = self.c2
1642
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1643
                dst_object=obj+'v0')
1644
                r0 = self.client.get_object_info(obj+'v0')
1645
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1646

    
1647
                """Check move_from"""
1648
                r = self.client.object_put(obj+'v1', format=None, 
1649
                        move_from='/'+self.c2+'/'+obj,
1650
                        source_version = vers2,
1651
                        content_encoding='application/octet-stream',
1652
                        content_length=0, success=201)
1653
                
1654
                """Check manifest"""
1655
                mobj = 'manifest.test'
1656
                txt = ''
1657
                for i in range(10):
1658
                        txt += '%s'%i
1659
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1660
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1661
                        
1662
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1663
                        manifest='%s/%s'%(self.client.container, mobj))
1664
                
1665
                r = self.client.object_get(mobj)
1666
                self.assertEqual(r.text, txt)
1667
           
1668
                """Upload a local file with one request"""
1669
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1670
                newf = open(self.fname, 'r')
1671
                self.client.upload_object('sample.file', newf)
1672
                newf.close()
1673
                """Check if file has been uploaded"""
1674
                r = self.client.get_object_info('sample.file')
1675
                self.assertEqual(int(r['content-length']), 10260)
1676

    
1677
                """Some problems with transfer-encoding?"""
1678

    
1679
        def test_object_copy(self):
1680
                """Test object_COPY"""
1681
                self.client.container=self.c2
1682
                obj = 'test2'
1683

    
1684
                data= '{"key1":"val1", "key2":"val2"}'
1685
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1686
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1687
                        permitions={
1688
                                'read':['accX:groupA', 'u1', 'u2'],
1689
                                'write':['u2', 'u3']},
1690
                        content_disposition='attachment; filename="fname.ext"')
1691
                
1692
                r = self.client.object_copy(obj+'orig',
1693
                        destination = '/'+self.client.container+'/'+obj,
1694
                        ignore_content_type=False, content_type='application/json', 
1695
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1696
                        permitions={'write':['u5', 'accX:groupB']})
1697
                self.assertEqual(r.status_code, 201)
1698
                
1699
                """Check content-disposition"""
1700
                r = self.client.get_object_info(obj)
1701
                self.assertTrue(r.has_key('content-disposition'))
1702

    
1703
                """Check Metadata"""
1704
                r = self.client.get_object_meta(obj)
1705
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1706
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1707
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1708

    
1709
                """Check permitions"""
1710
                r = self.client.get_object_sharing(obj)
1711
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1712
                self.assertTrue('accx:groupb' in r['write'])
1713

    
1714
                """Check destination account"""
1715
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1716
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1717
                        success=(201, 403))
1718
                self.assertEqual(r.status_code, 403)
1719
                
1720

    
1721
                """Check destination being another container
1722
                and also content_type and content encoding"""
1723
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1724
                        content_encoding='utf8', content_type='application/json')
1725
                self.assertEqual(r.status_code, 201)
1726
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1727
                
1728

    
1729
                """Check ignore_content_type and content_type"""
1730
                r = self.client.object_get(obj)
1731
                etag = r.headers['etag']
1732
                ctype = r.headers['content-type']
1733
                self.assertEqual(ctype, 'application/json')
1734
                
1735
                r = self.client.object_copy(obj+'orig',
1736
                        destination = '/'+self.client.container+'/'+obj+'0',
1737
                        ignore_content_type=True, content_type='application/json')
1738
                self.assertEqual(r.status_code, 201)
1739
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1740
                
1741

    
1742
                """Check if_etag_(not_)match"""
1743
                r = self.client.object_copy(obj,
1744
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1745
                self.assertEqual(r.status_code, 201)
1746
                
1747
                r = self.client.object_copy(obj,
1748
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1749
                self.assertEqual(r.status_code, 201)
1750
                vers2 = r.headers['x-object-version']
1751
                
1752

    
1753
                """Check source_version, public and format """
1754
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1755
                self.assertEqual(r.status_code, 201)
1756
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1757
                
1758
                r = self.client.get_object_info(obj+'3')
1759
                self.assertTrue(r.has_key('x-object-public'))
1760

    
1761
        def test_object_move(self):
1762
                """Test object_MOVE"""
1763
                self.client.container= self.c2
1764
                obj = 'test2'
1765

    
1766
                data= '{"key1":"val1", "key2":"val2"}'
1767
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1768
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1769
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1770
                
1771
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1772
                        ignore_content_type=False, content_type='application/json', 
1773
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1774
                        permitions={'write':['u5', 'accX:groupB']})
1775
                self.assertEqual(r.status_code, 201)
1776
                
1777

    
1778
                """Check Metadata"""
1779
                r = self.client.get_object_meta(obj)
1780
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1781
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1782
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1783

    
1784
                """Check permitions"""
1785
                r = self.client.get_object_sharing(obj)
1786
                self.assertFalse(r.has_key('read'))
1787
                self.assertTrue('u5' in r['write'])
1788
                self.assertTrue('accx:groupb' in r['write'])
1789

    
1790
                """Check destination account"""
1791
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1792
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1793
                        success=(201, 403))
1794
                self.assertEqual(r.status_code, 403)
1795
                
1796

    
1797
                """Check destination being another container and also
1798
                content_type, content_disposition and content encoding"""
1799
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1800
                        content_encoding='utf8', content_type='application/json',
1801
                        content_disposition='attachment; filename="fname.ext"')
1802
                self.assertEqual(r.status_code, 201)
1803
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1804
                self.client.container=self.c1
1805
                r = self.client.get_object_info(obj)
1806
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1807
                etag = r['etag']
1808
                ctype = r['content-type']
1809
                self.assertEqual(ctype, 'application/json')
1810

    
1811
                """Check ignore_content_type and content_type"""
1812
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1813
                        ignore_content_type=True, content_type='application/json')
1814
                self.assertEqual(r.status_code, 201)
1815
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1816
                
1817

    
1818
                """Check if_etag_(not_)match"""
1819
                self.client.container=self.c2
1820
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1821
                        if_etag_match=etag)
1822
                self.assertEqual(r.status_code, 201)
1823
                
1824
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1825
                        if_etag_not_match='lalala')
1826
                self.assertEqual(r.status_code, 201)
1827
                
1828

    
1829
                """Check public and format """
1830
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1831
                        format='xml', public=True)
1832
                self.assertEqual(r.status_code, 201)
1833
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1834
                
1835
                r = self.client.get_object_info(obj+'2')
1836
                self.assertTrue(r.has_key('x-object-public'))
1837

    
1838
        def test_object_post(self):
1839
                """Test object_POST"""
1840
                self.client.container=self.c2
1841
                obj = 'test2'
1842
                """create a filesystem file"""
1843
                self.fname = obj
1844
                newf = open(self.fname, 'w')
1845
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1846
                newf.close()
1847
                """create a file on container"""
1848
                r = self.client.object_put(obj, content_type='application/octet-stream',
1849
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1850
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1851
                
1852

    
1853
                """Append tests update, content_range, content_type, content_length"""
1854
                newf = open(obj, 'r')
1855
                self.client.append_object(obj, newf)
1856
                r = self.client.object_get(obj)
1857
                self.assertTrue(r.text.startswith('Hello!'))
1858
                
1859

    
1860
                """Overwrite tests update, content_type, content_length, content_range"""
1861
                newf.seek(0)
1862
                r = self.client.overwrite_object(obj, 0, 10, newf)
1863
                r = self.client.object_get(obj)
1864
                self.assertTrue(r.text.startswith('ello!'))
1865
                newf.close()
1866
                
1867
                
1868
                """Truncate tests update, content_range, content_type,
1869
                object_bytes and source_object"""
1870
                r = self.client.truncate_object(obj, 5)
1871
                r = self.client.object_get(obj)
1872
                self.assertEqual(r.text, 'ello!')
1873
                
1874

    
1875
                """Check metadata"""
1876
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1877
                r = self.client.get_object_meta(obj)
1878
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1879
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1880
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1881
                self.client.del_object_meta('mkey1', obj)
1882
                r = self.client.get_object_meta(obj)
1883
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1884

    
1885
                """Check permitions"""
1886
                self.client.set_object_sharing(obj,
1887
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1888
                r = self.client.get_object_sharing(obj)
1889
                self.assertTrue(r.has_key('read'))
1890
                self.assertTrue('u5' in r['read'])
1891
                self.assertTrue(r.has_key('write'))
1892
                self.assertTrue('u4' in r['write'])
1893
                self.client.del_object_sharing(obj)
1894
                r = self.client.get_object_sharing(obj)
1895
                self.assertTrue(len(r) == 0)
1896

    
1897
                """Check publish"""
1898
                self.client.publish_object(obj)
1899
                r = self.client.get_object_info(obj)
1900
                self.assertTrue(r.has_key('x-object-public'))
1901
                self.client.unpublish_object(obj)
1902
                r = self.client.get_object_info(obj)
1903
                self.assertFalse(r.has_key('x-object-public'))
1904

    
1905
                """Check if_etag_(not)match"""
1906
                etag = r['etag']
1907
                #r = self.client.object_post(obj, update=True, public=True,
1908
                #        if_etag_not_match=etag, success=(412,202,204))
1909
                #self.assertEqual(r.status_code, 412)
1910
                
1911
                r = self.client.object_post(obj, update=True, public=True,
1912
                        if_etag_match=etag, content_encoding='application/json')
1913
                
1914
                r = self.client.get_object_info(obj)
1915
                helloVersion = r['x-object-version']
1916
                self.assertTrue(r.has_key('x-object-public'))
1917
                self.assertEqual(r['content-encoding'], 'application/json')
1918

    
1919
                """Check source_version and source_account and content_disposition"""
1920
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1921
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1922
                        source_account='thisAccountWillNeverExist@adminland.com',
1923
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1924
                self.assertEqual(r.status_code, 403)
1925
                
1926
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1927
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1928
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1929
                        content_disposition='attachment; filename="fname.ext"')
1930
                
1931
                r = self.client.object_get(obj)
1932
                self.assertEqual(r.text, 'eello!')
1933
                self.assertTrue(r.headers.has_key('content-disposition')
1934
                        and 'fname.ext' in r.headers['content-disposition'])
1935
                
1936

    
1937
                """Check manifest"""
1938
                mobj = 'manifest.test'
1939
                txt = ''
1940
                for i in range(10):
1941
                        txt += '%s'%i
1942
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1943
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1944
                        
1945
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1946
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1947
                
1948
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1949
                
1950
                r = self.client.object_get(mobj)
1951
                self.assertEqual(r.text, txt)
1952
                
1953

    
1954
                """We need to check transfer_encoding """
1955

    
1956
        def test_object_delete(self):
1957
                """Test object_DELETE"""
1958
                self.client.container=self.c2
1959
                obj = 'test2'
1960
                """create a file on container"""
1961
                r = self.client.object_put(obj, content_type='application/octet-stream',
1962
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1963
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1964
                
1965

    
1966
                """Check with false until"""
1967
                r = self.client.object_delete(obj, until=1000000)
1968
                
1969
                r = self.client.object_get(obj, success=(200, 404))
1970
                self.assertEqual(r.status_code, 200)
1971
                
1972

    
1973
                """Check normal case"""
1974
                r = self.client.object_delete(obj)
1975
                self.assertEqual(r.status_code, 204)
1976
                
1977
                r = self.client.object_get(obj, success=(200, 404))
1978
                self.assertEqual(r.status_code, 404)
1979
                
1980

    
1981
        def create_large_file(self, size, name):
1982
                """Create a large file at fs"""
1983
                self.fname = name
1984
                import random
1985
                random.seed(self.now)
1986
                f = open(self.fname, 'w')
1987
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1988
                for hobyte_id in range(size/8):
1989
                        sss = 'hobt%s'%random.randint(1000, 9999)
1990
                        f.write(sss)
1991
                        if 0 == (hobyte_id*800)%size:
1992
                                f.write('\n')
1993
                                sys.stdout.write('\b\b')
1994
                                prs = (hobyte_id*800)//size
1995
                                if prs > 10:
1996
                                        sys.stdout.write('\b')
1997
                                sys.stdout.write('%s'%prs+'%')
1998
                                sys.stdout.flush()
1999
                print('\b\b\b100%')
2000
                f.close()
2001
                """"""
2002

    
2003
def init_parser():
2004
        parser = ArgumentParser(add_help=False)
2005
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
2006
                help="Show this help message and exit")
2007
        return parser
2008

    
2009
if __name__ == '__main__':
2010
        parser = init_parser()
2011
        args, argv = parser.parse_known_args()
2012

    
2013
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
2014
                raise Exception('\tusage: tests.py <group> [command]')
2015
        suiteFew = unittest.TestSuite()
2016

    
2017
        if len(argv) == 0 or argv[0] == 'pithos':
2018
                if len(argv) == 1:
2019
                        suiteFew.addTest(unittest.makeSuite(testPithos))
2020
                else:
2021
                        suiteFew.addTest(testPithos('test_'+argv[1]))
2022
        if len(argv) == 0 or argv[0] == 'cyclades':
2023
                if len(argv) == 1:
2024
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
2025
                        suiteFew.addTest(testCyclades('test_000'))
2026
                else:
2027
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
2028
        if len(argv) == 0 or argv[0] == 'image':
2029
                if len(argv) == 1:
2030
                        suiteFew.addTest(unittest.makeSuite(testImage))
2031
                else:
2032
                        suiteFew.addTest(testImage('test'+argv[1]))
2033
        if len(argv) == 0 or argv[0] == 'astakos':
2034
                if len(argv) == 1:
2035
                        suiteFew.addTest(unittest.makeSuite(testAstakos))
2036
                else:
2037
                        suiteFew.addTest(testAstakos('test'+argv[1]))
2038

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