Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 71286858

History | View | Annotate | Download (53.1 kB)

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

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

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

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

    
47
TEST_ALL = False
48

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

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

    
113
                self.servers = {}
114
                self.now = time.mktime(time.gmtime())
115
                self.servname1 = 'serv'+unicode(self.now)
116
                self.servname2 = self.servname1+'_v2'
117
                self.flavorid = 1
118
                #servers have to be created at the begining...
119

    
120
                self.client = cyclades(url, token)
121
                pass
122

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

    
174
        def _create_server(self, servername, flavorid, imageid, personality=None):
175
                server = self.client.create_server(servername, flavorid, imageid, personality)
176
                self.servers[servername] = server
177
                return server
178

    
179
        def _delete_server(self, servid):
180
                self.client.delete_server(servid)
181

    
182
        def if_not_all(foo):
183
                global TEST_ALL
184
                if TEST_ALL:
185
                        return None
186
                return foo
187

    
188
        def assert_dicts_are_deeply_equal(self, d1, d2):
189
                for k,v in d1.items():
190
                        self.assertTrue(d2.has_key(k))
191
                        if isinstance(v, dict):
192
                                self.assert_dicts_are_deeply_equal(v, d2[k])
193
                        else:
194
                                self.assertEqual(unicode(v), unicode(d2[k]))
195

    
196
        def test_000(self):
197
                "Prepare a full Cyclades test scenario"
198
                global TEST_ALL
199
                TEST_ALL = True
200

    
201
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
202
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
203

    
204
                print('testing')
205
                sys.stdout.write(' test create server')
206
                self._test_create_server()
207
                print('...ok')
208

    
209
                sys.stdout.write(' test list servers')
210
                self._test_list_servers()
211
                print('...ok')
212

    
213
                sys.stdout.write(' test get server details')
214
                self._test_get_server_details()
215
                print('...ok')
216

    
217
                sys.stdout.write(' test get image details')
218
                self._test_get_image_details()
219
                print('...ok')
220

    
221
                sys.stdout.write(' test update_server_name')
222
                self._test_update_server_name()
223
                print('...ok')
224

    
225
                sys.stdout.write(' test reboot_server')
226
                self._test_reboot_server()
227
                print('...ok')
228

    
229
                sys.stdout.write(' test create_server_metadata')
230
                self._test_create_server_metadata()
231
                print('...ok')
232

    
233
                sys.stdout.write(' test get_server_metadata')
234
                self._test_get_server_metadata()
235
                print('...ok')
236

    
237
                sys.stdout.write(' test update_server_metadata')
238
                self._test_update_server_metadata()
239
                print('...ok')
240

    
241
                sys.stdout.write(' test delete_server_metadata')
242
                self._test_delete_server_metadata()
243
                print('...ok')
244

    
245
                sys.stdout.write(' test list_flavors')
246
                self._test_list_flavors()
247
                print('...ok')
248

    
249
                sys.stdout.write(' test get_flavor_details')
250
                self._test_get_flavor_details()
251
                print('...ok')
252

    
253
                sys.stdout.write(' test list_images')
254
                self._test_list_images()
255
                print('...ok')
256

    
257
                sys.stdout.write(' test get_image_details')
258
                self._test_get_image_details()
259
                print('...ok')
260

    
261
                sys.stdout.write(' test get_image_metadata')
262
                self._test_get_image_metadata()
263
                print('...ok')
264

    
265
                sys.stdout.write(' test shutdown/start_server')
266
                self._test_shutdown_start_server()
267
                print('...ok')
268

    
269
                sys.stdout.write(' test get_server_console')
270
                self._test_get_server_console()        
271
                print('...ok')
272

    
273
                """Don't have auth for these:
274
                sys.stdout.write(' test delete_image')
275
                self._test_delete_image()
276
                print('...ok')
277
                sys.stdout.write(' test create_image_metadata')
278
                self._test_create_image_metadata()
279
                print('...ok')
280
                sys.stdout.write(' test update_image_metadata')
281
                self._test_update_image_metadata()
282
                print('...ok')
283
                sys.stdout.write(' test delete_image_metadata')
284
                self._test_delete_image_metadata()
285
                print('...ok')
286
                """
287

    
288
        def _has_status(self, servid, status):
289
                r = self.client.get_server_details(servid)
290
                return r['status'] == status
291
        def _wait_for_status(self, servid, status):
292
                wait = 0
293
                c=['|','/','-','\\']
294
                while self._has_status(servid, status):
295
                        if wait:
296
                                sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
297
                                for i in range(4*wait):
298
                                        sys.stdout.write('\b%s'%c[i%4])
299
                                        sys.stdout.flush()
300
                                        time.sleep(0.25)
301
                                print('')
302
                        wait = (wait + 7) if wait<60 else 0
303

    
304
        @if_not_all
305
        def test_list_servers(self):
306
                """Test list servers"""
307
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
308
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
309
                self._test_list_servers()
310

    
311
        def _test_list_servers(self):
312
                servers = self.client.list_servers()
313
                dservers = self.client.list_servers(detail=True)
314

    
315
                """detailed and simple are same size"""
316
                self.assertEqual(len(dservers), len(servers))
317
                for i in range(len(servers)):
318
                        for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
319
                                'status', 'updated']:
320
                                self.assertFalse(servers[i].has_key(field))
321
                                self.assertTrue(dservers[i].has_key(field))
322

    
323
                """detailed and simple contain same names"""
324
                names = sorted(map(lambda x: x["name"], servers))
325
                dnames = sorted(map(lambda x: x["name"], dservers))
326
                self.assertEqual(names, dnames)
327

    
328
        @if_not_all
329
        def test_create_server(self):
330
                """Test create_server"""
331
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
332
                self._test_create_server()
333

    
334
        def _test_create_server(self):
335
                self.assertEqual(self.server1["name"], self.servname1)
336
                self.assertEqual(self.server1["flavorRef"], self.flavorid)
337
                self.assertEqual(self.server1["imageRef"], self.img)
338
                self.assertEqual(self.server1["status"], "BUILD")
339

    
340
        @if_not_all
341
        def test_get_server_details(self):
342
                """Test get_server_details"""
343
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
344
                self._test_get_server_details()
345

    
346
        def _test_get_server_details(self):
347
                r = self.client.get_server_details(self.server1['id'])
348
                self.assertEqual(r["name"], self.servname1)
349
                self.assertEqual(r["flavorRef"], self.flavorid)
350
                self.assertEqual(r["imageRef"], self.img)
351
                self.assertEqual(r["status"], "BUILD")
352

    
353
        @if_not_all
354
        def test_get_image_details(self):
355
                """Test get_image_details"""
356
                self._test_get_image_details()
357

    
358
        def _test_get_image_details(self):
