Revision 17d86215

b/kamaki/cli/commands/astakos_cli.py
33 33

  
34 34
from kamaki.cli import command
35 35
from kamaki.clients.astakos import AstakosClient
36
<<<<<<< HEAD
37
from kamaki.cli.utils import print_dict, print_items
38
from kamaki.cli.errors import raiseCLIError, CLISyntaxError
39
from kamaki.cli.commands import _command_init
40
=======
41 36
from kamaki.cli.utils import print_dict
42 37
from kamaki.cli.commands import _command_init, errors
43
>>>>>>> develop
44 38
from kamaki.cli.command_tree import CommandTree
45 39
from kamaki.cli.argument import ValueArgument
46 40

  
......
65 59

  
66 60
@command(astakos_cmds)
67 61
class astakos_authenticate(_astakos_init):
68
<<<<<<< HEAD
69
    """Authenticate a user, show user information"""
70

  
71
    def main(self, token=None):
72
        super(self.__class__, self).main()
73
        try:
74
            reply = self.client.authenticate(token)
75
        except Exception as err:
76
            raiseCLIError(err)
77
        print_dict(reply)
78

  
79

  
80
@command(astakos_cmds)
81
class astakos_admin_userinfo(_astakos_init):
82
    """Get user info, provided you have admin privileges"""
83

  
84
    def __init__(self, arguments={}):
85
        super(self.__class__, self).__init__(arguments)
86
        self.arguments['email'] = ValueArgument('target user email', '--email')
87
        self.arguments['username'] = ValueArgument('target username',
88
            '--username')
89

  
90
    def main(self, admin_token=None):
91
        super(self.__class__, self).main()
92
        email = self.get_argument('email')
93
        username = self.get_argument('username')
94
        try:
95
            if email and username:
96
                raise CLISyntaxError(
97
                    'Arguments %s and %s are mutually exclusive' % (
98
                        self.arguments['email'].parsed_name,
99
                        self.arguments['username'].parsed_name
100
                        ), importance=1)
101
            elif email:
102
                reply = self.client.get_user_by_email(email,
103
                    admin=True,
104
                    token=admin_token)
105
            elif username:
106
                reply = self.client.get_user_by_username(username,
107
                    admin=True,
108
                    token=admin_token)
109
            else:
110
                raise CLISyntaxError(
111
                    'Exactly one of %s or %s is obligatory' % (
112
                        self.arguments['email'].parsed_name,
113
                        self.arguments['username'].parsed_name
114
                        ), importance=1)
115
        except Exception as err:
116
            raiseCLIError(err)
117
        print_dict(reply)
118

  
119

  
120
@command(astakos_cmds)
121
class astakos_service_userinfo(_astakos_init):
122
    """Get user info with service token"""
123

  
124
    def __init__(self, arguments={}):
125
        super(self.__class__, self).__init__(arguments)
126
        self.arguments['email'] = ValueArgument('target user email', '--email')
127
        self.arguments['username'] = ValueArgument('target username',
128
            '--username')
129

  
130
    def main(self, service_token=None):
131
        super(self.__class__, self).main()
132
        email = self.get_argument('email')
133
        username = self.get_argument('username')
134
        try:
135
            if email and username:
136
                raise CLISyntaxError(
137
                    'Arguments %s and %s are mutually exclusive' % (
138
                        self.arguments['email'].parsed_name,
139
                        self.arguments['username'].parsed_name
140
                        ), importance=1)
141
            elif email:
142
                reply = self.client.get_user_by_email(email,
143
                    token=service_token)
144
            elif username:
145
                reply = self.client.get_user_by_username(username,
146
                    token=service_token)
147
            else:
148
                raise CLISyntaxError(
149
                    'Exactly one of %s or %s is obligatory' % (
150
                        self.arguments['email'].parsed_name,
151
                        self.arguments['username'].parsed_name
152
                        ), importance=1)
153
        except Exception as err:
154
            raiseCLIError(err)
155
        print_dict(reply)
156

  
157

  
158
@command(astakos_cmds)
159
class astakos_service_list(_astakos_init):
160
    """List cloud services associated with astakos"""
161

  
162
    def main(self, token=None):
163
        super(self.__class__, self).main()
164
        reply = self.client.list_services(token)
