Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ bcebdfef

History | View | Annotate | Download (83.7 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
from progress.bar import IncrementalBar
42

    
43
from kamaki.clients import ClientError
44
from kamaki.clients.pithos import PithosClient as pithos
45
from kamaki.clients.cyclades import CycladesClient as cyclades
46
from kamaki.clients.image import ImageClient as image
47
from kamaki.clients.astakos import AstakosClient as astakos
48
from kamaki.cli.config import Config
49

    
50
TEST_ALL = False
51

    
52
cnf = Config('/home/saxtouri/.kamakirc')
53
global_username = cnf.get('global', 'account')
54
token = cnf.get('global', 'token')
55

    
56

    
57
class testAstakos(unittest.TestCase):
58
    def setUp(self):
59
        global cnf
60
        url = cnf.get('astakos', 'url')
61
        global token
62
        self.client = astakos(url, token)
63

    
64
    def tearDown(self):
65
        pass
66

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

    
79

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

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

    
113
        self.client.register(self.imgname,
114
            self.imglocation,
115
            params=dict(is_public=True))
116
        img = self._get_img_by_name(self.imgname)
117
        self._imglist[self.imgname] = img
118

    
119
    def tearDown(self):
120
        for img in self._imglist.values():
121
            self.cyclades.delete_image(img['id'])
122

    
123
    def _get_img_by_name(self, name):
124
        r = self.cyclades.list_images()
125
        for img in r:
126
            if img['name'] == name:
127
                return img
128
        return None
129

    
130
    def assert_dicts_are_deeply_equal(self, d1, d2):
131
        for k, v in d1.items():
132
            self.assertTrue(k in d2)
133
            if isinstance(v, dict):
134
                self.assert_dicts_are_deeply_equal(v, d2[k])
135
            else:
136
                self.assertEqual(unicode(v), unicode(d2[k]))
137

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

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

    
211
    def test_register(self):
212
        """Test register"""
213
        self._prepare_img()
214
        self.assertTrue(len(self._imglist) > 0)
215
        for img in self._imglist.values():
216
            self.assertTrue(img != None)
217

    
218
    def test_set_members(self):
219
        """Test set_members"""
220
        self._prepare_img()
221
        members = ['%s@fake.net' % self.now]
222
        for img in self._imglist.values():
223
            self.client.set_members(img['id'], members)
224
            r = self.client.list_members(img['id'])
225
            self.assertEqual(r[0]['member_id'], members[0])
226

    
227
    def test_list_members(self):
228
        """Test list_members"""
229
        self.test_set_members()
230

    
231
    def test_remove_members(self):
232
        """Test remove_members - NO CHECK"""
233
        return
234
        self._prepare_img()
235
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
236
        for img in self._imglist.values():
237
            self.client.set_members(img['id'], members)
238
            r = self.client.list_members(img['id'])
239
            self.assertTrue(len(r) > 1)
240
            self.client.remove_member(img['id'], members[0])
241
            r0 = self.client.list_members(img['id'])
242
            self.assertEqual(len(r), 1 + len(r0))
243
            self.assertEqual(r0[0]['member_id'], members[1])
244

    
245
    def test_list_shared(self):
246
        """Test list_shared - NOT CHECKED"""
247
        #No way to test this, if I dont have member images
248
        pass
249

    
250

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

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

    
312
        self.servers = {}
313
        self.now = time.mktime(time.gmtime())
314
        self.servname1 = 'serv' + unicode(self.now)
315
        self.servname2 = self.servname1 + '_v2'
316
        self.flavorid = 1
317
        #servers have to be created at the begining...
318
        self.networks = {}
319
        self.netname1 = 'net' + unicode(self.now)
320
        self.netname2 = 'net' + unicode(self.now) + '_v2'
321

    
322
        self.client = cyclades(url, token)
323
        pass
324

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

    
381
    def _create_server(self, servername, flavorid, imageid, personality=None):
382
        server = self.client.create_server(servername,
383
            flavorid,
384
            imageid,
385
            personality)
386
        self.servers[servername] = server
387
        return server
388

    
389
    def _delete_server(self, servid):
390
        self.client.delete_server(servid)
391

    
392
    def _create_network(self, netname, **kwargs):
393
        net = self.client.create_network(netname, **kwargs)
394
        self.networks[net['id']] = net
395
        return net
396

    
397
    def _delete_network(self, netid):
398
        sys.stdout.write('\tDelete network %s ' % netid)
399
        self.client.disconnect_network_nics(netid)
400
        wait = 3
401
        while True:
402
            try:
403
                self.client.delete_network(netid)
404
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
405
                break
406
            except ClientError as err:
407
                self.assertEqual(err.status, 421)
408
                time.sleep(wait)
409
                wait += 3
410
                sys.stdout.write('.')
411

    
412
    def if_not_all(foo):
413
        global TEST_ALL
414
        if TEST_ALL:
415
            return None
416
        return foo
417

    
418
    def assert_dicts_are_deeply_equal(self, d1, d2):
419
        for k, v in d1.items():
420
            self.assertTrue(k in d2)
421
            if isinstance(v, dict):
422
                self.assert_dicts_are_deeply_equal(v, d2[k])
423
            else:
424
                self.assertEqual(unicode(v), unicode(d2[k]))
425

    
426
    def test_000(self):
427
        "Prepare a full Cyclades test scenario"
428
        global TEST_ALL
429
        TEST_ALL = True
430

    
431
        self.server1 = self._create_server(self.servname1,
432
            self.flavorid,
433
            self.img)
434
        self.server2 = self._create_server(self.servname2,
435
            self.flavorid + 2,
436
            self.img)
437

    
438
        print('testing')
439
        sys.stdout.write(' test create server')
440
        self._test_create_server()
441
        print('...ok')
442

    
443
        sys.stdout.write(' test list servers')
444
        self._test_list_servers()
445
        print('...ok')
446

    
447
        print('- wait for test servers to build')
448
        self._wait_for_status(self.server1['id'], 'BUILD')
449
        self._wait_for_status(self.server2['id'], 'BUILD')
450
        print('- ok')
451

    
452
        sys.stdout.write(' test get server details')
453
        self._test_get_server_details()
454
        print('...ok')
455

    
456
        sys.stdout.write(' test get image details')
457
        self._test_get_image_details()
458
        print('...ok')
459

    
460
        sys.stdout.write(' test update_server_name')
461
        self._test_update_server_name()
462
        print('...ok')
463

    
464
        sys.stdout.write(' test reboot_server')
465
        self._test_reboot_server()
466
        print('...ok')
467

    
468
        print('- wait for test servers to boot')
469
        self._wait_for_status(self.server1['id'], 'REBOOT')
470
        self._wait_for_status(self.server2['id'], 'REBOOT')
471
        print('- ok')
472

    
473
        sys.stdout.write(' test create_server_metadata')
474
        self._test_create_server_metadata()
475
        print('...ok')
476

    
477
        sys.stdout.write(' test get_server_metadata')
478
        self._test_get_server_metadata()
479
        print('...ok')
480

    
481
        sys.stdout.write(' test update_server_metadata')
482
        self._test_update_server_metadata()
483
        print('...ok')
484

    
485
        sys.stdout.write(' test delete_server_metadata')
486
        self._test_delete_server_metadata()
487
        print('...ok')
488

    
489
        sys.stdout.write(' test list_flavors')
490
        self._test_list_flavors()
491
        print('...ok')
492

    
493
        sys.stdout.write(' test get_flavor_details')
494
        self._test_get_flavor_details()
495
        print('...ok')
496

    
497
        sys.stdout.write(' test list_images')
498
        self._test_list_images()
499
        print('...ok')
500

    
501
        sys.stdout.write(' test get_image_details')
502
        self._test_get_image_details()
503
        print('...ok')
504

    
505
        sys.stdout.write(' test get_image_metadata')
506
        self._test_get_image_metadata()
507
        print('...ok')
508

    
509
        sys.stdout.write(' test shutdown_server')
510
        self._test_shutdown_server()
511
        print('...ok')
512

    
513
        sys.stdout.write(' test start_server')
514
        self._test_start_server()
515
        print('...ok')
516

    
517
        sys.stdout.write(' test get_server_console')
518
        self._test_get_server_console()
519
        print('...ok')
520

    
521
        sys.stdout.write(' test get_firewall_profile')
522
        self._test_get_firewall_profile()
523
        print('...ok')
524

    
525
        sys.stdout.write(' test set_firewall_profile')
526
        self._test_set_firewall_profile()
527
        print('...ok')
528

    
529
        sys.stdout.write(' test get_server_stats')
530
        self._test_get_server_stats()
531
        print('...ok')
532

    
533
        self.network1 = self._create_network(self.netname1)
534

    
535
        sys.stdout.write(' test create_network')
536
        self._test_create_network()
537
        print('...ok')
538

    
539
        print('- wait for network to be activated')
540
        self._wait_for_network(self.network1['id'], 'ACTIVE')
541
        print('- ok')
542

    
543
        sys.stdout.write(' test connect_server')
544
        self._test_connect_server()
545
        print('...ok')
546

    
547
        sys.stdout.write(' test disconnect_server')
548
        self._test_disconnect_server()
549
        print('...ok')
550

    
551
        self.network2 = self._create_network(self.netname2)
552
        print('- wait for network to be activated')
553
        self._wait_for_network(self.network2['id'], 'ACTIVE')
554
        print('- ok')
555

    
556
        sys.stdout.write(' test list_server_nics')
557
        self._test_list_server_nics()
558
        print('...ok')
559

    
560
        sys.stdout.write(' test list_networks')
561
        self._test_list_networks()
562
        print('...ok')
563

    
564
        sys.stdout.write(' test get_network_details')
565
        self._test_get_network_details()
566
        print('...ok')
567

    
568
        sys.stdout.write(' test update_network_name')
569
        self._test_update_network_name()
570
        print('...ok')
571

    
572
        """Don't have auth for these:
573
        sys.stdout.write(' test delete_image')
574
        self._test_delete_image()
575
        print('...ok')
576
        sys.stdout.write(' test create_image_metadata')
577
        self._test_create_image_metadata()
578
        print('...ok')
579
        sys.stdout.write(' test update_image_metadata')
580
        self._test_update_image_metadata()
581
        print('...ok')
582
        sys.stdout.write(' test delete_image_metadata')
583
        self._test_delete_image_metadata()
584
        print('...ok')
585
        """
586

    
587
    @if_not_all
588
    def test_parallel_creation(self):
589
        """test create with multiple threads"""
590
        from kamaki.clients import SilentEvent
591
        c1 = SilentEvent(self._create_server,
592
            self.servname1,
593
            self.flavorid,
594
            self.img)
595
        c2 = SilentEvent(self._create_server,
596
            self.servname2,
597
            self.flavorid + 2,
598
            self.img)
599
        c3 = SilentEvent(self._create_server,
600
            self.servname1,
601
            self.flavorid,
602
            self.img)
603
        c4 = SilentEvent(self._create_server,
604
            self.servname2,
605
            self.flavorid + 2,
606
            self.img)
607
        c5 = SilentEvent(self._create_server,
608
            self.servname1,
609
            self.flavorid,
610
            self.img)
611
        c6 = SilentEvent(self._create_server,
612
            self.servname2,
613
            self.flavorid + 2,
614
            self.img)
615
        c7 = SilentEvent(self._create_server,
616
            self.servname1,
617
            self.flavorid,
618
            self.img)
619
        c8 = SilentEvent(self._create_server,
620
            self.servname2,
621
            self.flavorid + 2,
622
            self.img)
623
        c1.start()
624
        c2.start()
625
        c3.start()
626
        c4.start()
627
        c5.start()
628
        c6.start()
629
        c7.start()
630
        c8.start()
631

    
632
    def _wait_for_network(self, netid, status):
633
        wait = 3
634
        limit = 50
635
        c = ['|', '/', '-', '\\']
636
        sys.stdout.write('\t- make net %s %s  ' % (netid, status))
637
        while wait < limit:
638
            r = self.client.get_network_details(netid)
639
            if r['status'] == status:
640
                print('\tOK')
641
                return True
642
            sys.stdout.write('\tit is now %s, wait %ss  '\
643
                % (r['status'], wait))
644
            for i in range(wait * 4):
645
                sys.stdout.write('\b%s' % c[i % 4])
646
                sys.stdout.flush()
647
                time.sleep(0.25)
648
            print('\b ')
649
            wait += 3
650
        return False
651

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

    
679
    def _has_status(self, servid, status):
680
        r = self.client.get_server_details(servid)
681
        return r['status'] == status
682

    
683
    def _wait_for_status(self, servid, status):
684
        wait_bar = IncrementalBar('\tServer[%s] in %s ' % (servid, status))
685
        wait_bar.start()
686

    
687
        def progress_gen(n):
688
            for i in wait_bar.iter(range(int(n))):
689
                yield
690
            yield
691

    
692
        self.client.wait_server(servid, status, wait_cb=progress_gen)
693
        wait_bar.finish()
694

    
695
    @if_not_all
696
    def test_list_servers(self):
697
        """Test list servers"""
698
        self.server1 = self._create_server(self.servname1,
699
            self.flavorid,
700
            self.img)
701
        self.server2 = self._create_server(self.servname2,
702
            self.flavorid + 1,
703
            self.img)
704
        self._test_list_servers()
705

    
706
    def _test_list_servers(self):
707
        servers = self.client.list_servers()
708
        dservers = self.client.list_servers(detail=True)
709

    
710
        """detailed and simple are same size"""
711
        self.assertEqual(len(dservers), len(servers))
712
        for i in range(len(servers)):
713
            for field in ('created',
714
            'flavorRef',
715
            'hostId',
716
            'imageRef',
717
            'progress',
718
            'status',
719
            'updated'):
720
                self.assertFalse(field in servers[i])
721
                self.assertTrue(field in dservers[i])
722

    
723
        """detailed and simple contain same names"""
724
        names = sorted(map(lambda x: x["name"], servers))
725
        dnames = sorted(map(lambda x: x["name"], dservers))
726
        self.assertEqual(names, dnames)
727

    
728
    @if_not_all
729
    def test_create_server(self):
730
        """Test create_server"""
731
        self.server1 = self._create_server(self.servname1,
732
            self.flavorid,
733
            self.img)
734
        self._wait_for_status(self.server1['id'], 'BUILD')
735
        self._test_create_server()
736

    
737
    def _test_create_server(self):
738
        self.assertEqual(self.server1["name"], self.servname1)
739
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
740
        self.assertEqual(self.server1["imageRef"], self.img)
741
        self.assertEqual(self.server1["status"], "BUILD")
742

    
743
    @if_not_all
744
    def test_get_server_details(self):
745
        """Test get_server_details"""
746
        self.server1 = self._create_server(self.servname1,
747
            self.flavorid,
748
            self.img)
749
        self._wait_for_status(self.server1['id'], 'BUILD')
750
        self._test_get_server_details()
751

    
752
    def _test_get_server_details(self):
753
        r = self.client.get_server_details(self.server1['id'])
754
        self.assertEqual(r["name"], self.servname1)
755
        self.assertEqual(r["flavorRef"], self.flavorid)
756
        self.assertEqual(r["imageRef"], self.img)
757
        self.assertEqual(r["status"], "ACTIVE")
758

    
759
    @if_not_all
760
    def test_update_server_name(self):
761
        """Test update_server_name"""
762
        self.server1 = self._create_server(self.servname1,
763
            self.flavorid,
764
            self.img)
765
        self._test_update_server_name()
766

    
767
    def _test_update_server_name(self):
768
        new_name = self.servname1 + '_new_name'
769
        self.client.update_server_name(self.server1['id'], new_name)
770
        r = self.client.get_server_details(self.server1['id'],
771
         success=(200, 400))
772
        self.assertEqual(r['name'], new_name)
773
        changed = self.servers.pop(self.servname1)
774
        changed['name'] = new_name
775
        self.servers[new_name] = changed
776

    
777
    @if_not_all
778
    def test_reboot_server(self):
779
        """Test reboot server"""
780
        self.server1 = self._create_server(self.servname1,
781
            self.flavorid,
782
            self.img)
783
        self._wait_for_status(self.server1['id'], 'BUILD')
784
        self.server2 = self._create_server(self.servname2,
785
            self.flavorid + 1,
786
            self.img)
787
        self._wait_for_status(self.server2['id'], 'BUILD')
788
        self._test_reboot_server()
789
        self._wait_for_status(self.server1['id'], 'REBOOT')
790
        self._wait_for_status(self.server2['id'], 'REBOOT')
791

    
792
    def _test_reboot_server(self):
793
        self.client.reboot_server(self.server1['id'])
794
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
795
        self.client.reboot_server(self.server2['id'], hard=True)
796
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
797

    
798
    @if_not_all
799
    def test_get_server_metadata(self):
800
        """Test get server_metadata"""
801
        self.server1 = self._create_server(self.servname1,
802
            self.flavorid,
803
            self.img)
804
        self._test_get_server_metadata()
805

    
806
    def _test_get_server_metadata(self):
807
        self.client.create_server_metadata(self.server1['id'],
808
            'mymeta_0',
809
            'val_0')
810
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
811
        self.assertEqual(r['mymeta_0'], 'val_0')
812

    
813
    @if_not_all
814
    def test_create_server_metadata(self):
815
        """Test create_server_metadata"""
816
        self.server1 = self._create_server(self.servname1,
817
            self.flavorid,
818
            self.img)
819
        self._test_create_server_metadata()
820

    
821
    def _test_create_server_metadata(self):
822
        r1 = self.client.create_server_metadata(self.server1['id'],
823
            'mymeta',
824
            'mymeta val')
825
        self.assertTrue('mymeta' in r1)
826
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
827
        self.assert_dicts_are_deeply_equal(r1, r2)
828

    
829
    @if_not_all
830
    def test_update_server_metadata(self):
831
        """Test update_server_metadata"""
832
        self.server1 = self._create_server(self.servname1,
833
            self.flavorid,
834
            self.img)
835
        self._test_update_server_metadata()
836

    
837
    def _test_update_server_metadata(self):
838
        r1 = self.client.create_server_metadata(self.server1['id'],
839
            'mymeta3',
840
            'val2')
841
        self.assertTrue('mymeta3'in r1)
842
        r2 = self.client.update_server_metadata(self.server1['id'],
843
            mymeta3='val3')
844
        self.assertTrue(r2['mymeta3'], 'val3')
845

    
846
    @if_not_all
847
    def test_delete_server_metadata(self):
848
        """Test delete_server_metadata"""
849
        self.server1 = self._create_server(self.servname1,
850
            self.flavorid,
851
            self.img)
852
        self._test_delete_server_metadata()
853

    
854
    def _test_delete_server_metadata(self):
855
        r1 = self.client.create_server_metadata(self.server1['id'],
856
            'mymeta',
857
            'val')
858
        self.assertTrue('mymeta' in r1)
859
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
860
        try:
861
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
862
            raise ClientError('Wrong Error', status=100)
863
        except ClientError as err:
864
            self.assertEqual(err.status, 404)
865

    
866
    @if_not_all
867
    def test_list_flavors(self):
868
        """Test flavors_get"""
869
        self._test_list_flavors()
870

    
871
    def _test_list_flavors(self):
872
        r = self.client.list_flavors()
873
        self.assertTrue(len(r) > 1)
874
        r = self.client.list_flavors(detail=True)
875
        self.assertTrue('SNF:disk_template' in r[0])
876

    
877
    @if_not_all
878
    def test_get_flavor_details(self):
879
        """Test test_get_flavor_details"""
880
        self._test_get_flavor_details()
881

    
882
    def _test_get_flavor_details(self):
883
        r = self.client.get_flavor_details(self.flavorid)
884
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
885

    
886
    @if_not_all
887
    def test_list_images(self):
888
        """Test list_images"""
889
        self._test_list_images()
890

    
891
    def _test_list_images(self):
892
        r = self.client.list_images()
893
        self.assertTrue(len(r) > 1)
894
        r = self.client.list_images(detail=True)
895
        for detailed_img in r:
896
            if detailed_img['id'] == self.img:
897
                break
898
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
899

    
900
    @if_not_all
901
    def test_get_image_details(self):
902
        """Test image_details"""
903
        self._test_get_image_details()
904

    
905
    def _test_get_image_details(self):
906
        r = self.client.get_image_details(self.img)
907
        r.pop('updated')
908
        self.assert_dicts_are_deeply_equal(r, self.img_details)
909

    
910
    @if_not_all
911
    def test_get_image_metadata(self):
912
        """Test get_image_metadata"""
913
        self._test_get_image_metadata()
914

    
915
    def _test_get_image_metadata(self):
916
        r = self.client.get_image_metadata(self.img)
917
        self.assert_dicts_are_deeply_equal(
918
            self.img_details['metadata']['values'], r)
919
        for key, val in self.img_details['metadata']['values'].items():
920
            r = self.client.get_image_metadata(self.img, key)
921
            self.assertEqual(r[key], val)
922

    
923
    @if_not_all
924
    def test_start_server(self):
925
        """Test start_server"""
926
        self.server1 = self._create_server(self.servname1,
927
            self.flavorid,
928
            self.img)
929
        self._wait_for_status(self.server1['id'], 'BUILD')
930
        self.client.shutdown_server(self.server1['id'])
931
        self._wait_for_status(self.server1['id'], 'ACTIVE')
932
        self._test_start_server()
933

    
934
    def _test_start_server(self):
935
        self.client.start_server(self.server1['id'])
936
        self._wait_for_status(self.server1['id'], 'STOPPED')
937
        r = self.client.get_server_details(self.server1['id'])
938
        self.assertEqual(r['status'], 'ACTIVE')
939

    
940
    @if_not_all
941
    def test_shutdown_server(self):
942
        """Test shutdown_server"""
943
        self.server1 = self._create_server(self.servname1,
944
            self.flavorid,
945
            self.img)
946
        self._wait_for_status(self.server1['id'], 'BUILD')
947
        self._test_shutdown_server()
948

    
949
    def _test_shutdown_server(self):
950
        self.client.shutdown_server(self.server1['id'])
951
        self._wait_for_status(self.server1['id'], 'ACTIVE')
952
        r = self.client.get_server_details(self.server1['id'])
953
        self.assertEqual(r['status'], 'STOPPED')
954

    
955
    @if_not_all
956
    def test_get_server_console(self):
957
        """Test get_server_console"""
958
        self.server2 = self._create_server(self.servname2,
959
            self.flavorid + 2,
960
            self.img)
961
        self._wait_for_status(self.server2['id'], 'BUILD')
962
        self._test_get_server_console()
963

    
964
    def _test_get_server_console(self):
965
        r = self.client.get_server_console(self.server2['id'])
966
        self.assertTrue('host' in r)
967
        self.assertTrue('password' in r)
968
        self.assertTrue('port' in r)
969
        self.assertTrue('type' in r)
970

    
971
    @if_not_all
972
    def test_get_firewall_profile(self):
973
        """Test get_firewall_profile"""
974
        self.server1 = self._create_server(self.servname1,
975
            self.flavorid,
976
            self.img)
977
        self._test_get_firewall_profile()
978

    
979
    def _test_get_firewall_profile(self):
980
        self._wait_for_status(self.server1['id'], 'BUILD')
981
        fprofile = self.client.get_firewall_profile(self.server1['id'])
982
        self.assertTrue(fprofile in self.PROFILES)
983

    
984
    @if_not_all
985
    def test_set_firewall_profile(self):
986
        """Test set_firewall_profile"""
987
        self.server1 = self._create_server(self.servname1,
988
            self.flavorid,
989
            self.img)
990
        self._test_set_firewall_profile()
991

    
992
    def _test_set_firewall_profile(self):
993

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

    
1021
    @if_not_all
1022
    def test_get_server_stats(self):
1023
        self.server1 = self._create_server(self.servname1,
1024
            self.flavorid,
1025
            self.img)
1026
        self._test_get_server_stats()
1027

    
1028
    def _test_get_server_stats(self):
1029
        r = self.client.get_server_stats(self.server1['id'])
1030
        for term in ('cpuBar',
1031
        'cpuTimeSeries',
1032
        'netBar',
1033
        'netTimeSeries',
1034
        'refresh'):
1035
            self.assertTrue(term in r)
1036

    
1037
    @if_not_all
1038
    def test_list_networks(self):
1039
        """Test list_network"""
1040
        self.network1 = self._create_network(self.netname1)
1041
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1042
        self._test_list_networks()
1043

    
1044
    def _test_list_networks(self):
1045
        r = self.client.list_networks()
1046
        self.assertTrue(len(r) > 1)
1047
        ids = [net['id'] for net in r]
1048
        names = [net['name'] for net in r]
1049
        self.assertTrue('1' in ids)
1050
        self.assertTrue('public' in names)
1051
        self.assertTrue(self.network1['id'] in ids)
1052
        self.assertTrue(self.network1['name'] in names)
1053

    
1054
        r = self.client.list_networks(detail=True)
1055
        ids = [net['id'] for net in r]
1056
        names = [net['name'] for net in r]
1057
        for net in r:
1058
            self.assertTrue(net['id'] in ids)
1059
            self.assertTrue(net['name'] in names)
1060
            for term in ('status', 'updated', 'created'):
1061
                self.assertTrue(term in net.keys())
1062

    
1063
    @if_not_all
1064
    def test_create_network(self):
1065
        """Test create_network"""
1066
        self.network1 = self._create_network(self.netname1)
1067
        self._test_create_network()
1068

    
1069
    def _test_create_network(self):
1070
        nets = self.client.list_networks(self.network1['id'])
1071
        chosen = [net for net in nets if net['id'] == self.network1['id']][0]
1072
        chosen.pop('updated')
1073
        net1 = dict(self.network1)
1074
        net1.pop('updated')
1075
        self.assert_dicts_are_deeply_equal(chosen, net1)
1076

    
1077
    @if_not_all
1078
    def test_connect_server(self):
1079
        """Test connect_server"""
1080
        self.server1 = self._create_server(self.servname1,
1081
            self.flavorid,
1082
            self.img)
1083
        self.network1 = self._create_network(self.netname1)
1084
        self._wait_for_status(self.server1['id'], 'BUILD')
1085
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1086
        self._test_connect_server()
1087

    
1088
    def _test_connect_server(self):
1089
        self.client.connect_server(self.server1['id'], self.network1['id'])
1090
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1091
            self.server1['id']))
