Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 4375e020

History | View | Annotate | Download (84 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
from argparse import ArgumentParser
35
import unittest
36
import time
37
import datetime
38
import os
39
import sys
40

    
41
try:
42
    from progress.bar import FillingCirclesBar as IncrementalBar
43
except ImportError:
44
    print('No progress bars in testing!')
45
    pass
46

    
47
from kamaki.clients import ClientError
48
from kamaki.clients.pithos import PithosClient as pithos
49
from kamaki.clients.cyclades import CycladesClient as cyclades
50
from kamaki.clients.image import ImageClient as image
51
from kamaki.clients.astakos import AstakosClient as astakos
52
from kamaki.cli.config import Config
53

    
54
TEST_ALL = False
55

    
56
cnf = Config()
57
global_username = cnf.get('global', 'account')
58
token = cnf.get('global', 'token')
59

    
60

    
61
class testAstakos(unittest.TestCase):
62
    def setUp(self):
63
        global cnf
64
        url = cnf.get('astakos', 'url')
65
        global token
66
        self.client = astakos(url, token)
67

    
68
    def tearDown(self):
69
        pass
70

    
71
    def test_authenticate(self):
72
        r = self.client.authenticate()
73
        for term in ('username',
74
            'auth_token_expires',
75
            'auth_token',
76
            'auth_token_created',
77
            'groups',
78
            'uniq',
79
            'has_credits',
80
            'has_signed_terms'):
81
            self.assertTrue(term in r)
82

    
83

    
84
class testImage(unittest.TestCase):
85
    def setUp(self):
86
        global cnf
87
        cyclades_url = cnf.get('compute', 'url')
88
        url = cnf.get('image', 'url')
89
        global token
90
        self.token = token
91
        self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
92
        self.now = time.mktime(time.gmtime())
93
        self.imgname = 'img_%s' % self.now
94
        global global_username
95
        self.imglocation = 'pithos://%s/pithos/my.img'\
96
        % global_username
97
        self.client = image(url, self.token)
98
        self.cyclades = cyclades(cyclades_url, self.token)
99
        self._imglist = {}
100

    
101
    def _prepare_img(self):
102
        global cnf
103
        global global_username
104
        username = global_username.split('@')[0]
105
        imglocalpath =\
106
        '/home/%s/src/kamaki-settings/files/centos.diskdump' % username
107
        f = open(imglocalpath, 'rb')
108
        pithcli = pithos(cnf.get('store', 'url'),
109
            self.token,
110
            global_username,
111
            'pithos')
112
        print('\t- Upload an image at %s...' % imglocalpath)
113
        pithcli.upload_object('my.img', f)
114
        print('\t- ok')
115
        f.close()
116

    
117
        self.client.register(self.imgname,
118
            self.imglocation,
119
            params=dict(is_public=True))
120
        img = self._get_img_by_name(self.imgname)
121
        self._imglist[self.imgname] = img
122

    
123
    def tearDown(self):
124
        for img in self._imglist.values():
125
            self.cyclades.delete_image(img['id'])
126

    
127
    def _get_img_by_name(self, name):
128
        r = self.cyclades.list_images()
129
        for img in r:
130
            if img['name'] == name:
131
                return img
132
        return None
133

    
134
    def assert_dicts_are_deeply_equal(self, d1, d2):
135
        for k, v in d1.items():
136
            self.assertTrue(k in d2)
137
            if isinstance(v, dict):
138
                self.assert_dicts_are_deeply_equal(v, d2[k])
139
            else:
140
                self.assertEqual(unicode(v), unicode(d2[k]))
141

    
142
    def test_list_public(self):
143
        """Test list_public"""
144
        r = self.client.list_public()
145
        r0 = self.client.list_public(order='-')
146
        self.assertTrue(len(r) > 0)
147
        for img in r:
148
            for term in ('status',
149
                'name',
150
                'container_format',
151
                'disk_format',
152
                'id',
153
                'size'):
154
                self.assertTrue(term in img)
155
        self.assertTrue(len(r), len(r0))
156
        r0.reverse()
157
        for i, img in enumerate(r):
158
            self.assert_dicts_are_deeply_equal(img, r0[i])
159
        r1 = self.client.list_public(detail=True)
160
        for img in r1:
161
            for term in ('status',
162
                'name',
163
                'checksum',
164
                'created_at',
165
                'disk_format',
166
                'updated_at',
167
                'id',
168
                'location',
169
                'container_format',
170
                'owner',
171
                'is_public',
172
                'deleted_at',
173
                'properties',
174
                'size'):
175
                self.assertTrue(term in img)
176
                for interm in (
177
                    'osfamily',
178
                    'users',
179
                    'os',
180
                    'root_partition',
181
                    'description'):
182
                    self.assertTrue(interm in img['properties'])
183
        size_max = 1000000000
184
        r2 = self.client.list_public(filters=dict(size_max=size_max))
185
        self.assertTrue(len(r2) <= len(r))
186
        for img in r2:
187
            self.assertTrue(int(img['size']) <= size_max)
188

    
189
    def test_get_meta(self):
190
        """Test get_meta"""
191
        r = self.client.get_meta(self.imgid)
192
        self.assertEqual(r['id'], self.imgid)
193
        for term in ('status',
194
            'name',
195
            'checksum',
196
            'updated-at',
197
            'created-at',
198
            'deleted-at',
199
            'location',
200
            'is-public',
201
            'owner',
202
            'disk-format',
203
            'size',
204
            'container-format'):
205
            self.assertTrue(term in r)
206
            for interm in ('kernel',
207
                'osfamily',
208
                'users',
209
                'gui', 'sortorder',
210
                'root-partition',
211
                'os',
212
                'description'):
213
                self.assertTrue(interm in r['properties'])
214

    
215
    def test_register(self):
216
        """Test register"""
217
        self._prepare_img()
218
        self.assertTrue(len(self._imglist) > 0)
219
        for img in self._imglist.values():
220
            self.assertTrue(img != None)
221

    
222
    def test_reregister(self):
223
        """Test reregister"""
224
        self._prepare_img()
225
        self.client.reregister(self.imglocation,
226
            properties=dict(my_property='some_value'))
227

    
228
    def test_set_members(self):
229
        """Test set_members"""
230
        self._prepare_img()
231
        members = ['%s@fake.net' % self.now]
232
        for img in self._imglist.values():
233
            self.client.set_members(img['id'], members)
234
            r = self.client.list_members(img['id'])
235
            self.assertEqual(r[0]['member_id'], members[0])
236

    
237
    def test_list_members(self):
238
        """Test list_members"""
239
        self.test_set_members()
240

    
241
    def test_remove_members(self):
242
        """Test remove_members - NO CHECK"""
243
        return
244
        self._prepare_img()
245
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
246
        for img in self._imglist.values():
247
            self.client.set_members(img['id'], members)
248
            r = self.client.list_members(img['id'])
249
            self.assertTrue(len(r) > 1)
250
            self.client.remove_member(img['id'], members[0])
251
            r0 = self.client.list_members(img['id'])
252
            self.assertEqual(len(r), 1 + len(r0))
253
            self.assertEqual(r0[0]['member_id'], members[1])
254

    
255
    def test_list_shared(self):
256
        """Test list_shared - NOT CHECKED"""
257
        #No way to test this, if I dont have member images
258
        pass
259

    
260

    
261
class testCyclades(unittest.TestCase):
262
    """Set up a Cyclades thorough test"""
263
    def setUp(self):
264
        """okeanos"""
265
        url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
266
        global token
267
        global global_username
268
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
269
        self.img_details = {
270
            u'status': u'ACTIVE',
271
            u'updated': u'2012-11-19T13:52:16+00:00',
272
            u'name': u'Debian Base',
273
            u'created': u'2012-10-16T09:03:12+00:00',
274
            u'progress': 100,
275
            u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
276
            u'metadata': {
277
                u'values': {
278
                    u'kernel': u'2.6.32',
279
                    u'osfamily': u'linux',
280
                    u'users': u'root',
281
                    u'gui': u'No GUI',
282
                    u'sortorder': u'1',
283
                    u'os': u'debian',
284
                    u'root_partition': u'1',
285
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
286
                }
287
            }
288
        self.flavor_details = {u'name': u'C1R1024D20',
289
            u'ram': 1024,
290
            u'id': 1,
291
            u'SNF:disk_template': u'drbd',
292
            u'disk': 20,
293
            u'cpu': 1}
294
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
295

    
296
        """okeanos.io"""
297
        #url = 'https://cyclades.okeanos.io/api/v1.1'
298
        #global token
299
        #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
300
        #self.img_details= {
301
        #    u'status': u'ACTIVE',
302
        #    u'updated': u'2012-08-21T12:57:39+00:00',
303
        #    u'name': u'Debian Base',
304
        #    u'created': u'2012-08-21T12:56:53+00:00',
305
        #    u'progress': 100,
306
        #    u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
307
        #    u'metadata': {
308
        #        u'values': {
309
        #            u'kernel': u'2.6.32',
310
        #            u'osfamily': u'linux',
311
        #            u'users': u'root',
312
        #            u'gui': u'No GUI',
313
        #            u'sortorder': u'1',
314
        #            u'os': u'debian',
315
        #            u'root_partition':
316
        #            u'1', u'description':
317
        #            u'Debian Squeeze Base System'}
318
        #        }
319
        #    }
320
        #flavorid = 1
321

    
322
        self.servers = {}
323
        self.now = time.mktime(time.gmtime())
324
        self.servname1 = 'serv' + unicode(self.now)
325
        self.servname2 = self.servname1 + '_v2'
326
        self.flavorid = 1
327
        #servers have to be created at the begining...
328
        self.networks = {}
329
        self.netname1 = 'net' + unicode(self.now)
330
        self.netname2 = 'net' + unicode(self.now) + '_v2'
331

    
332
        self.client = cyclades(url, token)
333
        pass
334

    
335
    def tearDown(self):
336
        """Destoy servers used in testing"""
337
        print
338
        for netid in self.networks.keys():
339
            self._delete_network(netid)
340
        if 0 >= len(self.servers):
341
            return
342
        there_are_servers_running = True
343
        deleted_servers = {}
344
        waitime = 0
345
        print('-> Found %s servers to delete' % len(self.servers))
346
        while there_are_servers_running:
347
            there_are_servers_running = False
348
            if waitime > 0:
349
                c = ['|', '/', '-', '\\']
350
                suffix = ''
351
                sys.stdout.write('\t. . . wait %s seconds: ' % waitime)
352
                for i in range(4 * waitime):
353
                    oldlen = len(suffix)
354
                    suffix = '%ss %s' % (i / 4, c[i % 4])
355
                    sys.stdout.write(oldlen * '\b' + suffix)
356
                    sys.stdout.flush()
357
                    time.sleep(0.25)
358
                oldlen = len(': ' + suffix)
359
                print(oldlen * '\b' + oldlen * ' ')
360
                sys.stdout.flush()
361
            waitime += 3
362
            dservers = self.client.list_servers(detail=True)
363
            for server in dservers:
364
                if server['name'] in self.servers.keys():
365
                    there_are_servers_running = True
366
                    sys.stdout.write('\t%s status:%s '\
367
                        % (server['name'], server['status']))
368
                    if server['status'] == 'BUILD':
369
                        print('\twait...')
370
                    else:
371
                        print('\tDELETE %s' % server['name'])
372
                        self._delete_server(server['id'])
373
                        self.servers.pop(server['name'])
374
                        deleted_servers[server['name']] = 0
375
                        waitime = 0
376
                elif server['name'] in deleted_servers.keys():
377
                    there_are_servers_running = True
378
                    sys.stdout.write('\t%s status:%s '\
379
                        % (server['name'], server['status']))
380
                    retries = deleted_servers[server['name']]
381
                    if retries > 10:
382
                        print('\tretry DELETE %s'\
383
                            % server['name'])
384
                        self._delete_server(server['id'])
385
                        retries = 0
386
                        waitime = 0
387
                    else:
388
                        print('\tnot deleted yet ...')
389
                    deleted_servers[server['name']] = retries + 1
390

    
391
    def _create_server(self, servername, flavorid, imageid, personality=None):
392
        server = self.client.create_server(servername,
393
            flavorid,
394
            imageid,
395
            personality)
396
        self.servers[servername] = server
397
        return server
398

    
399
    def _delete_server(self, servid):
400
        self.client.delete_server(servid)
401

    
402
    def _create_network(self, netname, **kwargs):
403
        net = self.client.create_network(netname, **kwargs)
404
        self.networks[net['id']] = net
405
        return net
406

    
407
    def _delete_network(self, netid):
408
        sys.stdout.write('\tDelete network %s ' % netid)
409
        self.client.disconnect_network_nics(netid)
410
        wait = 3
411
        while True:
412
            try:
413
                self.client.delete_network(netid)
414
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
415
                break
416
            except ClientError as err:
417
                self.assertEqual(err.status, 421)
418
                time.sleep(wait)
419
                wait += 3
420
                sys.stdout.write('.')
421

    
422
    def if_not_all(foo):
423
        global TEST_ALL
424
        if TEST_ALL:
425
            return None
426
        return foo
427

    
428
    def assert_dicts_are_deeply_equal(self, d1, d2):
429
        for k, v in d1.items():
430
            self.assertTrue(k in d2)
431
            if isinstance(v, dict):
432
                self.assert_dicts_are_deeply_equal(v, d2[k])
433
            else:
434
                self.assertEqual(unicode(v), unicode(d2[k]))
435

    
436
    def test_000(self):
437
        "Prepare a full Cyclades test scenario"
438
        global TEST_ALL
439
        TEST_ALL = True
440

    
441
        self.server1 = self._create_server(self.servname1,
442
            self.flavorid,
443
            self.img)
444
        self.server2 = self._create_server(self.servname2,
445
            self.flavorid + 2,
446
            self.img)
447

    
448
        print('testing')
449
        sys.stdout.write(' test create server')
450
        self._test_create_server()
451
        print('...ok')
452

    
453
        sys.stdout.write(' test list servers')
454
        self._test_list_servers()
455
        print('...ok')
456

    
457
        print('- wait for test servers to build')
458
        self._wait_for_status(self.server1['id'], 'BUILD')
459
        self._wait_for_status(self.server2['id'], 'BUILD')
460
        print('- ok')
461

    
462
        sys.stdout.write(' test get server details')
463
        self._test_get_server_details()
464
        print('...ok')
465

    
466
        sys.stdout.write(' test get image details')
467
        self._test_get_image_details()
468
        print('...ok')
469

    
470
        sys.stdout.write(' test update_server_name')
471
        self._test_update_server_name()
472
        print('...ok')
473

    
474
        sys.stdout.write(' test reboot_server')
475
        self._test_reboot_server()
476
        print('...ok')
477

    
478
        print('- wait for test servers to boot')
479
        self._wait_for_status(self.server1['id'], 'REBOOT')
480
        self._wait_for_status(self.server2['id'], 'REBOOT')
481
        print('- ok')
482

    
483
        sys.stdout.write(' test create_server_metadata')
484
        self._test_create_server_metadata()
485
        print('...ok')
486

    
487
        sys.stdout.write(' test get_server_metadata')
488
        self._test_get_server_metadata()
489
        print('...ok')
490

    
491
        sys.stdout.write(' test update_server_metadata')
492
        self._test_update_server_metadata()
493
        print('...ok')
494

    
495
        sys.stdout.write(' test delete_server_metadata')
496
        self._test_delete_server_metadata()
497
        print('...ok')
498

    
499
        sys.stdout.write(' test list_flavors')
500
        self._test_list_flavors()
501
        print('...ok')
502

    
503
        sys.stdout.write(' test get_flavor_details')
504
        self._test_get_flavor_details()
505
        print('...ok')
506

    
507
        sys.stdout.write(' test list_images')
508
        self._test_list_images()
509
        print('...ok')
510

    
511
        sys.stdout.write(' test get_image_details')
512
        self._test_get_image_details()
513
        print('...ok')
514

    
515
        sys.stdout.write(' test get_image_metadata')
516
        self._test_get_image_metadata()
517
        print('...ok')
518

    
519
        sys.stdout.write(' test shutdown_server')
520
        self._test_shutdown_server()
521
        print('...ok')
522

    
523
        sys.stdout.write(' test start_server')
524
        self._test_start_server()
525
        print('...ok')
526

    
527
        sys.stdout.write(' test get_server_console')
528
        self._test_get_server_console()
529
        print('...ok')
530

    
531
        sys.stdout.write(' test get_firewall_profile')
532
        self._test_get_firewall_profile()
533
        print('...ok')
534

    
535
        sys.stdout.write(' test set_firewall_profile')
536
        self._test_set_firewall_profile()
537
        print('...ok')
538

    
539
        sys.stdout.write(' test get_server_stats')
540
        self._test_get_server_stats()
541
        print('...ok')
542

    
543
        self.network1 = self._create_network(self.netname1)
544

    
545
        sys.stdout.write(' test create_network')
546
        self._test_create_network()
547
        print('...ok')
548

    
549
        print('- wait for network to be activated')
550
        self._wait_for_network(self.network1['id'], 'ACTIVE')
551
        print('- ok')
552

    
553
        sys.stdout.write(' test connect_server')
554
        self._test_connect_server()
555
        print('...ok')
556

    
557
        sys.stdout.write(' test disconnect_server')
558
        self._test_disconnect_server()
559
        print('...ok')
560

    
561
        self.network2 = self._create_network(self.netname2)
562
        print('- wait for network to be activated')
563
        self._wait_for_network(self.network2['id'], 'ACTIVE')
564
        print('- ok')
565

    
566
        sys.stdout.write(' test list_server_nics')
567
        self._test_list_server_nics()
568
        print('...ok')
569

    
570
        sys.stdout.write(' test list_networks')
571
        self._test_list_networks()
572
        print('...ok')
573

    
574
        sys.stdout.write(' test get_network_details')
575
        self._test_get_network_details()
576
        print('...ok')
577

    
578
        sys.stdout.write(' test update_network_name')
579
        self._test_update_network_name()
580
        print('...ok')
581

    
582
        """Don't have auth for these:
583
        sys.stdout.write(' test delete_image')
584
        self._test_delete_image()
585
        print('...ok')
586
        sys.stdout.write(' test create_image_metadata')
587
        self._test_create_image_metadata()
588
        print('...ok')
589
        sys.stdout.write(' test update_image_metadata')
590
        self._test_update_image_metadata()
591
        print('...ok')
592
        sys.stdout.write(' test delete_image_metadata')
593
        self._test_delete_image_metadata()
594
        print('...ok')
595
        """
596

    
597
    @if_not_all
598
    def test_parallel_creation(self):
599
        """test create with multiple threads"""
600
        from kamaki.clients import SilentEvent
601
        c1 = SilentEvent(self._create_server,
602
            self.servname1,
603
            self.flavorid,
604
            self.img)
605
        c2 = SilentEvent(self._create_server,
606
            self.servname2,
607
            self.flavorid + 2,
608
            self.img)
609
        c3 = SilentEvent(self._create_server,
610
            self.servname1,
611
            self.flavorid,
612
            self.img)
613
        c4 = SilentEvent(self._create_server,
614
            self.servname2,
615
            self.flavorid + 2,
616
            self.img)
617
        c5 = SilentEvent(self._create_server,
618
            self.servname1,
619
            self.flavorid,
620
            self.img)
621
        c6 = SilentEvent(self._create_server,
622
            self.servname2,
623
            self.flavorid + 2,
624
            self.img)
625
        c7 = SilentEvent(self._create_server,
626
            self.servname1,
627
            self.flavorid,
628
            self.img)
629
        c8 = SilentEvent(self._create_server,
630
            self.servname2,
631
            self.flavorid + 2,
632
            self.img)
633
        c1.start()
634
        c2.start()
635
        c3.start()
636
        c4.start()
637
        c5.start()
638
        c6.start()
639
        c7.start()
640
        c8.start()
641

    
642
    def _wait_for_network(self, netid, status):
643
        wait = 3
644
        limit = 50
645
        c = ['|', '/', '-', '\\']
646
        sys.stdout.write('\t- make net %s %s  ' % (netid, status))
647
        while wait < limit:
648
            r = self.client.get_network_details(netid)
649
            if r['status'] == status:
650
                print('\tOK')
651
                return True
652
            sys.stdout.write('\tit is now %s, wait %ss  '\
653
                % (r['status'], wait))
654
            for i in range(wait * 4):
655
                sys.stdout.write('\b%s' % c[i % 4])
656
                sys.stdout.flush()
657
                time.sleep(0.25)
658
            print('\b ')
659
            wait += 3
660
        return False
661

    
662
    def _wait_for_nic(self, netid, servid, in_creation=True):
663
        self._wait_for_network(netid, 'ACTIVE')
664
        c = ['|', '/', '-', '\\']
665
        limit = 50
666
        wait = 3
667
        largetry = 0
668
        while wait < limit:
669
            nics = self.client.list_server_nics(servid)
670
            for net in nics:
671
                found_nic = net['network_id'] == netid
672
                if (in_creation and found_nic)\
673
                or not (in_creation or found_nic):
674
                    return True
675
            dis = '' if in_creation else 'dis'
676
            sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '\
677
                % (netid, dis, servid, wait))
678
            for i in range(wait * 4):
679
                sys.stdout.write('\b%s' % c[i % 4])
680
                sys.stdout.flush()
681
                time.sleep(0.25)
682
            print('\b ')
683
            wait += 3
684
            if wait >= limit and largetry < 3:
685
                wait = 3
686
                largetry += 1
687
        return False
688

    
689
    def _has_status(self, servid, status):
690
        r = self.client.get_server_details(servid)
691
        return r['status'] == status
692

    
693
    def _wait_for_status(self, servid, status):
694
        wait_bar = IncrementalBar('\tServer[%s] in %s ' % (servid, status))
695
        wait_bar.start()
696

    
697
        def progress_gen(n):
698
            for i in wait_bar.iter(range(int(n))):
699
                yield
700
            yield
701

    
702
        self.client.wait_server(servid, status, wait_cb=progress_gen)
703
        wait_bar.finish()
704

    
705
    @if_not_all
706
    def test_list_servers(self):
707
        """Test list servers"""
708
        self.server1 = self._create_server(self.servname1,
709
            self.flavorid,
710
            self.img)
711
        self.server2 = self._create_server(self.servname2,
712
            self.flavorid + 1,
713
            self.img)
714
        self._test_list_servers()
715

    
716
    def _test_list_servers(self):
717
        servers = self.client.list_servers()
718
        dservers = self.client.list_servers(detail=True)
719

    
720
        """detailed and simple are same size"""
721
        self.assertEqual(len(dservers), len(servers))
722
        for i in range(len(servers)):
723
            for field in ('created',
724
            'flavorRef',
725
            'hostId',
726
            'imageRef',
727
            'progress',
728
            'status',
729
            'updated'):
730
                self.assertFalse(field in servers[i])
731
                self.assertTrue(field in dservers[i])
732

    
733
        """detailed and simple contain same names"""
734
        names = sorted(map(lambda x: x["name"], servers))
735
        dnames = sorted(map(lambda x: x["name"], dservers))
736
        self.assertEqual(names, dnames)
737

    
738
    @if_not_all
739
    def test_create_server(self):
740
        """Test create_server"""
741
        self.server1 = self._create_server(self.servname1,
742
            self.flavorid,
743
            self.img)
744
        self._wait_for_status(self.server1['id'], 'BUILD')
745
        self._test_create_server()
746

    
747
    def _test_create_server(self):
748
        self.assertEqual(self.server1["name"], self.servname1)
749
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
750
        self.assertEqual(self.server1["imageRef"], self.img)
751
        self.assertEqual(self.server1["status"], "BUILD")
752

    
753
    @if_not_all
754
    def test_get_server_details(self):
755
        """Test get_server_details"""
756
        self.server1 = self._create_server(self.servname1,
757
            self.flavorid,
758
            self.img)
759
        self._wait_for_status(self.server1['id'], 'BUILD')
760
        self._test_get_server_details()
761

    
762
    def _test_get_server_details(self):
763
        r = self.client.get_server_details(self.server1['id'])
764
        self.assertEqual(r["name"], self.servname1)
765
        self.assertEqual(r["flavorRef"], self.flavorid)
766
        self.assertEqual(r["imageRef"], self.img)
767
        self.assertEqual(r["status"], "ACTIVE")
768

    
769
    @if_not_all
770
    def test_update_server_name(self):
771
        """Test update_server_name"""
772
        self.server1 = self._create_server(self.servname1,
773
            self.flavorid,
774
            self.img)
775
        self._test_update_server_name()
776

    
777
    def _test_update_server_name(self):
778
        new_name = self.servname1 + '_new_name'
779
        self.client.update_server_name(self.server1['id'], new_name)
780
        r = self.client.get_server_details(self.server1['id'],
781
         success=(200, 400))
782
        self.assertEqual(r['name'], new_name)
783
        changed = self.servers.pop(self.servname1)
784
        changed['name'] = new_name
785
        self.servers[new_name] = changed
786

    
787
    @if_not_all
788
    def test_reboot_server(self):
789
        """Test reboot server"""
790
        self.server1 = self._create_server(self.servname1,
791
            self.flavorid,
792
            self.img)
793
        self._wait_for_status(self.server1['id'], 'BUILD')
794
        self.server2 = self._create_server(self.servname2,
795
            self.flavorid + 1,
796
            self.img)
797
        self._wait_for_status(self.server2['id'], 'BUILD')
798
        self._test_reboot_server()
799
        self._wait_for_status(self.server1['id'], 'REBOOT')
800
        self._wait_for_status(self.server2['id'], 'REBOOT')
801

    
802
    def _test_reboot_server(self):
803
        self.client.reboot_server(self.server1['id'])
804
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
805
        self.client.reboot_server(self.server2['id'], hard=True)
806
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
807

    
808
    @if_not_all
809
    def test_get_server_metadata(self):
810
        """Test get server_metadata"""
811
        self.server1 = self._create_server(self.servname1,
812
            self.flavorid,
813
            self.img)
814
        self._test_get_server_metadata()
815

    
816
    def _test_get_server_metadata(self):
817
        self.client.create_server_metadata(self.server1['id'],
818
            'mymeta_0',
819
            'val_0')
820
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
821
        self.assertEqual(r['mymeta_0'], 'val_0')
822

    
823
    @if_not_all
824
    def test_create_server_metadata(self):
825
        """Test create_server_metadata"""
826
        self.server1 = self._create_server(self.servname1,
827
            self.flavorid,
828
            self.img)
829
        self._test_create_server_metadata()
830

    
831
    def _test_create_server_metadata(self):
832
        r1 = self.client.create_server_metadata(self.server1['id'],
833
            'mymeta',
834
            'mymeta val')
835
        self.assertTrue('mymeta' in r1)
836
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
837
        self.assert_dicts_are_deeply_equal(r1, r2)
838

    
839
    @if_not_all
840
    def test_update_server_metadata(self):
841
        """Test update_server_metadata"""
842
        self.server1 = self._create_server(self.servname1,
843
            self.flavorid,
844
            self.img)
845
        self._test_update_server_metadata()
846

    
847
    def _test_update_server_metadata(self):
848
        r1 = self.client.create_server_metadata(self.server1['id'],
849
            'mymeta3',
850
            'val2')
851
        self.assertTrue('mymeta3'in r1)
852
        r2 = self.client.update_server_metadata(self.server1['id'],
853
            mymeta3='val3')
854
        self.assertTrue(r2['mymeta3'], 'val3')
855

    
856
    @if_not_all
857
    def test_delete_server_metadata(self):
858
        """Test delete_server_metadata"""
859
        self.server1 = self._create_server(self.servname1,
860
            self.flavorid,
861
            self.img)
862
        self._test_delete_server_metadata()
863

    
864
    def _test_delete_server_metadata(self):
865
        r1 = self.client.create_server_metadata(self.server1['id'],
866
            'mymeta',
867
            'val')
868
        self.assertTrue('mymeta' in r1)
869
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
870
        try:
871
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
872
            raise ClientError('Wrong Error', status=100)
873
        except ClientError as err:
874
            self.assertEqual(err.status, 404)
875

    
876
    @if_not_all
877
    def test_list_flavors(self):
878
        """Test flavors_get"""
879
        self._test_list_flavors()
880

    
881
    def _test_list_flavors(self):
882
        r = self.client.list_flavors()
883
        self.assertTrue(len(r) > 1)
884
        r = self.client.list_flavors(detail=True)
885
        self.assertTrue('SNF:disk_template' in r[0])
886

    
887
    @if_not_all
888
    def test_get_flavor_details(self):
889
        """Test test_get_flavor_details"""
890
        self._test_get_flavor_details()
891

    
892
    def _test_get_flavor_details(self):
893
        r = self.client.get_flavor_details(self.flavorid)
894
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
895

    
896
    @if_not_all
897
    def test_list_images(self):
898
        """Test list_images"""
899
        self._test_list_images()
900

    
901
    def _test_list_images(self):
902
        r = self.client.list_images()
903
        self.assertTrue(len(r) > 1)
904
        r = self.client.list_images(detail=True)
905
        for detailed_img in r:
906
            if detailed_img['id'] == self.img:
907
                break
908
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
909

    
910
    @if_not_all
911
    def test_get_image_details(self):
912
        """Test image_details"""
913
        self._test_get_image_details()
914

    
915
    def _test_get_image_details(self):
916
        r = self.client.get_image_details(self.img)
917
        r.pop('updated')
918
        self.assert_dicts_are_deeply_equal(r, self.img_details)
919

    
920
    @if_not_all
921
    def test_get_image_metadata(self):
922
        """Test get_image_metadata"""
923
        self._test_get_image_metadata()
924

    
925
    def _test_get_image_metadata(self):
926
        r = self.client.get_image_metadata(self.img)
927
        self.assert_dicts_are_deeply_equal(
928
            self.img_details['metadata']['values'], r)
929
        for key, val in self.img_details['metadata']['values'].items():
930
            r = self.client.get_image_metadata(self.img, key)
931
            self.assertEqual(r[key], val)
932

    
933
    @if_not_all
934
    def test_start_server(self):
935
        """Test start_server"""
936
        self.server1 = self._create_server(self.servname1,
937
            self.flavorid,
938
            self.img)
939
        self._wait_for_status(self.server1['id'], 'BUILD')
940
        self.client.shutdown_server(self.server1['id'])
941
        self._wait_for_status(self.server1['id'], 'ACTIVE')
942
        self._test_start_server()
943

    
944
    def _test_start_server(self):
945
        self.client.start_server(self.server1['id'])
946
        self._wait_for_status(self.server1['id'], 'STOPPED')
947
        r = self.client.get_server_details(self.server1['id'])
948
        self.assertEqual(r['status'], 'ACTIVE')
949

    
950
    @if_not_all
951
    def test_shutdown_server(self):
952
        """Test shutdown_server"""
953
        self.server1 = self._create_server(self.servname1,
954
            self.flavorid,
955
            self.img)
956
        self._wait_for_status(self.server1['id'], 'BUILD')
957
        self._test_shutdown_server()
958

    
959
    def _test_shutdown_server(self):
960
        self.client.shutdown_server(self.server1['id'])
961
        self._wait_for_status(self.server1['id'], 'ACTIVE')
962
        r = self.client.get_server_details(self.server1['id'])
963
        self.assertEqual(r['status'], 'STOPPED')
964

    
965
    @if_not_all
966
    def test_get_server_console(self):
967
        """Test get_server_console"""
968
        self.server2 = self._create_server(self.servname2,
969
            self.flavorid + 2,
970
            self.img)
971
        self._wait_for_status(self.server2['id'], 'BUILD')
972
        self._test_get_server_console()
973

    
974
    def _test_get_server_console(self):
975
        r = self.client.get_server_console(self.server2['id'])
976
        self.assertTrue('host' in r)
977
        self.assertTrue('password' in r)
978
        self.assertTrue('port' in r)
979
        self.assertTrue('type' in r)
980

    
981
    @if_not_all
982
    def test_get_firewall_profile(self):
983
        """Test get_firewall_profile"""
984
        self.server1 = self._create_server(self.servname1,
985
            self.flavorid,
986
            self.img)
987
        self._test_get_firewall_profile()
988

    
989
    def _test_get_firewall_profile(self):
990
        self._wait_for_status(self.server1['id'], 'BUILD')
991
        fprofile = self.client.get_firewall_profile(self.server1['id'])
992
        self.assertTrue(fprofile in self.PROFILES)
993

    
994
    @if_not_all
995
    def test_set_firewall_profile(self):
996
        """Test set_firewall_profile"""
997
        self.server1 = self._create_server(self.servname1,
998
            self.flavorid,
999
            self.img)
1000
        self._test_set_firewall_profile()
1001

    
1002
    def _test_set_firewall_profile(self):
1003

    
1004
        self._wait_for_status(self.server1['id'], 'BUILD')
1005
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
1006
        fprofile = self.client.get_firewall_profile(self.server1['id'])
1007
        print('')
1008
        for counter, fprofile in enumerate(PROFILES):
1009
            start = fprofile
1010
            npos = counter + 1
1011
            nprofile = PROFILES[npos] if npos < len(PROFILES) else PROFILES[0]
1012
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
1013
            self.client.set_firewall_profile(self.server1['id'], nprofile)
1014
            wait = 3
1015
            c = ['|', '/', '-', '\\']
1016
            while fprofile != nprofile:
1017
                if wait % 10 == 0:
1018
                    self.client.set_firewall_profile(self.server1['id'],
1019
                        nprofile)
1020
                self.assertEqual(fprofile, start)
1021
                sys.stdout.write('\t   profile is %s, wait %ss  '\
1022
                    % (fprofile, wait))
1023
                for i in range(4 * wait):
1024
                    sys.stdout.write('\b%s' % c[i % 4])
1025
                    sys.stdout.flush()
1026
                    time.sleep(0.25)
1027
                wait += 3
1028
                print('\b ')
1029
                fprofile = self.client.get_firewall_profile(self.server1['id'])
1030

    
1031
    @if_not_all
1032
    def test_get_server_stats(self):
1033
        self.server1 = self._create_server(self.servname1,
1034
            self.flavorid,
1035
            self.img)
1036
        self._test_get_server_stats()
1037

    
1038
    def _test_get_server_stats(self):
1039
        r = self.client.get_server_stats(self.server1['id'])
1040
        for term in ('cpuBar',
1041
        'cpuTimeSeries',
1042
        'netBar',
1043
        'netTimeSeries',
1044
        'refresh'):
1045
            self.assertTrue(term in r)
1046

    
1047
    @if_not_all
1048
    def test_list_networks(self):
1049
        """Test list_network"""
1050
        self.network1 = self._create_network(self.netname1)
1051
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1052
        self._test_list_networks()
1053

    
1054
    def _test_list_networks(self):
1055
        r = self.client.list_networks()
1056
        self.assertTrue(len(r) > 1)
1057
        ids = [net['id'] for net in r]
1058
        names = [net['name'] for net in r]
1059
        self.assertTrue('1' in ids)
1060
        self.assertTrue('public' in names)
1061
        self.assertTrue(self.network1['id'] in ids)
1062
        self.assertTrue(self.network1['name'] in names)
1063

    
1064
        r = self.client.list_networks(detail=True)
1065
        ids = [net['id'] for net in r]
1066
        names = [net['name'] for net in r]
1067
        for net in r:
1068
            self.assertTrue(net['id'] in ids)
1069
            self.assertTrue(net['name'] in names)
1070
            for term in ('status', 'updated', 'created'):
1071
                self.assertTrue(term in net.keys())
1072

    
1073
    @if_not_all
1074
    def test_create_network(self):
1075
        """Test create_network"""
1076
        self.network1 = self._create_network(self.netname1)
1077
        self._test_create_network()
1078

    
1079
    def _test_create_network(self):
1080
        nets = self.client.list_networks(self.network1['id'])
1081
        chosen = [net for net in nets if net['id'] == self.network1['id']][0]
1082
        chosen.pop('updated')
1083
        net1 = dict(self.network1)
1084
        net1.pop('updated')
1085
        self.assert_dicts_are_deeply_equal(chosen, net1)
1086

    
1087
    @if_not_all
1088
    def test_connect_server(self):
1089
        """Test connect_server"""
1090
        self.server1 = self._create_server(self.servname1,
1091
            self.flavorid,
1092
            self.img)
1093
        self.network1 = self._create_network(self.netname1)
1094
        self._wait_for_status(self.server1['id'], 'BUILD')
1095
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1096
        self._test_connect_server()
1097

    
1098
    def _test_connect_server(self):
1099
        self.client.connect_server(self.server1['id'], self.network1['id'])
1100
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1101
            self.server1['id']))
