Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 75c3fc42

History | View | Annotate | Download (82.7 kB)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
587
    def _wait_for_network(self, netid, status):
588
        wait = 3
589
        limit = 50
590
        c = ['|', '/', '-', '\\']
591
        sys.stdout.write('\t- make net %s %s  ' % (netid, status))
592
        while wait < limit:
593
            r = self.client.get_network_details(netid)
594
            if r['status'] == status:
595
                print('\tOK')
596
                return True
597
            sys.stdout.write('\tit is now %s, wait %ss  '\
598
                % (r['status'], wait))
599
            for i in range(wait * 4):
600
                sys.stdout.write('\b%s' % c[i % 4])
601
                sys.stdout.flush()
602
                time.sleep(0.25)
603
            print('\b ')
604
            wait += 3
605
        return False
606

    
607
    def _wait_for_nic(self, netid, servid, in_creation=True):
608
        self._wait_for_network(netid, 'ACTIVE')
609
        c = ['|', '/', '-', '\\']
610
        limit = 50
611
        wait = 3
612
        largetry = 0
613
        while wait < limit:
614
            nics = self.client.list_server_nics(servid)
615
            for net in nics:
616
                found_nic = net['network_id'] == netid
617
                if (in_creation and found_nic)\
618
                or not (in_creation or found_nic):
619
                    return True
620
            dis = '' if in_creation else 'dis'
621
            sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '\
622
                % (netid, dis, servid, wait))
623
            for i in range(wait * 4):
624
                sys.stdout.write('\b%s' % c[i % 4])
625
                sys.stdout.flush()
626
                time.sleep(0.25)
627
            print('\b ')
628
            wait += 3
629
            if wait >= limit and largetry < 3:
630
                wait = 3
631
                largetry += 1
632
        return False
633

    
634
    def _has_status(self, servid, status):
635
        r = self.client.get_server_details(servid)
636
        return r['status'] == status
637

    
638
    def _wait_for_status(self, servid, status):
639
        wait = 0
640
        c = ['|', '/', '-', '\\']
641
        while self._has_status(servid, status):
642
            if wait:
643
                sys.stdout.write('\tServer %s in %s. Wait %ss  '\
644
                    % (servid, status, wait))
645
                for i in range(4 * wait):
646
                    sys.stdout.write('\b%s' % c[i % 4])
647
                    sys.stdout.flush()
648
                    time.sleep(0.25)
649
                print('\b ')
650
            wait = (wait + 3) if wait < 60 else 0
651

    
652
    @if_not_all
653
    def test_list_servers(self):
654
        """Test list servers"""
655
        self.server1 = self._create_server(self.servname1,
656
            self.flavorid,
657
            self.img)
658
        self.server2 = self._create_server(self.servname2,
659
            self.flavorid + 1,
660
            self.img)
661
        self._test_list_servers()
662

    
663
    def _test_list_servers(self):
664
        servers = self.client.list_servers()
665
        dservers = self.client.list_servers(detail=True)
666

    
667
        """detailed and simple are same size"""
668
        self.assertEqual(len(dservers), len(servers))
669
        for i in range(len(servers)):
670
            for field in ('created',
671
            'flavorRef',
672
            'hostId',
673
            'imageRef',
674
            'progress',
675
            'status',
676
            'updated'):
677
                self.assertFalse(field in servers[i])
678
                self.assertTrue(field in dservers[i])
679

    
680
        """detailed and simple contain same names"""
681
        names = sorted(map(lambda x: x["name"], servers))
682
        dnames = sorted(map(lambda x: x["name"], dservers))
683
        self.assertEqual(names, dnames)
684

    
685
    @if_not_all
686
    def test_create_server(self):
687
        """Test create_server"""
688
        self.server1 = self._create_server(self.servname1,
689
            self.flavorid,
690
            self.img)
691
        self._wait_for_status(self.server1['id'], 'BUILD')
692
        self._test_create_server()
693

    
694
    def _test_create_server(self):
695
        self.assertEqual(self.server1["name"], self.servname1)
696
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
697
        self.assertEqual(self.server1["imageRef"], self.img)
698
        self.assertEqual(self.server1["status"], "BUILD")
699

    
700
    @if_not_all
701
    def test_get_server_details(self):
702
        """Test get_server_details"""
703
        self.server1 = self._create_server(self.servname1,
704
            self.flavorid,
705
            self.img)
706
        self._wait_for_status(self.server1['id'], 'BUILD')
707
        self._test_get_server_details()
708

    
709
    def _test_get_server_details(self):
710
        r = self.client.get_server_details(self.server1['id'])
711
        self.assertEqual(r["name"], self.servname1)
712
        self.assertEqual(r["flavorRef"], self.flavorid)
713
        self.assertEqual(r["imageRef"], self.img)
714
        self.assertEqual(r["status"], "ACTIVE")
715

    
716
    @if_not_all
717
    def test_update_server_name(self):
718
        """Test update_server_name"""
719
        self.server1 = self._create_server(self.servname1,
720
            self.flavorid,
721
            self.img)
722
        self._test_update_server_name()
723

    
724
    def _test_update_server_name(self):
725
        new_name = self.servname1 + '_new_name'
726
        self.client.update_server_name(self.server1['id'], new_name)
727
        r = self.client.get_server_details(self.server1['id'],
728
         success=(200, 400))
729
        self.assertEqual(r['name'], new_name)
730
        changed = self.servers.pop(self.servname1)
731
        changed['name'] = new_name
732
        self.servers[new_name] = changed
733

    
734
    @if_not_all
735
    def test_reboot_server(self):
736
        """Test reboot server"""
737
        self.server1 = self._create_server(self.servname1,
738
            self.flavorid,
739
            self.img)
740
        self._wait_for_status(self.server1['id'], 'BUILD')
741
        self.server2 = self._create_server(self.servname2,
742
            self.flavorid + 1,
743
            self.img)
744
        self._wait_for_status(self.server2['id'], 'BUILD')
745
        self._test_reboot_server()
746
        self._wait_for_status(self.server1['id'], 'REBOOT')
747
        self._wait_for_status(self.server2['id'], 'REBOOT')
748

    
749
    def _test_reboot_server(self):
750
        self.client.reboot_server(self.server1['id'])
751
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
752
        self.client.reboot_server(self.server2['id'], hard=True)
753
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
754

    
755
    @if_not_all
756
    def test_get_server_metadata(self):
757
        """Test get server_metadata"""
758
        self.server1 = self._create_server(self.servname1,
759
            self.flavorid,
760
            self.img)
761
        self._test_get_server_metadata()
762

    
763
    def _test_get_server_metadata(self):
764
        self.client.create_server_metadata(self.server1['id'],
765
            'mymeta_0',
766
            'val_0')
767
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
768
        self.assertEqual(r['mymeta_0'], 'val_0')
769

    
770
    @if_not_all
771
    def test_create_server_metadata(self):
772
        """Test create_server_metadata"""
773
        self.server1 = self._create_server(self.servname1,
774
            self.flavorid,
775
            self.img)
776
        self._test_create_server_metadata()
777

    
778
    def _test_create_server_metadata(self):
779
        r1 = self.client.create_server_metadata(self.server1['id'],
780
            'mymeta',
781
            'mymeta val')
782
        self.assertTrue('mymeta' in r1)
783
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
784
        self.assert_dicts_are_deeply_equal(r1, r2)
785

    
786
    @if_not_all
787
    def test_update_server_metadata(self):
788
        """Test update_server_metadata"""
789
        self.server1 = self._create_server(self.servname1,
790
            self.flavorid,
791
            self.img)
792
        self._test_update_server_metadata()
793

    
794
    def _test_update_server_metadata(self):
795
        r1 = self.client.create_server_metadata(self.server1['id'],
796
            'mymeta3',
797
            'val2')
798
        self.assertTrue('mymeta3'in r1)
799
        r2 = self.client.update_server_metadata(self.server1['id'],
800
            mymeta3='val3')
801
        self.assertTrue(r2['mymeta3'], 'val3')
802

    
803
    @if_not_all
804
    def test_delete_server_metadata(self):
805
        """Test delete_server_metadata"""
806
        self.server1 = self._create_server(self.servname1,
807
            self.flavorid,
808
            self.img)
809
        self._test_delete_server_metadata()
