Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ e02728f9

History | View | Annotate | Download (81.6 kB)

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

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

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

    
47
TEST_ALL = False
48

    
49
global_username = 'saxtouri'
50
token = 'Kn+G9dfmlPLR2WFnhfBOow=='
51

    
52

    
53
class testAstakos(unittest.TestCase):
54
    def setUp(self):
55
        url = 'https://accounts.okeanos.grnet.gr'
56
        global token
57
        self.client = astakos(url, token)
58

    
59
    def tearDown(self):
60
        pass
61

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

    
74

    
75
class testImage(unittest.TestCase):
76
    def setUp(self):
77
        cyclades_url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
78
        url = 'https://cyclades.okeanos.grnet.gr/plankton'
79
        global token
80
        self.token = token
81
        self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
82
        self.now = time.mktime(time.gmtime())
83
        self.imgname = 'img_%s' % self.now
84
        global global_username
85
        self.imglocation = 'pithos://%s@grnet.gr/pithos/my.img'\
86
        % global_username
87
        self.client = image(url, self.token)
88
        self.cyclades = cyclades(cyclades_url, self.token)
89
        self._imglist = {}
90

    
91
    def _prepare_img(self):
92
        global global_username
93
        username = '%s@grnet.gr' % global_username
94
        imglocalpath = '/home/%s/src/kamaki-settings/files/centos.diskdump'\
95
        % global_username
96
        f = open(imglocalpath, 'rb')
97
        pithcli = pithos('https://pithos.okeanos.grnet.gr/v1',
98
            self.token,
99
            username,
100
            'pithos')
101
        pithcli.upload_object('my.img', f)
102
        f.close()
103

    
104
        self.client.register(self.imgname,
105
            self.imglocation,
106
            params=dict(is_public=True))
107
        img = self._get_img_by_name(self.imgname)
108
        self._imglist[self.imgname] = img
109

    
110
    def tearDown(self):
111
        for img in self._imglist.values():
112
            self.cyclades.delete_image(img['id'])
113

    
114
    def _get_img_by_name(self, name):
115
        r = self.cyclades.list_images()
116
        for img in r:
117
            if img['name'] == name:
118
                return img
119
        return None
120

    
121
    def assert_dicts_are_deeply_equal(self, d1, d2):
122
        for k, v in d1.items():
123
            self.assertTrue(k in d2)
124
            if isinstance(v, dict):
125
                self.assert_dicts_are_deeply_equal(v, d2[k])
126
            else:
127
                self.assertEqual(unicode(v), unicode(d2[k]))
128

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

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

    
205
    def test_register(self):
206
        """Test register"""
207
        self._prepare_img()
208
        self.assertTrue(len(self._imglist) > 0)
209
        for img in self._imglist.values():
210
            self.assertTrue(img != None)
211

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

    
221
    def test_list_members(self):
222
        """Test list_members"""
223
        self.test_set_members()
224

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

    
239
    def test_list_shared(self):
240
        """Test list_shared - NOT CHECKED"""
241
        #No way to test this, if I dont have member images
242
        pass
243

    
244

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

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

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

    
319
        self.client = cyclades(url, token)
320
        pass
321

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

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

    
386
    def _delete_server(self, servid):
387
        self.client.delete_server(servid)
388

    
389
    def _create_network(self, netname, **kwargs):
390
        net = self.client.create_network(netname, **kwargs)
391
        self.networks[net['id']] = net
392
        return net
393

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

    
409
    def if_not_all(foo):
410
        global TEST_ALL
411
        if TEST_ALL:
412
            return None
413
        return foo
414

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

    
423
    def test_000(self):
424
        "Prepare a full Cyclades test scenario"
425
        global TEST_ALL
426
        TEST_ALL = True
427

    
428
        self.server1 = self._create_server(self.servname1,
429
            self.flavorid,
430
            self.img)
431
        self.server2 = self._create_server(self.servname2,
432
            self.flavorid + 2,
433
            self.img)