1092

    
1093
    @if_not_all
1094
    def test_disconnect_server(self):
1095
        """Test disconnect_server"""
1096
        self.test_connect_server()
1097
        self._test_disconnect_server()
1098

    
1099
    def _test_disconnect_server(self):
1100
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
1101
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1102
            self.server1['id'],
1103
            in_creation=False))
1104

    
1105
    @if_not_all
1106
    def test_list_server_nics(self):
1107
        """Test list_server_nics"""
1108
        self.server1 = self._create_server(self.servname1,
1109
            self.flavorid,
1110
            self.img)
1111
        self.network2 = self._create_network(self.netname2)
1112
        self._wait_for_status(self.server1['id'], 'BUILD')
1113
        self._wait_for_network(self.network2['id'], 'ACTIVE')
1114
        self._test_list_server_nics()
1115

    
1116
    def _test_list_server_nics(self):
1117
        r = self.client.list_server_nics(self.server1['id'])
1118
        len0 = len(r)
1119

    
1120
        self.client.connect_server(self.server1['id'], self.network2['id'])
1121
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1122
            self.server1['id']))
1123
        r = self.client.list_server_nics(self.server1['id'])
1124
        self.assertTrue(len(r) > len0)
1125

    
1126
    @if_not_all
1127
    def test_get_network_details(self):