1102

    
1103
    @if_not_all
1104
    def test_disconnect_server(self):
1105
        """Test disconnect_server"""
1106
        self.test_connect_server()
1107
        self._test_disconnect_server()
1108

    
1109
    def _test_disconnect_server(self):
1110
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
1111
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1112
            self.server1['id'],
1113
            in_creation=False))
1114

    
1115
    @if_not_all
1116
    def test_list_server_nics(self):
1117
        """Test list_server_nics"""
1118
        self.server1 = self._create_server(self.servname1,
1119
            self.flavorid,
1120
            self.img)
1121
        self.network2 = self._create_network(self.netname2)
1122
        self._wait_for_status(self.server1['id'], 'BUILD')
1123
        self._wait_for_network(self.network2['id'], 'ACTIVE')
1124
        self._test_list_server_nics()
1125

    
1126
    def _test_list_server_nics(self):
1127
        r = self.client.list_server_nics(self.server1['id'])
1128
        len0 = len(r)
1129

    
1130
        self.client.connect_server(self.server1['id'], self.network2['id'])
1131
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1132
            self.server1['id']))
1133
        r = self.client.list_server_nics(self.server1['id'])
1134
        self.assertTrue(len(r) > len0)
1135

    
1136
    @if_not_all
1137
    def test_get_network_details(self):