434

    
435
        print('testing')
436
        sys.stdout.write(' test create server')
437
        self._test_create_server()
438
        print('...ok')
439

    
440
        sys.stdout.write(' test list servers')
441
        self._test_list_servers()
442
        print('...ok')
443

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

    
449
        sys.stdout.write(' test get server details')
450
        self._test_get_server_details()
451
        print('...ok')
452

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

    
457
        sys.stdout.write(' test update_server_name')
458
        self._test_update_server_name()
459
        print('...ok')
460

    
461
        sys.stdout.write(' test reboot_server')
462
        self._test_reboot_server()
463
        print('...ok')
464

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

    
470
        sys.stdout.write(' test create_server_metadata')
471
        self._test_create_server_metadata()
472
        print('...ok')
473

    
474
        sys.stdout.write(' test get_server_metadata')
475
        self._test_get_server_metadata()
476
        print('...ok')
477

    
478
        sys.stdout.write(' test update_server_metadata')
479
        self._test_update_server_metadata()
480
        print('...ok')
481

    
482
        sys.stdout.write(' test delete_server_metadata')
483
        self._test_delete_server_metadata()
484
        print('...ok')
485

    
486
        sys.stdout.write(' test list_flavors')
487
        self._test_list_flavors()
488
        print('...ok')
489

    
490
        sys.stdout.write(' test get_flavor_details')
491
        self._test_get_flavor_details()
492
        print('...ok')
493

    
494
        sys.stdout.write(' test list_images')
495
        self._test_list_images()
496
        print('...ok')
497

    
498
        sys.stdout.write(' test get_image_details')
499
        self._test_get_image_details()
500
        print('...ok')
501

    
502
        sys.stdout.write(' test get_image_metadata')
503
        self._test_get_image_metadata()
504
        print('...ok')
505

    
506
        sys.stdout.write(' test shutdown_server')
507
        self._test_shutdown_server()
508
        print('...ok')
509

    
510
        sys.stdout.write(' test start_server')
511
        self._test_start_server()
512
        print('...ok')
513

    
514
        sys.stdout.write(' test get_server_console')
515
        self._test_get_server_console()
516
        print('...ok')
517

    
518
        sys.stdout.write(' test get_firewall_profile')
519
        self._test_get_firewall_profile()
520
        print('...ok')
521

    
522
        sys.stdout.write(' test set_firewall_profile')
523
        self._test_set_firewall_profile()
524
        print('...ok')
525

    
526
        sys.stdout.write(' test get_server_stats')
527
        self._test_get_server_stats()
528
        print('...ok')
529

    
530
        self.network1 = self._create_network(self.netname1)
531

    
532
        sys.stdout.write(' test create_network')
533
        self._test_create_network()
534
        print('...ok')
535

    
536
        print('- wait for netowork to be activated')
537
        self._wait_for_network(self.network1['id'], 'ACTIVE')
538
        print('- ok')
539

    
540
        sys.stdout.write(' test connect_server')
541
        self._test_connect_server()
542
        print('...ok')
543

    
544
        sys.stdout.write(' test disconnect_server')
545
        self._test_disconnect_server()
546
        print('...ok')
547

    
548
        self.network2 = self._create_network(self.netname2)
549
        print('- wait for netowork to be activated')
550
        self._wait_for_network(self.network2['id'], 'ACTIVE')
551
        print('- ok')
552

    
553
        sys.stdout.write(' test list_server_nics')
554
        self._test_list_server_nics()
555
        print('...ok')
556

    
557
        sys.stdout.write(' test list_networks')
558
        self._test_list_networks()
559
        print('...ok')
560

    
561
        sys.stdout.write(' test get_network_details')
562
        self._test_get_network_details()
563
        print('...ok')
564

    
565
        sys.stdout.write(' test update_network_name')
566
        self._test_update_network_name()
567
        print('...ok')