359
                r = self.client.get_image_details(self.img)
360
                d = self.img_details
361
                self.assert_dicts_are_deeply_equal(r, d)
362

    
363
        @if_not_all
364
        def test_update_server_name(self):
365
                """Test update_server_name"""
366
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
367
                self._test_update_server_name()
368

    
369
        def _test_update_server_name(self):
370
                new_name = self.servname1+'_new_name'
371
                self.client.update_server_name(self.server1['id'], new_name)
372
                r = self.client.get_server_details(self.server1['id'], success=(200, 400))
373
                self.assertEqual(r['name'], new_name)
374
                changed = self.servers.pop(self.servname1)
375
                changed['name'] = new_name
376
                self.servers[new_name] = changed
377

    
378
        @if_not_all
379
        def test_reboot_server(self):
380
                """Test reboot server"""
381
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
382
                self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
383
                self._test_reboot_server()
384

    
385
        def _test_reboot_server(self):
386
                self._wait_for_status(self.server1['id'], 'BUILD')
387
                self.client.reboot_server(self.server1['id'])
388
                self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
389
                self._wait_for_status(self.server2['id'], 'BUILD')
390
                self.client.reboot_server(self.server2['id'], hard=True)
391
                self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
392
                self._wait_for_status(self.server1['id'], 'REBOOT')
393
                self._wait_for_status(self.server2['id'], 'REBOOT')
394

    
395
        @if_not_all
396
        def test_get_server_metadata(self):
397
                """Test get server_metadata"""
398
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
399
                self._test_get_server_metadata()
400
        def _test_get_server_metadata(self):
401
                self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
402
                r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
403
                self.assertEqual(r['mymeta_0'], 'val_0')
404

    
405
        @if_not_all
406
        def test_create_server_metadata(self):
407
                """Test create_server_metadata"""
408
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
409
                self._test_create_server_metadata()
410

    
411
        def _test_create_server_metadata(self):
412
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
413
                self.assertTrue(r1.has_key('mymeta'))
414
                r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
415
                self.assert_dicts_are_deeply_equal(r1, r2)
416

    
417
        @if_not_all
418
        def test_update_server_metadata(self):
419
                """Test update_server_metadata"""
420
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
421
                self._test_update_server_metadata()
422

    
423
        def _test_update_server_metadata(self):
424
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
425
                self.assertTrue(r1.has_key('mymeta3'))
426
                r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
427
                self.assertTrue(r2['mymeta3'], 'val3')
428

    
429
        @if_not_all
430
        def test_delete_server_metadata(self):
431
                """Test delete_server_metadata"""
432
                self.server1=self._create_server(self.servname1, self.flavorid, self.img)
433
                self._test_delete_server_metadata()
434

    
435
        def _test_delete_server_metadata(self):
436
                r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
437
                self.assertTrue(r1.has_key('mymeta'))
438
                self.client.delete_server_metadata(self.server1['id'], 'mymeta')
439
                try:
440
                        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
441
                        raise ClientError('Wrong Error', status=100)
442
                except ClientError as err:
443
                        self.assertEqual(err.status, 404)
444

    
445
        @if_not_all
446
        def test_list_flavors(self):
447
                """Test flavors_get"""
448
                self._test_list_flavors()
449

    
450
        def _test_list_flavors(self):
451
                r = self.client.list_flavors()
452
                self.assertTrue(len(r) > 1)
453
                r = self.client.list_flavors(detail=True)
454
                self.assertTrue(r[0].has_key('SNF:disk_template'))
455

    
456
        @if_not_all
457
        def test_get_flavor_details(self):
458
                """Test test_get_flavor_details"""
459
                self._test_get_flavor_details()
460

    
461
        def _test_get_flavor_details(self):
462
                r = self.client.get_flavor_details(self.flavorid)
463
                self.assert_dicts_are_deeply_equal(self.flavor_details, r)
464

    
465
        @if_not_all
466
        def test_list_images(self):
467
                """Test list_images"""
468
                self._test_list_images()
469

    
470
        def _test_list_images(self):
471
                r = self.client.list_images()
472
                self.assertTrue(len(r) > 1)
473
                r = self.client.list_images(detail=True)
474
                for detailed_img in r:
475
                        if detailed_img['id'] == self.img:
476
                                break
477
                self.assert_dicts_are_deeply_equal(r[1], self.img_details)
478

    
479
        @if_not_all
480
        def test_image_details(self):
481
                """Test image_details"""
482
                self._test_get_image_details
483

    
484
        def _test_get_image_details(self):
485
                r = self.client.get_image_details(self.img)
486
                self.assert_dicts_are_deeply_equal(r, self.img_details)
487

    
488
        @if_not_all
489
        def test_get_image_metadata(self):
490
                """Test get_image_metadata"""
491
                self._test_get_image_metadata()
492

    
493
        def _test_get_image_metadata(self):
494
                r = self.client.get_image_metadata(self.img)
495
                self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
496
                for key,val in self.img_details['metadata']['values'].items():
497
                        r = self.client.get_image_metadata(self.img, key)
498
                        self.assertEqual(r[key], val)
499

    
500
        @if_not_all
501
        def test_start_server(self):
502
                """Test start_server"""
503
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
504
                self._test_shutdown_start_server()
505
        @if_not_all
506
        def test_shutdown_server(self):
507
                """Test shutdown_server"""
508
                self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
509
                self._test_shutdown_start_server()
510

    
511
        def _test_shutdown_start_server(self):
512
                self._wait_for_status(self.server1['id'], 'BUILD')
513
                print('Shutdown Server %s'%self.server1['id'])
514
                self.client.shutdown_server(self.server1['id'])
515
                self._wait_for_status(self.server1['id'], 'ACTIVE')
516
                r = self.client.get_server_details(self.server1['id'])
517
                self.assertEqual(r['status'], 'STOPPED')
518
                print('Start Server %s'%self.server1['id'])
519
                self.client.start_server(self.server1['id'])
520
                self._wait_for_status(self.server1['id'], 'STOPPED')
521
                r = self.client.get_server_details(self.server1['id'])
522
                self.assertEqual(r['status'], 'ACTIVE')
523

    
524
        @if_not_all
525
        def test_get_server_console(self):
526
                """Test get_server_console"""
527
                self.server2 = self._create_server(self.servname2, self.flavorid, self.img)
528
                self._test_get_server_console()
529

    
530
        def _test_get_server_console(self):
531
                self._wait_for_status(self.server2['id'], 'BUILD')
532
                r = self.client.get_server_console(self.server2['id'])
533
                self.assertTrue(r.has_key('host'))
534
                self.assertTrue(r.has_key('password'))
535
                self.assertTrue(r.has_key('port'))
536
                self.assertTrue(r.has_key('type'))