1138
        """Test get_network_details"""
1139
        self.network1 = self._create_network(self.netname1)
1140
        self._test_get_network_details()
1141

    
1142
    def _test_get_network_details(self):
1143
        r = self.client.get_network_details(self.network1['id'])
1144
        net1 = dict(self.network1)
1145
        net1.pop('status')
1146
        net1.pop('updated', None)
1147
        net1.pop('attachments')
1148
        r.pop('status')
1149
        r.pop('updated', None)
1150
        r.pop('attachments')
1151
        self.assert_dicts_are_deeply_equal(net1, r)
1152

    
1153
    @if_not_all
1154
    def test_update_network_name(self):
1155
        self.network2 = self._create_network(self.netname2)
1156
        self._test_update_network_name()
1157

    
1158
    def _test_update_network_name(self):
1159
        updated_name = self.netname2 + '_upd'
1160
        self.client.update_network_name(self.network2['id'], updated_name)
1161
        wait = 3
1162
        c = ['|', '/', '-', '\\']
1163
        r = self.client.get_network_details(self.network2['id'])
1164
        while wait < 50:
1165
            if r['name'] == updated_name:
1166
                break
1167
            sys.stdout.write(
1168
                '\twait for %s renaming (%s->%s) %ss  ' % (self.network2['id'],
1169
                self.network2['name'],
1170
                updated_name, wait))