568

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

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

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

    
631
    def _has_status(self, servid, status):
632
        r = self.client.get_server_details(servid)
633
        return r['status'] == status
634

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

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

    
660
    def _test_list_servers(self):
661
        servers = self.client.list_servers()
662
        dservers = self.client.list_servers(detail=True)
663

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
820
    @if_not_all
821
    def test_list_flavors(self):
822
        """Test flavors_get"""
823
        self._test_list_flavors()
824

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

    
831
    @if_not_all
832
    def test_get_flavor_details(self):
833
        """Test test_get_flavor_details"""
834
        self._test_get_flavor_details()
835

    
836
    def _test_get_flavor_details(self):
837
        r = self.client.get_flavor_details(self.flavorid)
838
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
839

    
840
    @if_not_all
841
    def test_list_images(self):
842
        """Test list_images"""
843
        self._test_list_images()
844

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

    
854
    @if_not_all
855
    def test_image_details(self):
856
        """Test image_details"""
857
        self._test_get_image_details
858

    
859
    def _test_get_image_details(self):
860
        r = self.client.get_image_details(self.img)
861
        self.assert_dicts_are_deeply_equal(r, self.img_details)
862

    
863
    @if_not_all
864
    def test_get_image_metadata(self):
865
        """Test get_image_metadata"""
866
        self._test_get_image_metadata()
867

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

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

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

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

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

    
908
    @if_not_all
909
    def test_get_server_console(self):
910
        """Test get_server_console"""
911
        self.server2 = self._create_server(self.servname2,
912
            self.flavorid + 1,
913
            self.img)
914
        self._test_get_server_console()
915

    
916
    def _test_get_server_console(self):
917
        self._wait_for_status(self.server2['id'], 'BUILD')
918
        r = self.client.get_server_console(self.server2['id'])
919
        self.assertTrue('host' in r)
920
        self.assertTrue('password' in r)
921
        self.assertTrue('port' in r)
922
        self.assertTrue('type' in r)
923

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

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

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

    
945
    def _test_set_firewall_profile(self):
946

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

    
974
    @if_not_all
975
    def test_get_server_stats(self):
976
        self.server1 = self._create_server(self.servname1,
977
            self.flavorid,
978
            self.img)
979
        self._test_get_server_stats()
980

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

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

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

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

    
1016
    @if_not_all
1017
    def test_create_network(self):
1018
        """Test create_network"""
1019
        self.network1 = self._create_network(self.netname1)
1020
        self._test_create_network()
1021

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

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

    
1041
    def _test_connect_server(self):
1042
        self.client.connect_server(self.server1['id'], self.network1['id'])
1043
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1044
            self.server1['id']))
1045

    
1046
    @if_not_all
1047
    def test_disconnect_server(self):
1048
        """Test disconnect_server"""
1049
        self.test_connect_server()
1050
        self._test_disconnect_server()
1051

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

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

    
1069
    def _test_list_server_nics(self):
1070
        r = self.client.list_server_nics(self.server1['id'])
1071
        len0 = len(r)
1072
        self.assertTrue(len0 > 0)
1073
        self.assertTrue('1' in [net['network_id'] for net in r])
1074

    
1075
        self.client.connect_server(self.server1['id'], self.network2['id'])
1076
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1077
            self.server1['id']))
1078
        r = self.client.list_server_nics(self.server1['id'])
1079
        self.assertTrue(len(r) > len0)
1080

    
1081
    @if_not_all
1082
    def test_get_network_details(self):
1083
        """Test get_network_details"""
1084
        self.network1 = self._create_network(self.netname1)
1085
        self._test_get_network_details()
1086

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

    
1098
    @if_not_all
1099
    def test_update_network_name(self):
1100
        self.network2 = self._create_network(self.netname2)
1101
        self._test_update_network_name()
1102

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

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

1138
    @if_not_all
1139
    def test_create_image_metadata(self):
1140
        ""Test create_image_metadata""