537

    
538
        """ Don't have auth to test this
539
        @if_not_all
540
        def test_delete_image(self):
541
                ""Test delete_image""
542
                self._test_delete_image()
543
        def _test_delete_image(self):
544
                images = self.client.list_images()
545
                self.client.delete_image(images[2]['id'])
546
                try:
547
                        r = self.client.get_image_details(images[2]['id'], success=(400))
548
                except ClientError as err:
549
                        self.assertEqual(err.status, 404)
550

551
        @if_not_all
552
        def test_create_image_metadata(self):
553
                ""Test create_image_metadata""
554
                self._test_create_image_metadata()
555
        def _test_create_image_metadata(self):
556
                r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
557
                self.assertEqual(r['mykey'], 'myval')
558

559
        @if_not_all
560
        def test_update_image_metadata(self):
561
                ""Test update_image_metadata""
562
                self._test_update_image_metadata()
563
        def _test_update_image_metadata(self):
564
                r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
565
                r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
566
                self.assertEqual(r['mykey0'], 'myval0')
567

568
        @if_not_all
569
        def test_delete_image_metadata(self):
570
                ""Test delete_image_metadata""
571
                self._test_delete_image_metadata()
572
        def _test_delete_image_metadata(self):
573
                self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
574
                self.client.delete_image_metadata(self.img, 'mykey1')
575
                r = self.client.get_image_metadata(self.img)
576
                self.assertNotEqual(r.has_key('mykey1'))
577
        """
578

    
579
class testPithos(unittest.TestCase):
580
        """Set up a Pithos+ thorough test"""
581
        def setUp(self):
582
                """
583
                url = 'http://127.0.0.1:8000/v1'
584
                token = 'C/yBXmz3XjTFBnujc2biAg=='
585
                token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
586
                account = 'admin@adminland.com'
587
                """
588

    
589
                url='https://pithos.okeanos.grnet.gr/v1'
590

    
591
                token='Kn+G9dfmlPLR2WFnhfBOow=='
592
                account='saxtouri@grnet.gr'
593

    
594
                """
595
                url='https://pithos.okeanos.io/v1'
596
                token='0TpoyAXqJSPxLdDuZHiLOA=='
597
                account='saxtouri@admin.grnet.gr'
598
                """
599
                
600
                """
601
                def add_handler(name, level, prefix=''):
602
                        h = logging.StreamHandler()
603
                        fmt = logging.Formatter(prefix + '%(message)s')
604
                        h.setFormatter(fmt)
605
                        logger = logging.getLogger(name)
606
                        logger.addHandler(h)
607
                        logger.setLevel(level)
608
                import logging
609
                sendlog = logging.getLogger('clients.send')
610
                recvlog = logging.getLogger('clients.recv')
611
                add_handler('requests', logging.INFO, prefix='* ')
612
                add_handler('clients.send', logging.INFO, prefix='> ')
613
                add_handler('clients.recv', logging.INFO, prefix='< ')
614
                """
615
                
616
                self.fname = None
617
                container=None
618
                self.client = pithos(url, token, account, container)
619
                self.now = time.mktime(time.gmtime())
620
                self.c1 = 'c1_'+unicode(self.now)
621
                self.c2 = 'c2_'+unicode(self.now)
622
                self.c3 = 'c3_'+unicode(self.now)
623

    
624

    
625
                self.client.create_container(self.c1)
626
                self.client.create_container(self.c2)
627
                self.client.create_container(self.c3)
628
                self.makeNewObject(self.c1, 'test')
629
                self.makeNewObject(self.c2, 'test')
630
                self.now_unformated = datetime.datetime.utcnow()
631
                self.makeNewObject(self.c1, 'test1')
632
                self.makeNewObject(self.c2, 'test1')
633
                """Prepare an object to be shared - also its container"""
634
                self.client.container = self.c1
635
                r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
636
                
637
                self.makeNewObject(self.c1, 'another.test')
638

    
639
        def makeNewObject(self, container, obj):
640
                self.client.container = container
641
                r = self.client.object_put(obj, content_type='application/octet-stream',
642
                        data= 'file '+obj+' that lives in '+container,
643
                        metadata={'incontainer':container})
644

    
645
        def forceDeleteContainer(self, container):
646
                self.client.container = container
647
                try:
648
                        r = self.client.list_objects()
649
                except ClientError:
650
                        return
651
                for obj in r:
652
                        name = obj['name']
653
                        self.client.del_object(name)
654
                r = self.client.container_delete()
655
                self.container = ''
656

    
657
        def tearDown(self):
658
                """Destroy test cases"""
659
                if self.fname is not None:
660
                        try:
661
                                os.remove(self.fname)
662
                        except OSError:
663
                                pass
664
                        self.fname = None
665
                self.forceDeleteContainer(self.c1)
666
                self.forceDeleteContainer(self.c2)
667
                try:
668
                        self.forceDeleteContainer(self.c3)
669
                except ClientError:
670
                        pass
671
                self.client.container=''
672

    
673
        def test_000(self):
674
                """Perform a full Pithos+ kamaki support test"""
675

    
676
        def test_account_head(self):
677
                """Test account_HEAD"""
678
                r = self.client.account_head()
679
                self.assertEqual(r.status_code, 204)
680
                
681
                r = self.client.account_head(until='1000000000')
682
                self.assertEqual(r.status_code, 204)
683
           
684
                r = self.client.get_account_info(until='1000000000') 
685
                datestring = unicode(r['x-account-until-timestamp'])
686
                self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
687

    
688
                r = self.client.get_account_quota()
689
                self.assertTrue(r.has_key('x-account-policy-quota'))
690

    
691
                r = self.client.get_account_versioning()
692
                self.assertTrue(r.has_key('x-account-policy-versioning'))
693

    
694
                """Check if(un)modified_since"""
695
                for format in self.client.DATE_FORMATS:
696
                        now_formated = self.now_unformated.strftime(format)
697
                        r1 = self.client.account_head(if_modified_since=now_formated, success=(204, 304, 412))
698
                        sc1 = r1.status_code
699
                        r1.release()
700
                        r2 = self.client.account_head(if_unmodified_since=now_formated, success=(204, 304, 412))
701
                        sc2 = r2.status_code
702
                        r2.release()
703
                        self.assertNotEqual(sc1, sc2)
704

    
705
        def test_account_get(self):
706
                """Test account_GET"""
707
                #r = self.client.account_get()
708
                #self.assertEqual(r.status_code, 200)
709
                r = self.client.list_containers()
710
                fullLen = len(r)
711
                self.assertTrue(fullLen > 2)
712
                
713
                r = self.client.account_get(limit=1)
714
                self.assertEqual(len(r.json), 1)
715
                