1171
            for i in range(4 * wait):
1172
                sys.stdout.write('\b%s' % c[i % 4])
1173
                sys.stdout.flush()
1174
                time.sleep(0.25)
1175
            print('')
1176
            wait += 3
1177
            r = self.client.get_network_details(self.network2['id'])
1178
        self.assertEqual(r['name'], updated_name)
1179

    
1180
    """ Don't have auth to test this
1181
    @if_not_all
1182
    def test_delete_image(self):
1183
        ""Test delete_image""
1184
        self._test_delete_image()
1185
    def _test_delete_image(self):
1186
        images = self.client.list_images()
1187
        self.client.delete_image(images[2]['id'])
1188
        try:
1189
            r = self.client.get_image_details(images[2]['id'], success=(400))
1190
        except ClientError as err:
1191
            self.assertEqual(err.status, 404)
1192

1193
    @if_not_all
1194
    def test_create_image_metadata(self):
1195
        ""Test create_image_metadata""
1196
        self._test_create_image_metadata()
1197
    def _test_create_image_metadata(self):
1198
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1199
        self.assertEqual(r['mykey'], 'myval')
1200

1201
    @if_not_all
1202
    def test_update_image_metadata(self):
1203
        ""Test update_image_metadata""
1204
        self._test_update_image_metadata()
1205
    def _test_update_image_metadata(self):
1206
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1207
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1208
        self.assertEqual(r['mykey0'], 'myval0')
1209

1210
    @if_not_all
1211
    def test_delete_image_metadata(self):
1212
        ""Test delete_image_metadata""
1213
        self._test_delete_image_metadata()
1214
    def _test_delete_image_metadata(self):
1215
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1216
        self.client.delete_image_metadata(self.img, 'mykey1')
1217
        r = self.client.get_image_metadata(self.img)
1218
        self.assertNotEqual('mykey1' in r)
1219
    """
1220

    
1221

    
1222
class testPithos(unittest.TestCase):
1223
    """Set up a Pithos+ thorough test"""
1224
    def setUp(self):
1225
        """
1226
        url = 'http://127.0.0.1:8000/v1'
1227
        global token
1228
        account = 'admin@adminland.com'
1229
        """
1230

    
1231
        global cnf
1232
        url = cnf.get('store', 'url')
1233

    
1234
        global token
1235
        global global_username
1236
        account = global_username
1237

    
1238
        """
1239
        url='https://pithos.okeanos.io/v1'
1240
        """
1241

    
1242
        """
1243
        def add_handler(name, level, prefix=''):
1244
            h = logging.StreamHandler()
1245
            fmt = logging.Formatter(prefix + '%(message)s')
1246
            h.setFormatter(fmt)
1247
            logger = logging.getLogger(name)
1248
            logger.addHandler(h)
1249
            logger.setLevel(level)
1250
        import logging
1251
        sendlog = logging.getLogger('clients.send')
1252
        recvlog = logging.getLogger('clients.recv')
1253
        add_handler('requests', logging.INFO, prefix='* ')
1254
        add_handler('clients.send', logging.INFO, prefix='> ')
1255
        add_handler('clients.recv', logging.INFO, prefix='< ')
1256
        """
1257

    
1258
        self.fname = None
1259
        container = None
1260
        self.client = pithos(url, token, account, container)
1261
        self.now = time.mktime(time.gmtime())
1262
        self.c1 = 'c1_' + unicode(self.now)
1263
        self.c2 = 'c2_' + unicode(self.now)
1264
        self.c3 = 'c3_' + unicode(self.now)
1265

    
1266
        self.client.create_container(self.c1)