1141
        self._test_create_image_metadata()
1142
    def _test_create_image_metadata(self):
1143
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1144
        self.assertEqual(r['mykey'], 'myval')
1145

1146
    @if_not_all
1147
    def test_update_image_metadata(self):
1148
        ""Test update_image_metadata""
1149
        self._test_update_image_metadata()
1150
    def _test_update_image_metadata(self):
1151
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1152
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1153
        self.assertEqual(r['mykey0'], 'myval0')
1154

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

    
1166

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

    
1176
        url = 'https://pithos.okeanos.grnet.gr/v1'
1177

    
1178
        global token
1179
        global global_username
1180
        account = '%s@grnet.gr' % global_username
1181

    
1182
        """
1183
        url='https://pithos.okeanos.io/v1'
1184
        """
1185

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

    
1202
        self.fname = None
1203
        container = None
1204
        self.client = pithos(url, token, account, container)
1205
        self.now = time.mktime(time.gmtime())
1206
        self.c1 = 'c1_' + unicode(self.now)
1207
        self.c2 = 'c2_' + unicode(self.now)
1208
        self.c3 = 'c3_' + unicode(self.now)
1209

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

    
1224
        self.makeNewObject(self.c1, 'another.test')
1225

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

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

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

    
1261
    def test_000(self):
1262
        """Perform a full Pithos+ kamaki support test"""
1263

    
1264
    def test_account_head(self):
1265
        """Test account_HEAD"""
1266
        r = self.client.account_head()
1267
        self.assertEqual(r.status_code, 204)
1268

    
1269
        r = self.client.account_head(until='1000000000')
1270
        self.assertEqual(r.status_code, 204)
1271

    
1272
        r = self.client.get_account_info(until='1000000000')
1273
        datestring = unicode(r['x-account-until-timestamp'])
1274
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1275

    
1276
        r = self.client.get_account_quota()
1277
        self.assertTrue('x-account-policy-quota' in r)
1278

    
1279
        r = self.client.get_account_versioning()
1280
        self.assertTrue('x-account-policy-versioning' in r)
1281

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

    
1295
    def test_account_get(self):
1296
        """Test account_GET"""
1297
        #r = self.client.account_get()
1298
        #self.assertEqual(r.status_code, 200)
1299
        r = self.client.list_containers()
1300
        fullLen = len(r)
1301
        self.assertTrue(fullLen > 2)
1302

    
1303
        r = self.client.account_get(limit=1)
1304
        self.assertEqual(len(r.json), 1)
1305

    
1306
        r = self.client.account_get(marker='c2_')
1307
        temp_c0 = r.json[0]['name']
1308
        temp_c2 = r.json[2]['name']
1309

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

    
1316
        r = self.client.account_get(show_only_shared=True)
1317
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1318

    
1319
        r = self.client.account_get(until=1342609206)
1320
        self.assertTrue(len(r.json) <= fullLen)
1321

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

    
1335
        """Check sharing_accounts"""
1336
        r = self.client.get_sharing_accounts()
1337
        self.assertTrue(len(r) > 0)
1338

    
1339
    def test_account_post(self):
1340
        """Test account_POST"""
1341
        r = self.client.account_post()
1342
        self.assertEqual(r.status_code, 202)
1343
        grpName = 'grp' + unicode(self.now)
1344

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

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

    
1362
        self.client.del_account_meta(mprefix + '1')
1363
        r = self.client.get_account_meta()
1364
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
1365

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

    
1370
        """Missing testing for quota, versioning, because normally
1371
        you don't have permissions
1372
 to modify those at account level
1373
        """
1374

    
1375
        newquota = 1000000
1376
        self.client.set_account_quota(newquota)
1377
        #r = self.client.get_account_info()
1378
        #print(unicode(r))
1379
        #r = self.client.get_account_quota()
1380
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1381
        self.client.set_account_versioning('auto')
1382

    
1383
    def test_container_head(self):