716

    
717
                r = self.client.account_get(marker='c2_')
718
                temp_c0 = r.json[0]['name']
719
                temp_c2 = r.json[2]['name']
720
                
721
                r = self.client.account_get(limit=2, marker='c2_')
722
                conames = [container['name'] for container in r.json \
723
                        if container['name'].lower().startswith('c2_')]
724
                self.assertTrue(temp_c0 in conames)
725
                self.assertFalse(temp_c2 in conames)
726
                
727

    
728
                r = self.client.account_get(show_only_shared=True)
729
                self.assertTrue(self.c1 in [c['name'] for c in r.json])
730
                
731
                r = self.client.account_get(until=1342609206)
732
                self.assertTrue(len(r.json) <= fullLen)
733
                
734
                """Check if(un)modified_since"""
735
                for format in self.client.DATE_FORMATS:
736
                        now_formated = self.now_unformated.strftime(format)
737
                        r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
738
                        sc1 = r1.status_code
739
                        r1.release()
740
                        r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
741
                        sc2 = r2.status_code
742
                        r2.release()
743
                        self.assertNotEqual(sc1, sc2)
744

    
745
                """Check sharing_accounts"""
746
                r = self.client.get_sharing_accounts()
747
                self.assertTrue(len(r)>0)
748

    
749
        def test_account_post(self):
750
                """Test account_POST"""
751
                r = self.client.account_post()
752
                self.assertEqual(r.status_code, 202)
753
                grpName = 'grp'+unicode(self.now)
754
                
755

    
756
                """Method set/del_account_meta and set_account_groupcall use account_post internally
757
                """
758
                self.client.set_account_group(grpName, ['u1', 'u2'])
759
                r = self.client.get_account_group()
760
                self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
761
                self.client.del_account_group(grpName)
762
                r = self.client.get_account_group()
763
                self.assertTrue(not r.has_key('x-account-group-'+grpName))
764

    
765
                mprefix = 'meta'+unicode(self.now)
766
                self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
767
                r = self.client.get_account_meta()
768
                self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
769
                self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
770

    
771
                self.client.del_account_meta(mprefix+'1')
772
                r = self.client.get_account_meta()
773
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
774

    
775
                self.client.del_account_meta(mprefix+'2')
776
                r = self.client.get_account_meta()
777
                self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
778

    
779
                """Missing testing for quota, versioning, because normally
780
                you don't have permitions to modify those at account level
781
                """
782

    
783
                newquota=1000000
784
                self.client.set_account_quota(newquota)
785
                #r = self.client.get_account_info()
786
                #print(unicode(r))
787
                #r = self.client.get_account_quota()
788
                #self.assertEqual(r['x-account-policy-quota'], newquota)
789
                self.client.set_account_versioning('auto')
790

    
791
        def test_container_head(self):
792
                """Test container_HEAD"""
793
                self.client.container = self.c1
794

    
795
                r = self.client.container_head()
796
                self.assertEqual(r.status_code, 204)
797
                
798
                """Check until"""
799
                r = self.client.container_head(until=1000000, success=(204, 404))
800
                self.assertEqual(r.status_code, 404)
801
                
802
                """Check and if(un)modified_since"""
803
                for format in self.client.DATE_FORMATS:
804
                        now_formated = self.now_unformated.strftime(format)
805
                        r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
806
                        sc1=r1.status_code
807
                        r1.release()
808
                        r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
809
                        sc2=r2.status_code
810
                        r2.release()
811
                        self.assertNotEqual(sc1, sc2)
812

    
813
                """Check container object meta"""
814
                r = self.client.get_container_object_meta()
815
                self.assertEqual(r['x-container-object-meta'], 'Incontainer')
816

    
817
        def test_container_get(self):
818
                """Test container_GET"""
819
                self.client.container = self.c1
820

    
821
                r = self.client.container_get()
822
                self.assertEqual(r.status_code, 200)
823
                fullLen = len(r.json)
824
                
825

    
826
                r = self.client.container_get(prefix='test')
827
                lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
828
                self.assertTrue(len(r.json) > 1)
829
                self.assertEqual(len(r.json), len(lalobjects))
830
                
831

    
832
                r = self.client.container_get(limit=1)
833
                self.assertEqual(len(r.json), 1)
834
                
835

    
836
                r = self.client.container_get(marker='another')
837
                self.assertTrue(len(r.json) > 1)
838
                neobjects = [obj for obj in r.json if obj['name'] > 'another']
839
                self.assertEqual(len(r.json), len(neobjects))
840
                
841

    
842
                r = self.client.container_get(prefix='another.test', delimiter='.')
843
                self.assertTrue(fullLen > len(r.json))
844
                
845

    
846
                r = self.client.container_get(path='/')
847
                self.assertEqual(fullLen, len(r.json))
848
                
849

    
850
                r = self.client.container_get(format='xml')
851
                self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
852
                
853

    
854
                r = self.client.container_get(meta=['incontainer'])
855
                self.assertTrue(len(r.json) > 0)
856
                
857

    
858
                r = self.client.container_get(show_only_shared=True)
859
                self.assertTrue(len(r.json) < fullLen)
860
                
861

    
862
                try:
863
                        r = self.client.container_get(until=1000000000)
864
                        datestring = unicode(r.headers['x-account-until-timestamp'])
865
                        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
866
                        
867
                except ClientError:
868
                        
869
                        pass
870

    
871
                """Check and if un/modified_since"""
872
                for format in self.client.DATE_FORMATS:
873
                        now_formated = self.now_unformated.strftime(format)
874
                        r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
875
                        sc1 = r1.status_code
876
                        r1.release()
877
                        r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
878
                        sc2 = r2.status_code
879
                        r2.release()
880
                        self.assertNotEqual(sc1, sc2)
881
           
882
        def test_container_put(self):
883
                """Test container_PUT"""
884
                self.client.container = self.c2
885

    
886
                r = self.client.container_put()
887
                self.assertEqual(r.status_code, 202)
888
                
889

    
890
                r = self.client.get_container_quota(self.client.container)
891
                cquota = r.values()[0]
892
                newquota = 2*int(cquota)
893

    
894
                r = self.client.container_put(quota=newquota)
895
                self.assertEqual(r.status_code, 202)
896
                
897
                r = self.client.get_container_quota(self.client.container)
898
                xquota = int(r.values()[0])
899
                self.assertEqual(newquota, xquota)
900

    
901
                r = self.client.container_put(versioning='auto')
902
                self.assertEqual(r.status_code, 202)
903
                
904
                r = self.client.get_container_versioning(self.client.container)
905
                nvers = r.values()[0]
906
                self.assertEqual('auto', nvers)
907

    
908
                r = self.client.container_put(versioning='none')
909
                self.assertEqual(r.status_code, 202)