1128
        """Test get_network_details"""
1129
        self.network1 = self._create_network(self.netname1)
1130
        self._test_get_network_details()
1131

    
1132
    def _test_get_network_details(self):
1133
        r = self.client.get_network_details(self.network1['id'])
1134
        net1 = dict(self.network1)
1135
        net1.pop('status')
1136
        net1.pop('updated', None)
1137
        net1.pop('attachments')
1138
        r.pop('status')
1139
        r.pop('updated', None)
1140
        r.pop('attachments')
1141
        self.assert_dicts_are_deeply_equal(net1, r)
1142

    
1143
    @if_not_all
1144
    def test_update_network_name(self):
1145
        self.network2 = self._create_network(self.netname2)
1146
        self._test_update_network_name()
1147

    
1148
    def _test_update_network_name(self):
1149
        updated_name = self.netname2 + '_upd'
1150
        self.client.update_network_name(self.network2['id'], updated_name)
1151
        wait = 3
1152
        c = ['|', '/', '-', '\\']
1153
        r = self.client.get_network_details(self.network2['id'])
1154
        while wait < 50:
1155
            if r['name'] == updated_name:
1156
                break
1157
            sys.stdout.write(
1158
                '\twait for %s renaming (%s->%s) %ss  ' % (self.network2['id'],
1159
                self.network2['name'],
1160
                updated_name, wait))