1267
        self.client.create_container(self.c2)
1268
        self.client.create_container(self.c3)
1269
        self.makeNewObject(self.c1, 'test')
1270
        self.makeNewObject(self.c2, 'test')
1271
        self.now_unformated = datetime.datetime.utcnow()
1272
        self.makeNewObject(self.c1, 'test1')
1273
        self.makeNewObject(self.c2, 'test1')
1274
        """Prepare an object to be shared - also its container"""
1275
        self.client.container = self.c1
1276
        self.client.object_post('test',
1277
            update=True,
1278
            permissions={'read': 'someUser'})
1279

    
1280
        self.makeNewObject(self.c1, 'another.test')
1281

    
1282
    def makeNewObject(self, container, obj):
1283
        self.client.container = container
1284
        self.client.object_put(obj,
1285
            content_type='application/octet-stream',
1286
            data='file %s that lives in %s' % (obj, container),
1287
            metadata={'incontainer': container})
1288

    
1289
    def forceDeleteContainer(self, container):
1290
        self.client.container = container
1291
        try:
1292
            r = self.client.list_objects()
1293
        except ClientError:
1294
            return
1295
        for obj in r:
1296
            name = obj['name']
1297
            self.client.del_object(name)
1298
        r = self.client.container_delete()
1299
        self.container = ''
1300

    
1301
    def tearDown(self):
1302
        """Destroy test cases"""
1303
        if self.fname is not None:
1304
            try:
1305
                os.remove(self.fname)
1306
            except OSError:
1307
                pass
1308
            self.fname = None
1309
        self.forceDeleteContainer(self.c1)
1310
        self.forceDeleteContainer(self.c2)
1311
        try:
1312
            self.forceDeleteContainer(self.c3)
1313
        except ClientError:
1314
            pass
1315
        self.client.container = ''
1316

    
1317
    def test_000(self):
1318
        """Perform a full Pithos+ kamaki support test"""
1319

    
1320
    def test_account_head(self):
1321
        """Test account_HEAD"""
1322
        r = self.client.account_head()
1323
        self.assertEqual(r.status_code, 204)
1324

    
1325
        r = self.client.account_head(until='1000000000')
1326
        self.assertEqual(r.status_code, 204)
1327

    
1328
        r = self.client.get_account_info(until='1000000000')
1329
        datestring = unicode(r['x-account-until-timestamp'])
1330
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1331

    
1332
        r = self.client.get_account_quota()
1333
        self.assertTrue('x-account-policy-quota' in r)
1334

    
1335
        r = self.client.get_account_versioning()
1336
        self.assertTrue('x-account-policy-versioning' in r)
1337

    
1338
        """Check if(un)modified_since"""
1339
        for format in self.client.DATE_FORMATS:
1340
            now_formated = self.now_unformated.strftime(format)
1341
            r1 = self.client.account_head(if_modified_since=now_formated,
1342
                success=(204, 304, 412))
1343
            sc1 = r1.status_code
1344
            r1.release()
1345
            r2 = self.client.account_head(if_unmodified_since=now_formated,
1346
                success=(204, 304, 412))
1347
            sc2 = r2.status_code
1348
            r2.release()
1349
            self.assertNotEqual(sc1, sc2)
1350

    
1351
    def test_account_get(self):
1352
        """Test account_GET"""
1353
        #r = self.client.account_get()
1354
        #self.assertEqual(r.status_code, 200)
1355
        r = self.client.list_containers()
1356
        fullLen = len(r)
1357
        self.assertTrue(fullLen > 2)
1358

    
1359
        r = self.client.account_get(limit=1)
1360
        self.assertEqual(len(r.json), 1)
1361

    
1362
        r = self.client.account_get(marker='c2_')
1363
        temp_c0 = r.json[0]['name']
1364
        temp_c2 = r.json[2]['name']
1365

    
1366
        r = self.client.account_get(limit=2, marker='c2_')
1367
        conames = [container['name'] for container in r.json \
1368
            if container['name'].lower().startswith('c2_')]
1369
        self.assertTrue(temp_c0 in conames)
1370
        self.assertFalse(temp_c2 in conames)
1371

    
1372
        r = self.client.account_get(show_only_shared=True)
1373
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1374

    
1375
        r = self.client.account_get(until=1342609206)
1376
        self.assertTrue(len(r.json) <= fullLen)
1377

    
1378
        """Check if(un)modified_since"""
1379
        for format in self.client.DATE_FORMATS:
1380
            now_formated = self.now_unformated.strftime(format)
1381
            r1 = self.client.account_get(if_modified_since=now_formated,
1382
                success=(200, 304, 412))
1383
            sc1 = r1.status_code
1384
            r1.release()
1385
            r2 = self.client.account_get(if_unmodified_since=now_formated,
1386
                success=(200, 304, 412))
1387
            sc2 = r2.status_code
1388
            r2.release()
1389
            self.assertNotEqual(sc1, sc2)
1390

    
1391
        """Check sharing_accounts"""
1392
        r = self.client.get_sharing_accounts()
1393
        self.assertTrue(len(r) > 0)
1394

    
1395
    def test_account_post(self):
1396
        """Test account_POST"""
1397
        r = self.client.account_post()
1398
        self.assertEqual(r.status_code, 202)
1399
        grpName = 'grp' + unicode(self.now)
1400

    
1401
        """Method set/del_account_meta and set_account_groupcall use
1402
            account_post internally
1403
        """
1404
        self.client.set_account_group(grpName, ['u1', 'u2'])
1405
        r = self.client.get_account_group()
1406
        self.assertEqual(r['x-account-group-' + grpName], 'u1,u2')
1407
        self.client.del_account_group(grpName)
1408
        r = self.client.get_account_group()
1409
        self.assertTrue('x-account-group-' + grpName not in r)
1410

    
1411
        mprefix = 'meta' + unicode(self.now)
1412
        self.client.set_account_meta({mprefix + '1': 'v1',
1413
            mprefix + '2': 'v2'})
1414
        r = self.client.get_account_meta()
1415
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
1416
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
1417

    
1418
        self.client.del_account_meta(mprefix + '1')
1419
        r = self.client.get_account_meta()
1420
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
1421

    
1422
        self.client.del_account_meta(mprefix + '2')
1423
        r = self.client.get_account_meta()
1424
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
1425

    
1426
        """Missing testing for quota, versioning, because normally
1427
        you don't have permissions to modify those at account level
1428
        """
1429

    
1430
        newquota = 1000000
1431
        self.client.set_account_quota(newquota)
1432
        #r = self.client.get_account_info()
1433
        #print(unicode(r))
1434
        #r = self.client.get_account_quota()
1435
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1436
        self.client.set_account_versioning('auto')
1437

    
1438
    def test_container_head(self):
1439
        """Test container_HEAD"""
1440
        self.client.container = self.c1
1441

    
1442
        r = self.client.container_head()
1443
        self.assertEqual(r.status_code, 204)
1444

    
1445
        """Check until"""
1446
        r = self.client.container_head(until=1000000, success=(204, 404))
1447
        self.assertEqual(r.status_code, 404)
1448

    
1449
        """Check and if(un)modified_since"""
1450
        for format in self.client.DATE_FORMATS:
1451
            now_formated = self.now_unformated.strftime(format)
1452
            r1 = self.client.container_head(if_modified_since=now_formated,
1453
                success=(204, 304, 412))
1454
            sc1 = r1.status_code
1455
            r1.release()
1456
            r2 = self.client.container_head(if_unmodified_since=now_formated,
1457
                success=(204, 304, 412))
1458
            sc2 = r2.status_code
1459
            r2.release()
1460
            self.assertNotEqual(sc1, sc2)
1461

    
1462
        """Check container object meta"""
1463
        r = self.client.get_container_object_meta()
1464
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1465

    
1466
    def test_container_get(self):
1467
        """Test container_GET"""
1468
        self.client.container = self.c1
1469

    
1470
        r = self.client.container_get()
1471
        self.assertEqual(r.status_code, 200)
1472
        fullLen = len(r.json)
1473

    
1474
        r = self.client.container_get(prefix='test')
1475
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1476
        self.assertTrue(len(r.json) > 1)
1477
        self.assertEqual(len(r.json), len(lalobjects))
1478

    
1479
        r = self.client.container_get(limit=1)
1480
        self.assertEqual(len(r.json), 1)
1481

    
1482
        r = self.client.container_get(marker='another')
1483
        self.assertTrue(len(r.json) > 1)
1484
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1485
        self.assertEqual(len(r.json), len(neobjects))
1486

    
1487
        r = self.client.container_get(prefix='another.test', delimiter='.')
1488
        self.assertTrue(fullLen > len(r.json))
1489

    
1490
        r = self.client.container_get(path='/')
1491
        self.assertEqual(fullLen, len(r.json))
1492

    
1493
        r = self.client.container_get(format='xml')
1494
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1495

    
1496
        r = self.client.container_get(meta=['incontainer'])
1497
        self.assertTrue(len(r.json) > 0)
1498

    
1499
        r = self.client.container_get(show_only_shared=True)
1500
        self.assertTrue(len(r.json) < fullLen)
1501

    
1502
        try:
1503
            r = self.client.container_get(until=1000000000)
1504
            datestring = unicode(r.headers['x-account-until-timestamp'])
1505
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1506

    
1507
        except ClientError:
1508

    
1509
            pass
1510

    
1511
        """Check and if un/modified_since"""
1512
        for format in self.client.DATE_FORMATS:
1513
            now_formated = self.now_unformated.strftime(format)
1514
            r1 = self.client.container_get(if_modified_since=now_formated,
1515
                success=(200, 304, 412))
1516
            sc1 = r1.status_code
1517
            r1.release()
1518
            r2 = self.client.container_get(if_unmodified_since=now_formated,
1519
                success=(200, 304, 412))
1520
            sc2 = r2.status_code
1521
            r2.release()
1522
            self.assertNotEqual(sc1, sc2)
1523

    
1524
    def test_container_put(self):
1525
        """Test container_PUT"""
1526
        self.client.container = self.c2
1527

    
1528
        r = self.client.container_put()
1529
        self.assertEqual(r.status_code, 202)
1530

    
1531
        r = self.client.get_container_quota(self.client.container)
1532
        cquota = r.values()[0]
1533
        newquota = 2 * int(cquota)
1534

    
1535
        r = self.client.container_put(quota=newquota)
1536
        self.assertEqual(r.status_code, 202)
1537

    
1538
        r = self.client.get_container_quota(self.client.container)
1539
        xquota = int(r.values()[0])
1540
        self.assertEqual(newquota, xquota)
1541

    
1542
        r = self.client.container_put(versioning='auto')
1543
        self.assertEqual(r.status_code, 202)
1544

    
1545
        r = self.client.get_container_versioning(self.client.container)
1546
        nvers = r.values()[0]
1547
        self.assertEqual('auto', nvers)
