Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 3dabe5d2

History | View | Annotate | Download (81.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
import gevent.monkey
35
# Monkey-patch everything for gevent early on
36
gevent.monkey.patch_all()
37

    
38
from argparse import ArgumentParser
39
import unittest
40
import time
41
import datetime
42
import os
43
import sys
44

    
45
from kamaki.clients import ClientError
46
from kamaki.clients.pithos import PithosClient as pithos
47
from kamaki.clients.cyclades import CycladesClient as cyclades
48
from kamaki.clients.image import ImageClient as image
49
from kamaki.clients.astakos import AstakosClient as astakos
50

    
51
TEST_ALL = False
52

    
53
global_username = 'saxtouri'
54
token = 'Kn+G9dfmlPLR2WFnhfBOow=='
55

    
56

    
57
class testAstakos(unittest.TestCase):
58
    def setUp(self):
59
        url = 'https://accounts.okeanos.grnet.gr'
60
        global token
61
        self.client = astakos(url, token)
62

    
63
    def tearDown(self):
64
        pass
65

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

    
78

    
79
class testImage(unittest.TestCase):
80
    def setUp(self):
81
        cyclades_url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
82
        url = 'https://cyclades.okeanos.grnet.gr/plankton'
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@grnet.gr/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 global_username
97
        username = '%s@grnet.gr' % global_username
98
        imglocalpath = '/home/%s/src/kamaki-settings/files/centos.diskdump'\
99
        % global_username
100
        f = open(imglocalpath, 'rb')
101
        pithcli = pithos('https://pithos.okeanos.grnet.gr/v1',
102
            self.token,
103
            username,
104
            'pithos')
105
        pithcli.upload_object('my.img', f)
106
        f.close()
107

    
108
        self.client.register(self.imgname,
109
            self.imglocation,
110
            params=dict(is_public=True))
111
        img = self._get_img_by_name(self.imgname)
112
        self._imglist[self.imgname] = img
113

    
114
    def tearDown(self):
115
        for img in self._imglist.values():
116
            self.cyclades.delete_image(img['id'])
117

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

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

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

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

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

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

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

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

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

    
248

    
249
class testCyclades(unittest.TestCase):
250
    """Set up a Cyclades thorough test"""
251
    def setUp(self):
252
        """okeanos"""
253
        url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
254
        global token
255
        global global_username
256
        #account = '%s@grnet.gr' % 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
        #account='%s@grnet.gr'%global_username
290
        #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
291
        #self.img_details= {
292
        #    u'status': u'ACTIVE',
293
        #    u'updated': u'2012-08-21T12:57:39+00:00',
294
        #    u'name': u'Debian Base',
295
        #    u'created': u'2012-08-21T12:56:53+00:00',
296
        #    u'progress': 100,
297
        #    u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
298
        #    u'metadata': {
299
        #        u'values': {
300
        #            u'kernel': u'2.6.32',
301
        #            u'osfamily': u'linux',
302
        #            u'users': u'root',
303
        #            u'gui': u'No GUI',
304
        #            u'sortorder': u'1',
305
        #            u'os': u'debian',
306
        #            u'root_partition':
307
        #            u'1', u'description':
308
        #            u'Debian Squeeze Base System'}
309
        #        }
310
        #    }
311
        #flavorid = 1
312

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
912
    @if_not_all
913
    def test_get_server_console(self):
914
        """Test get_server_console"""
915
        self.server2 = self._create_server(self.servname2,
916
            self.flavorid + 1,
917
            self.img)
918
        self._test_get_server_console()
919

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

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

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

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

    
949
    def _test_set_firewall_profile(self):
950

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1073
    def _test_list_server_nics(self):
1074
        r = self.client.list_server_nics(self.server1['id'])
1075
        len0 = len(r)
1076
        self.assertTrue(len0 > 0)
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
        url = 'https://pithos.okeanos.grnet.gr/v1'
1181

    
1182
        global token
1183
        global global_username
1184
        account = '%s@grnet.gr' % global_username
1185

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1374
        """Missing testing for quota, versioning, because normally
1375
        you don't have permissions
1376
 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
    def test_object_put(self):
1725
        """Test object_PUT"""
1726

    
1727
        self.client.container = self.c2
1728
        obj = 'another.test'
1729

    
1730
        """create the object"""
1731
        r = self.client.object_put(obj,
1732
            data='a',
1733
            content_type='application/octer-stream',
1734
            permissions={
1735
                'read': ['accX:groupA', 'u1', 'u2'],
1736
                'write': ['u2', 'u3']},
1737
            metadata={'key1': 'val1', 'key2': 'val2'},
1738
            content_encoding='UTF-8',
1739
            content_disposition='attachment; filename="fname.ext"')
1740
        self.assertEqual(r.status_code, 201)
1741
        etag = r.headers['etag']
1742

    
1743
        """Check content-disposition"""
1744
        r = self.client.get_object_info(obj)
1745
        self.assertTrue('content-disposition' in r)
1746

    
1747
        """Check permissions
1748
"""
1749
        r = self.client.get_object_sharing(obj)
1750
        self.assertTrue('accx:groupa' in r['read'])
1751
        self.assertTrue('u1' in r['read'])
1752
        self.assertTrue('u2' in r['write'])
1753
        self.assertTrue('u3' in r['write'])
1754

    
1755
        """Check metadata"""
1756
        r = self.client.get_object_meta(obj)
1757
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1758
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1759

    
1760
        """Check public and if_etag_match"""
1761
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1762
            content_type='application/octet-stream', public=True)
1763

    
1764
        r = self.client.object_get(obj)
1765
        self.assertTrue('x-object-public' in r.headers)
1766
        vers2 = int(r.headers['x-object-version'])
1767
        etag = r.headers['etag']
1768
        self.assertEqual(r.text, 'b')
1769

    
1770
        """Check if_etag_not_match"""
1771
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1772
            content_type='application/octet-stream', success=(201, 412))
1773
        self.assertEqual(r.status_code, 412)
1774

    
1775
        """Check content_type and content_length"""
1776
        tmpdir = 'dir' + unicode(self.now)
1777
        r = self.client.object_put(tmpdir,
1778
            content_type='application/directory',
1779
            content_length=0)
1780

    
1781
        r = self.client.get_object_info(tmpdir)
1782
        self.assertEqual(r['content-type'], 'application/directory')
1783

    
1784
        """Check copy_from, content_encoding"""
1785
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1786
            format=None,
1787
            copy_from='/%s/%s' % (self.client.container, obj),
1788
            content_encoding='application/octet-stream',
1789
            source_account=self.client.account,
1790
            content_length=0, success=201)
1791
        self.assertEqual(r.status_code, 201)
1792

    
1793
        """Test copy_object for cross-conctainer copy"""
1794
        self.client.copy_object(src_container=self.c2,
1795
            src_object='%s/%s' % (tmpdir, obj),
1796
            dst_container=self.c1,
1797
            dst_object=obj)
1798
        self.client.container = self.c1
1799
        r1 = self.client.get_object_info(obj)
1800
        self.client.container = self.c2
1801
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
1802
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
1803

    
1804
        """Check cross-container copy_from, content_encoding"""
1805
        self.client.container = self.c1
1806
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
1807
        r = self.client.object_put(obj,
1808
            format=None,
1809
            copy_from=fromstr,
1810
            content_encoding='application/octet-stream',
1811
            source_account=self.client.account,
1812
            content_length=0, success=201)
1813

    
1814
        self.assertEqual(r.status_code, 201)
1815
        r = self.client.get_object_info(obj)
1816
        self.assertEqual(r['etag'], etag)
1817

    
1818
        """Check source_account"""
1819
        self.client.container = self.c2
1820
        fromstr = '/%s/%s' % (self.c1, obj)
1821
        r = self.client.object_put(obj + 'v2',
1822
            format=None,
1823
            move_from=fromstr,
1824
            content_encoding='application/octet-stream',
1825
            source_account='nonExistendAddress@NeverLand.com',
1826
            content_length=0,
1827
            success=(201, 403))
1828
        self.assertEqual(r.status_code, 403)
1829

    
1830
        """Check cross-container move_from"""
1831
        self.client.container = self.c1
1832
        r1 = self.client.get_object_info(obj)
1833
        self.client.container = self.c2
1834
        self.client.move_object(src_container=self.c1,
1835
            src_object=obj,
1836
            dst_container=self.c2,
1837
            dst_object=obj + 'v0')
1838
        r0 = self.client.get_object_info(obj + 'v0')
1839
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1840

    
1841
        """Check move_from"""
1842
        r = self.client.object_put(obj + 'v1',
1843
            format=None,
1844
            move_from='/%s/%s' % (self.c2, obj),
1845
            source_version=vers2,
1846
            content_encoding='application/octet-stream',
1847
            content_length=0, success=201)
1848

    
1849
        """Check manifest"""
1850
        mobj = 'manifest.test'
1851
        txt = ''
1852
        for i in range(10):
1853
            txt += '%s' % i
1854
            r = self.client.object_put('%s/%s' % (mobj, i),
1855
                data='%s' % i,
1856
                content_length=1,
1857
                success=201,
1858
                content_type='application/octet-stream',
1859
                content_encoding='application/octet-stream')
1860

    
1861
        r = self.client.object_put(mobj,
1862
            content_length=0,
1863
            content_type='application/octet-stream',
1864
            manifest='%s/%s' % (self.client.container, mobj))
1865

    
1866
        r = self.client.object_get(mobj)
1867
        self.assertEqual(r.text, txt)
1868

    
1869
        """Upload a local file with one request"""
1870
        self.create_large_file(1024 * 10, 'l10K.' + unicode(self.now))
1871
        newf = open(self.fname, 'r')
1872
        self.client.upload_object('sample.file', newf)
1873
        newf.close()
1874
        """Check if file has been uploaded"""
1875
        r = self.client.get_object_info('sample.file')
1876
        self.assertEqual(int(r['content-length']), 10260)
1877

    
1878
        """Some problems with transfer-encoding?"""
1879

    
1880
    def test_object_copy(self):
1881
        """Test object_COPY"""
1882
        self.client.container = self.c2
1883
        obj = 'test2'
1884

    
1885
        data = '{"key1":"val1", "key2":"val2"}'
1886
        r = self.client.object_put(obj + 'orig',
1887
            content_type='application/octet-stream',
1888
            data=data,
1889
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1890
            permissions={
1891
                'read': ['accX:groupA', 'u1', 'u2'],
1892
                'write': ['u2', 'u3']},
1893
            content_disposition='attachment; filename="fname.ext"')
1894

    
1895
        r = self.client.object_copy(obj + 'orig',
1896
            destination='/%s/%s' % (self.client.container, obj),
1897
            ignore_content_type=False, content_type='application/json',
1898
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1899
            permissions={'write': ['u5', 'accX:groupB']})
1900
        self.assertEqual(r.status_code, 201)
1901

    
1902
        """Check content-disposition"""
1903
        r = self.client.get_object_info(obj)
1904
        self.assertTrue('content-disposition' in r)
1905

    
1906
        """Check Metadata"""
1907
        r = self.client.get_object_meta(obj)
1908
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1909
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1910
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1911

    
1912
        """Check permissions"""
1913
        r = self.client.get_object_sharing(obj)
1914
        self.assertFalse('read' in r or 'u2' in r['write'])
1915
        self.assertTrue('accx:groupb' in r['write'])
1916

    
1917
        """Check destination account"""
1918
        r = self.client.object_copy(obj,
1919
            destination='/%s/%s' % (self.c1, obj),
1920
            content_encoding='utf8',
1921
            content_type='application/json',
1922
            destination_account='nonExistendAddress@NeverLand.com',
1923
            success=(201, 403))
1924
        self.assertEqual(r.status_code, 403)
1925

    
1926
        """Check destination being another container
1927
        and also content_type and content encoding"""
1928
        r = self.client.object_copy(obj,
1929
            destination='/%s/%s' % (self.c1, obj),
1930
            content_encoding='utf8',
1931
            content_type='application/json')
1932
        self.assertEqual(r.status_code, 201)
1933
        self.assertEqual(r.headers['content-type'],
1934
            'application/json; charset=UTF-8')
1935

    
1936
        """Check ignore_content_type and content_type"""
1937
        r = self.client.object_get(obj)
1938
        etag = r.headers['etag']
1939
        ctype = r.headers['content-type']
1940
        self.assertEqual(ctype, 'application/json')
1941

    
1942
        r = self.client.object_copy(obj + 'orig',
1943
            destination='/%s/%s0' % (self.client.container, obj),
1944
            ignore_content_type=True,
1945
            content_type='application/json')
1946
        self.assertEqual(r.status_code, 201)
1947
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1948

    
1949
        """Check if_etag_(not_)match"""
1950
        r = self.client.object_copy(obj,
1951
            destination='/%s/%s1' % (self.client.container, obj),
1952
            if_etag_match=etag)
1953
        self.assertEqual(r.status_code, 201)
1954

    
1955
        r = self.client.object_copy(obj,
1956
            destination='/%s/%s2' % (self.client.container, obj),
1957
            if_etag_not_match='lalala')
1958
        self.assertEqual(r.status_code, 201)
1959
        vers2 = r.headers['x-object-version']
1960

    
1961
        """Check source_version, public and format """
1962
        r = self.client.object_copy(obj + '2',
1963
            destination='/%s/%s3' % (self.client.container, obj),
1964
            source_version=vers2,
1965
            format='xml',
1966
            public=True)
1967
        self.assertEqual(r.status_code, 201)
1968
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1969

    
1970
        r = self.client.get_object_info(obj + '3')
1971
        self.assertTrue('x-object-public' in r)
1972

    
1973
    def test_object_move(self):
1974
        """Test object_MOVE"""
1975
        self.client.container = self.c2
1976
        obj = 'test2'
1977

    
1978
        data = '{"key1": "val1", "key2": "val2"}'
1979
        r = self.client.object_put(obj + 'orig',
1980
            content_type='application/octet-stream',
1981
            data=data,
1982
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1983
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
1984
                'write': ['u2', 'u3']})
1985

    
1986
        r = self.client.object_move(obj + 'orig',
1987
            destination='/%s/%s' % (self.client.container, obj),
1988
            ignore_content_type=False,
1989
            content_type='application/json',
1990
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1991
            permissions={'write': ['u5', 'accX:groupB']})
1992
        self.assertEqual(r.status_code, 201)
1993

    
1994
        """Check Metadata"""
1995
        r = self.client.get_object_meta(obj)
1996
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1997
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1998
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1999

    
2000
        """Check permissions
2001
"""
2002
        r = self.client.get_object_sharing(obj)
2003
        self.assertFalse('read' in r)
2004
        self.assertTrue('u5' in r['write'])
2005
        self.assertTrue('accx:groupb' in r['write'])
2006

    
2007
        """Check destination account"""
2008
        r = self.client.object_move(obj,
2009
            destination='/%s/%s' % (self.c1, obj),
2010
            content_encoding='utf8',
2011
            content_type='application/json',
2012
            destination_account='nonExistendAddress@NeverLand.com',
2013
            success=(201, 403))
2014
        self.assertEqual(r.status_code, 403)
2015

    
2016
        """Check destination being another container and also
2017
        content_type, content_disposition and content encoding"""
2018
        r = self.client.object_move(obj,
2019
            destination='/%s/%s' % (self.c1, obj),
2020
            content_encoding='utf8',
2021
            content_type='application/json',
2022
            content_disposition='attachment; filename="fname.ext"')
2023
        self.assertEqual(r.status_code, 201)
2024
        self.assertEqual(r.headers['content-type'],
2025
            'application/json; charset=UTF-8')
2026
        self.client.container = self.c1
2027
        r = self.client.get_object_info(obj)
2028
        self.assertTrue('content-disposition' in r\
2029
            and 'fname.ext' in r['content-disposition'])
2030
        etag = r['etag']
2031
        ctype = r['content-type']
2032
        self.assertEqual(ctype, 'application/json')
2033

    
2034
        """Check ignore_content_type and content_type"""
2035
        r = self.client.object_move(obj,
2036
            destination='/%s/%s' % (self.c2, obj),
2037
            ignore_content_type=True,
2038
            content_type='application/json')
2039
        self.assertEqual(r.status_code, 201)
2040
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2041

    
2042
        """Check if_etag_(not_)match"""
2043
        self.client.container = self.c2
2044
        r = self.client.object_move(obj,
2045
            destination='/%s/%s0' % (self.client.container, obj),
2046
            if_etag_match=etag)
2047
        self.assertEqual(r.status_code, 201)
2048

    
2049
        r = self.client.object_move(obj + '0',
2050
            destination='/%s/%s1' % (self.client.container, obj),
2051
            if_etag_not_match='lalala')
2052
        self.assertEqual(r.status_code, 201)
2053

    
2054
        """Check public and format """
2055
        r = self.client.object_move(obj + '1',
2056
            destination='/%s/%s2' % (self.client.container, obj),
2057
            format='xml', public=True)
2058
        self.assertEqual(r.status_code, 201)
2059
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2060

    
2061
        r = self.client.get_object_info(obj + '2')
2062
        self.assertTrue('x-object-public' in r)
2063

    
2064
    def test_object_post(self):
2065
        """Test object_POST"""
2066
        self.client.container = self.c2
2067
        obj = 'test2'
2068
        """create a filesystem file"""
2069
        self.fname = obj
2070
        newf = open(self.fname, 'w')
2071
        newf.writelines(['ello!\n',
2072
            'This is a test line\n',
2073
            'inside a test file\n'])
2074
        newf.close()
2075
        """create a file on container"""
2076
        r = self.client.object_put(obj,
2077
            content_type='application/octet-stream',
2078
            data='H',
2079
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2080
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2081
                'write': ['u2', 'u3']})
2082

    
2083
        """Append tests update, content_range, content_type, content_length"""
2084
        newf = open(obj, 'r')
2085
        self.client.append_object(obj, newf)
2086
        r = self.client.object_get(obj)
2087
        self.assertTrue(r.text.startswith('Hello!'))
2088

    
2089
        """Overwrite tests update,
2090
            content_type, content_length, content_range
2091
        """
2092
        newf.seek(0)
2093
        r = self.client.overwrite_object(obj, 0, 10, newf)
2094
        r = self.client.object_get(obj)
2095
        self.assertTrue(r.text.startswith('ello!'))
2096
        newf.close()
2097

    
2098
        """Truncate tests update,
2099
            content_range, content_type, object_bytes and source_object"""
2100
        r = self.client.truncate_object(obj, 5)
2101
        r = self.client.object_get(obj)
2102
        self.assertEqual(r.text, 'ello!')
2103

    
2104
        """Check metadata"""
2105
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2106
        r = self.client.get_object_meta(obj)
2107
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2108
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2109
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2110
        self.client.del_object_meta('mkey1', obj)
2111
        r = self.client.get_object_meta(obj)
2112
        self.assertFalse('x-object-meta-mkey1' in r)
2113

    
2114
        """Check permissions
2115
"""
2116
        self.client.set_object_sharing(obj,
2117
            read_permition=['u4', 'u5'], write_permition=['u4'])
2118
        r = self.client.get_object_sharing(obj)
2119
        self.assertTrue('read' in r)
2120
        self.assertTrue('u5' in r['read'])
2121
        self.assertTrue('write' in r)
2122
        self.assertTrue('u4' in r['write'])
2123
        self.client.del_object_sharing(obj)
2124
        r = self.client.get_object_sharing(obj)
2125
        self.assertTrue(len(r) == 0)
2126

    
2127
        """Check publish"""
2128
        self.client.publish_object(obj)
2129
        r = self.client.get_object_info(obj)
2130
        self.assertTrue('x-object-public' in r)
2131
        self.client.unpublish_object(obj)
2132
        r = self.client.get_object_info(obj)
2133
        self.assertFalse('x-object-public' in r)
2134

    
2135
        """Check if_etag_(not)match"""
2136
        etag = r['etag']
2137
        #r = self.client.object_post(obj, update=True, public=True,
2138
        #    if_etag_not_match=etag, success=(412,202,204))
2139
        #self.assertEqual(r.status_code, 412)
2140

    
2141
        r = self.client.object_post(obj, update=True, public=True,
2142
            if_etag_match=etag, content_encoding='application/json')
2143

    
2144
        r = self.client.get_object_info(obj)
2145
        helloVersion = r['x-object-version']
2146
        self.assertTrue('x-object-public' in r)
2147
        self.assertEqual(r['content-encoding'], 'application/json')
2148

    
2149
        """Check source_version and source_account and content_disposition"""
2150
        r = self.client.object_post(obj,
2151
            update=True,
2152
            content_type='application/octet-srteam',
2153
            content_length=5,
2154
            content_range='bytes 1-5/*',
2155
            source_object='/%s/%s' % (self.c2, obj),
2156
            source_account='thisAccountWillNeverExist@adminland.com',
2157
            source_version=helloVersion,
2158
            data='12345',
2159
            success=(403, 202, 204))
2160
        self.assertEqual(r.status_code, 403)
2161

    
2162
        r = self.client.object_post(obj,
2163
            update=True,
2164
            content_type='application/octet-srteam',
2165
            content_length=5,
2166
            content_range='bytes 1-5/*',
2167
            source_object='/%s/%s' % (self.c2, obj),
2168
            source_account=self.client.account,
2169
            source_version=helloVersion,
2170
            data='12345',
2171
            content_disposition='attachment; filename="fname.ext"')
2172

    
2173
        r = self.client.object_get(obj)
2174
        self.assertEqual(r.text, 'eello!')
2175
        self.assertTrue('content-disposition' in r.headers\
2176
            and 'fname.ext' in r.headers['content-disposition'])
2177

    
2178
        """Check manifest"""
2179
        mobj = 'manifest.test'
2180
        txt = ''
2181
        for i in range(10):
2182
            txt += '%s' % i
2183
            r = self.client.object_put('%s/%s' % (mobj, i),
2184
            data='%s' % i,
2185
            content_length=1,
2186
            success=201,
2187
            content_encoding='application/octet-stream',
2188
            content_type='application/octet-stream')
2189

    
2190
        self.client.create_object_by_manifestation(mobj,
2191
            content_type='application/octet-stream')
2192

    
2193
        r = self.client.object_post(mobj,
2194
            manifest='%s/%s' % (self.client.container, mobj))
2195

    
2196
        r = self.client.object_get(mobj)
2197
        self.assertEqual(r.text, txt)
2198

    
2199
        """We need to check transfer_encoding """
2200

    
2201
    def test_object_delete(self):
2202
        """Test object_DELETE"""
2203
        self.client.container = self.c2
2204
        obj = 'test2'
2205
        """create a file on container"""
2206
        r = self.client.object_put(obj,
2207
            content_type='application/octet-stream',
2208
            data='H',
2209
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2210
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2211
                'write': ['u2', 'u3']})
2212

    
2213
        """Check with false until"""
2214
        r = self.client.object_delete(obj, until=1000000)
2215

    
2216
        r = self.client.object_get(obj, success=(200, 404))
2217
        self.assertEqual(r.status_code, 200)
2218

    
2219
        """Check normal case"""
2220
        r = self.client.object_delete(obj)
2221
        self.assertEqual(r.status_code, 204)
2222

    
2223
        r = self.client.object_get(obj, success=(200, 404))
2224
        self.assertEqual(r.status_code, 404)
2225

    
2226
    def create_large_file(self, size, name):
2227
        """Create a large file at fs"""
2228
        self.fname = name
2229
        import random
2230
        random.seed(self.now)
2231
        f = open(self.fname, 'w')
2232
        sys.stdout.write(' create random file %s of size %s' % (name, size))
2233
        for hobyte_id in range(size / 8):
2234
            sss = 'hobt%s' % random.randint(1000, 9999)
2235
            f.write(sss)
2236
            if 0 == (hobyte_id * 800) % size:
2237
                f.write('\n')
2238
                sys.stdout.write('\b\b')
2239
                prs = (hobyte_id * 800) // size
2240
                if prs > 10:
2241
                    sys.stdout.write('\b')
2242
                sys.stdout.write('%s' % prs + '%')
2243
                sys.stdout.flush()
2244
        print('\b\b\b100%')
2245
        f.close()
2246
        """"""
2247

    
2248

    
2249
def init_parser():
2250
    parser = ArgumentParser(add_help=False)
2251
    parser.add_argument('-h', '--help',
2252
        dest='help',
2253
        action='store_true',
2254
        default=False,
2255
        help="Show this help message and exit")
2256
    return parser
2257

    
2258
if __name__ == '__main__':
2259
    parser = init_parser()
2260
    args, argv = parser.parse_known_args()
2261

    
2262
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2263
        raise Exception('\tusage: tests.py <group> [command]')
2264
    suiteFew = unittest.TestSuite()
2265

    
2266
    if len(argv) == 0 or argv[0] == 'pithos':
2267
        if len(argv) == 1:
2268
            suiteFew.addTest(unittest.makeSuite(testPithos))
2269
        else:
2270
            suiteFew.addTest(testPithos('test_' + argv[1]))
2271
    if len(argv) == 0 or argv[0] == 'cyclades':
2272
        if len(argv) == 1:
2273
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
2274
            suiteFew.addTest(testCyclades('test_000'))
2275
        else:
2276
            suiteFew.addTest(testCyclades('test_' + argv[1]))
2277
    if len(argv) == 0 or argv[0] == 'image':
2278
        if len(argv) == 1:
2279
            suiteFew.addTest(unittest.makeSuite(testImage))
2280
        else:
2281
            suiteFew.addTest(testImage('test_' + argv[1]))
2282
    if len(argv) == 0 or argv[0] == 'astakos':
2283
        if len(argv) == 1:
2284
            suiteFew.addTest(unittest.makeSuite(testAstakos))
2285
        else:
2286
            suiteFew.addTest(testAstakos('test_' + argv[1]))
2287

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