Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 2b74ab4a

History | View | Annotate | Download (84 kB)

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

    
34
from argparse import ArgumentParser
35
import unittest
36
import time
37
import datetime
38
import os
39
import sys
40

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

    
48
TEST_ALL = False
49

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

    
54

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

    
62
    def tearDown(self):
63
        pass
64

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

    
77

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

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

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

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

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

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

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

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

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

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

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

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

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

    
249

    
250
class testCyclades(unittest.TestCase):
251
    """Set up a Cyclades thorough test"""
252
    def setUp(self):
253
        """okeanos"""
254
        url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
255
        global token
256
        global global_username
257
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
258
        self.img_details = {
259
            u'status': u'ACTIVE',
260
            u'updated': u'2012-10-16T09:04:17+00:00',
261
            u'name': u'Debian Base',
262
            u'created': u'2012-10-16T09:03:12+00:00',
263
            u'progress': 100,
264
            u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
265
            u'metadata': {
266
                u'values': {
267
                    u'kernel': u'2.6.32',
268
                    u'osfamily': u'linux',
269
                    u'users': u'root',
270
                    u'gui': u'No GUI',
271
                    u'sortorder': u'1',
272
                    u'os': u'debian',
273
                    u'root_partition': u'1',
274
                    u'description': u'Debian 6.0.6 (Squeeze) Base System',
275
                    u'partition_table': u'msdos'}
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
    @if_not_all
326
    def test_parallel_creation(self):
327
        """test create with multiple threads"""
328
        from kamaki.clients import SilentEvent
329
        c1 = SilentEvent(self._create_server,
330
            self.servname1,
331
            self.flavorid,
332
            self.img)
333
        c2 = SilentEvent(self._create_server,
334
            self.servname2,
335
            self.flavorid + 2,
336
            self.img)
337
        c3 = SilentEvent(self._create_server,
338
            self.servname1,
339
            self.flavorid,
340
            self.img)
341
        c4 = SilentEvent(self._create_server,
342
            self.servname2,
343
            self.flavorid + 2,
344
            self.img)
345
        c5 = SilentEvent(self._create_server,
346
            self.servname1,
347
            self.flavorid,
348
            self.img)
349
        c6 = SilentEvent(self._create_server,
350
            self.servname2,
351
            self.flavorid + 2,
352
            self.img)
353
        c7 = SilentEvent(self._create_server,
354
            self.servname1,
355
            self.flavorid,
356
            self.img)
357
        c8 = SilentEvent(self._create_server,
358
            self.servname2,
359
            self.flavorid + 2,
360
            self.img)
361
        print('START THREADS')
362
        c1.start()
363
        c2.start()
364
        c3.start()
365
        c4.start()
366
        c5.start()
367
        c6.start()
368
        c7.start()
369
        c8.start()
370
        print('KEWL')
371

    
372
    def tearDown(self):
373
        """Destoy servers used in testing"""
374
        print
375
        for netid in self.networks.keys():
376
            self._delete_network(netid)
377
        if 0 >= len(self.servers):
378
            return
379
        there_are_servers_running = True
380
        deleted_servers = {}
381
        waitime = 0
382
        print('-> Found %s servers to delete' % len(self.servers))
383
        while there_are_servers_running:
384
            there_are_servers_running = False
385
            if waitime > 0:
386
                c = ['|', '/', '-', '\\']
387
                suffix = ''
388
                sys.stdout.write('\t. . . wait %s seconds: ' % waitime)
389
                for i in range(4 * waitime):
390
                    oldlen = len(suffix)
391
                    suffix = '%ss %s' % (i / 4, c[i % 4])
392
                    sys.stdout.write(oldlen * '\b' + suffix)
393
                    sys.stdout.flush()
394
                    time.sleep(0.25)
395
                oldlen = len(': ' + suffix)
396
                print(oldlen * '\b' + oldlen * ' ')
397
                sys.stdout.flush()
398
            waitime += 3
399
            dservers = self.client.list_servers(detail=True)
400
            for server in dservers:
401
                if server['name'] in self.servers.keys():
402
                    there_are_servers_running = True
403
                    sys.stdout.write('\t%s status:%s '\
404
                        % (server['name'], server['status']))
405
                    if server['status'] == 'BUILD':
406
                        print('\twait...')
407
                    else:
408
                        print('\tDELETE %s' % server['name'])
409
                        self._delete_server(server['id'])
410
                        self.servers.pop(server['name'])
411
                        deleted_servers[server['name']] = 0
412
                        waitime = 0
413
                elif server['name'] in deleted_servers.keys():
414
                    there_are_servers_running = True
415
                    sys.stdout.write('\t%s status:%s '\
416
                        % (server['name'], server['status']))
417
                    retries = deleted_servers[server['name']]
418
                    if retries > 10:
419
                        print('\tretry DELETE %s'\
420
                            % server['name'])
421
                        self._delete_server(server['id'])
422
                        retries = 0
423
                        waitime = 0
424
                    else:
425
                        print('\tnot deleted yet ...')
426
                    deleted_servers[server['name']] = retries + 1
427

    
428
    def _create_server(self, servername, flavorid, imageid, personality=None):
429
        server = self.client.create_server(servername,
430
            flavorid,
431
            imageid,
432
            personality)
433
        self.servers[servername] = server
434
        return server
435

    
436
    def _delete_server(self, servid):
437
        self.client.delete_server(servid)
438

    
439
    def _create_network(self, netname, **kwargs):
440
        net = self.client.create_network(netname, **kwargs)
441
        self.networks[net['id']] = net
442
        return net
443

    
444
    def _delete_network(self, netid):
445
        sys.stdout.write('\tDelete network %s ' % netid)
446
        self.client.disconnect_network_nics(netid)
447
        wait = 3
448
        while True:
449
            try:
450
                self.client.delete_network(netid)
451
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
452
                break
453
            except ClientError as err:
454
                self.assertEqual(err.status, 421)
455
                time.sleep(wait)
456
                wait += 3
457
                sys.stdout.write('.')
458

    
459
    def if_not_all(foo):
460
        global TEST_ALL
461
        if TEST_ALL:
462
            return None
463
        return foo
464

    
465
    def assert_dicts_are_deeply_equal(self, d1, d2):
466
        for k, v in d1.items():
467
            self.assertTrue(k in d2)
468
            if isinstance(v, dict):
469
                self.assert_dicts_are_deeply_equal(v, d2[k])
470
            else:
471
                self.assertEqual(unicode(v), unicode(d2[k]))
472

    
473
    def test_000(self):
474
        "Prepare a full Cyclades test scenario"
475
        global TEST_ALL
476
        TEST_ALL = True
477

    
478
        self.server1 = self._create_server(self.servname1,
479
            self.flavorid,
480
            self.img)
481
        self.server2 = self._create_server(self.servname2,
482
            self.flavorid + 2,
483
            self.img)
484

    
485
        print('testing')
486
        sys.stdout.write(' test create server')
487
        self._test_create_server()
488
        print('...ok')
489

    
490
        sys.stdout.write(' test list servers')
491
        self._test_list_servers()
492
        print('...ok')
493

    
494
        print('- wait for test servers to build')
495
        self._wait_for_status(self.server1['id'], 'BUILD')
496
        self._wait_for_status(self.server2['id'], 'BUILD')
497
        print('- ok')
498

    
499
        sys.stdout.write(' test get server details')
500
        self._test_get_server_details()
501
        print('...ok')
502

    
503
        sys.stdout.write(' test get image details')
504
        self._test_get_image_details()
505
        print('...ok')
506

    
507
        sys.stdout.write(' test update_server_name')
508
        self._test_update_server_name()
509
        print('...ok')
510

    
511
        sys.stdout.write(' test reboot_server')
512
        self._test_reboot_server()
513
        print('...ok')
514

    
515
        print('- wait for test servers to boot')
516
        self._wait_for_status(self.server1['id'], 'REBOOT')
517
        self._wait_for_status(self.server2['id'], 'REBOOT')
518
        print('- ok')
519

    
520
        sys.stdout.write(' test create_server_metadata')
521
        self._test_create_server_metadata()
522
        print('...ok')
523

    
524
        sys.stdout.write(' test get_server_metadata')
525
        self._test_get_server_metadata()
526
        print('...ok')
527

    
528
        sys.stdout.write(' test update_server_metadata')
529
        self._test_update_server_metadata()
530
        print('...ok')
531

    
532
        sys.stdout.write(' test delete_server_metadata')
533
        self._test_delete_server_metadata()
534
        print('...ok')
535

    
536
        sys.stdout.write(' test list_flavors')
537
        self._test_list_flavors()
538
        print('...ok')
539

    
540
        sys.stdout.write(' test get_flavor_details')
541
        self._test_get_flavor_details()
542
        print('...ok')
543

    
544
        sys.stdout.write(' test list_images')
545
        self._test_list_images()
546
        print('...ok')
547

    
548
        sys.stdout.write(' test get_image_details')
549
        self._test_get_image_details()
550
        print('...ok')
551

    
552
        sys.stdout.write(' test get_image_metadata')
553
        self._test_get_image_metadata()
554
        print('...ok')
555

    
556
        sys.stdout.write(' test shutdown_server')
557
        self._test_shutdown_server()
558
        print('...ok')
559

    
560
        sys.stdout.write(' test start_server')
561
        self._test_start_server()
562
        print('...ok')
563

    
564
        sys.stdout.write(' test get_server_console')
565
        self._test_get_server_console()
566
        print('...ok')
567

    
568
        sys.stdout.write(' test get_firewall_profile')
569
        self._test_get_firewall_profile()
570
        print('...ok')
571

    
572
        sys.stdout.write(' test set_firewall_profile')
573
        self._test_set_firewall_profile()
574
        print('...ok')
575

    
576
        sys.stdout.write(' test get_server_stats')
577
        self._test_get_server_stats()
578
        print('...ok')
579

    
580
        self.network1 = self._create_network(self.netname1)
581

    
582
        sys.stdout.write(' test create_network')
583
        self._test_create_network()
584
        print('...ok')
585

    
586
        print('- wait for network to be activated')
587
        self._wait_for_network(self.network1['id'], 'ACTIVE')
588
        print('- ok')
589

    
590
        sys.stdout.write(' test connect_server')
591
        self._test_connect_server()
592
        print('...ok')
593

    
594
        sys.stdout.write(' test disconnect_server')
595
        self._test_disconnect_server()
596
        print('...ok')
597

    
598
        self.network2 = self._create_network(self.netname2)
599
        print('- wait for network to be activated')
600
        self._wait_for_network(self.network2['id'], 'ACTIVE')
601
        print('- ok')
602

    
603
        sys.stdout.write(' test list_server_nics')
604
        self._test_list_server_nics()
605
        print('...ok')
606

    
607
        sys.stdout.write(' test list_networks')
608
        self._test_list_networks()
609
        print('...ok')
610

    
611
        sys.stdout.write(' test get_network_details')
612
        self._test_get_network_details()
613
        print('...ok')
614

    
615
        sys.stdout.write(' test update_network_name')
616
        self._test_update_network_name()
617
        print('...ok')
618

    
619
        """Don't have auth for these:
620
        sys.stdout.write(' test delete_image')
621
        self._test_delete_image()
622
        print('...ok')
623
        sys.stdout.write(' test create_image_metadata')
624
        self._test_create_image_metadata()
625
        print('...ok')
626
        sys.stdout.write(' test update_image_metadata')
627
        self._test_update_image_metadata()
628
        print('...ok')
629
        sys.stdout.write(' test delete_image_metadata')
630
        self._test_delete_image_metadata()
631
        print('...ok')
632
        """
633

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

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

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

    
685
    def _wait_for_status(self, servid, status):
686
        wait = 0
687
        c = ['|', '/', '-', '\\']
688
        while self._has_status(servid, status):
689
            if wait:
690
                sys.stdout.write('\tServer %s in %s. Wait %ss  '\
691
                    % (servid, status, wait))
692
                for i in range(4 * wait):
693
                    sys.stdout.write('\b%s' % c[i % 4])
694
                    sys.stdout.flush()
695
                    time.sleep(0.25)
696
                print('\b ')
697
            wait = (wait + 3) if wait < 60 else 0
698

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

    
710
    def _test_list_servers(self):
711
        servers = self.client.list_servers()
712
        dservers = self.client.list_servers(detail=True)
713

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

    
727
        """detailed and simple contain same names"""
728
        names = sorted(map(lambda x: x["name"], servers))
729
        dnames = sorted(map(lambda x: x["name"], dservers))
730
        self.assertEqual(names, dnames)
731

    
732
    @if_not_all
733
    def test_create_server(self):
734
        """Test create_server"""
735
        self.server1 = self._create_server(self.servname1,
736
            self.flavorid,
737
            self.img)
738
        self._wait_for_status(self.server1['id'], 'BUILD')
739
        self._test_create_server()
740

    
741
    def _test_create_server(self):
742
        self.assertEqual(self.server1["name"], self.servname1)
743
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
744
        self.assertEqual(self.server1["imageRef"], self.img)
745
        self.assertEqual(self.server1["status"], "BUILD")
746

    
747
    @if_not_all
748
    def test_get_server_details(self):
749
        """Test get_server_details"""
750
        self.server1 = self._create_server(self.servname1,
751
            self.flavorid,
752
            self.img)
753
        self._wait_for_status(self.server1['id'], 'BUILD')
754
        self._test_get_server_details()
755

    
756
    def _test_get_server_details(self):
757
        r = self.client.get_server_details(self.server1['id'])
758
        self.assertEqual(r["name"], self.servname1)
759
        self.assertEqual(r["flavorRef"], self.flavorid)
760
        self.assertEqual(r["imageRef"], self.img)
761
        self.assertEqual(r["status"], "ACTIVE")
762

    
763
    @if_not_all
764
    def test_update_server_name(self):
765
        """Test update_server_name"""
766
        self.server1 = self._create_server(self.servname1,
767
            self.flavorid,
768
            self.img)
769
        self._test_update_server_name()
770

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

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

    
796
    def _test_reboot_server(self):
797
        self.client.reboot_server(self.server1['id'])
798
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
799
        self.client.reboot_server(self.server2['id'], hard=True)
800
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
801

    
802
    @if_not_all
803
    def test_get_server_metadata(self):
804
        """Test get server_metadata"""
805
        self.server1 = self._create_server(self.servname1,
806
            self.flavorid,
807
            self.img)
808
        self._test_get_server_metadata()
809

    
810
    def _test_get_server_metadata(self):
811
        self.client.create_server_metadata(self.server1['id'],
812
            'mymeta_0',
813
            'val_0')
814
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
815
        self.assertEqual(r['mymeta_0'], 'val_0')
816

    
817
    @if_not_all
818
    def test_create_server_metadata(self):
819
        """Test create_server_metadata"""
820
        self.server1 = self._create_server(self.servname1,
821
            self.flavorid,
822
            self.img)
823
        self._test_create_server_metadata()
824

    
825
    def _test_create_server_metadata(self):
826
        r1 = self.client.create_server_metadata(self.server1['id'],
827
            'mymeta',
828
            'mymeta val')
829
        self.assertTrue('mymeta' in r1)
830
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
831
        self.assert_dicts_are_deeply_equal(r1, r2)
832

    
833
    @if_not_all
834
    def test_update_server_metadata(self):
835
        """Test update_server_metadata"""
836
        self.server1 = self._create_server(self.servname1,
837
            self.flavorid,
838
            self.img)
839
        self._test_update_server_metadata()
840

    
841
    def _test_update_server_metadata(self):
842
        r1 = self.client.create_server_metadata(self.server1['id'],
843
            'mymeta3',
844
            'val2')
845
        self.assertTrue('mymeta3'in r1)
846
        r2 = self.client.update_server_metadata(self.server1['id'],
847
            mymeta3='val3')
848
        self.assertTrue(r2['mymeta3'], 'val3')
849

    
850
    @if_not_all
851
    def test_delete_server_metadata(self):
852
        """Test delete_server_metadata"""
853
        self.server1 = self._create_server(self.servname1,
854
            self.flavorid,
855
            self.img)
856
        self._test_delete_server_metadata()
857

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

    
870
    @if_not_all
871
    def test_list_flavors(self):
872
        """Test flavors_get"""
873
        self._test_list_flavors()
874

    
875
    def _test_list_flavors(self):
876
        r = self.client.list_flavors()
877
        self.assertTrue(len(r) > 1)
878
        r = self.client.list_flavors(detail=True)
879
        self.assertTrue('SNF:disk_template' in r[0])
880

    
881
    @if_not_all
882
    def test_get_flavor_details(self):
883
        """Test test_get_flavor_details"""
884
        self._test_get_flavor_details()
885

    
886
    def _test_get_flavor_details(self):
887
        r = self.client.get_flavor_details(self.flavorid)
888
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
889

    
890
    @if_not_all
891
    def test_list_images(self):
892
        """Test list_images"""
893
        self._test_list_images()
894

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

    
904
    @if_not_all
905
    def test_image_details(self):
906
        """Test image_details"""
907
        self._test_get_image_details
908

    
909
    def _test_get_image_details(self):
910
        r = self.client.get_image_details(self.img)
911
        self.assert_dicts_are_deeply_equal(r, self.img_details)
912

    
913
    @if_not_all
914
    def test_get_image_metadata(self):
915
        """Test get_image_metadata"""
916
        self._test_get_image_metadata()
917

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

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

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

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

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

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

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

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

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

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

    
995
    def _test_set_firewall_profile(self):
996

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

    
1024
    @if_not_all
1025
    def test_get_server_stats(self):
1026
        self.server1 = self._create_server(self.servname1,
1027
            self.flavorid,
1028
            self.img)
1029
        self._test_get_server_stats()
1030

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

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

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

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

    
1066
    @if_not_all
1067
    def test_create_network(self):
1068
        """Test create_network"""
1069
        self.network1 = self._create_network(self.netname1)
1070
        self._test_create_network()
1071

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

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

    
1091
    def _test_connect_server(self):
1092
        self.client.connect_server(self.server1['id'], self.network1['id'])
1093
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1094
            self.server1['id']))
1095

    
1096
    @if_not_all
1097
    def test_disconnect_server(self):
1098
        """Test disconnect_server"""
1099
        self.test_connect_server()
1100
        self._test_disconnect_server()
1101

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

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

    
1119
    def _test_list_server_nics(self):
1120
        r = self.client.list_server_nics(self.server1['id'])
1121
        len0 = len(r)
1122
        self.assertTrue(len0 > 0)
1123
        self.assertTrue('1' in [net['network_id'] for net in r])
1124

    
1125
        self.client.connect_server(self.server1['id'], self.network2['id'])
1126
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1127
            self.server1['id']))
1128
        r = self.client.list_server_nics(self.server1['id'])
1129
        self.assertTrue(len(r) > len0)
1130

    
1131
    @if_not_all
1132
    def test_get_network_details(self):
1133
        """Test get_network_details"""
1134
        self.network1 = self._create_network(self.netname1)
1135
        self._test_get_network_details()
1136

    
1137
    def _test_get_network_details(self):
1138
        r = self.client.get_network_details(self.network1['id'])
1139
        net1 = dict(self.network1)
1140
        net1.pop('status')
1141
        net1.pop('updated', None)
1142
        net1.pop('attachments')
1143
        r.pop('status')
1144
        r.pop('updated', None)
1145
        r.pop('attachments')
1146
        self.assert_dicts_are_deeply_equal(net1, r)
1147

    
1148
    @if_not_all
1149
    def test_update_network_name(self):
1150
        self.network2 = self._create_network(self.netname2)
1151
        self._test_update_network_name()
1152

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

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

1188
    @if_not_all
1189
    def test_create_image_metadata(self):
1190
        ""Test create_image_metadata""
1191
        self._test_create_image_metadata()
1192
    def _test_create_image_metadata(self):
1193
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1194
        self.assertEqual(r['mykey'], 'myval')
1195

1196
    @if_not_all
1197
    def test_update_image_metadata(self):
1198
        ""Test update_image_metadata""
1199
        self._test_update_image_metadata()
1200
    def _test_update_image_metadata(self):
1201
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1202
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1203
        self.assertEqual(r['mykey0'], 'myval0')
1204

1205
    @if_not_all
1206
    def test_delete_image_metadata(self):
1207
        ""Test delete_image_metadata""
1208
        self._test_delete_image_metadata()
1209
    def _test_delete_image_metadata(self):
1210
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1211
        self.client.delete_image_metadata(self.img, 'mykey1')
1212
        r = self.client.get_image_metadata(self.img)
1213
        self.assertNotEqual('mykey1' in r)
1214
    """
1215

    
1216

    
1217
class testPithos(unittest.TestCase):
1218
    """Set up a Pithos+ thorough test"""
1219
    def setUp(self):
1220
        """
1221
        url = 'http://127.0.0.1:8000/v1'
1222
        global token
1223
        account = 'admin@adminland.com'
1224
        """
1225

    
1226
        global cnf
1227
        url = cnf.get('store', 'url')
1228

    
1229
        global token
1230
        global global_username
1231
        account = global_username
1232

    
1233
        """
1234
        url='https://pithos.okeanos.io/v1'
1235
        """
1236

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

    
1253
        self.fname = None
1254
        container = None
1255
        self.client = pithos(url, token, account, container)
1256
        self.now = time.mktime(time.gmtime())
1257
        self.c1 = 'c1_' + unicode(self.now)
1258
        self.c2 = 'c2_' + unicode(self.now)
1259
        self.c3 = 'c3_' + unicode(self.now)
1260

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

    
1275
        self.makeNewObject(self.c1, 'another.test')
1276

    
1277
    def makeNewObject(self, container, obj):
1278
        self.client.container = container
1279
        self.client.object_put(obj,
1280
            content_type='application/octet-stream',
1281
            data='file %s that lives in %s' % (obj, container),
1282
            metadata={'incontainer': container})
1283

    
1284
    def forceDeleteContainer(self, container):
1285
        self.client.container = container
1286
        try:
1287
            r = self.client.list_objects()
1288
        except ClientError:
1289
            return
1290
        for obj in r:
1291
            name = obj['name']
1292
            self.client.del_object(name)
1293
        r = self.client.container_delete()
1294
        self.container = ''
1295

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

    
1312
    def test_000(self):
1313
        """Perform a full Pithos+ kamaki support test"""
1314

    
1315
    def test_account_head(self):
1316
        """Test account_HEAD"""
1317
        r = self.client.account_head()
1318
        self.assertEqual(r.status_code, 204)
1319

    
1320
        r = self.client.account_head(until='1000000000')
1321
        self.assertEqual(r.status_code, 204)
1322

    
1323
        r = self.client.get_account_info(until='1000000000')
1324
        datestring = unicode(r['x-account-until-timestamp'])
1325
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1326

    
1327
        r = self.client.get_account_quota()
1328
        self.assertTrue('x-account-policy-quota' in r)
1329

    
1330
        r = self.client.get_account_versioning()
1331
        self.assertTrue('x-account-policy-versioning' in r)
1332

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

    
1346
    def test_account_get(self):
1347
        """Test account_GET"""
1348
        #r = self.client.account_get()
1349
        #self.assertEqual(r.status_code, 200)
1350
        r = self.client.list_containers()
1351
        fullLen = len(r)
1352
        self.assertTrue(fullLen > 2)
1353

    
1354
        r = self.client.account_get(limit=1)
1355
        self.assertEqual(len(r.json), 1)
1356

    
1357
        r = self.client.account_get(marker='c2_')
1358
        temp_c0 = r.json[0]['name']
1359
        temp_c2 = r.json[2]['name']
1360

    
1361
        r = self.client.account_get(limit=2, marker='c2_')
1362
        conames = [container['name'] for container in r.json \
1363
            if container['name'].lower().startswith('c2_')]
1364
        self.assertTrue(temp_c0 in conames)
1365
        self.assertFalse(temp_c2 in conames)
1366

    
1367
        r = self.client.account_get(show_only_shared=True)
1368
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1369

    
1370
        r = self.client.account_get(until=1342609206)
1371
        self.assertTrue(len(r.json) <= fullLen)
1372

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

    
1386
        """Check sharing_accounts"""
1387
        r = self.client.get_sharing_accounts()
1388
        self.assertTrue(len(r) > 0)
1389

    
1390
    def test_account_post(self):
1391
        """Test account_POST"""
1392
        r = self.client.account_post()
1393
        self.assertEqual(r.status_code, 202)
1394
        grpName = 'grp' + unicode(self.now)
1395

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

    
1406
        mprefix = 'meta' + unicode(self.now)
1407
        self.client.set_account_meta({mprefix + '1': 'v1',
1408
            mprefix + '2': 'v2'})
1409
        r = self.client.get_account_meta()
1410
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
1411
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
1412

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

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

    
1421
        """Missing testing for quota, versioning, because normally
1422
        you don't have permissions to modify those at account level
1423
        """
1424

    
1425
        newquota = 1000000
1426
        self.client.set_account_quota(newquota)
1427
        #r = self.client.get_account_info()
1428
        #print(unicode(r))
1429
        #r = self.client.get_account_quota()
1430
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1431
        self.client.set_account_versioning('auto')
1432

    
1433
    def test_container_head(self):
1434
        """Test container_HEAD"""
1435
        self.client.container = self.c1
1436

    
1437
        r = self.client.container_head()
1438
        self.assertEqual(r.status_code, 204)
1439

    
1440
        """Check until"""
1441
        r = self.client.container_head(until=1000000, success=(204, 404))
1442
        self.assertEqual(r.status_code, 404)
1443

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

    
1457
        """Check container object meta"""
1458
        r = self.client.get_container_object_meta()
1459
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1460

    
1461
    def test_container_get(self):
1462
        """Test container_GET"""
1463
        self.client.container = self.c1
1464

    
1465
        r = self.client.container_get()
1466
        self.assertEqual(r.status_code, 200)
1467
        fullLen = len(r.json)
1468

    
1469
        r = self.client.container_get(prefix='test')
1470
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1471
        self.assertTrue(len(r.json) > 1)
1472
        self.assertEqual(len(r.json), len(lalobjects))
1473

    
1474
        r = self.client.container_get(limit=1)
1475
        self.assertEqual(len(r.json), 1)
1476

    
1477
        r = self.client.container_get(marker='another')
1478
        self.assertTrue(len(r.json) > 1)
1479
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1480
        self.assertEqual(len(r.json), len(neobjects))
1481

    
1482
        r = self.client.container_get(prefix='another.test', delimiter='.')
1483
        self.assertTrue(fullLen > len(r.json))
1484

    
1485
        r = self.client.container_get(path='/')
1486
        self.assertEqual(fullLen, len(r.json))
1487

    
1488
        r = self.client.container_get(format='xml')
1489
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1490

    
1491
        r = self.client.container_get(meta=['incontainer'])
1492
        self.assertTrue(len(r.json) > 0)
1493

    
1494
        r = self.client.container_get(show_only_shared=True)
1495
        self.assertTrue(len(r.json) < fullLen)
1496

    
1497
        try:
1498
            r = self.client.container_get(until=1000000000)
1499
            datestring = unicode(r.headers['x-account-until-timestamp'])
1500
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1501

    
1502
        except ClientError:
1503

    
1504
            pass
1505

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

    
1519
    def test_container_put(self):
1520
        """Test container_PUT"""
1521
        self.client.container = self.c2
1522

    
1523
        r = self.client.container_put()
1524
        self.assertEqual(r.status_code, 202)
1525

    
1526
        r = self.client.get_container_quota(self.client.container)
1527
        cquota = r.values()[0]
1528
        newquota = 2 * int(cquota)
1529

    
1530
        r = self.client.container_put(quota=newquota)
1531
        self.assertEqual(r.status_code, 202)
1532

    
1533
        r = self.client.get_container_quota(self.client.container)
1534
        xquota = int(r.values()[0])
1535
        self.assertEqual(newquota, xquota)
1536

    
1537
        r = self.client.container_put(versioning='auto')
1538
        self.assertEqual(r.status_code, 202)
1539

    
1540
        r = self.client.get_container_versioning(self.client.container)
1541
        nvers = r.values()[0]
1542
        self.assertEqual('auto', nvers)
1543

    
1544
        r = self.client.container_put(versioning='none')
1545
        self.assertEqual(r.status_code, 202)
1546

    
1547
        r = self.client.get_container_versioning(self.client.container)
1548
        nvers = r.values()[0]
1549
        self.assertEqual('none', nvers)
1550

    
1551
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1552
        self.assertEqual(r.status_code, 202)
1553

    
1554
        r = self.client.get_container_meta(self.client.container)
1555
        self.assertTrue('x-container-meta-m1' in r)
1556
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1557
        self.assertTrue('x-container-meta-m2' in r)
1558
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1559

    
1560
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
1561
        self.assertEqual(r.status_code, 202)
1562

    
1563
        r = self.client.get_container_meta(self.client.container)
1564
        self.assertTrue('x-container-meta-m1' not in r)
1565
        self.assertTrue('x-container-meta-m2' in r)
1566
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1567

    
1568
        self.client.del_container_meta(self.client.container)
1569

    
1570
    def test_container_post(self):
1571
        """Test container_POST"""
1572
        self.client.container = self.c2
1573

    
1574
        """Simple post"""
1575
        r = self.client.container_post()
1576
        self.assertEqual(r.status_code, 202)
1577

    
1578
        """post meta"""
1579
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
1580
        r = self.client.get_container_meta(self.client.container)
1581
        self.assertTrue('x-container-meta-m1' in r)
1582
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1583
        self.assertTrue('x-container-meta-m2' in r)
1584
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1585

    
1586
        """post/2del meta"""
1587
        r = self.client.del_container_meta('m1')
1588
        r = self.client.set_container_meta({'m2': 'v2a'})
1589
        r = self.client.get_container_meta(self.client.container)
1590
        self.assertTrue('x-container-meta-m1' not in r)
1591
        self.assertTrue('x-container-meta-m2' in r)
1592
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1593

    
1594
        """check quota"""
1595
        r = self.client.get_container_quota(self.client.container)
1596
        cquota = r.values()[0]
1597
        newquota = 2 * int(cquota)
1598
        r = self.client.set_container_quota(newquota)
1599
        r = self.client.get_container_quota(self.client.container)
1600
        xquota = int(r.values()[0])
1601
        self.assertEqual(newquota, xquota)
1602
        r = self.client.set_container_quota(cquota)
1603
        r = self.client.get_container_quota(self.client.container)
1604
        xquota = r.values()[0]
1605
        self.assertEqual(cquota, xquota)
1606

    
1607
        """Check versioning"""
1608
        self.client.set_container_versioning('auto')
1609
        r = self.client.get_container_versioning(self.client.container)
1610
        nvers = r.values()[0]
1611
        self.assertEqual('auto', nvers)
1612
        self.client.set_container_versioning('none')
1613
        r = self.client.get_container_versioning(self.client.container)
1614
        nvers = r.values()[0]
1615
        self.assertEqual('none', nvers)
1616

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

    
1630
        """WTF is tranfer_encoding? What should I check about th** s**t? """
1631
        #TODO
1632

    
1633
        """Check update=False"""
1634
        r = self.client.object_post('test',
1635
            update=False,
1636
            metadata={'newmeta': 'newval'})
1637

    
1638
        r = self.client.get_object_info('test')
1639
        self.assertTrue('x-object-meta-newmeta' in r)
1640
        self.assertFalse('x-object-meta-incontainer' in r)
1641

    
1642
        r = self.client.del_container_meta('m2')
1643

    
1644
    def test_container_delete(self):
1645
        """Test container_DELETE"""
1646

    
1647
        """Fail to delete a non-empty container"""
1648
        self.client.container = self.c2
1649
        r = self.client.container_delete(success=409)
1650
        self.assertEqual(r.status_code, 409)
1651

    
1652
        """Fail to delete c3 (empty) container"""
1653
        self.client.container = self.c3
1654
        r = self.client.container_delete(until='1000000000')
1655
        self.assertEqual(r.status_code, 204)
1656

    
1657
        """Delete c3 (empty) container"""
1658
        r = self.client.container_delete()
1659
        self.assertEqual(r.status_code, 204)
1660

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

    
1676
    def test_object_head(self):
1677
        """Test object_HEAD"""
1678
        self.client.container = self.c2
1679
        obj = 'test'
1680

    
1681
        r = self.client.object_head(obj)
1682
        self.assertEqual(r.status_code, 200)
1683
        etag = r.headers['etag']
1684

    
1685
        r = self.client.object_head(obj, version=40)
1686
        self.assertEqual(r.headers['x-object-version'], '40')
1687

    
1688
        r = self.client.object_head(obj, if_etag_match=etag)
1689
        self.assertEqual(r.status_code, 200)
1690

    
1691
        r = self.client.object_head(obj,
1692
            if_etag_not_match=etag,
1693
            success=(200, 412, 304))
1694
        self.assertNotEqual(r.status_code, 200)
1695

    
1696
        r = self.client.object_head(obj,
1697
            version=40,
1698
            if_etag_match=etag,
1699
            success=412)
1700
        self.assertEqual(r.status_code, 412)
1701

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

    
1715
    def test_object_get(self):
1716
        """Test object_GET"""
1717
        self.client.container = self.c1
1718
        obj = 'test'
1719

    
1720
        r = self.client.object_get(obj)
1721
        self.assertEqual(r.status_code, 200)
1722

    
1723
        osize = int(r.headers['content-length'])
1724
        etag = r.headers['etag']
1725

    
1726
        r = self.client.object_get(obj, hashmap=True)
1727
        self.assertTrue('hashes' in r.json\
1728
            and 'block_hash' in r.json\
1729
            and 'block_size' in r.json\
1730
            and 'bytes' in r.json)
1731

    
1732
        r = self.client.object_get(obj, format='xml', hashmap=True)
1733
        self.assertEqual(len(r.text.split('hash>')), 3)
1734

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

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

    
1750
        r = self.client.object_get(obj, if_etag_match=etag)
1751
        self.assertEqual(r.status_code, 200)
1752

    
1753
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1754
        self.assertEqual(r.status_code, 200)
1755

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

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

    
1785
        print('\tCheck if files match...')
1786
        src_f = open(src_fname)
1787
        dnl_f = open(dnl_fname)
1788
        for pos in (0, f_size / 2, f_size - 20):
1789
            src_f.seek(pos)
1790
            dnl_f.seek(pos)
1791
            self.assertEqual(src_f.read(10), dnl_f.read(10))
1792
        src_f.close()
1793
        dnl_f.close()
1794

    
1795
        os.remove(src_fname)
1796
        os.remove(dnl_fname)
1797

    
1798
    def test_object_put(self):
1799
        """Test object_PUT"""
1800

    
1801
        self.client.container = self.c2
1802
        obj = 'another.test'
1803

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

    
1817
        """Check content-disposition"""
1818
        r = self.client.get_object_info(obj)
1819
        self.assertTrue('content-disposition' in r)
1820

    
1821
        """Check permissions"""
1822
        r = self.client.get_object_sharing(obj)
1823
        self.assertTrue('accx:groupa' in r['read'])
1824
        self.assertTrue('u1' in r['read'])
1825
        self.assertTrue('u2' in r['write'])
1826
        self.assertTrue('u3' in r['write'])
1827

    
1828
        """Check metadata"""
1829
        r = self.client.get_object_meta(obj)
1830
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1831
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1832

    
1833
        """Check public and if_etag_match"""
1834
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1835
            content_type='application/octet-stream', public=True)
1836

    
1837
        r = self.client.object_get(obj)
1838
        self.assertTrue('x-object-public' in r.headers)
1839
        vers2 = int(r.headers['x-object-version'])
1840
        etag = r.headers['etag']
1841
        self.assertEqual(r.text, 'b')
1842

    
1843
        """Check if_etag_not_match"""
1844
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1845
            content_type='application/octet-stream', success=(201, 412))
1846
        self.assertEqual(r.status_code, 412)
1847

    
1848
        """Check content_type and content_length"""
1849
        tmpdir = 'dir' + unicode(self.now)
1850
        r = self.client.object_put(tmpdir,
1851
            content_type='application/directory',
1852
            content_length=0)
1853

    
1854
        r = self.client.get_object_info(tmpdir)
1855
        self.assertEqual(r['content-type'], 'application/directory')
1856

    
1857
        """Check copy_from, content_encoding"""
1858
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1859
            format=None,
1860
            copy_from='/%s/%s' % (self.client.container, obj),
1861
            content_encoding='application/octet-stream',
1862
            source_account=self.client.account,
1863
            content_length=0, success=201)
1864
        self.assertEqual(r.status_code, 201)
1865

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

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

    
1887
        self.assertEqual(r.status_code, 201)
1888
        r = self.client.get_object_info(obj)
1889
        self.assertEqual(r['etag'], etag)
1890

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

    
1903
        """Check cross-container move_from"""
1904
        self.client.container = self.c1
1905
        r1 = self.client.get_object_info(obj)
1906
        self.client.container = self.c2
1907
        self.client.move_object(src_container=self.c1,
1908
            src_object=obj,
1909
            dst_container=self.c2,
1910
            dst_object=obj + 'v0')
1911
        r0 = self.client.get_object_info(obj + 'v0')
1912
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1913

    
1914
        """Check move_from"""
1915
        r = self.client.object_put(obj + 'v1',
1916
            format=None,
1917
            move_from='/%s/%s' % (self.c2, obj),
1918
            source_version=vers2,
1919
            content_encoding='application/octet-stream',
1920
            content_length=0, success=201)
1921

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

    
1934
        r = self.client.object_put(mobj,
1935
            content_length=0,
1936
            content_type='application/octet-stream',
1937
            manifest='%s/%s' % (self.client.container, mobj))
1938

    
1939
        r = self.client.object_get(mobj)
1940
        self.assertEqual(r.text, txt)
1941

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

    
1951
        """Some problems with transfer-encoding?"""
1952

    
1953
    def test_object_copy(self):
1954
        """Test object_COPY"""
1955
        self.client.container = self.c2
1956
        obj = 'test2'
1957

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

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

    
1975
        """Check content-disposition"""
1976
        r = self.client.get_object_info(obj)
1977
        self.assertTrue('content-disposition' in r)
1978

    
1979
        """Check Metadata"""
1980
        r = self.client.get_object_meta(obj)
1981
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1982
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1983
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1984

    
1985
        """Check permissions"""
1986
        r = self.client.get_object_sharing(obj)
1987
        self.assertFalse('read' in r or 'u2' in r['write'])
1988
        self.assertTrue('accx:groupb' in r['write'])
1989

    
1990
        """Check destination account"""
1991
        r = self.client.object_copy(obj,
1992
            destination='/%s/%s' % (self.c1, obj),
1993
            content_encoding='utf8',
1994
            content_type='application/json',
1995
            destination_account='nonExistendAddress@NeverLand.com',
1996
            success=(201, 403))
1997
        self.assertEqual(r.status_code, 403)
1998

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

    
2009
        """Check ignore_content_type and content_type"""
2010
        r = self.client.object_get(obj)
2011
        etag = r.headers['etag']
2012
        ctype = r.headers['content-type']
2013
        self.assertEqual(ctype, 'application/json')
2014

    
2015
        r = self.client.object_copy(obj + 'orig',
2016
            destination='/%s/%s0' % (self.client.container, obj),
2017
            ignore_content_type=True,
2018
            content_type='application/json')
2019
        self.assertEqual(r.status_code, 201)
2020
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2021

    
2022
        """Check if_etag_(not_)match"""
2023
        r = self.client.object_copy(obj,
2024
            destination='/%s/%s1' % (self.client.container, obj),
2025
            if_etag_match=etag)
2026
        self.assertEqual(r.status_code, 201)
2027

    
2028
        r = self.client.object_copy(obj,
2029
            destination='/%s/%s2' % (self.client.container, obj),
2030
            if_etag_not_match='lalala')
2031
        self.assertEqual(r.status_code, 201)
2032
        vers2 = r.headers['x-object-version']
2033

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

    
2043
        r = self.client.get_object_info(obj + '3')
2044
        self.assertTrue('x-object-public' in r)
2045

    
2046
    def test_object_move(self):
2047
        """Test object_MOVE"""
2048
        self.client.container = self.c2
2049
        obj = 'test2'
2050

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

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

    
2067
        """Check Metadata"""
2068
        r = self.client.get_object_meta(obj)
2069
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2070
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2071
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2072

    
2073
        """Check permissions"""
2074
        r = self.client.get_object_sharing(obj)
2075
        self.assertFalse('read' in r)
2076
        self.assertTrue('u5' in r['write'])
2077
        self.assertTrue('accx:groupb' in r['write'])
2078

    
2079
        """Check destination account"""
2080
        r = self.client.object_move(obj,
2081
            destination='/%s/%s' % (self.c1, obj),
2082
            content_encoding='utf8',
2083
            content_type='application/json',
2084
            destination_account='nonExistendAddress@NeverLand.com',
2085
            success=(201, 403))
2086
        self.assertEqual(r.status_code, 403)
2087

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

    
2106
        """Check ignore_content_type and content_type"""
2107
        r = self.client.object_move(obj,
2108
            destination='/%s/%s' % (self.c2, obj),
2109
            ignore_content_type=True,
2110
            content_type='application/json')
2111
        self.assertEqual(r.status_code, 201)
2112
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2113

    
2114
        """Check if_etag_(not_)match"""
2115
        self.client.container = self.c2
2116
        r = self.client.object_move(obj,
2117
            destination='/%s/%s0' % (self.client.container, obj),
2118
            if_etag_match=etag)
2119
        self.assertEqual(r.status_code, 201)
2120

    
2121
        r = self.client.object_move(obj + '0',
2122
            destination='/%s/%s1' % (self.client.container, obj),
2123
            if_etag_not_match='lalala')
2124
        self.assertEqual(r.status_code, 201)
2125

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

    
2133
        r = self.client.get_object_info(obj + '2')
2134
        self.assertTrue('x-object-public' in r)
2135

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

    
2155
        """Append tests update, content_range, content_type, content_length"""
2156
        newf = open(obj, 'r')
2157
        self.client.append_object(obj, newf)
2158
        r = self.client.object_get(obj)
2159
        self.assertTrue(r.text.startswith('Hello!'))
2160

    
2161
        """Overwrite tests update,
2162
            content_type, content_length, content_range
2163
        """
2164
        newf.seek(0)
2165
        r = self.client.overwrite_object(obj, 0, 10, newf)
2166
        r = self.client.object_get(obj)
2167
        self.assertTrue(r.text.startswith('ello!'))
2168
        newf.close()
2169

    
2170
        """Truncate tests update,
2171
            content_range, content_type, object_bytes and source_object"""
2172
        r = self.client.truncate_object(obj, 5)
2173
        r = self.client.object_get(obj)
2174
        self.assertEqual(r.text, 'ello!')
2175

    
2176
        """Check metadata"""
2177
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2178
        r = self.client.get_object_meta(obj)
2179
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2180
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2181
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2182
        self.client.del_object_meta('mkey1', obj)
2183
        r = self.client.get_object_meta(obj)
2184
        self.assertFalse('x-object-meta-mkey1' in r)
2185

    
2186
        """Check permissions"""
2187
        self.client.set_object_sharing(obj,
2188
            read_permition=['u4', 'u5'], write_permition=['u4'])
2189
        r = self.client.get_object_sharing(obj)
2190
        self.assertTrue('read' in r)
2191
        self.assertTrue('u5' in r['read'])
2192
        self.assertTrue('write' in r)
2193
        self.assertTrue('u4' in r['write'])
2194
        self.client.del_object_sharing(obj)
2195
        r = self.client.get_object_sharing(obj)
2196
        self.assertTrue(len(r) == 0)
2197

    
2198
        """Check publish"""
2199
        self.client.publish_object(obj)
2200
        r = self.client.get_object_info(obj)
2201
        self.assertTrue('x-object-public' in r)
2202
        self.client.unpublish_object(obj)
2203
        r = self.client.get_object_info(obj)
2204
        self.assertFalse('x-object-public' in r)
2205

    
2206
        """Check if_etag_(not)match"""
2207
        etag = r['etag']
2208
        """
2209
        r = self.client.object_post(obj,
2210
            update=True,
2211
            public=True,
2212
            if_etag_not_match=etag,
2213
            success=(412, 202, 204))
2214
        self.assertEqual(r.status_code, 412)
2215
        """
2216

    
2217
        r = self.client.object_post(obj, update=True, public=True,
2218
            if_etag_match=etag, content_encoding='application/json')
2219

    
2220
        r = self.client.get_object_info(obj)
2221
        helloVersion = r['x-object-version']
2222
        self.assertTrue('x-object-public' in r)
2223
        self.assertEqual(r['content-encoding'], 'application/json')
2224

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

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

    
2249
        r = self.client.object_get(obj)
2250
        self.assertEqual(r.text, 'eello!')
2251
        self.assertTrue('content-disposition' in r.headers\
2252
            and 'fname.ext' in r.headers['content-disposition'])
2253

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

    
2266
        self.client.create_object_by_manifestation(mobj,
2267
            content_type='application/octet-stream')
2268

    
2269
        r = self.client.object_post(mobj,
2270
            manifest='%s/%s' % (self.client.container, mobj))
2271

    
2272
        r = self.client.object_get(mobj)
2273
        self.assertEqual(r.text, txt)
2274

    
2275
        """We need to check transfer_encoding """
2276

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

    
2289
        """Check with false until"""
2290
        r = self.client.object_delete(obj, until=1000000)
2291

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

    
2295
        """Check normal case"""
2296
        r = self.client.object_delete(obj)
2297
        self.assertEqual(r.status_code, 204)
2298

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

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

    
2329

    
2330
def init_parser():
2331
    parser = ArgumentParser(add_help=False)
2332
    parser.add_argument('-h', '--help',
2333
        dest='help',
2334
        action='store_true',
2335
        default=False,
2336
        help="Show this help message and exit")
2337
    return parser
2338

    
2339

    
2340
def main(argv):
2341

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

    
2365
    unittest.TextTestRunner(verbosity=2).run(suiteFew)
2366

    
2367
if __name__ == '__main__':
2368
    parser = init_parser()
2369
    args, argv = parser.parse_known_args()
2370
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2371
        raise Exception('\tusage: tests.py <group> [command]')
2372
    main(argv)