1548

    
1549
        r = self.client.container_put(versioning='none')
1550
        self.assertEqual(r.status_code, 202)
1551

    
1552
        r = self.client.get_container_versioning(self.client.container)
1553
        nvers = r.values()[0]
1554
        self.assertEqual('none', nvers)
1555

    
1556
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1557
        self.assertEqual(r.status_code, 202)
1558

    
1559
        r = self.client.get_container_meta(self.client.container)
1560
        self.assertTrue('x-container-meta-m1' in r)
1561
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1562
        self.assertTrue('x-container-meta-m2' in r)
1563
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1564

    
1565
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
1566
        self.assertEqual(r.status_code, 202)
1567

    
1568
        r = self.client.get_container_meta(self.client.container)
1569
        self.assertTrue('x-container-meta-m1' not in r)
1570
        self.assertTrue('x-container-meta-m2' in r)
1571
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1572

    
1573
        self.client.del_container_meta(self.client.container)
1574

    
1575
    def test_container_post(self):
1576
        """Test container_POST"""
1577
        self.client.container = self.c2
1578

    
1579
        """Simple post"""
1580
        r = self.client.container_post()
1581
        self.assertEqual(r.status_code, 202)
1582

    
1583
        """post meta"""
1584
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
1585
        r = self.client.get_container_meta(self.client.container)
1586
        self.assertTrue('x-container-meta-m1' in r)
1587
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1588
        self.assertTrue('x-container-meta-m2' in r)
1589
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1590

    
1591
        """post/2del meta"""
1592
        r = self.client.del_container_meta('m1')
1593
        r = self.client.set_container_meta({'m2': 'v2a'})
1594
        r = self.client.get_container_meta(self.client.container)
1595
        self.assertTrue('x-container-meta-m1' not in r)
1596
        self.assertTrue('x-container-meta-m2' in r)
1597
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1598

    
1599
        """check quota"""
1600
        r = self.client.get_container_quota(self.client.container)
1601
        cquota = r.values()[0]
1602
        newquota = 2 * int(cquota)
1603
        r = self.client.set_container_quota(newquota)
1604
        r = self.client.get_container_quota(self.client.container)
1605
        xquota = int(r.values()[0])
1606
        self.assertEqual(newquota, xquota)
1607
        r = self.client.set_container_quota(cquota)
1608
        r = self.client.get_container_quota(self.client.container)
1609
        xquota = r.values()[0]
1610
        self.assertEqual(cquota, xquota)
1611

    
1612
        """Check versioning"""
1613
        self.client.set_container_versioning('auto')
1614
        r = self.client.get_container_versioning(self.client.container)
1615
        nvers = r.values()[0]
1616
        self.assertEqual('auto', nvers)
1617
        self.client.set_container_versioning('none')
1618
        r = self.client.get_container_versioning(self.client.container)
1619
        nvers = r.values()[0]
1620
        self.assertEqual('none', nvers)
1621

    
1622
        """put_block uses content_type and content_length to
1623
        post blocks of data 2 container. All that in upload_object"""
1624
        """Change a file at fs"""
1625
        self.create_large_file(1024 * 1024 * 100, 'l100M.' + unicode(self.now))
1626
        """Upload it at a directory in container"""
1627
        self.client.create_directory('dir')
1628
        newf = open(self.fname, 'r')
1629
        self.client.upload_object('/dir/sample.file', newf)
1630
        newf.close()
1631
        """Check if file has been uploaded"""
1632
        r = self.client.get_object_info('/dir/sample.file')
1633
        self.assertTrue(int(r['content-length']) > 100000000)
1634

    
1635
        """WTF is tranfer_encoding? What should I check about th** s**t? """
1636
        #TODO
1637

    
1638
        """Check update=False"""
1639
        r = self.client.object_post('test',
1640
            update=False,
1641
            metadata={'newmeta': 'newval'})
1642

    
1643
        r = self.client.get_object_info('test')
1644
        self.assertTrue('x-object-meta-newmeta' in r)
1645
        self.assertFalse('x-object-meta-incontainer' in r)
1646

    
1647
        r = self.client.del_container_meta('m2')
1648

    
1649
    def test_container_delete(self):
1650
        """Test container_DELETE"""
1651

    
1652
        """Fail to delete a non-empty container"""
1653
        self.client.container = self.c2
1654
        r = self.client.container_delete(success=409)
1655
        self.assertEqual(r.status_code, 409)
1656

    
1657
        """Fail to delete c3 (empty) container"""
1658
        self.client.container = self.c3
1659
        r = self.client.container_delete(until='1000000000')
1660
        self.assertEqual(r.status_code, 204)
1661

    
1662
        """Delete c3 (empty) container"""
1663
        r = self.client.container_delete()
1664
        self.assertEqual(r.status_code, 204)
1665

    
1666
        """Purge container(empty a container), check versionlist"""
1667
        self.client.container = self.c1
1668
        r = self.client.object_head('test', success=(200, 404))
1669
        self.assertEqual(r.status_code, 200)
1670
        self.client.del_container(delimiter='/')
1671
        r = self.client.object_head('test', success=(200, 404))
1672
        self.assertEqual(r.status_code, 404)
1673
        r = self.client.get_object_versionlist('test')
1674
        self.assertTrue(len(r) > 0)
1675
        self.assertTrue(len(r[0]) > 1)
1676
        self.client.purge_container()
1677
        self.assertRaises(ClientError,
1678
            self.client.get_object_versionlist,
1679
            'test')
1680

    
1681
    def test_object_head(self):
1682
        """Test object_HEAD"""
1683
        self.client.container = self.c2
1684
        obj = 'test'
1685

    
1686
        r = self.client.object_head(obj)
1687
        self.assertEqual(r.status_code, 200)
1688
        etag = r.headers['etag']
1689

    
1690
        r = self.client.object_head(obj, version=40)
1691
        self.assertEqual(r.headers['x-object-version'], '40')
1692

    
1693
        r = self.client.object_head(obj, if_etag_match=etag)
1694
        self.assertEqual(r.status_code, 200)
1695

    
1696
        r = self.client.object_head(obj,
1697
            if_etag_not_match=etag,
1698
            success=(200, 412, 304))
1699
        self.assertNotEqual(r.status_code, 200)
1700

    
1701
        r = self.client.object_head(obj,
1702
            version=40,
1703
            if_etag_match=etag,
1704
            success=412)
1705
        self.assertEqual(r.status_code, 412)
1706

    
1707
        """Check and if(un)modified_since"""
1708
        for format in self.client.DATE_FORMATS:
1709
            now_formated = self.now_unformated.strftime(format)
1710
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
1711
                success=(200, 304, 412))
1712
            sc1 = r1.status_code
1713
            r1.release()
1714
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1715
                success=(200, 304, 412))
1716
            sc2 = r2.status_code
1717
            r2.release()
1718
            self.assertNotEqual(sc1, sc2)
1719

    
1720
    def test_object_get(self):
1721
        """Test object_GET"""
1722
        self.client.container = self.c1
1723
        obj = 'test'
1724

    
1725
        r = self.client.object_get(obj)
1726
        self.assertEqual(r.status_code, 200)
1727

    
1728
        osize = int(r.headers['content-length'])
1729
        etag = r.headers['etag']
1730

    
1731
        r = self.client.object_get(obj, hashmap=True)
1732
        self.assertTrue('hashes' in r.json\
1733
            and 'block_hash' in r.json\
1734
            and 'block_size' in r.json\
1735
            and 'bytes' in r.json)
1736

    
1737
        r = self.client.object_get(obj, format='xml', hashmap=True)
1738
        self.assertEqual(len(r.text.split('hash>')), 3)
1739

    
1740
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1741
        r = self.client.object_get(obj,
1742
            data_range=rangestr,
1743
            success=(200, 206))
1744
        partsize = int(r.headers['content-length'])
1745
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1746

    
1747
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1748
        r = self.client.object_get(obj,
1749
            data_range=rangestr,
1750
            if_range=True,
1751
            success=(200, 206))
1752
        partsize = int(r.headers['content-length'])
1753
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1754

    
1755
        r = self.client.object_get(obj, if_etag_match=etag)
1756
        self.assertEqual(r.status_code, 200)
1757

    
1758
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1759
        self.assertEqual(r.status_code, 200)
1760

    
1761
        """Check and if(un)modified_since"""
1762
        for format in self.client.DATE_FORMATS:
1763
            now_formated = self.now_unformated.strftime(format)
1764
            r1 = self.client.object_get(obj, if_modified_since=now_formated,
1765
                success=(200, 304, 412))
1766
            sc1 = r1.status_code
1767
            r1.release()
1768
            r2 = self.client.object_get(obj,
1769
                if_unmodified_since=now_formated,
1770
                success=(200, 304, 412))
1771
            sc2 = r2.status_code
1772
            r2.release()
1773
            self.assertNotEqual(sc1, sc2)
1774

    
1775
        """Upload an object to download"""
1776
        src_fname = '/tmp/localfile1_%s' % self.now
1777
        dnl_fname = '/tmp/localfile2_%s' % self.now
1778
        trg_fname = 'remotefile_%s' % self.now
1779
        f_size = 59247824
1780
        self.create_large_file(f_size, src_fname)
1781
        src_f = open(src_fname, 'rb+')
1782
        print('\tUploading...')
1783
        self.client.upload_object(trg_fname, src_f)
1784
        src_f.close()
1785
        print('\tDownloading...')
1786
        dnl_f = open(dnl_fname, 'wb+')
1787
        self.client.download_object(trg_fname, dnl_f)
1788
        dnl_f.close()
1789

    
1790
        print('\tCheck if files match...')
1791
        src_f = open(src_fname)
1792
        dnl_f = open(dnl_fname)
1793
        for pos in (0, f_size / 2, f_size - 20):
1794
            src_f.seek(pos)
1795
            dnl_f.seek(pos)
1796
            self.assertEqual(src_f.read(10), dnl_f.read(10))
1797
        src_f.close()
1798
        dnl_f.close()
1799

    
1800
        os.remove(src_fname)
1801
        os.remove(dnl_fname)
1802

    
1803
    def test_object_put(self):
1804
        """Test object_PUT"""
1805

    
1806
        self.client.container = self.c2
1807
        obj = 'another.test'
1808

    
1809
        """create the object"""
1810
        r = self.client.object_put(obj,
1811
            data='a',
1812
            content_type='application/octer-stream',
1813
            permissions={
1814
                'read': ['accX:groupA', 'u1', 'u2'],
1815
                'write': ['u2', 'u3']},
1816
            metadata={'key1': 'val1', 'key2': 'val2'},
1817
            content_encoding='UTF-8',
1818
            content_disposition='attachment; filename="fname.ext"')
1819
        self.assertEqual(r.status_code, 201)
1820
        etag = r.headers['etag']
1821

    
1822
        """Check content-disposition"""