810

    
811
    def _test_delete_server_metadata(self):
812
        r1 = self.client.create_server_metadata(self.server1['id'],
813
            'mymeta',
814
            'val')
815
        self.assertTrue('mymeta' in r1)
816
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
817
        try:
818
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
819
            raise ClientError('Wrong Error', status=100)
820
        except ClientError as err:
821
            self.assertEqual(err.status, 404)
822

    
823
    @if_not_all
824
    def test_list_flavors(self):
825
        """Test flavors_get"""
826
        self._test_list_flavors()
827

    
828
    def _test_list_flavors(self):
829
        r = self.client.list_flavors()
830
        self.assertTrue(len(r) > 1)
831
        r = self.client.list_flavors(detail=True)
832
        self.assertTrue('SNF:disk_template' in r[0])
833

    
834
    @if_not_all
835
    def test_get_flavor_details(self):
836
        """Test test_get_flavor_details"""
837
        self._test_get_flavor_details()
838

    
839
    def _test_get_flavor_details(self):
840
        r = self.client.get_flavor_details(self.flavorid)
841
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
842

    
843
    @if_not_all
844
    def test_list_images(self):
845
        """Test list_images"""
846
        self._test_list_images()
847

    
848
    def _test_list_images(self):
849
        r = self.client.list_images()
850
        self.assertTrue(len(r) > 1)
851
        r = self.client.list_images(detail=True)
852
        for detailed_img in r:
853
            if detailed_img['id'] == self.img:
854
                break
855
        self.assert_dicts_are_deeply_equal(r[1], self.img_details)
856

    
857
    @if_not_all
858
    def test_image_details(self):
859
        """Test image_details"""
860
        self._test_get_image_details
861

    
862
    def _test_get_image_details(self):
863
        r = self.client.get_image_details(self.img)
864
        self.assert_dicts_are_deeply_equal(r, self.img_details)
865

    
866
    @if_not_all
867
    def test_get_image_metadata(self):
868
        """Test get_image_metadata"""
869
        self._test_get_image_metadata()
870

    
871
    def _test_get_image_metadata(self):
872
        r = self.client.get_image_metadata(self.img)
873
        self.assert_dicts_are_deeply_equal(
874
            self.img_details['metadata']['values'], r)
875
        for key, val in self.img_details['metadata']['values'].items():
876
            r = self.client.get_image_metadata(self.img, key)
877
            self.assertEqual(r[key], val)
878

    
879
    @if_not_all
880
    def test_start_server(self):
881
        """Test start_server"""
882
        self.server1 = self._create_server(self.servname1,
883
            self.flavorid,
884
            self.img)
885
        self._wait_for_status(self.server1['id'], 'BUILD')
886
        self.client.shutdown_server(self.server1['id'])
887
        self._wait_for_status(self.server1['id'], 'ACTIVE')
888
        self._test_start_server()
889

    
890
    def _test_start_server(self):
891
        self.client.start_server(self.server1['id'])
892
        self._wait_for_status(self.server1['id'], 'STOPPED')
893
        r = self.client.get_server_details(self.server1['id'])
894
        self.assertEqual(r['status'], 'ACTIVE')
895

    
896
    @if_not_all
897
    def test_shutdown_server(self):
898
        """Test shutdown_server"""
899
        self.server1 = self._create_server(self.servname1,
900
            self.flavorid,
901
            self.img)
902
        self._wait_for_status(self.server1['id'], 'BUILD')
903
        self._test_shutdown_server()
904

    
905
    def _test_shutdown_server(self):
906
        self.client.shutdown_server(self.server1['id'])
907
        self._wait_for_status(self.server1['id'], 'ACTIVE')
908
        r = self.client.get_server_details(self.server1['id'])
909
        self.assertEqual(r['status'], 'STOPPED')
910

    
911
    @if_not_all
912
    def test_get_server_console(self):
913
        """Test get_server_console"""
914
        self.server2 = self._create_server(self.servname2,
915
            self.flavorid + 2,
916
            self.img)
917
        self._wait_for_status(self.server2['id'], 'BUILD')
918
        self._test_get_server_console()
919

    
920
    def _test_get_server_console(self):
921
        r = self.client.get_server_console(self.server2['id'])
922
        self.assertTrue('host' in r)
923
        self.assertTrue('password' in r)
924
        self.assertTrue('port' in r)
925
        self.assertTrue('type' in r)
926

    
927
    @if_not_all
928
    def test_get_firewall_profile(self):
929
        """Test get_firewall_profile"""
930
        self.server1 = self._create_server(self.servname1,
931
            self.flavorid,
932
            self.img)
933
        self._test_get_firewall_profile()
934

    
935
    def _test_get_firewall_profile(self):
936
        self._wait_for_status(self.server1['id'], 'BUILD')
937
        fprofile = self.client.get_firewall_profile(self.server1['id'])
938
        self.assertTrue(fprofile in self.PROFILES)
939

    
940
    @if_not_all
941
    def test_set_firewall_profile(self):
942
        """Test set_firewall_profile"""
943
        self.server1 = self._create_server(self.servname1,
944
            self.flavorid,
945
            self.img)
946
        self._test_set_firewall_profile()
947

    
948
    def _test_set_firewall_profile(self):
949

    
950
        self._wait_for_status(self.server1['id'], 'BUILD')
951
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
952
        fprofile = self.client.get_firewall_profile(self.server1['id'])
953
        print('')
954
        for counter, fprofile in enumerate(PROFILES):
955
            start = fprofile
956
            npos = counter + 1
957
            nprofile = PROFILES[npos] if npos < len(PROFILES) else PROFILES[0]
958
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
959
            self.client.set_firewall_profile(self.server1['id'], nprofile)
960
            wait = 3
961
            c = ['|', '/', '-', '\\']
962
            while fprofile != nprofile:
963
                if wait % 10 == 0:
964
                    self.client.set_firewall_profile(self.server1['id'],
965
                        nprofile)
966
                self.assertEqual(fprofile, start)
967
                sys.stdout.write('\t   profile is %s, wait %ss  '\
968
                    % (fprofile, wait))
969
                for i in range(4 * wait):
970
                    sys.stdout.write('\b%s' % c[i % 4])
971
                    sys.stdout.flush()
972
                    time.sleep(0.25)
973
                wait += 3
974
                print('\b ')
975
                fprofile = self.client.get_firewall_profile(self.server1['id'])
976

    
977
    @if_not_all
978
    def test_get_server_stats(self):
979
        self.server1 = self._create_server(self.servname1,
980
            self.flavorid,
981
            self.img)
982
        self._test_get_server_stats()
983

    
984
    def _test_get_server_stats(self):
985
        r = self.client.get_server_stats(self.server1['id'])
986
        for term in ('cpuBar',
987
        'cpuTimeSeries',
988
        'netBar',
989
        'netTimeSeries',
990
        'refresh'):
991
            self.assertTrue(term in r)
992

    
993
    @if_not_all
994
    def test_list_networks(self):
995
        """Test list_network"""
996
        self.network1 = self._create_network(self.netname1)
997
        self._wait_for_network(self.network1['id'], 'ACTIVE')
998
        self._test_list_networks()
999

    
1000
    def _test_list_networks(self):
1001
        r = self.client.list_networks()
1002
        self.assertTrue(len(r) > 1)
1003
        ids = [net['id'] for net in r]
1004
        names = [net['name'] for net in r]
1005
        self.assertTrue('1' in ids)
1006
        self.assertTrue('public' in names)
1007
        self.assertTrue(self.network1['id'] in ids)
1008
        self.assertTrue(self.network1['name'] in names)
1009

    
1010
        r = self.client.list_networks(detail=True)
1011
        ids = [net['id'] for net in r]
1012
        names = [net['name'] for net in r]
1013
        for net in r:
1014
            self.assertTrue(net['id'] in ids)
1015
            self.assertTrue(net['name'] in names)
1016
            for term in ('status', 'updated', 'created'):
1017
                self.assertTrue(term in net.keys())
1018

    
1019
    @if_not_all
1020
    def test_create_network(self):
1021
        """Test create_network"""
1022
        self.network1 = self._create_network(self.netname1)
1023
        self._test_create_network()
1024

    
1025
    def _test_create_network(self):