1161
            for i in range(4 * wait):
1162
                sys.stdout.write('\b%s' % c[i % 4])
1163
                sys.stdout.flush()
1164
                time.sleep(0.25)
1165
            print('')
1166
            wait += 3
1167
            r = self.client.get_network_details(self.network2['id'])
1168
        self.assertEqual(r['name'], updated_name)
1169

    
1170
    """ Don't have auth to test this
1171
    @if_not_all
1172
    def test_delete_image(self):
1173
        ""Test delete_image""
1174
        self._test_delete_image()
1175
    def _test_delete_image(self):
1176
        images = self.client.list_images()
1177
        self.client.delete_image(images[2]['id'])
1178
        try:
1179
            r = self.client.get_image_details(images[2]['id'], success=(400))
1180
        except ClientError as err:
1181
            self.assertEqual(err.status, 404)
1182

1183
    @if_not_all
1184
    def test_create_image_metadata(self):
1185
        ""Test create_image_metadata""
1186
        self._test_create_image_metadata()
1187
    def _test_create_image_metadata(self):
1188
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1189
        self.assertEqual(r['mykey'], 'myval')
1190

1191
    @if_not_all
1192
    def test_update_image_metadata(self):
1193
        ""Test update_image_metadata""
1194
        self._test_update_image_metadata()
1195
    def _test_update_image_metadata(self):
1196
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1197
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1198
        self.assertEqual(r['mykey0'], 'myval0')
1199

1200
    @if_not_all
1201
    def test_delete_image_metadata(self):
1202
        ""Test delete_image_metadata""
1203
        self._test_delete_image_metadata()
1204
    def _test_delete_image_metadata(self):
1205
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1206
        self.client.delete_image_metadata(self.img, 'mykey1')
1207
        r = self.client.get_image_metadata(self.img)
1208
        self.assertNotEqual('mykey1' in r)
1209
    """
1210

    
1211

    
1212
class testPithos(unittest.TestCase):
1213
    """Set up a Pithos+ thorough test"""
1214
    def setUp(self):
1215
        """
1216
        url = 'http://127.0.0.1:8000/v1'
1217
        global token
1218
        account = 'admin@adminland.com'
1219
        """
1220

    
1221
        global cnf
1222
        url = cnf.get('store', 'url')
1223

    
1224
        global token
1225
        global global_username
1226
        account = global_username
1227

    
1228
        """
1229
        url='https://pithos.okeanos.io/v1'
1230
        """
1231

    
1232
        """
1233
        def add_handler(name, level, prefix=''):
1234
            h = logging.StreamHandler()
1235
            fmt = logging.Formatter(prefix + '%(message)s')
1236
            h.setFormatter(fmt)
1237
            logger = logging.getLogger(name)
1238
            logger.addHandler(h)
1239
            logger.setLevel(level)
1240
        import logging
1241
        sendlog = logging.getLogger('clients.send')
1242
        recvlog = logging.getLogger('clients.recv')
1243
        add_handler('requests', logging.INFO, prefix='* ')
1244
        add_handler('clients.send', logging.INFO, prefix='> ')
1245
        add_handler('clients.recv', logging.INFO, prefix='< ')
1246
        """
1247

    
1248
        self.fname = None
1249
        container = None
1250
        self.client = pithos(url, token, account, container)
1251
        self.now = time.mktime(time.gmtime())
1252
        self.c1 = 'c1_' + unicode(self.now)
1253
        self.c2 = 'c2_' + unicode(self.now)
1254
        self.c3 = 'c3_' + unicode(self.now)
1255

    
1256
        self.client.create_container(self.c1)
1257
        self.client.create_container(self.c2)
1258
        self.client.create_container(self.c3)
1259
        self.makeNewObject(self.c1, 'test')
1260
        self.makeNewObject(self.c2, 'test')
1261
        self.now_unformated = datetime.datetime.utcnow()
1262
        self.makeNewObject(self.c1, 'test1')
1263
        self.makeNewObject(self.c2, 'test1')
1264
        """Prepare an object to be shared - also its container"""
1265
        self.client.container = self.c1
1266
        self.client.object_post('test',
1267
            update=True,
1268
            permissions={'read': 'someUser'})
1269

    
1270
        self.makeNewObject(self.c1, 'another.test')
1271

    
1272
    def makeNewObject(self, container, obj):
1273
        self.client.container = container
1274
        self.client.object_put(obj,
1275
            content_type='application/octet-stream',
1276
            data='file %s that lives in %s' % (obj, container),
1277
            metadata={'incontainer': container})
1278

    
1279
    def forceDeleteContainer(self, container):
1280
        self.client.container = container
1281
        try:
1282
            r = self.client.list_objects()
1283
        except ClientError:
1284
            return
1285
        for obj in r:
1286
            name = obj['name']
1287
            self.client.del_object(name)
1288
        r = self.client.container_delete()
1289
        self.container = ''
1290

    
1291
    def tearDown(self):
1292
        """Destroy test cases"""
1293
        if self.fname is not None:
1294
            try:
1295
                os.remove(self.fname)
1296
            except OSError:
1297
                pass
1298
            self.fname = None
1299
        self.forceDeleteContainer(self.c1)
1300
        self.forceDeleteContainer(self.c2)
1301
        try:
1302
            self.forceDeleteContainer(self.c3)
1303
        except ClientError:
1304
            pass
1305
        self.client.container = ''
1306

    
1307
    def test_000(self):
1308
        """Perform a full Pithos+ kamaki support test"""
1309

    
1310
    def test_account_head(self):
1311
        """Test account_HEAD"""
1312
        r = self.client.account_head()
1313
        self.assertEqual(r.status_code, 204)
1314

    
1315
        r = self.client.account_head(until='1000000000')
1316
        self.assertEqual(r.status_code, 204)
1317

    
1318
        r = self.client.get_account_info(until='1000000000')
1319
        datestring = unicode(r['x-account-until-timestamp'])
1320
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1321

    
1322
        r = self.client.get_account_quota()
1323
        self.assertTrue('x-account-policy-quota' in r)
1324

    
1325
        r = self.client.get_account_versioning()
1326
        self.assertTrue('x-account-policy-versioning' in r)
1327

    
1328
        """Check if(un)modified_since"""
1329
        for format in self.client.DATE_FORMATS:
1330
            now_formated = self.now_unformated.strftime(format)
1331
            r1 = self.client.account_head(if_modified_since=now_formated,
1332
                success=(204, 304, 412))
1333
            sc1 = r1.status_code
1334
            r1.release()
1335
            r2 = self.client.account_head(if_unmodified_since=now_formated,
1336
                success=(204, 304, 412))
1337
            sc2 = r2.status_code
1338
            r2.release()
1339
            self.assertNotEqual(sc1, sc2)
1340

    
1341
    def test_account_get(self):
1342
        """Test account_GET"""
1343
        #r = self.client.account_get()
1344
        #self.assertEqual(r.status_code, 200)
1345
        r = self.client.list_containers()
1346
        fullLen = len(r)
1347
        self.assertTrue(fullLen > 2)
1348

    
1349
        r = self.client.account_get(limit=1)
1350
        self.assertEqual(len(r.json), 1)
1351

    
1352
        r = self.client.account_get(marker='c2_')
1353
        temp_c0 = r.json[0]['name']
1354
        temp_c2 = r.json[2]['name']
1355

    
1356
        r = self.client.account_get(limit=2, marker='c2_')
1357
        conames = [container['name'] for container in r.json \
1358
            if container['name'].lower().startswith('c2_')]
1359
        self.assertTrue(temp_c0 in conames)
1360
        self.assertFalse(temp_c2 in conames)
1361

    
1362
        r = self.client.account_get(show_only_shared=True)
1363
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1364

    
1365
        r = self.client.account_get(until=1342609206)
1366
        self.assertTrue(len(r.json) <= fullLen)
1367

    
1368
        """Check if(un)modified_since"""
1369
        for format in self.client.DATE_FORMATS:
1370
            now_formated = self.now_unformated.strftime(format)
1371
            r1 = self.client.account_get(if_modified_since=now_formated,
1372
                success=(200, 304, 412))
1373
            sc1 = r1.status_code
1374
            r1.release()