910
                
911
                r = self.client.get_container_versioning(self.client.container)
912
                nvers = r.values()[0]
913
                self.assertEqual('none', nvers)
914

    
915
                r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
916
                self.assertEqual(r.status_code, 202)
917
                
918
                r = self.client.get_container_meta(self.client.container)
919
                self.assertTrue(r.has_key('x-container-meta-m1'))
920
                self.assertEqual(r['x-container-meta-m1'], 'v1')
921
                self.assertTrue(r.has_key('x-container-meta-m2'))
922
                self.assertEqual(r['x-container-meta-m2'], 'v2')
923

    
924
                r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
925
                self.assertEqual(r.status_code, 202)
926
                
927
                r = self.client.get_container_meta(self.client.container)
928
                self.assertTrue(not r.has_key('x-container-meta-m1'))
929
                self.assertTrue(r.has_key('x-container-meta-m2'))
930
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
931
           
932
                self.client.del_container_meta(self.client.container)
933

    
934
        def test_container_post(self):
935
                """Test container_POST"""
936
                self.client.container = self.c2
937

    
938
                """Simple post"""
939
                r = self.client.container_post()
940
                self.assertEqual(r.status_code, 202)
941
                
942

    
943
                """post meta"""
944
                self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
945
                r = self.client.get_container_meta(self.client.container)
946
                self.assertTrue(r.has_key('x-container-meta-m1'))
947
                self.assertEqual(r['x-container-meta-m1'], 'v1')
948
                self.assertTrue(r.has_key('x-container-meta-m2'))
949
                self.assertEqual(r['x-container-meta-m2'], 'v2')
950

    
951
                """post/2del meta"""
952
                r = self.client.del_container_meta('m1')
953
                r = self.client.set_container_meta({'m2':'v2a'})
954
                r = self.client.get_container_meta(self.client.container)
955
                self.assertTrue(not r.has_key('x-container-meta-m1'))
956
                self.assertTrue(r.has_key('x-container-meta-m2'))
957
                self.assertEqual(r['x-container-meta-m2'], 'v2a')
958

    
959
                """check quota"""
960
                r = self.client.get_container_quota(self.client.container)
961
                cquota = r.values()[0]
962
                newquota = 2*int(cquota)
963
                r = self.client.set_container_quota(newquota)
964
                r = self.client.get_container_quota(self.client.container)
965
                xquota = int(r.values()[0])
966
                self.assertEqual(newquota, xquota)
967
                r = self.client.set_container_quota(cquota)
968
                r = self.client.get_container_quota(self.client.container)
969
                xquota = r.values()[0]
970
                self.assertEqual(cquota, xquota)
971

    
972
                """Check versioning"""
973
                self.client.set_container_versioning('auto')
974
                r = self.client.get_container_versioning(self.client.container)
975
                nvers = r.values()[0]
976
                self.assertEqual('auto', nvers)
977
                self.client.set_container_versioning('none')
978
                r = self.client.get_container_versioning(self.client.container)
979
                nvers = r.values()[0]
980
                self.assertEqual('none', nvers)
981

    
982
                """put_block uses content_type and content_length to
983
                post blocks of data 2 container. All that in upload_object"""
984
                """Change a file at fs"""
985
                self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
986
                """Upload it at a directory in container"""
987
                self.client.create_directory('dir')
988
                newf = open(self.fname, 'r')
989
                self.client.upload_object('/dir/sample.file', newf)
990
                newf.close()
991
                """Check if file has been uploaded"""
992
                r = self.client.get_object_info('/dir/sample.file')
993
                self.assertTrue(int(r['content-length']) > 100000000)
994

    
995
                """WTF is tranfer_encoding? What should I check about th** s**t? """
996
                #TODO
997

    
998
                """Check update=False"""
999
                r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
1000
                
1001
                r = self.client.get_object_info('test')
1002
                self.assertTrue(r.has_key('x-object-meta-newmeta'))
1003
                self.assertFalse(r.has_key('x-object-meta-incontainer'))
1004

    
1005
                r = self.client.del_container_meta('m2')
1006

    
1007
        def test_container_delete(self):
1008
                """Test container_DELETE"""
1009

    
1010
                """Fail to delete a non-empty container"""
1011
                self.client.container = self.c2
1012
                r = self.client.container_delete(success=409)
1013
                self.assertEqual(r.status_code, 409)
1014
                
1015

    
1016
                """Fail to delete c3 (empty) container"""
1017
                self.client.container = self.c3
1018
                r = self.client.container_delete(until='1000000000')
1019
                self.assertEqual(r.status_code, 204)
1020
                
1021

    
1022
                """Delete c3 (empty) container"""
1023
                r = self.client.container_delete()
1024
                self.assertEqual(r.status_code, 204)
1025

    
1026
                """Purge container(empty a container), check versionlist"""
1027
                self.client.container = self.c1
1028
                r = self.client.object_head('test', success=(200, 404))
1029
                self.assertEqual(r.status_code, 200)
1030
                self.client.del_container(delimiter='/')
1031
                r = self.client.object_head('test', success=(200, 404))
1032
                self.assertEqual(r.status_code, 404)
1033
                r = self.client.get_object_versionlist('test')
1034
                self.assertTrue(len(r) > 0)
1035
                self.assertTrue(len(r[0])>1)
1036
                self.client.purge_container()
1037
                self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
1038

    
1039
        def test_object_head(self):
1040
                """Test object_HEAD"""
1041
                self.client.container = self.c2
1042
                obj = 'test'
1043

    
1044
                r = self.client.object_head(obj)
1045
                self.assertEqual(r.status_code, 200)
1046
                etag = r.headers['etag']
1047
                
1048

    
1049
                r = self.client.object_head(obj, version=40)
1050
                self.assertEqual(r.headers['x-object-version'], '40')
1051
                
1052

    
1053
                r = self.client.object_head(obj, if_etag_match=etag)
1054
                self.assertEqual(r.status_code, 200)
1055
                
1056
                r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
1057
                self.assertNotEqual(r.status_code, 200)
1058
                
1059

    
1060
                r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
1061
                self.assertEqual(r.status_code, 412)
1062
                
1063

    
1064
                """Check and if(un)modified_since"""
1065
                for format in self.client.DATE_FORMATS:
1066
                        now_formated = self.now_unformated.strftime(format)
1067
                        r1 = self.client.object_head(obj, if_modified_since=now_formated,
1068
                                success=(200, 304, 412))
1069
                        sc1 = r1.status_code
1070
                        r1.release()
1071
                        r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1072
                                success=(200, 304, 412))
1073
                        sc2 = r2.status_code
1074
                        r2.release()
1075
                        self.assertNotEqual(sc1, sc2)
1076

    
1077
        def test_object_get(self):