1026
        nets = self.client.list_networks(self.network1['id'])
1027
        chosen = [net for net in nets if net['id'] == self.network1['id']][0]
1028
        chosen.pop('updated')
1029
        net1 = dict(self.network1)
1030
        net1.pop('updated')
1031
        self.assert_dicts_are_deeply_equal(chosen, net1)
1032

    
1033
    @if_not_all
1034
    def test_connect_server(self):
1035
        """Test connect_server"""
1036
        self.server1 = self._create_server(self.servname1,
1037
            self.flavorid,
1038
            self.img)
1039
        self.network1 = self._create_network(self.netname1)
1040
        self._wait_for_status(self.server1['id'], 'BUILD')
1041
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1042
        self._test_connect_server()
1043

    
1044
    def _test_connect_server(self):
1045
        self.client.connect_server(self.server1['id'], self.network1['id'])
1046
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1047
            self.server1['id']))
1048

    
1049
    @if_not_all
1050
    def test_disconnect_server(self):
1051
        """Test disconnect_server"""
1052
        self.test_connect_server()
1053
        self._test_disconnect_server()
1054

    
1055
    def _test_disconnect_server(self):
1056
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
1057
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1058
            self.server1['id'],
1059
            in_creation=False))
1060

    
1061
    @if_not_all
1062
    def test_list_server_nics(self):
1063
        """Test list_server_nics"""
1064
        self.server1 = self._create_server(self.servname1,
1065
            self.flavorid,
1066
            self.img)
1067
        self.network2 = self._create_network(self.netname2)
1068
        self._wait_for_status(self.server1['id'], 'BUILD')
1069
        self._wait_for_network(self.network2['id'], 'ACTIVE')
1070
        self._test_list_server_nics()
1071

    
1072
    def _test_list_server_nics(self):
1073
        r = self.client.list_server_nics(self.server1['id'])
1074
        len0 = len(r)
1075
        self.assertTrue(len0 > 0)
1076
        print(' ' + net)
1077
        self.assertTrue('1' in [net['network_id'] for net in r])
1078

    
1079
        self.client.connect_server(self.server1['id'], self.network2['id'])
1080
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1081
            self.server1['id']))
1082
        r = self.client.list_server_nics(self.server1['id'])
1083
        self.assertTrue(len(r) > len0)
1084

    
1085
    @if_not_all
1086
    def test_get_network_details(self):
1087
        """Test get_network_details"""
1088
        self.network1 = self._create_network(self.netname1)
1089
        self._test_get_network_details()
1090

    
1091
    def _test_get_network_details(self):
1092
        r = self.client.get_network_details(self.network1['id'])
1093
        net1 = dict(self.network1)
1094
        net1.pop('status')
1095
        net1.pop('updated', None)
1096
        net1.pop('attachments')
1097
        r.pop('status')
1098
        r.pop('updated', None)
1099
        r.pop('attachments')
1100
        self.assert_dicts_are_deeply_equal(net1, r)
1101

    
1102
    @if_not_all
1103
    def test_update_network_name(self):
1104
        self.network2 = self._create_network(self.netname2)
1105
        self._test_update_network_name()
1106

    
1107
    def _test_update_network_name(self):
1108
        updated_name = self.netname2 + '_upd'
1109
        self.client.update_network_name(self.network2['id'], updated_name)
1110
        wait = 3
1111
        c = ['|', '/', '-', '\\']
1112
        r = self.client.get_network_details(self.network2['id'])
1113
        while wait < 50:
1114
            if r['name'] == updated_name:
1115
                break
1116
            sys.stdout.write(
1117
                '\twait for %s renaming (%s->%s) %ss  ' % (self.network2['id'],
1118
                self.network2['name'],
1119
                updated_name, wait))
1120
            for i in range(4 * wait):
1121
                sys.stdout.write('\b%s' % c[i % 4])
1122
                sys.stdout.flush()
1123
                time.sleep(0.25)
1124
            print('')
1125
            wait += 3
1126
            r = self.client.get_network_details(self.network2['id'])
1127
        self.assertEqual(r['name'], updated_name)
1128

    
1129
    """ Don't have auth to test this
1130
    @if_not_all
1131
    def test_delete_image(self):
1132
        ""Test delete_image""
1133
        self._test_delete_image()
1134
    def _test_delete_image(self):
1135
        images = self.client.list_images()
1136
        self.client.delete_image(images[2]['id'])
1137
        try:
1138
            r = self.client.get_image_details(images[2]['id'], success=(400))
1139
        except ClientError as err:
1140
            self.assertEqual(err.status, 404)
1141

1142
    @if_not_all
1143
    def test_create_image_metadata(self):
1144
        ""Test create_image_metadata""
1145
        self._test_create_image_metadata()
1146
    def _test_create_image_metadata(self):
1147
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1148
        self.assertEqual(r['mykey'], 'myval')
1149

1150
    @if_not_all
1151
    def test_update_image_metadata(self):
1152
        ""Test update_image_metadata""
1153
        self._test_update_image_metadata()
1154
    def _test_update_image_metadata(self):
1155
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1156
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1157
        self.assertEqual(r['mykey0'], 'myval0')
1158

1159
    @if_not_all
1160
    def test_delete_image_metadata(self):
1161
        ""Test delete_image_metadata""
1162
        self._test_delete_image_metadata()
1163
    def _test_delete_image_metadata(self):
1164
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1165
        self.client.delete_image_metadata(self.img, 'mykey1')
1166
        r = self.client.get_image_metadata(self.img)
1167
        self.assertNotEqual('mykey1' in r)
1168
    """
1169

    
1170

    
1171
class testPithos(unittest.TestCase):
1172
    """Set up a Pithos+ thorough test"""
1173
    def setUp(self):
1174
        """
1175
        url = 'http://127.0.0.1:8000/v1'
1176
        global token
1177
        account = 'admin@adminland.com'
1178
        """
1179

    
1180
        global cnf
1181
        url = cnf.get('store', 'url')
1182

    
1183
        global token
1184
        global global_username
1185
        account = global_username
1186

    
1187
        """
1188
        url='https://pithos.okeanos.io/v1'
1189
        """
1190

    
1191
        """
1192
        def add_handler(name, level, prefix=''):
1193
            h = logging.StreamHandler()
1194
            fmt = logging.Formatter(prefix + '%(message)s')
1195
            h.setFormatter(fmt)
1196
            logger = logging.getLogger(name)
1197
            logger.addHandler(h)
1198
            logger.setLevel(level)
1199
        import logging
1200
        sendlog = logging.getLogger('clients.send')
1201
        recvlog = logging.getLogger('clients.recv')
1202
        add_handler('requests', logging.INFO, prefix='* ')
1203
        add_handler('clients.send', logging.INFO, prefix='> ')
1204
        add_handler('clients.recv', logging.INFO, prefix='< ')
1205
        """
1206

    
1207
        self.fname = None
1208
        container = None
1209
        self.client = pithos(url, token, account, container)
1210
        self.now = time.mktime(time.gmtime())
1211
        self.c1 = 'c1_' + unicode(self.now)
1212
        self.c2 = 'c2_' + unicode(self.now)
1213
        self.c3 = 'c3_' + unicode(self.now)
1214

    
1215
        self.client.create_container(self.c1)
1216
        self.client.create_container(self.c2)
1217
        self.client.create_container(self.c3)
1218
        self.makeNewObject(self.c1, 'test')
1219
        self.makeNewObject(self.c2, 'test')
1220
        self.now_unformated = datetime.datetime.utcnow()
1221
        self.makeNewObject(self.c1, 'test1')
1222
        self.makeNewObject(self.c2, 'test1')
1223
        """Prepare an object to be shared - also its container"""
1224
        self.client.container = self.c1
1225
        self.client.object_post('test',
1226
            update=True,
1227
            permissions={'read': 'someUser'})
1228

    
1229
        self.makeNewObject(self.c1, 'another.test')
1230

    
1231
    def makeNewObject(self, container, obj):
1232
        self.client.container = container
1233
        self.client.object_put(obj,
1234
            content_type='application/octet-stream',
1235
            data='file %s that lives in %s' % (obj, container),
1236
            metadata={'incontainer': container})
1237

    
1238
    def forceDeleteContainer(self, container):
1239
        self.client.container = container