1384
        """Test container_HEAD"""
1385
        self.client.container = self.c1
1386

    
1387
        r = self.client.container_head()
1388
        self.assertEqual(r.status_code, 204)
1389

    
1390
        """Check until"""
1391
        r = self.client.container_head(until=1000000, success=(204, 404))
1392
        self.assertEqual(r.status_code, 404)
1393

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

    
1407
        """Check container object meta"""
1408
        r = self.client.get_container_object_meta()
1409
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1410

    
1411
    def test_container_get(self):
1412
        """Test container_GET"""
1413
        self.client.container = self.c1
1414

    
1415
        r = self.client.container_get()
1416
        self.assertEqual(r.status_code, 200)
1417
        fullLen = len(r.json)
1418

    
1419
        r = self.client.container_get(prefix='test')
1420
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1421
        self.assertTrue(len(r.json) > 1)
1422
        self.assertEqual(len(r.json), len(lalobjects))
1423

    
1424
        r = self.client.container_get(limit=1)
1425
        self.assertEqual(len(r.json), 1)
1426

    
1427
        r = self.client.container_get(marker='another')
1428
        self.assertTrue(len(r.json) > 1)
1429
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1430
        self.assertEqual(len(r.json), len(neobjects))
1431

    
1432
        r = self.client.container_get(prefix='another.test', delimiter='.')
1433
        self.assertTrue(fullLen > len(r.json))
1434

    
1435
        r = self.client.container_get(path='/')
1436
        self.assertEqual(fullLen, len(r.json))
1437

    
1438
        r = self.client.container_get(format='xml')
1439
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1440

    
1441
        r = self.client.container_get(meta=['incontainer'])
1442
        self.assertTrue(len(r.json) > 0)
1443

    
1444
        r = self.client.container_get(show_only_shared=True)
1445
        self.assertTrue(len(r.json) < fullLen)
1446

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

    
1452
        except ClientError:
1453

    
1454
            pass
1455

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

    
1469
    def test_container_put(self):
1470
        """Test container_PUT"""
1471
        self.client.container = self.c2
1472

    
1473
        r = self.client.container_put()
1474
        self.assertEqual(r.status_code, 202)
1475

    
1476
        r = self.client.get_container_quota(self.client.container)
1477
        cquota = r.values()[0]
1478
        newquota = 2 * int(cquota)
1479

    
1480
        r = self.client.container_put(quota=newquota)
1481
        self.assertEqual(r.status_code, 202)
1482

    
1483
        r = self.client.get_container_quota(self.client.container)
1484
        xquota = int(r.values()[0])
1485
        self.assertEqual(newquota, xquota)
1486

    
1487
        r = self.client.container_put(versioning='auto')
1488
        self.assertEqual(r.status_code, 202)
1489

    
1490
        r = self.client.get_container_versioning(self.client.container)
1491
        nvers = r.values()[0]
1492
        self.assertEqual('auto', nvers)
1493

    
1494
        r = self.client.container_put(versioning='none')
1495
        self.assertEqual(r.status_code, 202)
1496

    
1497
        r = self.client.get_container_versioning(self.client.container)
1498
        nvers = r.values()[0]
1499
        self.assertEqual('none', nvers)
1500

    
1501
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1502
        self.assertEqual(r.status_code, 202)
1503

    
1504
        r = self.client.get_container_meta(self.client.container)
1505
        self.assertTrue('x-container-meta-m1' in r)
1506
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1507
        self.assertTrue('x-container-meta-m2' in r)
1508
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1509

    
1510
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
1511
        self.assertEqual(r.status_code, 202)
1512

    
1513
        r = self.client.get_container_meta(self.client.container)
1514
        self.assertTrue('x-container-meta-m1' not in r)
1515
        self.assertTrue('x-container-meta-m2' in r)
1516
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1517

    
1518
        self.client.del_container_meta(self.client.container)
1519

    
1520
    def test_container_post(self):
1521
        """Test container_POST"""
1522
        self.client.container = self.c2
1523

    
1524
        """Simple post"""
1525
        r = self.client.container_post()
1526
        self.assertEqual(r.status_code, 202)
1527

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

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

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

    
1557
        """Check versioning"""
1558
        self.client.set_container_versioning('auto')
1559
        r = self.client.get_container_versioning(self.client.container)
1560
        nvers = r.values()[0]
1561
        self.assertEqual('auto', nvers)
1562
        self.client.set_container_versioning('none')
1563
        r = self.client.get_container_versioning(self.client.container)
1564
        nvers = r.values()[0]
1565
        self.assertEqual('none', nvers)
1566

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

    
1580
        """WTF is tranfer_encoding? What should I check about th** s**t? """
1581
        #TODO
1582

    
1583
        """Check update=False"""
1584
        r = self.client.object_post('test',
1585
            update=False,
1586
            metadata={'newmeta': 'newval'})
1587

    
1588
        r = self.client.get_object_info('test')
1589
        self.assertTrue('x-object-meta-newmeta' in r)
1590
        self.assertFalse('x-object-meta-incontainer' in r)
1591

    
1592
        r = self.client.del_container_meta('m2')
1593

    
1594
    def test_container_delete(self):
1595
        """Test container_DELETE"""
1596

    
1597
        """Fail to delete a non-empty container"""
1598
        self.client.container = self.c2
1599
        r = self.client.container_delete(success=409)
1600
        self.assertEqual(r.status_code, 409)
1601

    
1602
        """Fail to delete c3 (empty) container"""
1603
        self.client.container = self.c3
1604
        r = self.client.container_delete(until='1000000000')
1605
        self.assertEqual(r.status_code, 204)
1606

    
1607
        """Delete c3 (empty) container"""
1608
        r = self.client.container_delete()
1609
        self.assertEqual(r.status_code, 204)
1610

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

    
1626
    def test_object_head(self):
1627
        """Test object_HEAD"""
1628
        self.client.container = self.c2
1629
        obj = 'test'
1630

    
1631
        r = self.client.object_head(obj)
1632
        self.assertEqual(r.status_code, 200)
1633
        etag = r.headers['etag']
1634

    
1635
        r = self.client.object_head(obj, version=40)
1636
        self.assertEqual(r.headers['x-object-version'], '40')
1637

    
1638
        r = self.client.object_head(obj, if_etag_match=etag)
1639
        self.assertEqual(r.status_code, 200)
1640

    
1641
        r = self.client.object_head(obj,
1642
            if_etag_not_match=etag,
1643
            success=(200, 412, 304))
1644
        self.assertNotEqual(r.status_code, 200)
1645

    
1646
        r = self.client.object_head(obj,
1647
            version=40,
1648
            if_etag_match=etag,
1649
            success=412)
1650
        self.assertEqual(r.status_code, 412)
1651

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

    
1665
    def test_object_get(self):
1666
        """Test object_GET"""
1667
        self.client.container = self.c1
1668
        obj = 'test'
1669

    
1670
        r = self.client.object_get(obj)
1671
        self.assertEqual(r.status_code, 200)
1672

    
1673
        osize = int(r.headers['content-length'])
1674
        etag = r.headers['etag']
1675

    
1676
        r = self.client.object_get(obj, hashmap=True)
1677
        self.assertTrue('hashes' in r.json\
1678
            and 'block_hash' in r.json\
1679
            and 'block_size' in r.json\
1680
            and 'bytes' in r.json)
1681

    
1682
        r = self.client.object_get(obj, format='xml', hashmap=True)
1683
        self.assertEqual(len(r.text.split('hash>')), 3)
1684

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

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

    
1700
        r = self.client.object_get(obj, if_etag_match=etag)
1701
        self.assertEqual(r.status_code, 200)
1702

    
1703
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1704
        self.assertEqual(r.status_code, 200)