1078
                """Test object_GET"""
1079
                self.client.container = self.c1
1080
                obj = 'test'
1081

    
1082
                r = self.client.object_get(obj)
1083
                self.assertEqual(r.status_code, 200)
1084

    
1085
                osize = int(r.headers['content-length'])
1086
                etag = r.headers['etag']
1087
                
1088

    
1089
                r = self.client.object_get(obj, hashmap=True)
1090
                self.assertTrue(r.json.has_key('hashes') \
1091
                        and r.json.has_key('block_hash') \
1092
                        and r.json.has_key('block_size') \
1093
                        and r.json.has_key('bytes'))
1094
                
1095

    
1096
                r = self.client.object_get(obj, format='xml', hashmap=True)
1097
                self.assertEqual(len(r.text.split('hash>')), 3)
1098
                
1099

    
1100
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1101
                r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
1102
                partsize = int(r.headers['content-length'])
1103
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1104
                
1105

    
1106
                rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
1107
                r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
1108
                partsize = int(r.headers['content-length'])
1109
                self.assertTrue(0 < partsize and partsize <= 1+osize/3)
1110
                
1111

    
1112
                r = self.client.object_get(obj, if_etag_match=etag)
1113
                self.assertEqual(r.status_code, 200)
1114
                
1115

    
1116
                r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
1117
                self.assertEqual(r.status_code, 200)
1118
                
1119

    
1120
                """Check and if(un)modified_since"""
1121
                for format in self.client.DATE_FORMATS:
1122
                        now_formated = self.now_unformated.strftime(format)
1123
                        r1 = self.client.object_get(obj, if_modified_since=now_formated,
1124
                                success=(200, 304, 412))
1125
                        sc1 = r1.status_code
1126
                        r1.release()
1127
                        r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
1128
                        sc2 = r2.status_code
1129
                        r2.release()
1130
                        self.assertNotEqual(sc1, sc2)
1131

    
1132
        def test_object_put(self):
1133
                """Test object_PUT"""
1134

    
1135
                self.client.container = self.c2
1136
                obj='another.test'
1137

    
1138
                """create the object"""
1139
                r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
1140
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
1141
                        metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
1142
                        content_disposition='attachment; filename="fname.ext"')
1143
                self.assertEqual(r.status_code, 201)
1144
                etag = r.headers['etag']
1145
                
1146
                """Check content-disposition"""
1147
                r = self.client.get_object_info(obj)
1148
                self.assertTrue(r.has_key('content-disposition'))
1149

    
1150
                """Check permitions"""
1151
                r = self.client.get_object_sharing(obj)
1152
                self.assertTrue('accx:groupa' in r['read'])
1153
                self.assertTrue('u1' in r['read'])
1154
                self.assertTrue('u2' in r['write'])
1155
                self.assertTrue('u3' in r['write'])
1156

    
1157
                """Check metadata"""
1158
                r = self.client.get_object_meta(obj)
1159
                self.assertEqual(r['x-object-meta-key1'], 'val1')
1160
                self.assertEqual(r['x-object-meta-key2'], 'val2')
1161

    
1162
                """Check public and if_etag_match"""
1163
                r = self.client.object_put(obj, if_etag_match=etag, data='b',
1164
                        content_type='application/octet-stream', public=True)
1165
                
1166
                r = self.client.object_get(obj)
1167
                self.assertTrue(r.headers.has_key('x-object-public'))
1168
                vers2 = int(r.headers['x-object-version'])
1169
                etag = r.headers['etag']
1170
                self.assertEqual(r.text, 'b')
1171
                
1172
                """Check if_etag_not_match"""
1173
                r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1174
                        content_type='application/octet-stream', success=(201, 412))
1175
                self.assertEqual(r.status_code, 412)
1176
                
1177

    
1178
                """Check content_type and content_length"""
1179
                tmpdir = 'dir'+unicode(self.now)
1180
                r = self.client.object_put(tmpdir, content_type='application/directory',
1181
                        content_length=0)
1182
                
1183
                r = self.client.get_object_info(tmpdir)
1184
                self.assertEqual(r['content-type'], 'application/directory')
1185

    
1186
                """Check copy_from, content_encoding"""
1187
                r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
1188
                        copy_from='/%s/%s'%(self.client.container, obj),
1189
                        content_encoding='application/octet-stream', 
1190
                        source_account=self.client.account,
1191
                        content_length=0, success=201)
1192
                self.assertEqual(r.status_code, 201)
1193

    
1194
                """Test copy_object for cross-conctainer copy"""
1195
                self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
1196
                        dst_container=self.c1, dst_object=obj)
1197
                self.client.container = self.c1
1198
                r1 = self.client.get_object_info(obj)
1199
                self.client.container = self.c2
1200
                r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
1201
                self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
1202
                
1203
                """Check cross-container copy_from, content_encoding"""
1204
                self.client.container = self.c1
1205
                fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
1206
                r = self.client.object_put(obj, format=None, copy_from=fromstr,
1207
                        content_encoding='application/octet-stream', 
1208
                        source_account=self.client.account,
1209
                        content_length=0, success=201)
1210
                
1211
                self.assertEqual(r.status_code, 201)
1212
                r = self.client.get_object_info(obj)
1213
                self.assertEqual(r['etag'], etag)
1214

    
1215
                """Check source_account"""
1216
                self.client.container = self.c2
1217
                fromstr = '/'+self.c1+'/'+obj
1218
                r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
1219
                        content_encoding='application/octet-stream', 
1220
                        source_account='nonExistendAddress@NeverLand.com', 
1221
                        content_length=0, success=(201, 403))
1222
                self.assertEqual(r.status_code, 403)
1223
                
1224
                """Check cross-container move_from"""
1225
                self.client.container = self.c1
1226
                r1 = self.client.get_object_info(obj)
1227
                self.client.container = self.c2
1228
                self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
1229
                dst_object=obj+'v0')
1230
                r0 = self.client.get_object_info(obj+'v0')
1231
                self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1232

    
1233
                """Check move_from"""
1234
                r = self.client.object_put(obj+'v1', format=None, 
1235
                        move_from='/'+self.c2+'/'+obj,
1236
                        source_version = vers2,
1237
                        content_encoding='application/octet-stream',
1238
                        content_length=0, success=201)
1239
                
1240
                """Check manifest"""
1241
                mobj = 'manifest.test'
1242
                txt = ''
1243
                for i in range(10):
1244
                        txt += '%s'%i
1245
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1246
                                content_type='application/octet-stream', content_encoding='application/octet-stream')
1247
                        
1248
                r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
1249
                        manifest='%s/%s'%(self.client.container, mobj))
1250
                
1251
                r = self.client.object_get(mobj)