1375
            r2 = self.client.account_get(if_unmodified_since=now_formated,
1376
                success=(200, 304, 412))
1377
            sc2 = r2.status_code
1378
            r2.release()
1379
            self.assertNotEqual(sc1, sc2)
1380

    
1381
        """Check sharing_accounts"""
1382
        r = self.client.get_sharing_accounts()
1383
        self.assertTrue(len(r) > 0)
1384

    
1385
    def test_account_post(self):
1386
        """Test account_POST"""
1387
        r = self.client.account_post()
1388
        self.assertEqual(r.status_code, 202)
1389
        grpName = 'grp' + unicode(self.now)
1390

    
1391
        """Method set/del_account_meta and set_account_groupcall use
1392
            account_post internally
1393
        """
1394
        self.client.set_account_group(grpName, ['u1', 'u2'])
1395
        r = self.client.get_account_group()
1396
        self.assertEqual(r['x-account-group-' + grpName], 'u1,u2')
1397
        self.client.del_account_group(grpName)
1398
        r = self.client.get_account_group()
1399
        self.assertTrue('x-account-group-' + grpName not in r)
1400

    
1401
        mprefix = 'meta' + unicode(self.now)
1402
        self.client.set_account_meta({mprefix + '1': 'v1',
1403
            mprefix + '2': 'v2'})
1404
        r = self.client.get_account_meta()
1405
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
1406
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
1407

    
1408
        self.client.del_account_meta(mprefix + '1')
1409
        r = self.client.get_account_meta()
1410
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
1411

    
1412
        self.client.del_account_meta(mprefix + '2')
1413
        r = self.client.get_account_meta()
1414
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
1415

    
1416
        """Missing testing for quota, versioning, because normally
1417
        you don't have permissions to modify those at account level
1418
        """
1419

    
1420
        newquota = 1000000
1421
        self.client.set_account_quota(newquota)
1422
        #r = self.client.get_account_info()
1423
        #print(unicode(r))
1424
        #r = self.client.get_account_quota()
1425
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1426
        self.client.set_account_versioning('auto')
1427

    
1428
    def test_container_head(self):
1429
        """Test container_HEAD"""
1430
        self.client.container = self.c1
1431

    
1432
        r = self.client.container_head()
1433
        self.assertEqual(r.status_code, 204)
1434

    
1435
        """Check until"""
1436
        r = self.client.container_head(until=1000000, success=(204, 404))
1437
        self.assertEqual(r.status_code, 404)
1438

    
1439
        """Check and if(un)modified_since"""
1440
        for format in self.client.DATE_FORMATS:
1441
            now_formated = self.now_unformated.strftime(format)
1442
            r1 = self.client.container_head(if_modified_since=now_formated,
1443
                success=(204, 304, 412))
1444
            sc1 = r1.status_code
1445
            r1.release()
1446
            r2 = self.client.container_head(if_unmodified_since=now_formated,
1447
                success=(204, 304, 412))
1448
            sc2 = r2.status_code
1449
            r2.release()
1450
            self.assertNotEqual(sc1, sc2)
1451

    
1452
        """Check container object meta"""
1453
        r = self.client.get_container_object_meta()
1454
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1455

    
1456
    def test_container_get(self):
1457
        """Test container_GET"""
1458
        self.client.container = self.c1
1459

    
1460
        r = self.client.container_get()
1461
        self.assertEqual(r.status_code, 200)
1462
        fullLen = len(r.json)
1463

    
1464
        r = self.client.container_get(prefix='test')
1465
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1466
        self.assertTrue(len(r.json) > 1)
1467
        self.assertEqual(len(r.json), len(lalobjects))
1468

    
1469
        r = self.client.container_get(limit=1)
1470
        self.assertEqual(len(r.json), 1)
1471

    
1472
        r = self.client.container_get(marker='another')
1473
        self.assertTrue(len(r.json) > 1)
1474
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1475
        self.assertEqual(len(r.json), len(neobjects))
1476

    
1477
        r = self.client.container_get(prefix='another.test', delimiter='.')
1478
        self.assertTrue(fullLen > len(r.json))
1479

    
1480
        r = self.client.container_get(path='/')
1481
        self.assertEqual(fullLen, len(r.json))
1482

    
1483
        r = self.client.container_get(format='xml')
1484
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1485

    
1486
        r = self.client.container_get(meta=['incontainer'])
1487
        self.assertTrue(len(r.json) > 0)
1488

    
1489
        r = self.client.container_get(show_only_shared=True)
1490
        self.assertTrue(len(r.json) < fullLen)
1491

    
1492
        try:
1493
            r = self.client.container_get(until=1000000000)
1494
            datestring = unicode(r.headers['x-account-until-timestamp'])
1495
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1496

    
1497
        except ClientError:
1498

    
1499
            pass
1500

    
1501
        """Check and if un/modified_since"""
1502
        for format in self.client.DATE_FORMATS:
1503
            now_formated = self.now_unformated.strftime(format)
1504
            r1 = self.client.container_get(if_modified_since=now_formated,
1505
                success=(200, 304, 412))
1506
            sc1 = r1.status_code
1507
            r1.release()
1508
            r2 = self.client.container_get(if_unmodified_since=now_formated,
1509
                success=(200, 304, 412))
1510
            sc2 = r2.status_code
1511
            r2.release()
1512
            self.assertNotEqual(sc1, sc2)
1513

    
1514
    def test_container_put(self):
1515
        """Test container_PUT"""
1516
        self.client.container = self.c2
1517

    
1518
        r = self.client.container_put()
1519
        self.assertEqual(r.status_code, 202)
1520

    
1521
        r = self.client.get_container_quota(self.client.container)
1522
        cquota = r.values()[0]
1523
        newquota = 2 * int(cquota)
1524

    
1525
        r = self.client.container_put(quota=newquota)
1526
        self.assertEqual(r.status_code, 202)
1527

    
1528
        r = self.client.get_container_quota(self.client.container)
1529
        xquota = int(r.values()[0])
1530
        self.assertEqual(newquota, xquota)
1531

    
1532
        r = self.client.container_put(versioning='auto')
1533
        self.assertEqual(r.status_code, 202)
1534

    
1535
        r = self.client.get_container_versioning(self.client.container)
1536
        nvers = r.values()[0]
1537
        self.assertEqual('auto', nvers)
1538

    
1539
        r = self.client.container_put(versioning='none')
1540
        self.assertEqual(r.status_code, 202)
1541

    
1542
        r = self.client.get_container_versioning(self.client.container)
1543
        nvers = r.values()[0]
1544
        self.assertEqual('none', nvers)
1545

    
1546
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1547
        self.assertEqual(r.status_code, 202)
1548

    
1549
        r = self.client.get_container_meta(self.client.container)
1550
        self.assertTrue('x-container-meta-m1' in r)
1551
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1552
        self.assertTrue('x-container-meta-m2' in r)
1553
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1554

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

    
1558
        r = self.client.get_container_meta(self.client.container)
1559
        self.assertTrue('x-container-meta-m1' not in r)
1560
        self.assertTrue('x-container-meta-m2' in r)
1561
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1562

    
1563
        self.client.del_container_meta(self.client.container)
1564

    
1565
    def test_container_post(self):
1566
        """Test container_POST"""
1567
        self.client.container = self.c2
1568

    
1569
        """Simple post"""
1570
        r = self.client.container_post()
1571
        self.assertEqual(r.status_code, 202)
1572

    
1573
        """post meta"""
1574
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
1575
        r = self.client.get_container_meta(self.client.container)
1576
        self.assertTrue('x-container-meta-m1' in r)
1577
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1578
        self.assertTrue('x-container-meta-m2' in r)
1579
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1580

    
1581
        """post/2del meta"""
1582
        r = self.client.del_container_meta('m1')
1583
        r = self.client.set_container_meta({'m2': 'v2a'})
1584
        r = self.client.get_container_meta(self.client.container)
1585
        self.assertTrue('x-container-meta-m1' not in r)
1586
        self.assertTrue('x-container-meta-m2' in r)
1587
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1588

    
1589
        """check quota"""
1590
        r = self.client.get_container_quota(self.client.container)
1591
        cquota = r.values()[0]
1592
        newquota = 2 * int(cquota)
1593
        r = self.client.set_container_quota(newquota)
1594
        r = self.client.get_container_quota(self.client.container)
1595
        xquota = int(r.values()[0])
1596
        self.assertEqual(newquota, xquota)
1597
        r = self.client.set_container_quota(cquota)
1598
        r = self.client.get_container_quota(self.client.container)
1599
        xquota = r.values()[0]
1600
        self.assertEqual(cquota, xquota)
1601

    
1602
        """Check versioning"""
1603
        self.client.set_container_versioning('auto')
1604
        r = self.client.get_container_versioning(self.client.container)
1605
        nvers = r.values()[0]
1606
        self.assertEqual('auto', nvers)
1607
        self.client.set_container_versioning('none')
1608
        r = self.client.get_container_versioning(self.client.container)
1609
        nvers = r.values()[0]
1610
        self.assertEqual('none', nvers)
1611

    
1612
        """put_block uses content_type and content_length to
1613
        post blocks of data 2 container. All that in upload_object"""
1614
        """Change a file at fs"""
1615
        self.create_large_file(1024 * 1024 * 100, 'l100M.' + unicode(self.now))
1616
        """Upload it at a directory in container"""