1240
        try:
1241
            r = self.client.list_objects()
1242
        except ClientError:
1243
            return
1244
        for obj in r:
1245
            name = obj['name']
1246
            self.client.del_object(name)
1247
        r = self.client.container_delete()
1248
        self.container = ''
1249

    
1250
    def tearDown(self):
1251
        """Destroy test cases"""
1252
        if self.fname is not None:
1253
            try:
1254
                os.remove(self.fname)
1255
            except OSError:
1256
                pass
1257
            self.fname = None
1258
        self.forceDeleteContainer(self.c1)
1259
        self.forceDeleteContainer(self.c2)
1260
        try:
1261
            self.forceDeleteContainer(self.c3)
1262
        except ClientError:
1263
            pass
1264
        self.client.container = ''
1265

    
1266
    def test_000(self):
1267
        """Perform a full Pithos+ kamaki support test"""
1268

    
1269
    def test_account_head(self):
1270
        """Test account_HEAD"""
1271
        r = self.client.account_head()
1272
        self.assertEqual(r.status_code, 204)
1273

    
1274
        r = self.client.account_head(until='1000000000')
1275
        self.assertEqual(r.status_code, 204)
1276

    
1277
        r = self.client.get_account_info(until='1000000000')
1278
        datestring = unicode(r['x-account-until-timestamp'])
1279
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1280

    
1281
        r = self.client.get_account_quota()
1282
        self.assertTrue('x-account-policy-quota' in r)
1283

    
1284
        r = self.client.get_account_versioning()
1285
        self.assertTrue('x-account-policy-versioning' in r)
1286

    
1287
        """Check if(un)modified_since"""
1288
        for format in self.client.DATE_FORMATS:
1289
            now_formated = self.now_unformated.strftime(format)
1290
            r1 = self.client.account_head(if_modified_since=now_formated,
1291
                success=(204, 304, 412))
1292
            sc1 = r1.status_code
1293
            r1.release()
1294
            r2 = self.client.account_head(if_unmodified_since=now_formated,
1295
                success=(204, 304, 412))
1296
            sc2 = r2.status_code
1297
            r2.release()
1298
            self.assertNotEqual(sc1, sc2)
1299

    
1300
    def test_account_get(self):
1301
        """Test account_GET"""
1302
        #r = self.client.account_get()
1303
        #self.assertEqual(r.status_code, 200)
1304
        r = self.client.list_containers()
1305
        fullLen = len(r)
1306
        self.assertTrue(fullLen > 2)
1307

    
1308
        r = self.client.account_get(limit=1)
1309
        self.assertEqual(len(r.json), 1)
1310

    
1311
        r = self.client.account_get(marker='c2_')
1312
        temp_c0 = r.json[0]['name']
1313
        temp_c2 = r.json[2]['name']
1314

    
1315
        r = self.client.account_get(limit=2, marker='c2_')
1316
        conames = [container['name'] for container in r.json \
1317
            if container['name'].lower().startswith('c2_')]
1318
        self.assertTrue(temp_c0 in conames)
1319
        self.assertFalse(temp_c2 in conames)
1320

    
1321
        r = self.client.account_get(show_only_shared=True)
1322
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1323

    
1324
        r = self.client.account_get(until=1342609206)
1325
        self.assertTrue(len(r.json) <= fullLen)
1326

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

    
1340
        """Check sharing_accounts"""
1341
        r = self.client.get_sharing_accounts()
1342
        self.assertTrue(len(r) > 0)
1343

    
1344
    def test_account_post(self):
1345
        """Test account_POST"""
1346
        r = self.client.account_post()
1347
        self.assertEqual(r.status_code, 202)
1348
        grpName = 'grp' + unicode(self.now)
1349

    
1350
        """Method set/del_account_meta and set_account_groupcall use
1351
            account_post internally
1352
        """
1353
        self.client.set_account_group(grpName, ['u1', 'u2'])
1354
        r = self.client.get_account_group()
1355
        self.assertEqual(r['x-account-group-' + grpName], 'u1,u2')
1356
        self.client.del_account_group(grpName)
1357
        r = self.client.get_account_group()
1358
        self.assertTrue('x-account-group-' + grpName not in r)
1359

    
1360
        mprefix = 'meta' + unicode(self.now)
1361
        self.client.set_account_meta({mprefix + '1': 'v1',
1362
            mprefix + '2': 'v2'})
1363
        r = self.client.get_account_meta()
1364
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
1365
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
1366

    
1367
        self.client.del_account_meta(mprefix + '1')
1368
        r = self.client.get_account_meta()
1369
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
1370

    
1371
        self.client.del_account_meta(mprefix + '2')
1372
        r = self.client.get_account_meta()
1373
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
1374

    
1375
        """Missing testing for quota, versioning, because normally
1376
        you don't have permissions to modify those at account level
1377
        """
1378

    
1379
        newquota = 1000000
1380
        self.client.set_account_quota(newquota)
1381
        #r = self.client.get_account_info()
1382
        #print(unicode(r))
1383
        #r = self.client.get_account_quota()
1384
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1385
        self.client.set_account_versioning('auto')
1386

    
1387
    def test_container_head(self):
1388
        """Test container_HEAD"""
1389
        self.client.container = self.c1
1390

    
1391
        r = self.client.container_head()
1392
        self.assertEqual(r.status_code, 204)
1393

    
1394
        """Check until"""
1395
        r = self.client.container_head(until=1000000, success=(204, 404))
1396
        self.assertEqual(r.status_code, 404)
1397

    
1398
        """Check and if(un)modified_since"""
1399
        for format in self.client.DATE_FORMATS:
1400
            now_formated = self.now_unformated.strftime(format)
1401
            r1 = self.client.container_head(if_modified_since=now_formated,
1402
                success=(204, 304, 412))
1403
            sc1 = r1.status_code
1404
            r1.release()
1405
            r2 = self.client.container_head(if_unmodified_since=now_formated,
1406
                success=(204, 304, 412))
1407
            sc2 = r2.status_code
1408
            r2.release()
1409
            self.assertNotEqual(sc1, sc2)
1410

    
1411
        """Check container object meta"""
1412
        r = self.client.get_container_object_meta()
1413
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1414

    
1415
    def test_container_get(self):
1416
        """Test container_GET"""
1417
        self.client.container = self.c1
1418

    
1419
        r = self.client.container_get()
1420
        self.assertEqual(r.status_code, 200)
1421
        fullLen = len(r.json)
1422

    
1423
        r = self.client.container_get(prefix='test')
1424
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1425
        self.assertTrue(len(r.json) > 1)
1426
        self.assertEqual(len(r.json), len(lalobjects))
1427

    
1428
        r = self.client.container_get(limit=1)
1429
        self.assertEqual(len(r.json), 1)
1430

    
1431
        r = self.client.container_get(marker='another')
1432
        self.assertTrue(len(r.json) > 1)
1433
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1434
        self.assertEqual(len(r.json), len(neobjects))
1435

    
1436
        r = self.client.container_get(prefix='another.test', delimiter='.')
1437
        self.assertTrue(fullLen > len(r.json))
1438

    
1439
        r = self.client.container_get(path='/')
1440
        self.assertEqual(fullLen, len(r.json))
1441

    
1442
        r = self.client.container_get(format='xml')
1443
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1444

    
1445
        r = self.client.container_get(meta=['incontainer'])
1446
        self.assertTrue(len(r.json) > 0)
1447

    
1448
        r = self.client.container_get(show_only_shared=True)
1449
        self.assertTrue(len(r.json) < fullLen)
1450

    
1451
        try:
1452
            r = self.client.container_get(until=1000000000)
1453
            datestring = unicode(r.headers['x-account-until-timestamp'])
1454
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1455

    
1456
        except ClientError:
1457

    
1458
            pass
1459

    
1460
        """Check and if un/modified_since"""
1461
        for format in self.client.DATE_FORMATS:
1462
            now_formated = self.now_unformated.strftime(format)
1463
            r1 = self.client.container_get(if_modified_since=now_formated,
1464
                success=(200, 304, 412))
1465
            sc1 = r1.status_code
1466
            r1.release()
1467
            r2 = self.client.container_get(if_unmodified_since=now_formated,
1468
                success=(200, 304, 412))
1469
            sc2 = r2.status_code