1252
                self.assertEqual(r.text, txt)
1253
           
1254
                """Upload a local file with one request"""
1255
                self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
1256
                newf = open(self.fname, 'r')
1257
                self.client.upload_object('sample.file', newf)
1258
                newf.close()
1259
                """Check if file has been uploaded"""
1260
                r = self.client.get_object_info('sample.file')
1261
                self.assertEqual(int(r['content-length']), 10260)
1262

    
1263
                """Some problems with transfer-encoding?"""
1264

    
1265
        def test_object_copy(self):
1266
                """Test object_COPY"""
1267
                self.client.container=self.c2
1268
                obj = 'test2'
1269

    
1270
                data= '{"key1":"val1", "key2":"val2"}'
1271
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1272
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1273
                        permitions={
1274
                                'read':['accX:groupA', 'u1', 'u2'],
1275
                                'write':['u2', 'u3']},
1276
                        content_disposition='attachment; filename="fname.ext"')
1277
                
1278
                r = self.client.object_copy(obj+'orig',
1279
                        destination = '/'+self.client.container+'/'+obj,
1280
                        ignore_content_type=False, content_type='application/json', 
1281
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1282
                        permitions={'write':['u5', 'accX:groupB']})
1283
                self.assertEqual(r.status_code, 201)
1284
                
1285
                """Check content-disposition"""
1286
                r = self.client.get_object_info(obj)
1287
                self.assertTrue(r.has_key('content-disposition'))
1288

    
1289
                """Check Metadata"""
1290
                r = self.client.get_object_meta(obj)
1291
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1292
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1293
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1294

    
1295
                """Check permitions"""
1296
                r = self.client.get_object_sharing(obj)
1297
                self.assertFalse(r.has_key('read') or 'u2' in r['write'])
1298
                self.assertTrue('accx:groupb' in r['write'])
1299

    
1300
                """Check destination account"""
1301
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1302
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1303
                        success=(201, 403))
1304
                self.assertEqual(r.status_code, 403)
1305
                
1306

    
1307
                """Check destination being another container
1308
                and also content_type and content encoding"""
1309
                r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
1310
                        content_encoding='utf8', content_type='application/json')
1311
                self.assertEqual(r.status_code, 201)
1312
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1313
                
1314

    
1315
                """Check ignore_content_type and content_type"""
1316
                r = self.client.object_get(obj)
1317
                etag = r.headers['etag']
1318
                ctype = r.headers['content-type']
1319
                self.assertEqual(ctype, 'application/json')
1320
                
1321
                r = self.client.object_copy(obj+'orig',
1322
                        destination = '/'+self.client.container+'/'+obj+'0',
1323
                        ignore_content_type=True, content_type='application/json')
1324
                self.assertEqual(r.status_code, 201)
1325
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1326
                
1327

    
1328
                """Check if_etag_(not_)match"""
1329
                r = self.client.object_copy(obj,
1330
                        destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1331
                self.assertEqual(r.status_code, 201)
1332
                
1333
                r = self.client.object_copy(obj,
1334
                        destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1335
                self.assertEqual(r.status_code, 201)
1336
                vers2 = r.headers['x-object-version']
1337
                
1338

    
1339
                """Check source_version, public and format """
1340
                r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1341
                self.assertEqual(r.status_code, 201)
1342
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1343
                
1344
                r = self.client.get_object_info(obj+'3')
1345
                self.assertTrue(r.has_key('x-object-public'))
1346

    
1347
        def test_object_move(self):
1348
                """Test object_MOVE"""
1349
                self.client.container= self.c2
1350
                obj = 'test2'
1351

    
1352
                data= '{"key1":"val1", "key2":"val2"}'
1353
                r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1354
                        data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1355
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1356
                
1357
                r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1358
                        ignore_content_type=False, content_type='application/json', 
1359
                        metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1360
                        permitions={'write':['u5', 'accX:groupB']})
1361
                self.assertEqual(r.status_code, 201)
1362
                
1363

    
1364
                """Check Metadata"""
1365
                r = self.client.get_object_meta(obj)
1366
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1367
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1368
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1369

    
1370
                """Check permitions"""
1371
                r = self.client.get_object_sharing(obj)
1372
                self.assertFalse(r.has_key('read'))
1373
                self.assertTrue('u5' in r['write'])
1374
                self.assertTrue('accx:groupb' in r['write'])
1375

    
1376
                """Check destination account"""
1377
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1378
                        content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1379
                        success=(201, 403))
1380
                self.assertEqual(r.status_code, 403)
1381
                
1382

    
1383
                """Check destination being another container and also
1384
                content_type, content_disposition and content encoding"""
1385
                r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1386
                        content_encoding='utf8', content_type='application/json',
1387
                        content_disposition='attachment; filename="fname.ext"')
1388
                self.assertEqual(r.status_code, 201)
1389
                self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1390
                self.client.container=self.c1
1391
                r = self.client.get_object_info(obj)
1392
                self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1393
                etag = r['etag']
1394
                ctype = r['content-type']
1395
                self.assertEqual(ctype, 'application/json')
1396

    
1397
                """Check ignore_content_type and content_type"""
1398
                r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1399
                        ignore_content_type=True, content_type='application/json')
1400
                self.assertEqual(r.status_code, 201)
1401
                self.assertNotEqual(r.headers['content-type'], 'application/json')
1402
                
1403

    
1404
                """Check if_etag_(not_)match"""
1405
                self.client.container=self.c2
1406
                r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1407
                        if_etag_match=etag)
1408
                self.assertEqual(r.status_code, 201)
1409
                
1410
                r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1411
                        if_etag_not_match='lalala')
1412
                self.assertEqual(r.status_code, 201)
1413
                
1414

    
1415
                """Check public and format """
1416
                r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1417
                        format='xml', public=True)
1418
                self.assertEqual(r.status_code, 201)
1419
                self.assertTrue(r.headers['content-type'].index('xml') > 0)
1420
                
1421
                r = self.client.get_object_info(obj+'2')
1422
                self.assertTrue(r.has_key('x-object-public'))
1423

    
1424
        def test_object_post(self):
1425
                """Test object_POST"""
1426
                self.client.container=self.c2
1427
                obj = 'test2'
1428
                """create a filesystem file"""
1429
                self.fname = obj
1430
                newf = open(self.fname, 'w')
1431
                newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1432
                newf.close()
1433
                """create a file on container"""