1617
        self.client.create_directory('dir')
1618
        newf = open(self.fname, 'r')
1619
        self.client.upload_object('/dir/sample.file', newf)
1620
        newf.close()
1621
        """Check if file has been uploaded"""
1622
        r = self.client.get_object_info('/dir/sample.file')
1623
        self.assertTrue(int(r['content-length']) > 100000000)
1624

    
1625
        """WTF is tranfer_encoding? What should I check about th** s**t? """
1626
        #TODO
1627

    
1628
        """Check update=False"""
1629
        r = self.client.object_post('test',
1630
            update=False,
1631
            metadata={'newmeta': 'newval'})
1632

    
1633
        r = self.client.get_object_info('test')
1634
        self.assertTrue('x-object-meta-newmeta' in r)
1635
        self.assertFalse('x-object-meta-incontainer' in r)
1636

    
1637
        r = self.client.del_container_meta('m2')
1638

    
1639
    def test_container_delete(self):
1640
        """Test container_DELETE"""
1641

    
1642
        """Fail to delete a non-empty container"""
1643
        self.client.container = self.c2
1644
        r = self.client.container_delete(success=409)
1645
        self.assertEqual(r.status_code, 409)
1646

    
1647
        """Fail to delete c3 (empty) container"""
1648
        self.client.container = self.c3
1649
        r = self.client.container_delete(until='1000000000')
1650
        self.assertEqual(r.status_code, 204)
1651

    
1652
        """Delete c3 (empty) container"""
1653
        r = self.client.container_delete()
1654
        self.assertEqual(r.status_code, 204)
1655

    
1656
        """Purge container(empty a container), check versionlist"""
1657
        self.client.container = self.c1
1658
        r = self.client.object_head('test', success=(200, 404))
1659
        self.assertEqual(r.status_code, 200)
1660
        self.client.del_container(delimiter='/')
1661
        r = self.client.object_head('test', success=(200, 404))
1662
        self.assertEqual(r.status_code, 404)
1663
        r = self.client.get_object_versionlist('test')
1664
        self.assertTrue(len(r) > 0)
1665
        self.assertTrue(len(r[0]) > 1)
1666
        self.client.purge_container()
1667
        self.assertRaises(ClientError,
1668
            self.client.get_object_versionlist,
1669
            'test')
1670

    
1671
    def test_object_head(self):
1672
        """Test object_HEAD"""
1673
        self.client.container = self.c2
1674
        obj = 'test'
1675

    
1676
        r = self.client.object_head(obj)
1677
        self.assertEqual(r.status_code, 200)
1678
        etag = r.headers['etag']
1679

    
1680
        r = self.client.object_head(obj, version=40)
1681
        self.assertEqual(r.headers['x-object-version'], '40')
1682

    
1683
        r = self.client.object_head(obj, if_etag_match=etag)
1684
        self.assertEqual(r.status_code, 200)
1685

    
1686
        r = self.client.object_head(obj,
1687
            if_etag_not_match=etag,
1688
            success=(200, 412, 304))
1689
        self.assertNotEqual(r.status_code, 200)
1690

    
1691
        r = self.client.object_head(obj,
1692
            version=40,
1693
            if_etag_match=etag,
1694
            success=412)
1695
        self.assertEqual(r.status_code, 412)
1696

    
1697
        """Check and if(un)modified_since"""
1698
        for format in self.client.DATE_FORMATS:
1699
            now_formated = self.now_unformated.strftime(format)
1700
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
1701
                success=(200, 304, 412))
1702
            sc1 = r1.status_code
1703
            r1.release()
1704
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1705
                success=(200, 304, 412))
1706
            sc2 = r2.status_code
1707
            r2.release()
1708
            self.assertNotEqual(sc1, sc2)
1709

    
1710
    def test_object_get(self):
1711
        """Test object_GET"""
1712
        self.client.container = self.c1
1713
        obj = 'test'
1714

    
1715
        r = self.client.object_get(obj)
1716
        self.assertEqual(r.status_code, 200)
1717

    
1718
        osize = int(r.headers['content-length'])
1719
        etag = r.headers['etag']
1720

    
1721
        r = self.client.object_get(obj, hashmap=True)
1722
        self.assertTrue('hashes' in r.json\
1723
            and 'block_hash' in r.json\
1724
            and 'block_size' in r.json\
1725
            and 'bytes' in r.json)
1726

    
1727
        r = self.client.object_get(obj, format='xml', hashmap=True)
1728
        self.assertEqual(len(r.text.split('hash>')), 3)
1729

    
1730
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1731
        r = self.client.object_get(obj,
1732
            data_range=rangestr,
1733
            success=(200, 206))
1734
        partsize = int(r.headers['content-length'])
1735
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1736

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

    
1745
        r = self.client.object_get(obj, if_etag_match=etag)
1746
        self.assertEqual(r.status_code, 200)
1747

    
1748
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1749
        self.assertEqual(r.status_code, 200)
1750

    
1751
        """Check and if(un)modified_since"""
1752
        for format in self.client.DATE_FORMATS:
1753
            now_formated = self.now_unformated.strftime(format)
1754
            r1 = self.client.object_get(obj, if_modified_since=now_formated,
1755
                success=(200, 304, 412))
1756
            sc1 = r1.status_code
1757
            r1.release()
1758
            r2 = self.client.object_get(obj,
1759
                if_unmodified_since=now_formated,
1760
                success=(200, 304, 412))
1761
            sc2 = r2.status_code
1762
            r2.release()
1763
            self.assertNotEqual(sc1, sc2)
1764

    
1765
        """Upload an object to download"""
1766
        src_fname = '/tmp/localfile1_%s' % self.now
1767
        dnl_fname = '/tmp/localfile2_%s' % self.now
1768
        trg_fname = 'remotefile_%s' % self.now
1769
        f_size = 59247824
1770
        self.create_large_file(f_size, src_fname)
1771
        src_f = open(src_fname, 'rb+')
1772
        print('\tUploading...')
1773
        self.client.upload_object(trg_fname, src_f)
1774
        src_f.close()
1775
        print('\tDownloading...')
1776
        dnl_f = open(dnl_fname, 'wb+')
1777
        self.client.download_object(trg_fname, dnl_f)
1778
        dnl_f.close()
1779

    
1780
        print('\tCheck if files match...')
1781
        src_f = open(src_fname)
1782
        dnl_f = open(dnl_fname)
1783
        for pos in (0, f_size / 2, f_size - 20):
1784
            src_f.seek(pos)
1785
            dnl_f.seek(pos)
1786
            self.assertEqual(src_f.read(10), dnl_f.read(10))
1787
        src_f.close()
1788
        dnl_f.close()
1789

    
1790
        os.remove(src_fname)
1791
        os.remove(dnl_fname)
1792

    
1793
    def test_object_put(self):
1794
        """Test object_PUT"""
1795

    
1796
        self.client.container = self.c2
1797
        obj = 'another.test'
1798

    
1799
        """create the object"""
1800
        r = self.client.object_put(obj,
1801
            data='a',
1802
            content_type='application/octer-stream',
1803
            permissions={
1804
                'read': ['accX:groupA', 'u1', 'u2'],
1805
                'write': ['u2', 'u3']},
1806
            metadata={'key1': 'val1', 'key2': 'val2'},
1807
            content_encoding='UTF-8',
1808
            content_disposition='attachment; filename="fname.ext"')
1809
        self.assertEqual(r.status_code, 201)
1810
        etag = r.headers['etag']
1811

    
1812
        """Check content-disposition"""
1813
        r = self.client.get_object_info(obj)
1814
        self.assertTrue('content-disposition' in r)
1815

    
1816
        """Check permissions"""
1817
        r = self.client.get_object_sharing(obj)
1818
        self.assertTrue('accx:groupa' in r['read'])
1819
        self.assertTrue('u1' in r['read'])
1820
        self.assertTrue('u2' in r['write'])
1821
        self.assertTrue('u3' in r['write'])
1822

    
1823
        """Check metadata"""
1824
        r = self.client.get_object_meta(obj)
1825
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1826
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1827

    
1828
        """Check public and if_etag_match"""
1829
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1830
            content_type='application/octet-stream', public=True)
1831

    
1832
        r = self.client.object_get(obj)
1833
        self.assertTrue('x-object-public' in r.headers)
1834
        vers2 = int(r.headers['x-object-version'])
1835
        etag = r.headers['etag']
1836
        self.assertEqual(r.text, 'b')
1837

    
1838
        """Check if_etag_not_match"""
1839
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1840
            content_type='application/octet-stream', success=(201, 412))
1841
        self.assertEqual(r.status_code, 412)
1842

    
1843
        """Check content_type and content_length"""
1844
        tmpdir = 'dir' + unicode(self.now)
1845
        r = self.client.object_put(tmpdir,
1846
            content_type='application/directory',
1847
            content_length=0)
1848

    
1849
        r = self.client.get_object_info(tmpdir)
1850
        self.assertEqual(r['content-type'], 'application/directory')
1851

    
1852
        """Check copy_from, content_encoding"""
1853
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1854
            format=None,
1855
            copy_from='/%s/%s' % (self.client.container, obj),
1856
            content_encoding='application/octet-stream',
1857
            source_account=self.client.account,
1858
            content_length=0, success=201)
1859
        self.assertEqual(r.status_code, 201)
1860

    
1861
        """Test copy_object for cross-conctainer copy"""