1470
            r2.release()
1471
            self.assertNotEqual(sc1, sc2)
1472

    
1473
    def test_container_put(self):
1474
        """Test container_PUT"""
1475
        self.client.container = self.c2
1476

    
1477
        r = self.client.container_put()
1478
        self.assertEqual(r.status_code, 202)
1479

    
1480
        r = self.client.get_container_quota(self.client.container)
1481
        cquota = r.values()[0]
1482
        newquota = 2 * int(cquota)
1483

    
1484
        r = self.client.container_put(quota=newquota)
1485
        self.assertEqual(r.status_code, 202)
1486

    
1487
        r = self.client.get_container_quota(self.client.container)
1488
        xquota = int(r.values()[0])
1489
        self.assertEqual(newquota, xquota)
1490

    
1491
        r = self.client.container_put(versioning='auto')
1492
        self.assertEqual(r.status_code, 202)
1493

    
1494
        r = self.client.get_container_versioning(self.client.container)
1495
        nvers = r.values()[0]
1496
        self.assertEqual('auto', nvers)
1497

    
1498
        r = self.client.container_put(versioning='none')
1499
        self.assertEqual(r.status_code, 202)
1500

    
1501
        r = self.client.get_container_versioning(self.client.container)
1502
        nvers = r.values()[0]
1503
        self.assertEqual('none', nvers)
1504

    
1505
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1506
        self.assertEqual(r.status_code, 202)
1507

    
1508
        r = self.client.get_container_meta(self.client.container)
1509
        self.assertTrue('x-container-meta-m1' in r)
1510
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1511
        self.assertTrue('x-container-meta-m2' in r)
1512
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1513

    
1514
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
1515
        self.assertEqual(r.status_code, 202)
1516

    
1517
        r = self.client.get_container_meta(self.client.container)
1518
        self.assertTrue('x-container-meta-m1' not in r)
1519
        self.assertTrue('x-container-meta-m2' in r)
1520
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1521

    
1522
        self.client.del_container_meta(self.client.container)
1523

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

    
1528
        """Simple post"""
1529
        r = self.client.container_post()
1530
        self.assertEqual(r.status_code, 202)
1531

    
1532
        """post meta"""
1533
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
1534
        r = self.client.get_container_meta(self.client.container)
1535
        self.assertTrue('x-container-meta-m1' in r)
1536
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1537
        self.assertTrue('x-container-meta-m2' in r)
1538
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1539

    
1540
        """post/2del meta"""
1541
        r = self.client.del_container_meta('m1')
1542
        r = self.client.set_container_meta({'m2': 'v2a'})
1543
        r = self.client.get_container_meta(self.client.container)
1544
        self.assertTrue('x-container-meta-m1' not in r)
1545
        self.assertTrue('x-container-meta-m2' in r)
1546
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1547

    
1548
        """check quota"""
1549
        r = self.client.get_container_quota(self.client.container)
1550
        cquota = r.values()[0]
1551
        newquota = 2 * int(cquota)
1552
        r = self.client.set_container_quota(newquota)
1553
        r = self.client.get_container_quota(self.client.container)
1554
        xquota = int(r.values()[0])
1555
        self.assertEqual(newquota, xquota)
1556
        r = self.client.set_container_quota(cquota)
1557
        r = self.client.get_container_quota(self.client.container)
1558
        xquota = r.values()[0]
1559
        self.assertEqual(cquota, xquota)
1560

    
1561
        """Check versioning"""
1562
        self.client.set_container_versioning('auto')
1563
        r = self.client.get_container_versioning(self.client.container)
1564
        nvers = r.values()[0]
1565
        self.assertEqual('auto', nvers)
1566
        self.client.set_container_versioning('none')
1567
        r = self.client.get_container_versioning(self.client.container)
1568
        nvers = r.values()[0]
1569
        self.assertEqual('none', nvers)
1570

    
1571
        """put_block uses content_type and content_length to
1572
        post blocks of data 2 container. All that in upload_object"""
1573
        """Change a file at fs"""
1574
        self.create_large_file(1024 * 1024 * 100, 'l100M.' + unicode(self.now))
1575
        """Upload it at a directory in container"""
1576
        self.client.create_directory('dir')
1577
        newf = open(self.fname, 'r')
1578
        self.client.upload_object('/dir/sample.file', newf)
1579
        newf.close()
1580
        """Check if file has been uploaded"""
1581
        r = self.client.get_object_info('/dir/sample.file')
1582
        self.assertTrue(int(r['content-length']) > 100000000)
1583

    
1584
        """WTF is tranfer_encoding? What should I check about th** s**t? """
1585
        #TODO
1586

    
1587
        """Check update=False"""
1588
        r = self.client.object_post('test',
1589
            update=False,
1590
            metadata={'newmeta': 'newval'})
1591

    
1592
        r = self.client.get_object_info('test')
1593
        self.assertTrue('x-object-meta-newmeta' in r)
1594
        self.assertFalse('x-object-meta-incontainer' in r)
1595

    
1596
        r = self.client.del_container_meta('m2')
1597

    
1598
    def test_container_delete(self):
1599
        """Test container_DELETE"""
1600

    
1601
        """Fail to delete a non-empty container"""
1602
        self.client.container = self.c2
1603
        r = self.client.container_delete(success=409)
1604
        self.assertEqual(r.status_code, 409)
1605

    
1606
        """Fail to delete c3 (empty) container"""
1607
        self.client.container = self.c3
1608
        r = self.client.container_delete(until='1000000000')
1609
        self.assertEqual(r.status_code, 204)
1610

    
1611
        """Delete c3 (empty) container"""
1612
        r = self.client.container_delete()
1613
        self.assertEqual(r.status_code, 204)
1614

    
1615
        """Purge container(empty a container), check versionlist"""
1616
        self.client.container = self.c1
1617
        r = self.client.object_head('test', success=(200, 404))
1618
        self.assertEqual(r.status_code, 200)
1619
        self.client.del_container(delimiter='/')
1620
        r = self.client.object_head('test', success=(200, 404))
1621
        self.assertEqual(r.status_code, 404)
1622
        r = self.client.get_object_versionlist('test')
1623
        self.assertTrue(len(r) > 0)
1624
        self.assertTrue(len(r[0]) > 1)
1625
        self.client.purge_container()
1626
        self.assertRaises(ClientError,
1627
            self.client.get_object_versionlist,
1628
            'test')
1629

    
1630
    def test_object_head(self):
1631
        """Test object_HEAD"""
1632
        self.client.container = self.c2
1633
        obj = 'test'
1634

    
1635
        r = self.client.object_head(obj)
1636
        self.assertEqual(r.status_code, 200)
1637
        etag = r.headers['etag']
1638

    
1639
        r = self.client.object_head(obj, version=40)
1640
        self.assertEqual(r.headers['x-object-version'], '40')
1641

    
1642
        r = self.client.object_head(obj, if_etag_match=etag)
1643
        self.assertEqual(r.status_code, 200)
1644

    
1645
        r = self.client.object_head(obj,
1646
            if_etag_not_match=etag,
1647
            success=(200, 412, 304))
1648
        self.assertNotEqual(r.status_code, 200)
1649

    
1650
        r = self.client.object_head(obj,
1651
            version=40,
1652
            if_etag_match=etag,
1653
            success=412)
1654
        self.assertEqual(r.status_code, 412)
1655

    
1656
        """Check and if(un)modified_since"""
1657
        for format in self.client.DATE_FORMATS:
1658
            now_formated = self.now_unformated.strftime(format)
1659
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
1660
                success=(200, 304, 412))
1661
            sc1 = r1.status_code
1662
            r1.release()
1663
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1664
                success=(200, 304, 412))
1665
            sc2 = r2.status_code
1666
            r2.release()
1667
            self.assertNotEqual(sc1, sc2)
1668

    
1669
    def test_object_get(self):
1670
        """Test object_GET"""
1671
        self.client.container = self.c1
1672
        obj = 'test'
1673

    
1674
        r = self.client.object_get(obj)
1675
        self.assertEqual(r.status_code, 200)
1676

    
1677
        osize = int(r.headers['content-length'])
1678
        etag = r.headers['etag']
1679

    
1680
        r = self.client.object_get(obj, hashmap=True)
1681
        self.assertTrue('hashes' in r.json\
1682
            and 'block_hash' in r.json\
1683
            and 'block_size' in r.json\
1684
            and 'bytes' in r.json)
1685

    
1686
        r = self.client.object_get(obj, format='xml', hashmap=True)
1687
        self.assertEqual(len(r.text.split('hash>')), 3)
1688

    
1689
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1690
        r = self.client.object_get(obj,
1691
            data_range=rangestr,
1692
            success=(200, 206))
1693
        partsize = int(r.headers['content-length'])
1694
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1695

    
1696
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1697
        r = self.client.object_get(obj,
1698
            data_range=rangestr,
1699
            if_range=True,
1700
            success=(200, 206))
1701
        partsize = int(r.headers['content-length'])
1702
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1703

    
1704
        r = self.client.object_get(obj, if_etag_match=etag)
1705
        self.assertEqual(r.status_code, 200)
1706

    
1707
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1708
        self.assertEqual(r.status_code, 200)
1709

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

    
1724
        """Upload an object to download"""
1725
        src_fname = '/tmp/localfile1_%s' % self.now
1726
        dnl_fname = '/tmp/localfile2_%s' % self.now
1727
        trg_fname = 'remotefile_%s' % self.now
1728
        f_size = 59247824
1729
        self.create_large_file(f_size, src_fname)
1730
        src_f = open(src_fname, 'rb+')
1731
        print('\tUploading...')
1732
        self.client.upload_object(trg_fname, src_f)
1733
        src_f.close()
1734
        print('\tDownloading...')
1735
        dnl_f = open(dnl_fname, 'wb+')
1736
        self.client.download_object(trg_fname, dnl_f)
1737
        dnl_f.close()
1738

    
1739
        print('\tCheck if files match...')
1740
        src_f = open(src_fname)
1741
        dnl_f = open(dnl_fname)
1742
        for pos in (0, f_size / 2, f_size - 20):
1743
            src_f.seek(pos)
1744
            dnl_f.seek(pos)
1745
            self.assertEqual(src_f.read(10), dnl_f.read(10))
1746
        src_f.close()
1747
        dnl_f.close()
1748

    
1749
        os.remove(src_fname)
1750
        os.remove(dnl_fname)
1751

    
1752
    def test_object_put(self):
1753
        """Test object_PUT"""
1754

    
1755
        self.client.container = self.c2
1756
        obj = 'another.test'
1757

    
1758
        """create the object"""
1759
        r = self.client.object_put(obj,
1760
            data='a',
1761
            content_type='application/octer-stream',
1762
            permissions={
1763
                'read': ['accX:groupA', 'u1', 'u2'],
1764
                'write': ['u2', 'u3']},
1765
            metadata={'key1': 'val1', 'key2': 'val2'},
1766
            content_encoding='UTF-8',
1767
            content_disposition='attachment; filename="fname.ext"')
1768
        self.assertEqual(r.status_code, 201)
1769
        etag = r.headers['etag']
1770

    
1771
        """Check content-disposition"""
1772
        r = self.client.get_object_info(obj)
1773
        self.assertTrue('content-disposition' in r)
1774

    
1775
        """Check permissions"""
1776
        r = self.client.get_object_sharing(obj)
1777
        self.assertTrue('accx:groupa' in r['read'])
1778
        self.assertTrue('u1' in r['read'])
1779
        self.assertTrue('u2' in r['write'])
1780
        self.assertTrue('u3' in r['write'])
1781

    
1782
        """Check metadata"""
1783
        r = self.client.get_object_meta(obj)
1784
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1785
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1786

    
1787
        """Check public and if_etag_match"""
1788
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1789
            content_type='application/octet-stream', public=True)
1790

    
1791
        r = self.client.object_get(obj)
1792
        self.assertTrue('x-object-public' in r.headers)
1793
        vers2 = int(r.headers['x-object-version'])
1794
        etag = r.headers['etag']
1795
        self.assertEqual(r.text, 'b')
1796

    
1797
        """Check if_etag_not_match"""
1798
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1799
            content_type='application/octet-stream', success=(201, 412))
1800
        self.assertEqual(r.status_code, 412)
1801

    
1802
        """Check content_type and content_length"""
1803
        tmpdir = 'dir' + unicode(self.now)
1804
        r = self.client.object_put(tmpdir,
1805
            content_type='application/directory',
1806
            content_length=0)
1807

    
1808
        r = self.client.get_object_info(tmpdir)
1809
        self.assertEqual(r['content-type'], 'application/directory')
1810

    
1811
        """Check copy_from, content_encoding"""
1812
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1813
            format=None,
1814
            copy_from='/%s/%s' % (self.client.container, obj),
1815
            content_encoding='application/octet-stream',
1816
            source_account=self.client.account,
1817
            content_length=0, success=201)
1818
        self.assertEqual(r.status_code, 201)
1819

    
1820
        """Test copy_object for cross-conctainer copy"""
1821
        self.client.copy_object(src_container=self.c2,
1822
            src_object='%s/%s' % (tmpdir, obj),
1823
            dst_container=self.c1,
1824
            dst_object=obj)
1825
        self.client.container = self.c1
1826
        r1 = self.client.get_object_info(obj)
1827
        self.client.container = self.c2
1828
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
1829
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
1830

    
1831
        """Check cross-container copy_from, content_encoding"""
1832
        self.client.container = self.c1
1833
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
1834
        r = self.client.object_put(obj,
1835
            format=None,
1836
            copy_from=fromstr,
1837
            content_encoding='application/octet-stream',
1838
            source_account=self.client.account,
1839
            content_length=0, success=201)
1840

    
1841
        self.assertEqual(r.status_code, 201)
1842
        r = self.client.get_object_info(obj)
1843
        self.assertEqual(r['etag'], etag)
1844

    
1845
        """Check source_account"""
1846
        self.client.container = self.c2
1847
        fromstr = '/%s/%s' % (self.c1, obj)
1848
        r = self.client.object_put(obj + 'v2',
1849
            format=None,
1850
            move_from=fromstr,
1851
            content_encoding='application/octet-stream',
1852
            source_account='nonExistendAddress@NeverLand.com',
1853
            content_length=0,
1854
            success=(201, 403))
1855
        self.assertEqual(r.status_code, 403)
1856

    
1857
        """Check cross-container move_from"""
1858
        self.client.container = self.c1
1859
        r1 = self.client.get_object_info(obj)
1860
        self.client.container = self.c2
1861
        self.client.move_object(src_container=self.c1,
1862
            src_object=obj,
1863
            dst_container=self.c2,
1864
            dst_object=obj + 'v0')
1865
        r0 = self.client.get_object_info(obj + 'v0')
1866
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1867

    
1868
        """Check move_from"""
1869
        r = self.client.object_put(obj + 'v1',
1870
            format=None,
1871
            move_from='/%s/%s' % (self.c2, obj),
1872
            source_version=vers2,
1873
            content_encoding='application/octet-stream',
1874
            content_length=0, success=201)
1875

    
1876
        """Check manifest"""
1877
        mobj = 'manifest.test'
1878
        txt = ''
1879
        for i in range(10):
1880
            txt += '%s' % i
1881
            r = self.client.object_put('%s/%s' % (mobj, i),
1882
                data='%s' % i,
1883
                content_length=1,
1884
                success=201,
1885
                content_type='application/octet-stream',
1886
                content_encoding='application/octet-stream')
1887

    
1888
        r = self.client.object_put(mobj,
1889
            content_length=0,
1890
            content_type='application/octet-stream',
1891
            manifest='%s/%s' % (self.client.container, mobj))
1892

    
1893
        r = self.client.object_get(mobj)
1894
        self.assertEqual(r.text, txt)
1895

    
1896
        """Upload a local file with one request"""
1897
        self.create_large_file(1024 * 10, 'l10K.' + unicode(self.now))
1898
        newf = open(self.fname, 'r')
1899
        self.client.upload_object('sample.file', newf)
1900
        newf.close()
1901
        """Check if file has been uploaded"""
1902
        r = self.client.get_object_info('sample.file')
1903
        self.assertEqual(int(r['content-length']), 10260)
1904

    
1905
        """Some problems with transfer-encoding?"""
1906

    
1907
    def test_object_copy(self):