1434
                r = self.client.object_put(obj, content_type='application/octet-stream',
1435
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1436
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1437
                
1438

    
1439
                """Append tests update, content_range, content_type, content_length"""
1440
                newf = open(obj, 'r')
1441
                self.client.append_object(obj, newf)
1442
                r = self.client.object_get(obj)
1443
                self.assertTrue(r.text.startswith('Hello!'))
1444
                
1445

    
1446
                """Overwrite tests update, content_type, content_length, content_range"""
1447
                newf.seek(0)
1448
                r = self.client.overwrite_object(obj, 0, 10, newf)
1449
                r = self.client.object_get(obj)
1450
                self.assertTrue(r.text.startswith('ello!'))
1451
                newf.close()
1452
                
1453
                
1454
                """Truncate tests update, content_range, content_type,
1455
                object_bytes and source_object"""
1456
                r = self.client.truncate_object(obj, 5)
1457
                r = self.client.object_get(obj)
1458
                self.assertEqual(r.text, 'ello!')
1459
                
1460

    
1461
                """Check metadata"""
1462
                self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1463
                r = self.client.get_object_meta(obj)
1464
                self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1465
                self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1466
                self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1467
                self.client.del_object_meta('mkey1', obj)
1468
                r = self.client.get_object_meta(obj)
1469
                self.assertFalse(r.has_key('x-object-meta-mkey1'))
1470

    
1471
                """Check permitions"""
1472
                self.client.set_object_sharing(obj,
1473
                        read_permition=['u4', 'u5'], write_permition=['u4'])
1474
                r = self.client.get_object_sharing(obj)
1475
                self.assertTrue(r.has_key('read'))
1476
                self.assertTrue('u5' in r['read'])
1477
                self.assertTrue(r.has_key('write'))
1478
                self.assertTrue('u4' in r['write'])
1479
                self.client.del_object_sharing(obj)
1480
                r = self.client.get_object_sharing(obj)
1481
                self.assertTrue(len(r) == 0)
1482

    
1483
                """Check publish"""
1484
                self.client.publish_object(obj)
1485
                r = self.client.get_object_info(obj)
1486
                self.assertTrue(r.has_key('x-object-public'))
1487
                self.client.unpublish_object(obj)
1488
                r = self.client.get_object_info(obj)
1489
                self.assertFalse(r.has_key('x-object-public'))
1490

    
1491
                """Check if_etag_(not)match"""
1492
                etag = r['etag']
1493
                #r = self.client.object_post(obj, update=True, public=True,
1494
                #        if_etag_not_match=etag, success=(412,202,204))
1495
                #self.assertEqual(r.status_code, 412)
1496
                
1497
                r = self.client.object_post(obj, update=True, public=True,
1498
                        if_etag_match=etag, content_encoding='application/json')
1499
                
1500
                r = self.client.get_object_info(obj)
1501
                helloVersion = r['x-object-version']
1502
                self.assertTrue(r.has_key('x-object-public'))
1503
                self.assertEqual(r['content-encoding'], 'application/json')
1504

    
1505
                """Check source_version and source_account and content_disposition"""
1506
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1507
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1508
                        source_account='thisAccountWillNeverExist@adminland.com',
1509
                        source_version=helloVersion, data='12345', success=(403, 202, 204))
1510
                self.assertEqual(r.status_code, 403)
1511
                
1512
                r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1513
                        content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1514
                        source_account=self.client.account, source_version=helloVersion, data='12345',
1515
                        content_disposition='attachment; filename="fname.ext"')
1516
                
1517
                r = self.client.object_get(obj)
1518
                self.assertEqual(r.text, 'eello!')
1519
                self.assertTrue(r.headers.has_key('content-disposition')
1520
                        and 'fname.ext' in r.headers['content-disposition'])
1521
                
1522

    
1523
                """Check manifest"""
1524
                mobj = 'manifest.test'
1525
                txt = ''
1526
                for i in range(10):
1527
                        txt += '%s'%i
1528
                        r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1529
                                content_encoding='application/octet-stream', content_type='application/octet-stream')
1530
                        
1531
                #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1532
                self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1533
                
1534
                r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1535
                
1536
                r = self.client.object_get(mobj)
1537
                self.assertEqual(r.text, txt)
1538
                
1539

    
1540
                """We need to check transfer_encoding """
1541

    
1542
        def test_object_delete(self):
1543
                """Test object_DELETE"""
1544
                self.client.container=self.c2
1545
                obj = 'test2'
1546
                """create a file on container"""
1547
                r = self.client.object_put(obj, content_type='application/octet-stream',
1548
                        data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1549
                        permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1550
                
1551

    
1552
                """Check with false until"""
1553
                r = self.client.object_delete(obj, until=1000000)
1554
                
1555
                r = self.client.object_get(obj, success=(200, 404))
1556
                self.assertEqual(r.status_code, 200)
1557
                
1558

    
1559
                """Check normal case"""
1560
                r = self.client.object_delete(obj)
1561
                self.assertEqual(r.status_code, 204)
1562
                
1563
                r = self.client.object_get(obj, success=(200, 404))
1564
                self.assertEqual(r.status_code, 404)
1565
                
1566

    
1567
        def create_large_file(self, size, name):
1568
                """Create a large file at fs"""
1569
                self.fname = name
1570
                import random
1571
                random.seed(self.now)
1572
                f = open(self.fname, 'w')
1573
                sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1574
                for hobyte_id in range(size/8):
1575
                        sss = 'hobt%s'%random.randint(1000, 9999)
1576
                        f.write(sss)
1577
                        if 0 == (hobyte_id*800)%size:
1578
                                f.write('\n')
1579
                                sys.stdout.write('\b\b')
1580
                                prs = (hobyte_id*800)//size
1581
                                if prs > 10:
1582
                                        sys.stdout.write('\b')
1583
                                sys.stdout.write('%s'%prs+'%')
1584
                                sys.stdout.flush()
1585
                print('\b\b\b100%')
1586
                f.close()
1587
                """"""
1588

    
1589
def init_parser():
1590
        parser = ArgumentParser(add_help=False)
1591
        parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1592
                help="Show this help message and exit")
1593
        return parser
1594

    
1595
if __name__ == '__main__':
1596
        parser = init_parser()
1597
        args, argv = parser.parse_known_args()
1598

    
1599
        if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1600
                raise Exception('\tusage: tests.py <group> [command]')
1601
        suiteFew = unittest.TestSuite()
1602

    
1603
        if len(argv) == 0 or argv[0] == 'pithos':
1604
                if len(argv) == 1:
1605
                        suiteFew.addTest(unittest.makeSuite(testPithos))
1606
                else:
1607
                        suiteFew.addTest(testPithos('test_'+argv[1]))
1608
        if len(argv) == 0 or argv[0] == 'cyclades':
1609
                if len(argv) == 1:
1610
                        #suiteFew.addTest(unittest.makeSuite(testCyclades))
1611
                        suiteFew.addTest(testCyclades('test_000'))
1612
                else:
1613
                        suiteFew.addTest(testCyclades('test_'+argv[1]))
1614

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