1862
        self.client.copy_object(src_container=self.c2,
1863
            src_object='%s/%s' % (tmpdir, obj),
1864
            dst_container=self.c1,
1865
            dst_object=obj)
1866
        self.client.container = self.c1
1867
        r1 = self.client.get_object_info(obj)
1868
        self.client.container = self.c2
1869
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
1870
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
1871

    
1872
        """Check cross-container copy_from, content_encoding"""
1873
        self.client.container = self.c1
1874
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
1875
        r = self.client.object_put(obj,
1876
            format=None,
1877
            copy_from=fromstr,
1878
            content_encoding='application/octet-stream',
1879
            source_account=self.client.account,
1880
            content_length=0, success=201)
1881

    
1882
        self.assertEqual(r.status_code, 201)
1883
        r = self.client.get_object_info(obj)
1884
        self.assertEqual(r['etag'], etag)
1885

    
1886
        """Check source_account"""
1887
        self.client.container = self.c2
1888
        fromstr = '/%s/%s' % (self.c1, obj)
1889
        r = self.client.object_put(obj + 'v2',
1890
            format=None,
1891
            move_from=fromstr,
1892
            content_encoding='application/octet-stream',
1893
            source_account='nonExistendAddress@NeverLand.com',
1894
            content_length=0,
1895
            success=(201, 403))
1896
        self.assertEqual(r.status_code, 403)
1897

    
1898
        """Check cross-container move_from"""
1899
        self.client.container = self.c1
1900
        r1 = self.client.get_object_info(obj)
1901
        self.client.container = self.c2
1902
        self.client.move_object(src_container=self.c1,
1903
            src_object=obj,
1904
            dst_container=self.c2,
1905
            dst_object=obj + 'v0')
1906
        r0 = self.client.get_object_info(obj + 'v0')
1907
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1908

    
1909
        """Check move_from"""
1910
        r = self.client.object_put(obj + 'v1',
1911
            format=None,
1912
            move_from='/%s/%s' % (self.c2, obj),
1913
            source_version=vers2,
1914
            content_encoding='application/octet-stream',
1915
            content_length=0, success=201)
1916

    
1917
        """Check manifest"""
1918
        mobj = 'manifest.test'
1919
        txt = ''
1920
        for i in range(10):
1921
            txt += '%s' % i
1922
            r = self.client.object_put('%s/%s' % (mobj, i),
1923
                data='%s' % i,
1924
                content_length=1,
1925
                success=201,
1926
                content_type='application/octet-stream',
1927
                content_encoding='application/octet-stream')
1928

    
1929
        r = self.client.object_put(mobj,
1930
            content_length=0,
1931
            content_type='application/octet-stream',
1932
            manifest='%s/%s' % (self.client.container, mobj))
1933

    
1934
        r = self.client.object_get(mobj)
1935
        self.assertEqual(r.text, txt)
1936

    
1937
        """Upload a local file with one request"""
1938
        self.create_large_file(1024 * 10, 'l10K.' + unicode(self.now))
1939
        newf = open(self.fname, 'r')
1940
        self.client.upload_object('sample.file', newf)
1941
        newf.close()
1942
        """Check if file has been uploaded"""
1943
        r = self.client.get_object_info('sample.file')
1944
        self.assertEqual(int(r['content-length']), 10260)
1945

    
1946
        """Some problems with transfer-encoding?"""
1947

    
1948
    def test_object_copy(self):
1949
        """Test object_COPY"""
1950
        self.client.container = self.c2
1951
        obj = 'test2'
1952

    
1953
        data = '{"key1":"val1", "key2":"val2"}'
1954
        r = self.client.object_put(obj + 'orig',
1955
            content_type='application/octet-stream',
1956
            data=data,
1957
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1958
            permissions={
1959
                'read': ['accX:groupA', 'u1', 'u2'],
1960
                'write': ['u2', 'u3']},
1961
            content_disposition='attachment; filename="fname.ext"')
1962

    
1963
        r = self.client.object_copy(obj + 'orig',
1964
            destination='/%s/%s' % (self.client.container, obj),
1965
            ignore_content_type=False, content_type='application/json',
1966
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1967
            permissions={'write': ['u5', 'accX:groupB']})
1968
        self.assertEqual(r.status_code, 201)
1969

    
1970
        """Check content-disposition"""
1971
        r = self.client.get_object_info(obj)
1972
        self.assertTrue('content-disposition' in r)
1973

    
1974
        """Check Metadata"""
1975
        r = self.client.get_object_meta(obj)
1976
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1977
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1978
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1979

    
1980
        """Check permissions"""
1981
        r = self.client.get_object_sharing(obj)
1982
        self.assertFalse('read' in r or 'u2' in r['write'])
1983
        self.assertTrue('accx:groupb' in r['write'])
1984

    
1985
        """Check destination account"""
1986
        r = self.client.object_copy(obj,
1987
            destination='/%s/%s' % (self.c1, obj),
1988
            content_encoding='utf8',
1989
            content_type='application/json',
1990
            destination_account='nonExistendAddress@NeverLand.com',
1991
            success=(201, 403))
1992
        self.assertEqual(r.status_code, 403)
1993

    
1994
        """Check destination being another container
1995
        and also content_type and content encoding"""
1996
        r = self.client.object_copy(obj,
1997
            destination='/%s/%s' % (self.c1, obj),
1998
            content_encoding='utf8',
1999
            content_type='application/json')
2000
        self.assertEqual(r.status_code, 201)
2001
        self.assertEqual(r.headers['content-type'],
2002
            'application/json; charset=UTF-8')
2003

    
2004
        """Check ignore_content_type and content_type"""
2005
        r = self.client.object_get(obj)
2006
        etag = r.headers['etag']
2007
        ctype = r.headers['content-type']
2008
        self.assertEqual(ctype, 'application/json')
2009

    
2010
        r = self.client.object_copy(obj + 'orig',
2011
            destination='/%s/%s0' % (self.client.container, obj),
2012
            ignore_content_type=True,
2013
            content_type='application/json')
2014
        self.assertEqual(r.status_code, 201)
2015
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2016

    
2017
        """Check if_etag_(not_)match"""
2018
        r = self.client.object_copy(obj,
2019
            destination='/%s/%s1' % (self.client.container, obj),
2020
            if_etag_match=etag)
2021
        self.assertEqual(r.status_code, 201)
2022

    
2023
        r = self.client.object_copy(obj,
2024
            destination='/%s/%s2' % (self.client.container, obj),
2025
            if_etag_not_match='lalala')
2026
        self.assertEqual(r.status_code, 201)
2027
        vers2 = r.headers['x-object-version']
2028

    
2029
        """Check source_version, public and format """
2030
        r = self.client.object_copy(obj + '2',
2031
            destination='/%s/%s3' % (self.client.container, obj),
2032
            source_version=vers2,
2033
            format='xml',
2034
            public=True)
2035
        self.assertEqual(r.status_code, 201)
2036
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2037

    
2038
        r = self.client.get_object_info(obj + '3')
2039
        self.assertTrue('x-object-public' in r)
2040

    
2041
    def test_object_move(self):
2042
        """Test object_MOVE"""
2043
        self.client.container = self.c2
2044
        obj = 'test2'
2045

    
2046
        data = '{"key1": "val1", "key2": "val2"}'
2047
        r = self.client.object_put(obj + 'orig',
2048
            content_type='application/octet-stream',
2049
            data=data,
2050
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2051
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2052
                'write': ['u2', 'u3']})
2053

    
2054
        r = self.client.object_move(obj + 'orig',
2055
            destination='/%s/%s' % (self.client.container, obj),
2056
            ignore_content_type=False,
2057
            content_type='application/json',
2058
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
2059
            permissions={'write': ['u5', 'accX:groupB']})
2060
        self.assertEqual(r.status_code, 201)
2061

    
2062
        """Check Metadata"""
2063
        r = self.client.get_object_meta(obj)
2064
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2065
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2066
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2067

    
2068
        """Check permissions"""
2069
        r = self.client.get_object_sharing(obj)
2070
        self.assertFalse('read' in r)
2071
        self.assertTrue('u5' in r['write'])
2072
        self.assertTrue('accx:groupb' in r['write'])
2073

    
2074
        """Check destination account"""
2075
        r = self.client.object_move(obj,
2076
            destination='/%s/%s' % (self.c1, obj),
2077
            content_encoding='utf8',
2078
            content_type='application/json',
2079
            destination_account='nonExistendAddress@NeverLand.com',
2080
            success=(201, 403))
2081
        self.assertEqual(r.status_code, 403)
2082

    
2083
        """Check destination being another container and also
2084
        content_type, content_disposition and content encoding"""
2085
        r = self.client.object_move(obj,
2086
            destination='/%s/%s' % (self.c1, obj),
2087
            content_encoding='utf8',
2088
            content_type='application/json',
2089
            content_disposition='attachment; filename="fname.ext"')
2090
        self.assertEqual(r.status_code, 201)
2091
        self.assertEqual(r.headers['content-type'],
2092
            'application/json; charset=UTF-8')
2093
        self.client.container = self.c1
2094
        r = self.client.get_object_info(obj)
2095
        self.assertTrue('content-disposition' in r\
2096
            and 'fname.ext' in r['content-disposition'])
2097
        etag = r['etag']
2098
        ctype = r['content-type']
2099
        self.assertEqual(ctype, 'application/json')
2100

    
2101
        """Check ignore_content_type and content_type"""
2102
        r = self.client.object_move(obj,
2103
            destination='/%s/%s' % (self.c2, obj),
2104
            ignore_content_type=True,
2105
            content_type='application/json')
2106
        self.assertEqual(r.status_code, 201)
2107
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2108

    
2109
        """Check if_etag_(not_)match"""
2110
        self.client.container = self.c2
2111
        r = self.client.object_move(obj,
2112
            destination='/%s/%s0' % (self.client.container, obj),
2113
            if_etag_match=etag)
2114
        self.assertEqual(r.status_code, 201)
2115

    
2116
        r = self.client.object_move(obj + '0',
2117
            destination='/%s/%s1' % (self.client.container, obj),
2118
            if_etag_not_match='lalala')
2119
        self.assertEqual(r.status_code, 201)
2120

    
2121
        """Check public and format """
2122
        r = self.client.object_move(obj + '1',
2123
            destination='/%s/%s2' % (self.client.container, obj),
2124
            format='xml', public=True)
2125
        self.assertEqual(r.status_code, 201)
2126
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2127

    
2128
        r = self.client.get_object_info(obj + '2')
2129
        self.assertTrue('x-object-public' in r)
2130

    
2131
    def test_object_post(self):
2132
        """Test object_POST"""
2133
        self.client.container = self.c2
2134
        obj = 'test2'
2135
        """create a filesystem file"""
2136
        self.fname = obj
2137
        newf = open(self.fname, 'w')
2138
        newf.writelines(['ello!\n',
2139
            'This is a test line\n',
2140
            'inside a test file\n'])
2141
        newf.close()
2142
        """create a file on container"""
2143
        r = self.client.object_put(obj,
2144
            content_type='application/octet-stream',
2145
            data='H',
2146
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2147
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2148
                'write': ['u2', 'u3']})
2149

    
2150
        """Append tests update, content_range, content_type, content_length"""
2151
        newf = open(obj, 'r')
2152
        self.client.append_object(obj, newf)
2153
        r = self.client.object_get(obj)
2154
        self.assertTrue(r.text.startswith('Hello!'))
2155

    
2156
        """Overwrite tests update,
2157
            content_type, content_length, content_range
2158
        """
2159
        newf.seek(0)
2160
        r = self.client.overwrite_object(obj, 0, 10, newf)
2161
        r = self.client.object_get(obj)
2162
        self.assertTrue(r.text.startswith('ello!'))
2163
        newf.close()
2164

    
2165
        """Truncate tests update,
2166
            content_range, content_type, object_bytes and source_object"""
2167
        r = self.client.truncate_object(obj, 5)
2168
        r = self.client.object_get(obj)
2169
        self.assertEqual(r.text, 'ello!')
2170

    
2171
        """Check metadata"""
2172
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2173
        r = self.client.get_object_meta(obj)
2174
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2175
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2176
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2177
        self.client.del_object_meta('mkey1', obj)
2178
        r = self.client.get_object_meta(obj)
2179
        self.assertFalse('x-object-meta-mkey1' in r)
2180

    
2181
        """Check permissions"""
2182
        self.client.set_object_sharing(obj,
2183
            read_permition=['u4', 'u5'], write_permition=['u4'])
2184
        r = self.client.get_object_sharing(obj)
2185
        self.assertTrue('read' in r)
2186
        self.assertTrue('u5' in r['read'])
2187
        self.assertTrue('write' in r)
2188
        self.assertTrue('u4' in r['write'])
2189
        self.client.del_object_sharing(obj)
2190
        r = self.client.get_object_sharing(obj)
2191
        self.assertTrue(len(r) == 0)
2192

    
2193
        """Check publish"""
2194
        self.client.publish_object(obj)
2195
        r = self.client.get_object_info(obj)
2196
        self.assertTrue('x-object-public' in r)
2197
        self.client.unpublish_object(obj)
2198
        r = self.client.get_object_info(obj)
2199
        self.assertFalse('x-object-public' in r)
2200

    
2201
        """Check if_etag_(not)match"""
2202
        etag = r['etag']
2203
        """
2204
        r = self.client.object_post(obj,
2205
            update=True,
2206
            public=True,
2207
            if_etag_not_match=etag,
2208
            success=(412, 202, 204))
2209
        self.assertEqual(r.status_code, 412)
2210
        """
2211

    
2212
        r = self.client.object_post(obj, update=True, public=True,
2213
            if_etag_match=etag, content_encoding='application/json')
2214

    
2215
        r = self.client.get_object_info(obj)
2216
        helloVersion = r['x-object-version']
2217
        self.assertTrue('x-object-public' in r)
2218
        self.assertEqual(r['content-encoding'], 'application/json')
2219

    
2220
        """Check source_version and source_account and content_disposition"""
2221
        r = self.client.object_post(obj,
2222
            update=True,
2223
            content_type='application/octet-srteam',
2224
            content_length=5,
2225
            content_range='bytes 1-5/*',
2226
            source_object='/%s/%s' % (self.c2, obj),
2227
            source_account='thisAccountWillNeverExist@adminland.com',
2228
            source_version=helloVersion,
2229
            data='12345',
2230
            success=(403, 202, 204))
2231
        self.assertEqual(r.status_code, 403)
2232

    
2233
        r = self.client.object_post(obj,
2234
            update=True,
2235
            content_type='application/octet-srteam',
2236
            content_length=5,
2237
            content_range='bytes 1-5/*',
2238
            source_object='/%s/%s' % (self.c2, obj),
2239
            source_account=self.client.account,
2240
            source_version=helloVersion,
2241
            data='12345',
2242
            content_disposition='attachment; filename="fname.ext"')
2243

    
2244
        r = self.client.object_get(obj)
2245
        self.assertEqual(r.text, 'eello!')
2246
        self.assertTrue('content-disposition' in r.headers\
2247
            and 'fname.ext' in r.headers['content-disposition'])
2248

    
2249
        """Check manifest"""
2250
        mobj = 'manifest.test'
2251
        txt = ''
2252
        for i in range(10):
2253
            txt += '%s' % i
2254
            r = self.client.object_put('%s/%s' % (mobj, i),
2255
            data='%s' % i,
2256
            content_length=1,
2257
            success=201,
2258
            content_encoding='application/octet-stream',
2259
            content_type='application/octet-stream')
2260

    
2261
        self.client.create_object_by_manifestation(mobj,
2262
            content_type='application/octet-stream')
2263

    
2264
        r = self.client.object_post(mobj,
2265
            manifest='%s/%s' % (self.client.container, mobj))
2266

    
2267
        r = self.client.object_get(mobj)
2268
        self.assertEqual(r.text, txt)
2269

    
2270
        """We need to check transfer_encoding """
2271

    
2272
    def test_object_delete(self):
2273
        """Test object_DELETE"""
2274
        self.client.container = self.c2
2275
        obj = 'test2'
2276
        """create a file on container"""
2277
        r = self.client.object_put(obj,
2278
            content_type='application/octet-stream',
2279
            data='H',
2280
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2281
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2282
                'write': ['u2', 'u3']})
2283

    
2284
        """Check with false until"""
2285
        r = self.client.object_delete(obj, until=1000000)
2286

    
2287
        r = self.client.object_get(obj, success=(200, 404))
2288
        self.assertEqual(r.status_code, 200)
2289

    
2290
        """Check normal case"""
2291
        r = self.client.object_delete(obj)
2292
        self.assertEqual(r.status_code, 204)
2293

    
2294
        r = self.client.object_get(obj, success=(200, 404))
2295
        self.assertEqual(r.status_code, 404)
2296

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

    
2324

    
2325
def init_parser():
2326
    parser = ArgumentParser(add_help=False)
2327
    parser.add_argument('-h', '--help',
2328
        dest='help',
2329
        action='store_true',
2330
        default=False,
2331
        help="Show this help message and exit")
2332
    return parser
2333

    
2334

    
2335
def main(argv):
2336

    
2337
    suiteFew = unittest.TestSuite()
2338
    if len(argv) == 0 or argv[0] == 'pithos':
2339
        if len(argv) == 1:
2340
            suiteFew.addTest(unittest.makeSuite(testPithos))
2341
        else:
2342
            suiteFew.addTest(testPithos('test_' + argv[1]))
2343
    if len(argv) == 0 or argv[0] == 'cyclades':
2344
        if len(argv) == 1:
2345
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
2346
            suiteFew.addTest(testCyclades('test_000'))
2347
        else:
2348
            suiteFew.addTest(testCyclades('test_' + argv[1]))
2349
    if len(argv) == 0 or argv[0] == 'image':
2350
        if len(argv) == 1:
2351
            suiteFew.addTest(unittest.makeSuite(testImage))
2352
        else:
2353
            suiteFew.addTest(testImage('test_' + argv[1]))
2354
    if len(argv) == 0 or argv[0] == 'astakos':
2355
        if len(argv) == 1:
2356
            suiteFew.addTest(unittest.makeSuite(testAstakos))
2357
        else:
2358
            suiteFew.addTest(testAstakos('test_' + argv[1]))
2359

    
2360
    unittest.TextTestRunner(verbosity=2).run(suiteFew)
2361

    
2362
if __name__ == '__main__':
2363
    parser = init_parser()
2364
    args, argv = parser.parse_known_args()
2365
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2366
        raise Exception('\tusage: tests.py <group> [command]')
2367
    main(argv)