1705

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

    
1720
    def test_object_put(self):
1721
        """Test object_PUT"""
1722

    
1723
        self.client.container = self.c2
1724
        obj = 'another.test'
1725

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

    
1739
        """Check content-disposition"""
1740
        r = self.client.get_object_info(obj)
1741
        self.assertTrue('content-disposition' in r)
1742

    
1743
        """Check permissions
1744
"""
1745
        r = self.client.get_object_sharing(obj)
1746
        self.assertTrue('accx:groupa' in r['read'])
1747
        self.assertTrue('u1' in r['read'])
1748
        self.assertTrue('u2' in r['write'])
1749
        self.assertTrue('u3' in r['write'])
1750

    
1751
        """Check metadata"""
1752
        r = self.client.get_object_meta(obj)
1753
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1754
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1755

    
1756
        """Check public and if_etag_match"""
1757
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1758
            content_type='application/octet-stream', public=True)
1759

    
1760
        r = self.client.object_get(obj)
1761
        self.assertTrue('x-object-public' in r.headers)
1762
        vers2 = int(r.headers['x-object-version'])
1763
        etag = r.headers['etag']
1764
        self.assertEqual(r.text, 'b')
1765

    
1766
        """Check if_etag_not_match"""
1767
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1768
            content_type='application/octet-stream', success=(201, 412))
1769
        self.assertEqual(r.status_code, 412)
1770

    
1771
        """Check content_type and content_length"""
1772
        tmpdir = 'dir' + unicode(self.now)
1773
        r = self.client.object_put(tmpdir,
1774
            content_type='application/directory',
1775
            content_length=0)
1776

    
1777
        r = self.client.get_object_info(tmpdir)
1778
        self.assertEqual(r['content-type'], 'application/directory')
1779

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

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

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

    
1810
        self.assertEqual(r.status_code, 201)
1811
        r = self.client.get_object_info(obj)
1812
        self.assertEqual(r['etag'], etag)
1813

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

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

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

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

    
1857
        r = self.client.object_put(mobj,
1858
            content_length=0,
1859
            content_type='application/octet-stream',
1860
            manifest='%s/%s' % (self.client.container, mobj))
1861

    
1862
        r = self.client.object_get(mobj)
1863
        self.assertEqual(r.text, txt)
1864

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

    
1874
        """Some problems with transfer-encoding?"""
1875

    
1876
    def test_object_copy(self):
1877
        """Test object_COPY"""
1878
        self.client.container = self.c2
1879
        obj = 'test2'
1880

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

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

    
1898
        """Check content-disposition"""
1899
        r = self.client.get_object_info(obj)
1900
        self.assertTrue('content-disposition' in r)
1901

    
1902
        """Check Metadata"""
1903
        r = self.client.get_object_meta(obj)
1904
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1905
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1906
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1907

    
1908
        """Check permissions"""
1909
        r = self.client.get_object_sharing(obj)
1910
        self.assertFalse('read' in r or 'u2' in r['write'])
1911
        self.assertTrue('accx:groupb' in r['write'])
1912

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

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

    
1932
        """Check ignore_content_type and content_type"""
1933
        r = self.client.object_get(obj)
1934
        etag = r.headers['etag']
1935
        ctype = r.headers['content-type']
1936
        self.assertEqual(ctype, 'application/json')
1937

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

    
1945
        """Check if_etag_(not_)match"""
1946
        r = self.client.object_copy(obj,
1947
            destination='/%s/%s1' % (self.client.container, obj),
1948
            if_etag_match=etag)
1949
        self.assertEqual(r.status_code, 201)
1950

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

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

    
1966
        r = self.client.get_object_info(obj + '3')
1967
        self.assertTrue('x-object-public' in r)
1968

    
1969
    def test_object_move(self):
1970
        """Test object_MOVE"""
1971
        self.client.container = self.c2
1972
        obj = 'test2'