165
        print_items(reply)
166
=======
167 62
    """Authenticate a user
168 63
    Get user information (e.g. unique account name) from token
169 64
    Token should be set in settings:
......
181 76

  
182 77
    def main(self, custom_token=None):
183 78
        self._run(custom_token)
184
>>>>>>> develop
/dev/null
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
try:
42
    from progress.bar import FillingCirclesBar as IncrementalBar
43
except ImportError:
44
    print('No progress bars in testing!')
45
    pass
46

  
47
from kamaki.clients import ClientError
48
from kamaki.clients.pithos import PithosClient as pithos
49
from kamaki.clients.cyclades import CycladesClient as cyclades
50
from kamaki.clients.image import ImageClient as image
51
from kamaki.clients.astakos import AstakosClient as astakos
52
from kamaki.cli.config import Config
53

  
54
TEST_ALL = False
55

  
56
cnf = Config()
57
global_username = None
58
token = None
59

  
60

  
61
def _init_cnf():
62
    global cnf
63
    global global_username
64
    global_username = cnf.get('test', 'account') or\
65
        cnf.get('global', 'account')
66
    global token
67
    token = cnf.get('test', 'token') or cnf.get('global', 'token')
68

  
69

  
70
class testAstakos(unittest.TestCase):
71
    def setUp(self):
72
        _init_cnf()
73
        global cnf
74
        url = cnf.get('test', 'astakos_url') or cnf.get('astakos', 'url')
75
        global token
76
        self.client = astakos(url, token)
77

  
78
    def tearDown(self):
79
        pass
80

  
81
    def test_authenticate(self):
82
        r = self.client.authenticate()
83
        for term in ('username',
84
            'auth_token_expires',
85
            'auth_token',
86
            'auth_token_created',
87
            'groups',
88
            'uniq',
89
            'has_credits',
90
            'has_signed_terms'):
91
            self.assertTrue(term in r)
92

  
93
    def test_list_services(self):
94
        r = self.client.list_services()
95
        self.assertTrue(len(r) > 1)
96
        for service in r:
97
            self.assertTrue(set(('id', 'name')).issubset(service.keys()))
98

  
99

  
100
class testImage(unittest.TestCase):
101
    def setUp(self):
102
        _init_cnf()
103
        global cnf
104
        cyclades_url = cnf.get('compute', 'url')
105
        url = cnf.get('image', 'url')
106
        global token
107
        self.token = token
108
        self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
109
        self.now = time.mktime(time.gmtime())
110
        self.imgname = 'img_%s' % self.now
111
        global global_username
112
        self.imglocation = 'pithos://%s/pithos/my.img'\
113
        % global_username
114
        self.client = image(url, self.token)
115
        self.cyclades = cyclades(cyclades_url, self.token)
116
        self._imglist = {}
117

  
118
    def _prepare_img(self):
119
        global cnf
120
        global global_username
121
        username = global_username.split('@')[0]
122
        imglocalpath =\
123
        '/home/%s/src/kamaki-settings/files/centos.diskdump' % username
124
        f = open(imglocalpath, 'rb')
125
        pithcli = pithos(cnf.get('store', 'url'),
126
            self.token,
127
            global_username,
128
            'pithos')
129
        print('\t- Upload an image at %s...' % imglocalpath)
130
        pithcli.upload_object('my.img', f)
131
        print('\t- ok')
132
        f.close()
133

  
134
        self.client.register(self.imgname,
135
            self.imglocation,
136
            params=dict(is_public=True))
137
        img = self._get_img_by_name(self.imgname)
138
        self._imglist[self.imgname] = img
139

  
140
    def tearDown(self):
141
        for img in self._imglist.values():
142
            self.cyclades.delete_image(img['id'])
143

  
144
    def _get_img_by_name(self, name):
145
        r = self.cyclades.list_images()
146
        for img in r:
147
            if img['name'] == name:
148
                return img
149
        return None
150

  
151
    def assert_dicts_are_deeply_equal(self, d1, d2):
152
        for k, v in d1.items():
153
            self.assertTrue(k in d2)
154
            if isinstance(v, dict):
155
                self.assert_dicts_are_deeply_equal(v, d2[k])
156
            else:
157
                self.assertEqual(unicode(v), unicode(d2[k]))
158

  
159
    def test_list_public(self):
160
        """Test list_public"""
161
        r = self.client.list_public()
162
        r0 = self.client.list_public(order='-')
163
        self.assertTrue(len(r) > 0)
164
        for img in r:
165
            for term in ('status',
166
                'name',
167
                'container_format',
168
                'disk_format',
169
                'id',
170
                'size'):
171
                self.assertTrue(term in img)
172
        self.assertTrue(len(r), len(r0))
173
        r0.reverse()
174
        for i, img in enumerate(r):
175
            self.assert_dicts_are_deeply_equal(img, r0[i])
176
        r1 = self.client.list_public(detail=True)
177
        for img in r1:
178
            for term in ('status',
179
                'name',
180
                'checksum',
181
                'created_at',
182
                'disk_format',
183
                'updated_at',
184
                'id',
185
                'location',
186
                'container_format',
187
                'owner',
188
                'is_public',
189
                'deleted_at',
190
                'properties',
191
                'size'):
192
                self.assertTrue(term in img)
193
                for interm in (
194
                    'osfamily',
195
                    'users',
196
                    'os',
197
                    'root_partition',
198
                    'description'):
199
                    self.assertTrue(interm in img['properties'])
200
        size_max = 1000000000
201
        r2 = self.client.list_public(filters=dict(size_max=size_max))
202
        self.assertTrue(len(r2) <= len(r))
203
        for img in r2:
204
            self.assertTrue(int(img['size']) <= size_max)
205

  
206
    def test_get_meta(self):
207
        """Test get_meta"""
208
        r = self.client.get_meta(self.imgid)
209
        self.assertEqual(r['id'], self.imgid)
210
        for term in ('status',
211
            'name',
212
            'checksum',
213
            'updated-at',
214
            'created-at',
215
            'deleted-at',
216
            'location',
217
            'is-public',
218
            'owner',
219
            'disk-format',
220
            'size',
221
            'container-format'):
222
            self.assertTrue(term in r)
223
            for interm in ('kernel',
224
                'osfamily',
225
                'users',
226
                'gui', 'sortorder',
227
                'root-partition',
228
                'os',
229
                'description'):
230
                self.assertTrue(interm in r['properties'])
231

  
232
    def test_register(self):
233
        """Test register"""
234
        self._prepare_img()
235
        self.assertTrue(len(self._imglist) > 0)
236
        for img in self._imglist.values():
237
            self.assertTrue(img != None)
238

  
239
    def test_reregister(self):
240
        """Test reregister"""
241
        self._prepare_img()
242
        self.client.reregister(self.imglocation,
243
            properties=dict(my_property='some_value'))
244

  
245
    def test_set_members(self):
246
        """Test set_members"""
247
        self._prepare_img()
248
        members = ['%s@fake.net' % self.now]
249
        for img in self._imglist.values():
250
            self.client.set_members(img['id'], members)
251
            r = self.client.list_members(img['id'])
252
            self.assertEqual(r[0]['member_id'], members[0])
253

  
254
    def test_list_members(self):
255
        """Test list_members"""
256
        self.test_set_members()
257

  
258
    def test_remove_members(self):
259
        """Test remove_members - NO CHECK"""
260
        return
261
        self._prepare_img()
262
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
263
        for img in self._imglist.values():
264
            self.client.set_members(img['id'], members)
265
            r = self.client.list_members(img['id'])
266
            self.assertTrue(len(r) > 1)
267
            self.client.remove_member(img['id'], members[0])
268
            r0 = self.client.list_members(img['id'])
269
            self.assertEqual(len(r), 1 + len(r0))
270
            self.assertEqual(r0[0]['member_id'], members[1])
271

  
272
    def test_list_shared(self):
273
        """Test list_shared - NOT CHECKED"""
274
        #No way to test this, if I dont have member images
275
        pass
276

  
277

  
278
class testCyclades(unittest.TestCase):
279
    """Set up a Cyclades thorough test"""
280
    def setUp(self):
281
        """okeanos"""
282
        _init_cnf()
283
        global cnf
284
        url = cnf.get('compute', 'url')
285
        global token
286
        global global_username
287
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
288
        self.img_details = {
289
            u'status': u'ACTIVE',
290
            u'updated': u'2012-11-19T13:52:16+00:00',
291
            u'name': u'Debian Base',
292
            u'created': u'2012-10-16T09:03:12+00:00',
293
            u'progress': 100,
294
            u'id': self.img,
295
            u'metadata': {
296
                u'values': {
297
                    u'kernel': u'2.6.32',
298
                    u'osfamily': u'linux',
299
                    u'users': u'root',
300
                    u'gui': u'No GUI',
301
                    u'sortorder': u'1',
302
                    u'os': u'debian',
303
                    u'root_partition': u'1',
304
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
305
                }
306
            }
307
        self.flavor_details = {u'name': u'C1R1024D20',
308
            u'ram': 1024,
309
            u'id': 1,
310
            u'SNF:disk_template': u'drbd',
311
            u'disk': 20,
312
            u'cpu': 1}
313
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
314

  
315
        """okeanos.io"""
316
        """