1908
        """Test object_COPY"""
1909
        self.client.container = self.c2
1910
        obj = 'test2'
1911

    
1912
        data = '{"key1":"val1", "key2":"val2"}'
1913
        r = self.client.object_put(obj + 'orig',
1914
            content_type='application/octet-stream',
1915
            data=data,
1916
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1917
            permissions={
1918
                'read': ['accX:groupA', 'u1', 'u2'],
1919
                'write': ['u2', 'u3']},
1920
            content_disposition='attachment; filename="fname.ext"')
1921

    
1922
        r = self.client.object_copy(obj + 'orig',
1923
            destination='/%s/%s' % (self.client.container, obj),
1924
            ignore_content_type=False, content_type='application/json',
1925
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1926
            permissions={'write': ['u5', 'accX:groupB']})
1927
        self.assertEqual(r.status_code, 201)
1928

    
1929
        """Check content-disposition"""
1930
        r = self.client.get_object_info(obj)
1931
        self.assertTrue('content-disposition' in r)
1932

    
1933
        """Check Metadata"""
1934
        r = self.client.get_object_meta(obj)
1935
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1936
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1937
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1938

    
1939
        """Check permissions"""
1940
        r = self.client.get_object_sharing(obj)
1941
        self.assertFalse('read' in r or 'u2' in r['write'])
1942
        self.assertTrue('accx:groupb' in r['write'])
1943

    
1944
        """Check destination account"""
1945
        r = self.client.object_copy(obj,
1946
            destination='/%s/%s' % (self.c1, obj),
1947
            content_encoding='utf8',
1948
            content_type='application/json',
1949
            destination_account='nonExistendAddress@NeverLand.com',
1950
            success=(201, 403))
1951
        self.assertEqual(r.status_code, 403)
1952

    
1953
        """Check destination being another container
1954
        and also content_type and content encoding"""
1955
        r = self.client.object_copy(obj,
1956
            destination='/%s/%s' % (self.c1, obj),
1957
            content_encoding='utf8',
1958
            content_type='application/json')
1959
        self.assertEqual(r.status_code, 201)
1960
        self.assertEqual(r.headers['content-type'],
1961
            'application/json; charset=UTF-8')
1962

    
1963
        """Check ignore_content_type and content_type"""
1964
        r = self.client.object_get(obj)
1965
        etag = r.headers['etag']
1966
        ctype = r.headers['content-type']
1967
        self.assertEqual(ctype, 'application/json')
1968

    
1969
        r = self.client.object_copy(obj + 'orig',
1970
            destination='/%s/%s0' % (self.client.container, obj),
1971
            ignore_content_type=True,
1972
            content_type='application/json')
1973
        self.assertEqual(r.status_code, 201)
1974
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1975

    
1976
        """Check if_etag_(not_)match"""
1977
        r = self.client.object_copy(obj,
1978
            destination='/%s/%s1' % (self.client.container, obj),
1979
            if_etag_match=etag)
1980
        self.assertEqual(r.status_code, 201)
1981

    
1982
        r = self.client.object_copy(obj,
1983
            destination='/%s/%s2' % (self.client.container, obj),
1984
            if_etag_not_match='lalala')
1985
        self.assertEqual(r.status_code, 201)
1986
        vers2 = r.headers['x-object-version']
1987

    
1988
        """Check source_version, public and format """
1989
        r = self.client.object_copy(obj + '2',
1990
            destination='/%s/%s3' % (self.client.container, obj),
1991
            source_version=vers2,
1992
            format='xml',
1993
            public=True)
1994
        self.assertEqual(r.status_code, 201)
1995
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1996

    
1997
        r = self.client.get_object_info(obj + '3')
1998
        self.assertTrue('x-object-public' in r)
1999

    
2000
    def test_object_move(self):
2001
        """Test object_MOVE"""
2002
        self.client.container = self.c2
2003
        obj = 'test2'
2004

    
2005
        data = '{"key1": "val1", "key2": "val2"}'
2006
        r = self.client.object_put(obj + 'orig',
2007
            content_type='application/octet-stream',
2008
            data=data,
2009
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2010
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2011
                'write': ['u2', 'u3']})
2012

    
2013
        r = self.client.object_move(obj + 'orig',
2014
            destination='/%s/%s' % (self.client.container, obj),
2015
            ignore_content_type=False,
2016
            content_type='application/json',
2017
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
2018
            permissions={'write': ['u5', 'accX:groupB']})
2019
        self.assertEqual(r.status_code, 201)
2020

    
2021
        """Check Metadata"""
2022
        r = self.client.get_object_meta(obj)
2023
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2024
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2025
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2026

    
2027
        """Check permissions"""
2028
        r = self.client.get_object_sharing(obj)
2029
        self.assertFalse('read' in r)
2030
        self.assertTrue('u5' in r['write'])
2031
        self.assertTrue('accx:groupb' in r['write'])
2032

    
2033
        """Check destination account"""
2034
        r = self.client.object_move(obj,
2035
            destination='/%s/%s' % (self.c1, obj),
2036
            content_encoding='utf8',
2037
            content_type='application/json',
2038
            destination_account='nonExistendAddress@NeverLand.com',
2039
            success=(201, 403))
2040
        self.assertEqual(r.status_code, 403)
2041

    
2042
        """Check destination being another container and also
2043
        content_type, content_disposition and content encoding"""
2044
        r = self.client.object_move(obj,
2045
            destination='/%s/%s' % (self.c1, obj),
2046
            content_encoding='utf8',
2047
            content_type='application/json',
2048
            content_disposition='attachment; filename="fname.ext"')
2049
        self.assertEqual(r.status_code, 201)
2050
        self.assertEqual(r.headers['content-type'],
2051
            'application/json; charset=UTF-8')
2052
        self.client.container = self.c1
2053
        r = self.client.get_object_info(obj)
2054
        self.assertTrue('content-disposition' in r\
2055
            and 'fname.ext' in r['content-disposition'])
2056
        etag = r['etag']
2057
        ctype = r['content-type']
2058
        self.assertEqual(ctype, 'application/json')
2059

    
2060
        """Check ignore_content_type and content_type"""
2061
        r = self.client.object_move(obj,
2062
            destination='/%s/%s' % (self.c2, obj),
2063
            ignore_content_type=True,
2064
            content_type='application/json')
2065
        self.assertEqual(r.status_code, 201)
2066
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2067

    
2068
        """Check if_etag_(not_)match"""
2069
        self.client.container = self.c2
2070
        r = self.client.object_move(obj,
2071
            destination='/%s/%s0' % (self.client.container, obj),
2072
            if_etag_match=etag)
2073
        self.assertEqual(r.status_code, 201)
2074

    
2075
        r = self.client.object_move(obj + '0',
2076
            destination='/%s/%s1' % (self.client.container, obj),
2077
            if_etag_not_match='lalala')
2078
        self.assertEqual(r.status_code, 201)
2079

    
2080
        """Check public and format """
2081
        r = self.client.object_move(obj + '1',
2082
            destination='/%s/%s2' % (self.client.container, obj),
2083
            format='xml', public=True)
2084
        self.assertEqual(r.status_code, 201)
2085
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2086

    
2087
        r = self.client.get_object_info(obj + '2')
2088
        self.assertTrue('x-object-public' in r)
2089

    
2090
    def test_object_post(self):
2091
        """Test object_POST"""
2092
        self.client.container = self.c2
2093
        obj = 'test2'
2094
        """create a filesystem file"""
2095
        self.fname = obj
2096
        newf = open(self.fname, 'w')
2097
        newf.writelines(['ello!\n',
2098
            'This is a test line\n',
2099
            'inside a test file\n'])
2100
        newf.close()
2101
        """create a file on container"""
2102
        r = self.client.object_put(obj,
2103
            content_type='application/octet-stream',
2104
            data='H',
2105
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2106
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2107
                'write': ['u2', 'u3']})
2108

    
2109
        """Append tests update, content_range, content_type, content_length"""
2110
        newf = open(obj, 'r')
2111
        self.client.append_object(obj, newf)
2112
        r = self.client.object_get(obj)
2113
        self.assertTrue(r.text.startswith('Hello!'))
2114

    
2115
        """Overwrite tests update,
2116
            content_type, content_length, content_range
2117
        """
2118
        newf.seek(0)
2119
        r = self.client.overwrite_object(obj, 0, 10, newf)
2120
        r = self.client.object_get(obj)
2121
        self.assertTrue(r.text.startswith('ello!'))
2122
        newf.close()
2123

    
2124
        """Truncate tests update,
2125
            content_range, content_type, object_bytes and source_object"""
2126
        r = self.client.truncate_object(obj, 5)
2127
        r = self.client.object_get(obj)
2128
        self.assertEqual(r.text, 'ello!')
2129

    
2130
        """Check metadata"""
2131
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2132
        r = self.client.get_object_meta(obj)
2133
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2134
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2135
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2136
        self.client.del_object_meta('mkey1', obj)
2137
        r = self.client.get_object_meta(obj)
2138
        self.assertFalse('x-object-meta-mkey1' in r)
2139

    
2140
        """Check permissions"""
2141
        self.client.set_object_sharing(obj,
2142
            read_permition=['u4', 'u5'], write_permition=['u4'])
2143
        r = self.client.get_object_sharing(obj)
2144
        self.assertTrue('read' in r)
2145
        self.assertTrue('u5' in r['read'])
2146
        self.assertTrue('write' in r)
2147
        self.assertTrue('u4' in r['write'])
2148
        self.client.del_object_sharing(obj)
2149
        r = self.client.get_object_sharing(obj)
2150
        self.assertTrue(len(r) == 0)
2151

    
2152
        """Check publish"""
2153
        self.client.publish_object(obj)
2154
        r = self.client.get_object_info(obj)
2155
        self.assertTrue('x-object-public' in r)
2156
        self.client.unpublish_object(obj)
2157
        r = self.client.get_object_info(obj)
2158
        self.assertFalse('x-object-public' in r)
2159

    
2160
        """Check if_etag_(not)match"""
2161
        etag = r['etag']
2162
        """
2163
        r = self.client.object_post(obj,
2164
            update=True,
2165
            public=True,
2166
            if_etag_not_match=etag,
2167
            success=(412, 202, 204))
2168
        self.assertEqual(r.status_code, 412)
2169
        """
2170

    
2171
        r = self.client.object_post(obj, update=True, public=True,
2172
            if_etag_match=etag, content_encoding='application/json')
2173

    
2174
        r = self.client.get_object_info(obj)
2175
        helloVersion = r['x-object-version']
2176
        self.assertTrue('x-object-public' in r)
2177
        self.assertEqual(r['content-encoding'], 'application/json')
2178

    
2179
        """Check source_version and source_account and content_disposition"""
2180
        r = self.client.object_post(obj,
2181
            update=True,
2182
            content_type='application/octet-srteam',
2183
            content_length=5,
2184
            content_range='bytes 1-5/*',
2185
            source_object='/%s/%s' % (self.c2, obj),
2186
            source_account='thisAccountWillNeverExist@adminland.com',
2187
            source_version=helloVersion,
2188
            data='12345',
2189
            success=(403, 202, 204))
2190
        self.assertEqual(r.status_code, 403)
2191

    
2192
        r = self.client.object_post(obj,
2193
            update=True,
2194
            content_type='application/octet-srteam',
2195
            content_length=5,
2196
            content_range='bytes 1-5/*',
2197
            source_object='/%s/%s' % (self.c2, obj),
2198
            source_account=self.client.account,
2199
            source_version=helloVersion,
2200
            data='12345',
2201
            content_disposition='attachment; filename="fname.ext"')
2202

    
2203
        r = self.client.object_get(obj)
2204
        self.assertEqual(r.text, 'eello!')
2205
        self.assertTrue('content-disposition' in r.headers\
2206
            and 'fname.ext' in r.headers['content-disposition'])
2207

    
2208
        """Check manifest"""
2209
        mobj = 'manifest.test'
2210
        txt = ''
2211
        for i in range(10):
2212
            txt += '%s' % i
2213
            r = self.client.object_put('%s/%s' % (mobj, i),
2214
            data='%s' % i,
2215
            content_length=1,
2216
            success=201,
2217
            content_encoding='application/octet-stream',
2218
            content_type='application/octet-stream')
2219

    
2220
        self.client.create_object_by_manifestation(mobj,
2221
            content_type='application/octet-stream')
2222

    
2223
        r = self.client.object_post(mobj,
2224
            manifest='%s/%s' % (self.client.container, mobj))
2225

    
2226
        r = self.client.object_get(mobj)
2227
        self.assertEqual(r.text, txt)
2228

    
2229
        """We need to check transfer_encoding """
2230

    
2231
    def test_object_delete(self):
2232
        """Test object_DELETE"""
2233
        self.client.container = self.c2
2234
        obj = 'test2'
2235
        """create a file on container"""
2236
        r = self.client.object_put(obj,
2237
            content_type='application/octet-stream',
2238
            data='H',
2239
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2240
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2241
                'write': ['u2', 'u3']})
2242

    
2243
        """Check with false until"""
2244
        r = self.client.object_delete(obj, until=1000000)
2245

    
2246
        r = self.client.object_get(obj, success=(200, 404))
2247
        self.assertEqual(r.status_code, 200)
2248

    
2249
        """Check normal case"""
2250
        r = self.client.object_delete(obj)
2251
        self.assertEqual(r.status_code, 204)
2252

    
2253
        r = self.client.object_get(obj, success=(200, 404))
2254
        self.assertEqual(r.status_code, 404)
2255

    
2256
    def create_large_file(self, size, name):
2257
        """Create a large file at fs"""
2258
        self.fname = name
2259
        import random
2260
        random.seed(self.now)
2261
        rf = open('/dev/urandom', 'r')
2262
        f = open(self.fname, 'w')
2263
        sys.stdout.write(
2264
            ' create random file %s of size %s      ' % (name, size))
2265
        for hobyte_id in range(size / 8):
2266
            #sss = 'hobt%s' % random.randint(1000, 9999)
2267
            f.write(rf.read(8))
2268
            if 0 == (hobyte_id * 800) % size:
2269
                f.write('\n')
2270
                f.flush()
2271
                prs = (hobyte_id * 800) // size
2272
                sys.stdout.write('\b\b')
2273
                if prs > 10:
2274
                    sys.stdout.write('\b')
2275
                sys.stdout.write('%s%%' % prs)
2276
                sys.stdout.flush()
2277
        print('\b\b\b100%')
2278
        f.flush()
2279
        rf.close()
2280
        f.close()
2281
        """"""
2282

    
2283

    
2284
def init_parser():
2285
    parser = ArgumentParser(add_help=False)
2286
    parser.add_argument('-h', '--help',
2287
        dest='help',
2288
        action='store_true',
2289
        default=False,
2290
        help="Show this help message and exit")
2291
    return parser
2292

    
2293

    
2294
def main(argv):
2295

    
2296
    suiteFew = unittest.TestSuite()
2297
    if len(argv) == 0 or argv[0] == 'pithos':
2298
        if len(argv) == 1:
2299
            suiteFew.addTest(unittest.makeSuite(testPithos))
2300
        else:
2301
            suiteFew.addTest(testPithos('test_' + argv[1]))
2302
    if len(argv) == 0 or argv[0] == 'cyclades':
2303
        if len(argv) == 1:
2304
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
2305
            suiteFew.addTest(testCyclades('test_000'))
2306
        else:
2307
            suiteFew.addTest(testCyclades('test_' + argv[1]))
2308
    if len(argv) == 0 or argv[0] == 'image':
2309
        if len(argv) == 1:
2310
            suiteFew.addTest(unittest.makeSuite(testImage))
2311
        else:
2312
            suiteFew.addTest(testImage('test_' + argv[1]))
2313
    if len(argv) == 0 or argv[0] == 'astakos':
2314
        if len(argv) == 1:
2315
            suiteFew.addTest(unittest.makeSuite(testAstakos))
2316
        else:
2317
            suiteFew.addTest(testAstakos('test_' + argv[1]))
2318

    
2319
    unittest.TextTestRunner(verbosity=2).run(suiteFew)
2320

    
2321
if __name__ == '__main__':
2322
    parser = init_parser()
2323
    args, argv = parser.parse_known_args()
2324
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2325
        raise Exception('\tusage: tests.py <group> [command]')
2326
    main(argv)