1973

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

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

    
1990
        """Check Metadata"""
1991
        r = self.client.get_object_meta(obj)
1992
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1993
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1994
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1995

    
1996
        """Check permissions
1997
"""
1998
        r = self.client.get_object_sharing(obj)
1999
        self.assertFalse('read' in r)
2000
        self.assertTrue('u5' in r['write'])
2001
        self.assertTrue('accx:groupb' in r['write'])
2002

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

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

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

    
2038
        """Check if_etag_(not_)match"""
2039
        self.client.container = self.c2
2040
        r = self.client.object_move(obj,
2041
            destination='/%s/%s0' % (self.client.container, obj),
2042
            if_etag_match=etag)
2043
        self.assertEqual(r.status_code, 201)
2044

    
2045
        r = self.client.object_move(obj + '0',
2046
            destination='/%s/%s1' % (self.client.container, obj),
2047
            if_etag_not_match='lalala')
2048
        self.assertEqual(r.status_code, 201)
2049

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

    
2057
        r = self.client.get_object_info(obj + '2')
2058
        self.assertTrue('x-object-public' in r)
2059

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

    
2079
        """Append tests update, content_range, content_type, content_length"""
2080
        newf = open(obj, 'r')
2081
        self.client.append_object(obj, newf)
2082
        r = self.client.object_get(obj)
2083
        self.assertTrue(r.text.startswith('Hello!'))
2084

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

    
2094
        """Truncate tests update,
2095
            content_range, content_type, object_bytes and source_object"""
2096
        r = self.client.truncate_object(obj, 5)
2097
        r = self.client.object_get(obj)
2098
        self.assertEqual(r.text, 'ello!')
2099

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

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

    
2123
        """Check publish"""
2124
        self.client.publish_object(obj)
2125
        r = self.client.get_object_info(obj)
2126
        self.assertTrue('x-object-public' in r)
2127
        self.client.unpublish_object(obj)
2128
        r = self.client.get_object_info(obj)
2129
        self.assertFalse('x-object-public' in r)
2130

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

    
2137
        r = self.client.object_post(obj, update=True, public=True,
2138
            if_etag_match=etag, content_encoding='application/json')
2139

    
2140
        r = self.client.get_object_info(obj)
2141
        helloVersion = r['x-object-version']
2142
        self.assertTrue('x-object-public' in r)
2143
        self.assertEqual(r['content-encoding'], 'application/json')
2144

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

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

    
2169
        r = self.client.object_get(obj)
2170
        self.assertEqual(r.text, 'eello!')
2171
        self.assertTrue('content-disposition' in r.headers\
2172
            and 'fname.ext' in r.headers['content-disposition'])
2173

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

    
2186
        self.client.create_object_by_manifestation(mobj,
2187
            content_type='application/octet-stream')
2188

    
2189
        r = self.client.object_post(mobj,
2190
            manifest='%s/%s' % (self.client.container, mobj))
2191

    
2192
        r = self.client.object_get(mobj)
2193
        self.assertEqual(r.text, txt)
2194

    
2195
        """We need to check transfer_encoding """
2196

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

    
2209
        """Check with false until"""
2210
        r = self.client.object_delete(obj, until=1000000)
2211

    
2212
        r = self.client.object_get(obj, success=(200, 404))
2213
        self.assertEqual(r.status_code, 200)
2214

    
2215
        """Check normal case"""
2216
        r = self.client.object_delete(obj)
2217
        self.assertEqual(r.status_code, 204)
2218

    
2219
        r = self.client.object_get(obj, success=(200, 404))
2220
        self.assertEqual(r.status_code, 404)
2221

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

    
2244

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

    
2254
if __name__ == '__main__':
2255
    parser = init_parser()
2256
    args, argv = parser.parse_known_args()
2257

    
2258
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2259
        raise Exception('\tusage: tests.py <group> [command]')
2260
    suiteFew = unittest.TestSuite()
2261

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

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