1823
        r = self.client.get_object_info(obj)
1824
        self.assertTrue('content-disposition' in r)
1825

    
1826
        """Check permissions"""
1827
        r = self.client.get_object_sharing(obj)
1828
        self.assertTrue('accx:groupa' in r['read'])
1829
        self.assertTrue('u1' in r['read'])
1830
        self.assertTrue('u2' in r['write'])
1831
        self.assertTrue('u3' in r['write'])
1832

    
1833
        """Check metadata"""
1834
        r = self.client.get_object_meta(obj)
1835
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1836
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1837

    
1838
        """Check public and if_etag_match"""
1839
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1840
            content_type='application/octet-stream', public=True)
1841

    
1842
        r = self.client.object_get(obj)
1843
        self.assertTrue('x-object-public' in r.headers)
1844
        vers2 = int(r.headers['x-object-version'])
1845
        etag = r.headers['etag']
1846
        self.assertEqual(r.text, 'b')
1847

    
1848
        """Check if_etag_not_match"""
1849
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1850
            content_type='application/octet-stream', success=(201, 412))
1851
        self.assertEqual(r.status_code, 412)
1852

    
1853
        """Check content_type and content_length"""
1854
        tmpdir = 'dir' + unicode(self.now)
1855
        r = self.client.object_put(tmpdir,
1856
            content_type='application/directory',
1857
            content_length=0)
1858

    
1859
        r = self.client.get_object_info(tmpdir)
1860
        self.assertEqual(r['content-type'], 'application/directory')
1861

    
1862
        """Check copy_from, content_encoding"""
1863
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1864
            format=None,
1865
            copy_from='/%s/%s' % (self.client.container, obj),
1866
            content_encoding='application/octet-stream',
1867
            source_account=self.client.account,
1868
            content_length=0, success=201)
1869
        self.assertEqual(r.status_code, 201)
1870

    
1871
        """Test copy_object for cross-conctainer copy"""
1872
        self.client.copy_object(src_container=self.c2,
1873
            src_object='%s/%s' % (tmpdir, obj),
1874
            dst_container=self.c1,
1875
            dst_object=obj)
1876
        self.client.container = self.c1
1877
        r1 = self.client.get_object_info(obj)
1878
        self.client.container = self.c2
1879
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
1880
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
1881

    
1882
        """Check cross-container copy_from, content_encoding"""
1883
        self.client.container = self.c1
1884
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
1885
        r = self.client.object_put(obj,
1886
            format=None,
1887
            copy_from=fromstr,
1888
            content_encoding='application/octet-stream',
1889
            source_account=self.client.account,
1890
            content_length=0, success=201)
1891

    
1892
        self.assertEqual(r.status_code, 201)
1893
        r = self.client.get_object_info(obj)
1894
        self.assertEqual(r['etag'], etag)
1895

    
1896
        """Check source_account"""
1897
        self.client.container = self.c2
1898
        fromstr = '/%s/%s' % (self.c1, obj)
1899
        r = self.client.object_put(obj + 'v2',
1900
            format=None,
1901
            move_from=fromstr,
1902
            content_encoding='application/octet-stream',
1903
            source_account='nonExistendAddress@NeverLand.com',
1904
            content_length=0,
1905
            success=(201, 403))
1906
        self.assertEqual(r.status_code, 403)
1907

    
1908
        """Check cross-container move_from"""
1909
        self.client.container = self.c1
1910
        r1 = self.client.get_object_info(obj)
1911
        self.client.container = self.c2
1912
        self.client.move_object(src_container=self.c1,
1913
            src_object=obj,
1914
            dst_container=self.c2,
1915
            dst_object=obj + 'v0')
1916
        r0 = self.client.get_object_info(obj + 'v0')
1917
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1918

    
1919
        """Check move_from"""
1920
        r = self.client.object_put(obj + 'v1',
1921
            format=None,
1922
            move_from='/%s/%s' % (self.c2, obj),
1923
            source_version=vers2,
1924
            content_encoding='application/octet-stream',
1925
            content_length=0, success=201)
1926

    
1927
        """Check manifest"""
1928
        mobj = 'manifest.test'
1929
        txt = ''
1930
        for i in range(10):
1931
            txt += '%s' % i
1932
            r = self.client.object_put('%s/%s' % (mobj, i),
1933
                data='%s' % i,
1934
                content_length=1,
1935
                success=201,
1936
                content_type='application/octet-stream',
1937
                content_encoding='application/octet-stream')
1938

    
1939
        r = self.client.object_put(mobj,
1940
            content_length=0,
1941
            content_type='application/octet-stream',
1942
            manifest='%s/%s' % (self.client.container, mobj))
1943

    
1944
        r = self.client.object_get(mobj)
1945
        self.assertEqual(r.text, txt)
1946

    
1947
        """Upload a local file with one request"""
1948
        self.create_large_file(1024 * 10, 'l10K.' + unicode(self.now))
1949
        newf = open(self.fname, 'r')
1950
        self.client.upload_object('sample.file', newf)
1951
        newf.close()
1952
        """Check if file has been uploaded"""
1953
        r = self.client.get_object_info('sample.file')
1954
        self.assertEqual(int(r['content-length']), 10260)
1955

    
1956
        """Some problems with transfer-encoding?"""
1957

    
1958
    def test_object_copy(self):
1959
        """Test object_COPY"""
1960
        self.client.container = self.c2
1961
        obj = 'test2'
1962

    
1963
        data = '{"key1":"val1", "key2":"val2"}'
1964
        r = self.client.object_put(obj + 'orig',
1965
            content_type='application/octet-stream',
1966
            data=data,
1967
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1968
            permissions={
1969
                'read': ['accX:groupA', 'u1', 'u2'],
1970
                'write': ['u2', 'u3']},
1971
            content_disposition='attachment; filename="fname.ext"')
1972

    
1973
        r = self.client.object_copy(obj + 'orig',
1974
            destination='/%s/%s' % (self.client.container, obj),
1975
            ignore_content_type=False, content_type='application/json',
1976
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1977
            permissions={'write': ['u5', 'accX:groupB']})
1978
        self.assertEqual(r.status_code, 201)
1979

    
1980
        """Check content-disposition"""
1981
        r = self.client.get_object_info(obj)
1982
        self.assertTrue('content-disposition' in r)
1983

    
1984
        """Check Metadata"""
1985
        r = self.client.get_object_meta(obj)
1986
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1987
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1988
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1989

    
1990
        """Check permissions"""
1991
        r = self.client.get_object_sharing(obj)
1992
        self.assertFalse('read' in r or 'u2' in r['write'])
1993
        self.assertTrue('accx:groupb' in r['write'])
1994

    
1995
        """Check destination account"""
1996
        r = self.client.object_copy(obj,
1997
            destination='/%s/%s' % (self.c1, obj),
1998
            content_encoding='utf8',
1999
            content_type='application/json',
2000
            destination_account='nonExistendAddress@NeverLand.com',
2001
            success=(201, 403))
2002
        self.assertEqual(r.status_code, 403)
2003

    
2004
        """Check destination being another container
2005
        and also content_type and content encoding"""
2006
        r = self.client.object_copy(obj,
2007
            destination='/%s/%s' % (self.c1, obj),
2008
            content_encoding='utf8',
2009
            content_type='application/json')
2010
        self.assertEqual(r.status_code, 201)
2011
        self.assertEqual(r.headers['content-type'],
2012
            'application/json; charset=UTF-8')
2013

    
2014
        """Check ignore_content_type and content_type"""
2015
        r = self.client.object_get(obj)
2016
        etag = r.headers['etag']
2017
        ctype = r.headers['content-type']
2018
        self.assertEqual(ctype, 'application/json')
2019

    
2020
        r = self.client.object_copy(obj + 'orig',
2021
            destination='/%s/%s0' % (self.client.container, obj),
2022
            ignore_content_type=True,
2023
            content_type='application/json')
2024
        self.assertEqual(r.status_code, 201)
2025
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2026

    
2027
        """Check if_etag_(not_)match"""
2028
        r = self.client.object_copy(obj,
2029
            destination='/%s/%s1' % (self.client.container, obj),
2030
            if_etag_match=etag)
2031
        self.assertEqual(r.status_code, 201)
2032

    
2033
        r = self.client.object_copy(obj,
2034
            destination='/%s/%s2' % (self.client.container, obj),
2035
            if_etag_not_match='lalala')
2036
        self.assertEqual(r.status_code, 201)
2037
        vers2 = r.headers['x-object-version']
2038

    
2039
        """Check source_version, public and format """
2040
        r = self.client.object_copy(obj + '2',
2041
            destination='/%s/%s3' % (self.client.container, obj),
2042
            source_version=vers2,
2043
            format='xml',
2044
            public=True)
2045
        self.assertEqual(r.status_code, 201)
2046
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2047

    
2048
        r = self.client.get_object_info(obj + '3')
2049
        self.assertTrue('x-object-public' in r)
2050

    
2051
    def test_object_move(self):
2052
        """Test object_MOVE"""
2053
        self.client.container = self.c2
2054
        obj = 'test2'
2055

    
2056
        data = '{"key1": "val1", "key2": "val2"}'
2057
        r = self.client.object_put(obj + 'orig',
2058
            content_type='application/octet-stream',
2059
            data=data,
2060
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2061
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2062
                'write': ['u2', 'u3']})
2063

    
2064
        r = self.client.object_move(obj + 'orig',
2065
            destination='/%s/%s' % (self.client.container, obj),
2066
            ignore_content_type=False,
2067
            content_type='application/json',
2068
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
2069
            permissions={'write': ['u5', 'accX:groupB']})
2070
        self.assertEqual(r.status_code, 201)
2071

    
2072
        """Check Metadata"""
2073
        r = self.client.get_object_meta(obj)
2074
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2075
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2076
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2077

    
2078
        """Check permissions"""
2079
        r = self.client.get_object_sharing(obj)
2080
        self.assertFalse('read' in r)
2081
        self.assertTrue('u5' in r['write'])
2082
        self.assertTrue('accx:groupb' in r['write'])
2083

    
2084
        """Check destination account"""
2085
        r = self.client.object_move(obj,
2086
            destination='/%s/%s' % (self.c1, obj),
2087
            content_encoding='utf8',
2088
            content_type='application/json',
2089
            destination_account='nonExistendAddress@NeverLand.com',
2090
            success=(201, 403))
2091
        self.assertEqual(r.status_code, 403)
2092

    
2093
        """Check destination being another container and also
2094
        content_type, content_disposition and content encoding"""
2095
        r = self.client.object_move(obj,
2096
            destination='/%s/%s' % (self.c1, obj),
2097
            content_encoding='utf8',
2098
            content_type='application/json',
2099
            content_disposition='attachment; filename="fname.ext"')
2100
        self.assertEqual(r.status_code, 201)
2101
        self.assertEqual(r.headers['content-type'],
2102
            'application/json; charset=UTF-8')
2103
        self.client.container = self.c1
2104
        r = self.client.get_object_info(obj)
2105
        self.assertTrue('content-disposition' in r\
2106
            and 'fname.ext' in r['content-disposition'])
2107
        etag = r['etag']
2108
        ctype = r['content-type']
2109
        self.assertEqual(ctype, 'application/json')
2110

    
2111
        """Check ignore_content_type and content_type"""
2112
        r = self.client.object_move(obj,
2113
            destination='/%s/%s' % (self.c2, obj),
2114
            ignore_content_type=True,
2115
            content_type='application/json')
2116
        self.assertEqual(r.status_code, 201)
2117
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2118

    
2119
        """Check if_etag_(not_)match"""
2120
        self.client.container = self.c2
2121
        r = self.client.object_move(obj,
2122
            destination='/%s/%s0' % (self.client.container, obj),
2123
            if_etag_match=etag)
2124
        self.assertEqual(r.status_code, 201)
2125

    
2126
        r = self.client.object_move(obj + '0',
2127
            destination='/%s/%s1' % (self.client.container, obj),
2128
            if_etag_not_match='lalala')
2129
        self.assertEqual(r.status_code, 201)
2130

    
2131
        """Check public and format """
2132
        r = self.client.object_move(obj + '1',
2133
            destination='/%s/%s2' % (self.client.container, obj),
2134
            format='xml', public=True)
2135
        self.assertEqual(r.status_code, 201)
2136
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2137

    
2138
        r = self.client.get_object_info(obj + '2')
2139
        self.assertTrue('x-object-public' in r)
2140

    
2141
    def test_object_post(self):
2142
        """Test object_POST"""
2143
        self.client.container = self.c2
2144
        obj = 'test2'
2145
        """create a filesystem file"""
2146
        self.fname = obj
2147
        newf = open(self.fname, 'w')
2148
        newf.writelines(['ello!\n',
2149
            'This is a test line\n',
2150
            'inside a test file\n'])
2151
        newf.close()
2152
        """create a file on container"""
2153
        r = self.client.object_put(obj,
2154
            content_type='application/octet-stream',
2155
            data='H',
2156
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2157
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2158
                'write': ['u2', 'u3']})
2159

    
2160
        """Append tests update, content_range, content_type, content_length"""
2161
        newf = open(obj, 'r')
2162
        self.client.append_object(obj, newf)
2163
        r = self.client.object_get(obj)
2164
        self.assertTrue(r.text.startswith('Hello!'))
2165

    
2166
        """Overwrite tests update,
2167
            content_type, content_length, content_range
2168
        """
2169
        newf.seek(0)
2170
        r = self.client.overwrite_object(obj, 0, 10, newf)
2171
        r = self.client.object_get(obj)
2172
        self.assertTrue(r.text.startswith('ello!'))
2173
        newf.close()
2174

    
2175
        """Truncate tests update,
2176
            content_range, content_type, object_bytes and source_object"""
2177
        r = self.client.truncate_object(obj, 5)
2178
        r = self.client.object_get(obj)
2179
        self.assertEqual(r.text, 'ello!')
2180

    
2181
        """Check metadata"""
2182
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2183
        r = self.client.get_object_meta(obj)
2184
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2185
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2186
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2187
        self.client.del_object_meta(obj, 'mkey1')
2188
        r = self.client.get_object_meta(obj)
2189
        self.assertFalse('x-object-meta-mkey1' in r)
2190

    
2191
        """Check permissions"""
2192
        self.client.set_object_sharing(obj,
2193
            read_permition=['u4', 'u5'], write_permition=['u4'])
2194
        r = self.client.get_object_sharing(obj)
2195
        self.assertTrue('read' in r)
2196
        self.assertTrue('u5' in r['read'])
2197
        self.assertTrue('write' in r)
2198
        self.assertTrue('u4' in r['write'])
2199
        self.client.del_object_sharing(obj)
2200
        r = self.client.get_object_sharing(obj)
2201
        self.assertTrue(len(r) == 0)
2202

    
2203
        """Check publish"""
2204
        self.client.publish_object(obj)
2205
        r = self.client.get_object_info(obj)
2206
        self.assertTrue('x-object-public' in r)
2207
        self.client.unpublish_object(obj)
2208
        r = self.client.get_object_info(obj)
2209
        self.assertFalse('x-object-public' in r)
2210

    
2211
        """Check if_etag_(not)match"""
2212
        etag = r['etag']
2213
        """
2214
        r = self.client.object_post(obj,
2215
            update=True,
2216
            public=True,
2217
            if_etag_not_match=etag,
2218
            success=(412, 202, 204))
2219
        self.assertEqual(r.status_code, 412)
2220
        """
2221

    
2222
        r = self.client.object_post(obj, update=True, public=True,
2223
            if_etag_match=etag, content_encoding='application/json')
2224

    
2225
        r = self.client.get_object_info(obj)
2226
        helloVersion = r['x-object-version']
2227
        self.assertTrue('x-object-public' in r)
2228
        self.assertEqual(r['content-encoding'], 'application/json')
2229

    
2230
        """Check source_version and source_account and content_disposition"""
2231
        r = self.client.object_post(obj,
2232
            update=True,
2233
            content_type='application/octet-srteam',
2234
            content_length=5,
2235
            content_range='bytes 1-5/*',
2236
            source_object='/%s/%s' % (self.c2, obj),
2237
            source_account='thisAccountWillNeverExist@adminland.com',
2238
            source_version=helloVersion,
2239
            data='12345',
2240
            success=(403, 202, 204))
2241
        self.assertEqual(r.status_code, 403)
2242

    
2243
        r = self.client.object_post(obj,
2244
            update=True,
2245
            content_type='application/octet-srteam',
2246
            content_length=5,
2247
            content_range='bytes 1-5/*',
2248
            source_object='/%s/%s' % (self.c2, obj),
2249
            source_account=self.client.account,
2250
            source_version=helloVersion,
2251
            data='12345',
2252
            content_disposition='attachment; filename="fname.ext"')
2253

    
2254
        r = self.client.object_get(obj)
2255
        self.assertEqual(r.text, 'eello!')
2256
        self.assertTrue('content-disposition' in r.headers\
2257
            and 'fname.ext' in r.headers['content-disposition'])
2258

    
2259
        """Check manifest"""
2260
        mobj = 'manifest.test'
2261
        txt = ''
2262
        for i in range(10):
2263
            txt += '%s' % i
2264
            r = self.client.object_put('%s/%s' % (mobj, i),
2265
            data='%s' % i,
2266
            content_length=1,
2267
            success=201,
2268
            content_encoding='application/octet-stream',
2269
            content_type='application/octet-stream')
2270

    
2271
        self.client.create_object_by_manifestation(mobj,
2272
            content_type='application/octet-stream')
2273

    
2274
        r = self.client.object_post(mobj,
2275
            manifest='%s/%s' % (self.client.container, mobj))
2276

    
2277
        r = self.client.object_get(mobj)
2278
        self.assertEqual(r.text, txt)
2279

    
2280
        """We need to check transfer_encoding """
2281

    
2282
    def test_object_delete(self):
2283
        """Test object_DELETE"""
2284
        self.client.container = self.c2
2285
        obj = 'test2'
2286
        """create a file on container"""
2287
        r = self.client.object_put(obj,
2288
            content_type='application/octet-stream',
2289
            data='H',
2290
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2291
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2292
                'write': ['u2', 'u3']})
2293

    
2294
        """Check with false until"""
2295
        r = self.client.object_delete(obj, until=1000000)
2296

    
2297
        r = self.client.object_get(obj, success=(200, 404))
2298
        self.assertEqual(r.status_code, 200)
2299

    
2300
        """Check normal case"""
2301
        r = self.client.object_delete(obj)
2302
        self.assertEqual(r.status_code, 204)
2303

    
2304
        r = self.client.object_get(obj, success=(200, 404))
2305
        self.assertEqual(r.status_code, 404)
2306

    
2307
    def create_large_file(self, size, name):
2308
        """Create a large file at fs"""
2309
        self.fname = name
2310
        import random
2311
        random.seed(self.now)
2312
        rf = open('/dev/urandom', 'r')
2313
        f = open(self.fname, 'w')
2314
        sys.stdout.write(
2315
            ' create random file %s of size %s      ' % (name, size))
2316
        for hobyte_id in range(size / 8):
2317
            #sss = 'hobt%s' % random.randint(1000, 9999)
2318
            f.write(rf.read(8))
2319
            if 0 == (hobyte_id * 800) % size:
2320
                f.write('\n')
2321
                f.flush()
2322
                prs = (hobyte_id * 800) // size
2323
                sys.stdout.write('\b\b')
2324
                if prs > 10:
2325
                    sys.stdout.write('\b')
2326
                sys.stdout.write('%s%%' % prs)
2327
                sys.stdout.flush()
2328
        print('\b\b\b100%')
2329
        f.flush()
2330
        rf.close()
2331
        f.close()
2332
        """"""
2333

    
2334

    
2335
def init_parser():
2336
    parser = ArgumentParser(add_help=False)
2337
    parser.add_argument('-h', '--help',
2338
        dest='help',
2339
        action='store_true',
2340
        default=False,
2341
        help="Show this help message and exit")
2342
    return parser
2343

    
2344

    
2345
def main(argv):
2346

    
2347
    suiteFew = unittest.TestSuite()
2348
    if len(argv) == 0 or argv[0] == 'pithos':
2349
        if len(argv) == 1:
2350
            suiteFew.addTest(unittest.makeSuite(testPithos))
2351
        else:
2352
            suiteFew.addTest(testPithos('test_' + argv[1]))
2353
    if len(argv) == 0 or argv[0] == 'cyclades':
2354
        if len(argv) == 1:
2355
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
2356
            suiteFew.addTest(testCyclades('test_000'))
2357
        else:
2358
            suiteFew.addTest(testCyclades('test_' + argv[1]))
2359
    if len(argv) == 0 or argv[0] == 'image':
2360
        if len(argv) == 1:
2361
            suiteFew.addTest(unittest.makeSuite(testImage))
2362
        else:
2363
            suiteFew.addTest(testImage('test_' + argv[1]))
2364
    if len(argv) == 0 or argv[0] == 'astakos':
2365
        if len(argv) == 1:
2366
            suiteFew.addTest(unittest.makeSuite(testAstakos))
2367
        else:
2368
            suiteFew.addTest(testAstakos('test_' + argv[1]))
2369

    
2370
    unittest.TextTestRunner(verbosity=2).run(suiteFew)
2371

    
2372
if __name__ == '__main__':
2373
    parser = init_parser()
2374
    args, argv = parser.parse_known_args()
2375
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2376
        raise Exception('\tusage: tests.py <group> [command]')
2377
    main(argv)