317
        self.img = 'b3e68235-3abd-4d60-adfe-1379a4f8d3fe'
318
        self.img_details = {
319
            u'status': u'ACTIVE',
320
            u'updated': u'2012-11-19T15:29:51+00:00',
321
            u'name': u'Debian Base',
322
            u'created': u'2012-11-19T14:54:57+00:00',
323
            u'progress': 100,
324
            u'id': self.img,
325
            u'metadata': {
326
                u'values': {
327
                    u'kernel': u'2.6.32',
328
                    u'osfamily': u'linux',
329
                    u'users': u'root',
330
                    u'gui': u'No GUI',
331
                    u'sortorder': u'1',
332
                    u'os': u'debian',
333
                    u'root_partition': u'1',
334
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
335
                }
336
            }
337
        """
338

  
339
        self.servers = {}
340
        self.now = time.mktime(time.gmtime())
341
        self.servname1 = 'serv' + unicode(self.now)
342
        self.servname2 = self.servname1 + '_v2'
343
        self.flavorid = 1
344
        #servers have to be created at the begining...
345
        self.networks = {}
346
        self.netname1 = 'net' + unicode(self.now)
347
        self.netname2 = 'net' + unicode(self.now) + '_v2'
348

  
349
        self.client = cyclades(url, token)
350
        pass
351

  
352
    def tearDown(self):
353
        """Destoy servers used in testing"""
354
        print
355
        for netid in self.networks.keys():
356
            self._delete_network(netid)
357
        if 0 >= len(self.servers):
358
            return
359
        print('-> Found %s servers to delete' % len(self.servers))
360
        for server in self.servers.values():
361
            self._delete_server(server['id'])
362

  
363
    def _create_server(self, servername, flavorid, imageid, personality=None):
364
        server = self.client.create_server(servername,
365
            flavorid,
366
            imageid,
367
            personality)
368
        self.servers[servername] = server
369
        return server
370

  
371
    def _delete_server(self, servid):
372
        try:
373
            current_state = self.client.get_server_details(servid)
374
            current_state = current_state['status']
375
            if current_state == 'DELETED':
376
                return
377
        except:
378
            return
379
        self.client.delete_server(servid)
380
        self._wait_for_status(servid, current_state)
381

  
382
    def _create_network(self, netname, **kwargs):
383
        net = self.client.create_network(netname, **kwargs)
384
        self.networks[net['id']] = net
385
        return net
386

  
387
    def _delete_network(self, netid):
388
        sys.stdout.write('\tDelete network %s ' % netid)
389
        self.client.disconnect_network_nics(netid)
390
        wait = 3
391
        while True:
392
            try:
393
                self.client.delete_network(netid)
394
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
395
                break
396
            except ClientError as err:
397
                self.assertEqual(err.status, 421)
398
                time.sleep(wait)
399
                wait += 3
400
                sys.stdout.write('.')
401

  
402
    def if_not_all(foo):
403
        global TEST_ALL
404
        if TEST_ALL:
405
            return None
406
        return foo
407

  
408
    def assert_dicts_are_deeply_equal(self, d1, d2):
409
        for k, v in d1.items():
410
            self.assertTrue(k in d2)
411
            if isinstance(v, dict):
412
                self.assert_dicts_are_deeply_equal(v, d2[k])
413
            else:
414
                self.assertEqual(unicode(v), unicode(d2[k]))
415

  
416
    def test_000(self):
417
        "Prepare a full Cyclades test scenario"
418
        global TEST_ALL
419
        TEST_ALL = True
420

  
421
        self.server1 = self._create_server(self.servname1,
422
            self.flavorid,
423
            self.img)
424
        self.server2 = self._create_server(self.servname2,
425
            self.flavorid + 2,
426
            self.img)
427

  
428
        print('testing')
429
        sys.stdout.write(' test create server')
430
        self._test_create_server()
431
        print('...ok')
432

  
433
        sys.stdout.write(' test list servers')
434
        self._test_list_servers()
435
        print('...ok')
436

  
437
        print('- wait for test servers to build')
438
        self._wait_for_status(self.server1['id'], 'BUILD')
439
        self._wait_for_status(self.server2['id'], 'BUILD')
440
        print('- ok')
441

  
442
        sys.stdout.write(' test get server details')
443
        self._test_get_server_details()
444
        print('...ok')
445

  
446
        sys.stdout.write(' test get image details')
447
        self._test_get_image_details()
448
        print('...ok')
449

  
450
        sys.stdout.write(' test update_server_name')
451
        self._test_update_server_name()
452
        print('...ok')
453

  
454
        sys.stdout.write(' test reboot_server')
455
        self._test_reboot_server()
456
        print('...ok')
457

  
458
        print('- wait for test servers to boot')
459
        self._wait_for_status(self.server1['id'], 'REBOOT')
460
        self._wait_for_status(self.server2['id'], 'REBOOT')
461
        print('- ok')
462

  
463
        sys.stdout.write(' test create_server_metadata')
464
        self._test_create_server_metadata()
465
        print('...ok')
466

  
467
        sys.stdout.write(' test get_server_metadata')
468
        self._test_get_server_metadata()
469
        print('...ok')
470

  
471
        sys.stdout.write(' test update_server_metadata')
472
        self._test_update_server_metadata()
473
        print('...ok')
474

  
475
        sys.stdout.write(' test delete_server_metadata')
476
        self._test_delete_server_metadata()
477
        print('...ok')
478

  
479
        sys.stdout.write(' test list_flavors')
480
        self._test_list_flavors()
481
        print('...ok')
482

  
483
        sys.stdout.write(' test get_flavor_details')
484
        self._test_get_flavor_details()
485
        print('...ok')
486

  
487
        sys.stdout.write(' test list_images')
488
        self._test_list_images()
489
        print('...ok')
490

  
491
        sys.stdout.write(' test get_image_details')
492
        self._test_get_image_details()
493
        print('...ok')
494

  
495
        sys.stdout.write(' test get_image_metadata')
496
        self._test_get_image_metadata()
497
        print('...ok')
498

  
499
        sys.stdout.write(' test shutdown_server')
500
        self._test_shutdown_server()
501
        print('...ok')
502

  
503
        sys.stdout.write(' test start_server')
504
        self._test_start_server()
505
        print('...ok')
506

  
507
        sys.stdout.write(' test get_server_console')
508
        self._test_get_server_console()
509
        print('...ok')
510

  
511
        sys.stdout.write(' test get_firewall_profile')
512
        print('\tSKIP')
513
        #self._test_get_firewall_profile()
514
        print('...ok')
515

  
516
        sys.stdout.write(' test set_firewall_profile')
517
        print('\tSKIP')
518
        #self._test_set_firewall_profile()
519
        print('...ok')
520

  
521
        sys.stdout.write(' test get_server_stats')
522
        self._test_get_server_stats()
523
        print('...ok')
524

  
525
        self.network1 = self._create_network(self.netname1)
526

  
527
        sys.stdout.write(' test create_network')
528
        self._test_create_network()
529
        print('...ok')
530

  
531
        print('- wait for network to be activated')
532
        self._wait_for_network(self.network1['id'], 'ACTIVE')
533
        print('- ok')
534

  
535
        sys.stdout.write(' test connect_server')
536
        self._test_connect_server()
537
        print('...ok')
538

  
539
        sys.stdout.write(' test disconnect_server')
540
        self._test_disconnect_server()
541
        print('...ok')
542

  
543
        self.network2 = self._create_network(self.netname2)
544
        print('- wait for network to be activated')
545
        self._wait_for_network(self.network2['id'], 'ACTIVE')
546
        print('- ok')
547

  
548
        sys.stdout.write(' test list_server_nics')
549
        self._test_list_server_nics()
550
        print('...ok')
551

  
552
        sys.stdout.write(' test list_networks')
553
        self._test_list_networks()
554
        print('...ok')
555

  
556
        sys.stdout.write(' test get_network_details')
557
        self._test_get_network_details()
558
        print('...ok')
559

  
560
        sys.stdout.write(' test update_network_name')
561
        self._test_update_network_name()
562
        print('...ok')
563

  
564
        """Don't have auth for these:
565
        sys.stdout.write(' test delete_image')
566
        self._test_delete_image()
567
        print('...ok')
568
        sys.stdout.write(' test create_image_metadata')
569
        self._test_create_image_metadata()
570
        print('...ok')
571
        sys.stdout.write(' test update_image_metadata')
572
        self._test_update_image_metadata()
573
        print('...ok')
574
        sys.stdout.write(' test delete_image_metadata')
575
        self._test_delete_image_metadata()
576
        print('...ok')
577
        """
578

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

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

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

  
671
    def _has_status(self, servid, status):
672
        r = self.client.get_server_details(servid)
673
        return r['status'] == status
674

  
675
    def _wait_for_status(self, servid, status):
676
        withbar = True
677
        try:
678
            wait_bar = IncrementalBar('\tServer[%s] in %s ' % (servid, status))
679
        except NameError:
680
            withbar = False
681

  
682
        wait_cb = None
683
        if withbar:
684
            wait_bar.start()
685

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

  
691
            wait_cb = progress_gen
692

  
693
        time.sleep(0.5)
694
        self.client.wait_server(servid, status, wait_cb=wait_cb)
695
        if withbar:
696
            wait_bar.finish()
697

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

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

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

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

  
731
    @if_not_all
732
    def test_create_server(self):
733
        """Test create_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._test_create_server()
739

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  
995
    def _test_set_firewall_profile(self):
996

  
997
        self._wait_for_status(self.server1['id'], 'BUILD')
998
        PROFILES = ['DISABLED', 'ENABLED', 'PROTECTED']
999
        fprofile = self.client.get_firewall_profile(self.server1['id'])
1000
        print('')
1001
        count_success = 0
1002
        for counter, fprofile in enumerate(PROFILES):
1003
            npos = counter + 1
1004
            try:
1005
                nprofile = PROFILES[npos]
1006
            except IndexError:
1007
                nprofile = PROFILES[0]
1008
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
1009
            self.client.set_firewall_profile(self.server1['id'], nprofile)
1010
            time.sleep(0.5)
1011
            self.client.reboot_server(self.server1['id'], hard=True)
1012
            time.sleep(1)
1013
            self._wait_for_status(self.server1['id'], 'REBOOT')
1014
            time.sleep(0.5)
1015
            changed = self.client.get_firewall_profile(self.server1['id'])
1016
            try:
1017
                self.assertEqual(changed, nprofile)
1018
            except AssertionError as err:
1019
                if count_success:
1020
                    print('\tFAIL in swap #%s' % npos)
1021
                    break
1022
                else:
1023
                    raise err
1024
            count_success += 1
1025

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

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

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

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

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

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

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

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

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

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

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

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

  
1121
    def _test_list_server_nics(self):
1122
        r = self.client.list_server_nics(self.server1['id'])
1123
        len0 = len(r)
1124

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

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

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

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

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

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

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

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

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

  
1216

  
1217
class testPithos(unittest.TestCase):
1218
    """Set up a Pithos+ thorough test"""
1219
    def setUp(self):
1220
        _init_cnf()
1221
        global cnf
1222
        url = cnf.get('store', 'url')
1223

  
1224
        global token
1225
        global global_username
1226
        account = global_username
1227

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  
1356
        r = self.client.account_get(limit=2, marker='c2_')
1357
        conames = [container['name'] for container in r.json \
1358
            if container['name'].lower().startswith('c2_')]
1359
        self.assertTrue(temp_c0 in conames)
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff