Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / cyclades.py @ c6ebe715

History | View | Annotate | Download (28 kB)

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

    
34
import time
35

    
36
from kamaki.clients import livetest, ClientError
37
from kamaki.clients.cyclades import CycladesClient
38
from kamaki.clients.astakos import AstakosClient
39

    
40

    
41
class Cyclades(livetest.Generic):
42
    """Set up a Cyclades test"""
43
    def setUp(self):
44
        print
45
        with open(self['cmpimage', 'details']) as f:
46
            self.img_details = eval(f.read())
47
        self.img = self.img_details['id']
48
        with open(self['flavor', 'details']) as f:
49
            self._flavor_details = eval(f.read())
50
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
51

    
52
        self.servers = {}
53
        self.now = time.mktime(time.gmtime())
54
        self.servname1 = 'serv' + unicode(self.now)
55
        self.servname2 = self.servname1 + '_v2'
56
        self.servname1 += '_v1'
57
        self.flavorid = self._flavor_details['id']
58
        #servers have to be created at the begining...
59
        self.networks = {}
60
        self.netname1 = 'net' + unicode(self.now)
61
        self.netname2 = 'net' + unicode(self.now) + '_v2'
62

    
63
        self.cloud = 'cloud.%s' % self['testcloud']
64
        aurl, self.token = self[self.cloud, 'url'], self[self.cloud, 'token']
65
        self.auth_base = AstakosClient(aurl, self.token)
66
        curl = self.auth_base.get_service_endpoints('compute')['publicURL']
67
        self.client = CycladesClient(curl, self.token)
68

    
69
    def tearDown(self):
70
        """Destoy servers used in testing"""
71
        for net in self.networks.keys():
72
            self._delete_network(net)
73
        for server in self.servers.values():
74
            self._delete_server(server['id'])
75
            print('DEL VM %s (%s)' % (server['id'], server['name']))
76

    
77
    def test_000(self):
78
        "Prepare a full Cyclades test scenario"
79
        self.server1 = self._create_server(
80
            self.servname1, self.flavorid, self.img)
81
        self.server2 = self._create_server(
82
            self.servname2, self.flavorid, self.img)
83
        super(self.__class__, self).test_000()
84

    
85
    def _create_server(self, servername, flavorid, imageid, personality=None):
86
        server = self.client.create_server(
87
            servername, flavorid, imageid, personality=personality)
88
        print('CREATE VM %s (%s)' % (server['id'], server['name']))
89
        self.servers[servername] = server
90
        return server
91

    
92
    def _delete_server(self, servid):
93
        try:
94
            current_state = self.client.get_server_details(servid)
95
            current_state = current_state['status']
96
            if current_state == 'DELETED':
97
                return
98
            self.client.delete_server(servid)
99
            self._wait_for_status(servid, current_state)
100
            self.client.delete_server(servid)
101
        except:
102
            return
103

    
104
    def _create_network(self, netname, **kwargs):
105
        net = self.client.create_network(netname, **kwargs)
106
        self.networks[net['id']] = net
107
        return net
108

    
109
    def _delete_network(self, netid):
110
        if not netid in self.networks:
111
            return None
112
        print('Disconnect nics of network %s' % netid)
113
        self.client.disconnect_network_nics(netid)
114

    
115
        def netwait(wait):
116
            try:
117
                self.client.delete_network(netid)
118
            except ClientError:
119
                time.sleep(wait)
120
        self.do_with_progress_bar(
121
            netwait,
122
            'Delete network %s' % netid,
123
            self._waits[:7])
124
        return self.networks.pop(netid)
125

    
126
    def _wait_for_network(self, netid, status):
127

    
128
        def netwait(wait):
129
            r = self.client.get_network_details(netid)
130
            if r['status'] == status:
131
                return
132
            time.sleep(wait)
133
        self.do_with_progress_bar(
134
            netwait,
135
            'Wait network %s to reach status %s' % (netid, status),
136
            self._waits[:5])
137

    
138
    def _wait_for_nic(self, netid, servid, in_creation=True):
139
        self._wait_for_network(netid, 'ACTIVE')
140

    
141
        def nicwait(wait):
142
            nics = self.client.list_server_nics(servid)
143
            for net in nics:
144
                found_nic = net['network_id'] == netid
145
                if (in_creation and found_nic) or not (
146
                        in_creation or found_nic):
147
                    return
148
            time.sleep(wait)
149
        self.do_with_progress_bar(
150
            nicwait,
151
            'Wait nic-%s-%s to %sconnect' % (
152
                netid,
153
                servid,
154
                '' if in_creation else 'dis'),
155
            self._waits[:5])
156
        for net in self.client.list_server_nics(servid):
157
            if netid == net['network_id']:
158
                return True
159
        return False
160

    
161
    def _has_status(self, servid, status):
162
        r = self.client.get_server_details(servid)
163
        #print 'MY ', servid, ' STATUS IS ', r['status']
164
        return r['status'] == status
165

    
166
    def _wait_for_status(self, servid, status):
167
        (wait_bar, wait_cb) = self._safe_progress_bar(
168
            'Server %s in %s' % (servid, status))
169
        self.client.wait_server(
170
            servid, status, wait_cb=wait_cb, delay=2, max_wait=198)
171
        self._safe_progress_bar_finish(wait_bar)
172

    
173
    def test_parallel_creation(self):
174
        """test create with multiple threads
175
        Do not use this in regular livetest
176
        """
177
        from kamaki.clients import SilentEvent
178
        c = []
179
        for i in range(8):
180
            sname = '%s_%s' % (self.servname1, i)
181
            c.append(SilentEvent(
182
                self._create_server, sname, self.flavorid, self.img))
183
        for i in range(8):
184
            c[i].start()
185

    
186
    def test_create_server(self):
187
        """Test create_server"""
188
        self.server1 = self._create_server(
189
            self.servname1, self.flavorid, self.img)
190
        self._wait_for_status(self.server1['id'], 'BUILD')
191
        self._test_0010_create_server()
192

    
193
    def _test_0010_create_server(self):
194
        self.assertEqual(self.server1["name"], self.servname1)
195
        self.assertEqual(self.server1["flavor"]["id"], self.flavorid)
196
        self.assertEqual(self.server1["image"]["id"], self.img)
197
        self.assertEqual(self.server1["status"], "BUILD")
198

    
199
    def test_list_servers(self):
200
        """Test list servers"""
201
        self.server1 = self._create_server(
202
            self.servname1, self.flavorid, self.img)
203
        self.server2 = self._create_server(
204
            self.servname2, self.flavorid, self.img)
205
        self._test_0020_list_servers()
206

    
207
    def _test_0020_list_servers(self):
208
        servers = self.client.list_servers()
209
        dservers = self.client.list_servers(detail=True)
210

    
211
        """detailed and simple are same size"""
212
        self.assertEqual(len(dservers), len(servers))
213
        fields = set([
214
            'created', 'flavor', 'hostId', 'image', 'progress', 'status',
215
            'updated'])
216
        for i, srv in enumerate(servers):
217
            self.assertTrue(fields.isdisjoint(srv))
218
            self.assertTrue(fields.issubset(dservers[i]))
219

    
220
        """detailed and simple contain same names"""
221
        names = sorted(map(lambda x: x["name"], servers))
222
        dnames = sorted(map(lambda x: x["name"], dservers))
223
        self.assertEqual(names, dnames)
224

    
225
    def _test_0030_wait_test_servers_to_build(self):
226
        """Pseudo-test to wait for VMs to load"""
227
        print('')
228
        self._wait_for_status(self.server1['id'], 'BUILD')
229
        self._wait_for_status(self.server2['id'], 'BUILD')
230

    
231
    def test_get_server_details(self):
232
        """Test get_server_details"""
233
        self.server1 = self._create_server(
234
            self.servname1, self.flavorid, self.img)
235
        self._wait_for_status(self.server1['id'], 'BUILD')
236
        self._test_0040_get_server_details()
237

    
238
    def _test_0040_get_server_details(self):
239
        r = self.client.get_server_details(self.server1['id'])
240
        self.assertEqual(r["name"], self.servname1)
241
        self.assertEqual(r["flavor"]["id"], self.flavorid)
242
        self.assertEqual(r["image"]["id"], self.img)
243
        self.assertEqual(r["status"], "ACTIVE")
244

    
245
    def test_update_server_name(self):
246
        """Test update_server_name"""
247
        self.server1 = self._create_server(
248
            self.servname1, self.flavorid, self.img)
249
        self._test_0050_update_server_name()
250

    
251
    def _test_0050_update_server_name(self):
252
        new_name = self.servname1 + '_new_name'
253
        self.client.update_server_name(self.server1['id'], new_name)
254
        r = self.client.get_server_details(
255
            self.server1['id'], success=(200, 400))
256
        self.assertEqual(r['name'], new_name)
257
        changed = self.servers.pop(self.servname1)
258
        changed['name'] = new_name
259
        self.servers[new_name] = changed
260

    
261
    def test_reboot_server(self):
262
        """Test reboot server"""
263
        self.server1 = self._create_server(
264
            self.servname1, self.flavorid, self.img)
265
        self._wait_for_status(self.server1['id'], 'BUILD')
266
        self.server2 = self._create_server(
267
            self.servname2, self.flavorid + 2, self.img)
268
        self._wait_for_status(self.server2['id'], 'BUILD')
269
        self._test_0060_reboot_server()
270
        self._wait_for_status(self.server1['id'], 'REBOOT')
271
        self._wait_for_status(self.server2['id'], 'REBOOT')
272

    
273
    def _test_0060_reboot_server(self):
274
        self.client.reboot_server(self.server1['id'])
275
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
276
        self.client.reboot_server(self.server2['id'], hard=True)
277
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
278

    
279
    def test_resize_server(self):
280
        """Modify the flavor of a server"""
281
        self.server1 = self._create_server(
282
            self.servname1, self.flavorid, self.img)
283
        self._test_0065_resize_server()
284
        self.delete_server(self.server1['id'])
285
        self.server1 = self._create_server(
286
            self.servname1, self.flavorid, self.img)
287

    
288
    def _test_0065_resize_server(self):
289
        self.client.resize_server(self.servname1, self.flavorid + 2)
290
        srv = self.client.get_flavor_details(self.server1['id'])
291
        self.assertEqual(srv['flavor']['id'], self.flavorid + 2)
292

    
293
    def _test_0070_wait_test_servers_to_reboot(self):
294
        """Pseudo-test to wait for VMs to load"""
295
        print('')
296
        self._wait_for_status(self.server1['id'], 'REBOOT')
297
        self._wait_for_status(self.server2['id'], 'REBOOT')
298

    
299
    def test_create_server_metadata(self):
300
        """Test create_server_metadata"""
301
        self.server1 = self._create_server(
302
            self.servname1, self.flavorid, self.img)
303
        self._test_0080_create_server_metadata()
304

    
305
    def _test_0080_create_server_metadata(self):
306
        r1 = self.client.create_server_metadata(
307
            self.server1['id'], 'mymeta', 'mymeta val')
308
        self.assertTrue('mymeta' in r1)
309
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
310
        self.assert_dicts_are_equal(r1, r2)
311

    
312
    def test_get_server_metadata(self):
313
        """Test get server_metadata"""
314
        self.server1 = self._create_server(
315
            self.servname1, self.flavorid, self.img)
316
        self._test_0090_get_server_metadata()
317

    
318
    def _test_0090_get_server_metadata(self):
319
        self.client.update_server_metadata(
320
            self.server1['id'], mymeta_0='val_0')
321
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
322
        self.assertEqual(r['mymeta_0'], 'val_0')
323

    
324
    def test_update_server_metadata(self):
325
        """Test update_server_metadata"""
326
        self.server1 = self._create_server(
327
            self.servname1, self.flavorid, self.img)
328
        self._test_0100_update_server_metadata()
329

    
330
    def _test_0100_update_server_metadata(self):
331
        r1 = self.client.update_server_metadata(
332
            self.server1['id'], mymeta3='val2')
333
        self.assertTrue('mymeta3'in r1)
334
        r2 = self.client.update_server_metadata(
335
            self.server1['id'], mymeta3='val3')
336
        self.assertTrue(r2['mymeta3'], 'val3')
337

    
338
    def test_delete_server_metadata(self):
339
        """Test delete_server_metadata"""
340
        self.server1 = self._create_server(
341
            self.servname1, self.flavorid, self.img)
342
        self._test_0110_delete_server_metadata()
343

    
344
    def _test_0110_delete_server_metadata(self):
345
        r1 = self.client.update_server_metadata(
346
            self.server1['id'], mymeta='val')
347
        self.assertTrue('mymeta' in r1)
348
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
349
        try:
350
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
351
            raise ClientError('Wrong Error', status=100)
352
        except ClientError as err:
353
            self.assertEqual(err.status, 404)
354

    
355
    def test_list_flavors(self):
356
        """Test flavors_get"""
357
        self._test_0120_list_flavors()
358

    
359
    def _test_0120_list_flavors(self):
360
        r = self.client.list_flavors()
361
        self.assertTrue(len(r) > 1)
362
        r = self.client.list_flavors(detail=True)
363
        self.assertTrue('SNF:disk_template' in r[0])
364

    
365
    def test_get_flavor_details(self):
366
        """Test test_get_flavor_details"""
367
        self._test_0130_get_flavor_details()
368

    
369
    def _test_0130_get_flavor_details(self):
370
        r = self.client.get_flavor_details(self.flavorid)
371
        self.assert_dicts_are_equal(self._flavor_details, r)
372

    
373
    def test_list_images(self):
374
        """Test list_images"""
375
        self._test_0140_list_images()
376

    
377
    def _test_0140_list_images(self):
378
        r = self.client.list_images()
379
        self.assertTrue(len(r) > 1)
380
        r = self.client.list_images(detail=True)
381
        for detailed_img in r:
382
            if detailed_img['id'] == self.img:
383
                break
384
        self.assert_dicts_are_equal(detailed_img, self.img_details)
385

    
386
    def test_get_image_details(self):
387
        """Test image_details"""
388
        self._test_0150_get_image_details()
389

    
390
    def _test_0150_get_image_details(self):
391
        r = self.client.get_image_details(self.img)
392
        self.assert_dicts_are_equal(r, self.img_details)
393

    
394
    def test_get_image_metadata(self):
395
        """Test get_image_metadata"""
396
        self._test_0160_get_image_metadata()
397

    
398
    def _test_0160_get_image_metadata(self):
399
        r = self.client.get_image_metadata(self.img)
400
        self.assert_dicts_are_equal(
401
            self.img_details['metadata'], r)
402
        for key, val in self.img_details['metadata'].items():
403
            r = self.client.get_image_metadata(self.img, key)
404
            self.assertEqual(r[key], val)
405

    
406
    def test_shutdown_server(self):
407
        """Test shutdown_server"""
408
        self.server1 = self._create_server(
409
            self.servname1, self.flavorid, self.img)
410
        self._wait_for_status(self.server1['id'], 'BUILD')
411
        self._test_0170_shutdown_server()
412

    
413
    def _test_0170_shutdown_server(self):
414
        self.client.shutdown_server(self.server1['id'])
415
        self._wait_for_status(self.server1['id'], 'ACTIVE')
416
        r = self.client.get_server_details(self.server1['id'])
417
        self.assertEqual(r['status'], 'STOPPED')
418

    
419
    def test_start_server(self):
420
        """Test start_server"""
421
        self.server1 = self._create_server(
422
            self.servname1, self.flavorid, self.img)
423
        self._wait_for_status(self.server1['id'], 'BUILD')
424
        self.client.shutdown_server(self.server1['id'])
425
        self._wait_for_status(self.server1['id'], 'ACTIVE')
426
        self._test_0180_start_server()
427

    
428
    def _test_0180_start_server(self):
429
        self.client.start_server(self.server1['id'])
430
        self._wait_for_status(self.server1['id'], 'STOPPED')
431
        r = self.client.get_server_details(self.server1['id'])
432
        self.assertEqual(r['status'], 'ACTIVE')
433

    
434
    def test_get_server_console(self):
435
        """Test get_server_console"""
436
        self.server2 = self._create_server(
437
            self.servname2, self.flavorid, self.img)
438
        self._wait_for_status(self.server2['id'], 'BUILD')
439
        self._test_0190_get_server_console()
440

    
441
    def _test_0190_get_server_console(self):
442
        r = self.client.get_server_console(self.server2['id'])
443
        self.assertTrue('host' in r)
444
        self.assertTrue('password' in r)
445
        self.assertTrue('port' in r)
446
        self.assertTrue('type' in r)
447

    
448
    def test_get_firewall_profile(self):
449
        """Test get_firewall_profile"""
450
        self.server1 = self._create_server(
451
            self.servname1, self.flavorid, self.img)
452
        self._test_0200_get_firewall_profile()
453

    
454
    def _test_0200_get_firewall_profile(self):
455
        self._wait_for_status(self.server1['id'], 'BUILD')
456
        fprofile = self.client.get_firewall_profile(self.server1['id'])
457
        self.assertTrue(fprofile in self.PROFILES)
458

    
459
    def test_set_firewall_profile(self):
460
        """Test set_firewall_profile"""
461
        self.server1 = self._create_server(
462
            self.servname1, self.flavorid, self.img)
463
        self._test_0210_set_firewall_profile()
464

    
465
    def _test_0210_set_firewall_profile(self):
466

    
467
        self._wait_for_status(self.server1['id'], 'BUILD')
468
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
469
        fprofile = self.client.get_firewall_profile(self.server1['id'])
470
        print('')
471
        count_success = 0
472
        for counter, fprofile in enumerate(PROFILES):
473
            npos = counter + 1
474
            try:
475
                nprofile = PROFILES[npos]
476
            except IndexError:
477
                nprofile = PROFILES[0]
478
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
479
            self.client.set_firewall_profile(self.server1['id'], nprofile)
480
            time.sleep(0.5)
481
            self.client.reboot_server(self.server1['id'], hard=True)
482
            time.sleep(1)
483
            self._wait_for_status(self.server1['id'], 'REBOOT')
484
            time.sleep(0.5)
485
            changed = self.client.get_firewall_profile(self.server1['id'])
486
            try:
487
                self.assertEqual(changed, nprofile)
488
            except AssertionError as err:
489
                if count_success:
490
                    print('\tFAIL in swap #%s' % npos)
491
                    break
492
                else:
493
                    raise err
494
            count_success += 1
495

    
496
    def test_get_server_stats(self):
497
        self.server1 = self._create_server(
498
            self.servname1, self.flavorid, self.img)
499
        self._test_0220_get_server_stats()
500

    
501
    def _test_0220_get_server_stats(self):
502
        r = self.client.get_server_stats(self.server1['id'])
503
        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
504
        for term in it:
505
            self.assertTrue(term in r)
506

    
507
    def test_create_network(self):
508
        """Test create_network"""
509
        self._test_0230_create_network()
510

    
511
    def _test_0230_create_network(self):
512
        print('\twith no params')
513
        self.network1 = self._create_network(self.netname1)
514
        self._wait_for_network(self.network1['id'], 'ACTIVE')
515
        n1id = self.network1['id']
516
        self.network1 = self.client.get_network_details(n1id)
517
        nets = self.client.list_networks(self.network1['id'])
518
        chosen = [net for net in nets if net['id'] == n1id][0]
519
        chosen.pop('updated')
520
        net1 = dict(self.network1)
521
        net1.pop('updated')
522
        self.assert_dicts_are_equal(chosen, net1)
523
        full_args = dict(
524
                cidr='192.168.1.0/24',
525
                gateway='192.168.1.1',
526
                type='MAC_FILTERED',
527
                dhcp=True)
528
        try_args = dict(all=True)
529
        try_args.update(full_args)
530
        for param, val in try_args.items():
531
            print('\tdelete %s to avoid max net limit' % n1id)
532
            self._delete_network(n1id)
533
            kwargs = full_args if param == 'all' else {param: val}
534
            print('\twith %s=%s' % (param, val))
535
            self.network1 = self._create_network(self.netname1, **kwargs)
536
            n1id = self.network1['id']
537
            self._wait_for_network(n1id, 'ACTIVE')
538
            self.network1 = self.client.get_network_details(n1id)
539
            if param == 'all':
540
                for p, v in full_args.items():
541
                    self.assertEqual(self.network1[p], v)
542
            else:
543
                self.assertEqual(self.network1[param], val)
544

    
545
    def test_connect_server(self):
546
        """Test connect_server"""
547
        self.server1 = self._create_server(
548
            self.servname1, self.flavorid, self.img)
549
        self.network1 = self._create_network(self.netname1)
550
        self._wait_for_status(self.server1['id'], 'BUILD')
551
        self._wait_for_network(self.network1['id'], 'ACTIVE')
552
        self._test_0240_connect_server()
553

    
554
    def _test_0250_connect_server(self):
555
        self.client.connect_server(self.server1['id'], self.network1['id'])
556
        self.assertTrue(
557
            self._wait_for_nic(self.network1['id'], self.server1['id']))
558

    
559
    def test_disconnect_server(self):
560
        """Test disconnect_server"""
561
        self.test_connect_server()
562
        self._test_0250_disconnect_server()
563

    
564
    def _test_0250_disconnect_server(self):
565
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
566
        self.assertTrue(self._wait_for_nic(
567
            self.network1['id'], self.server1['id'], in_creation=False))
568

    
569
    def _test_0260_wait_for_second_network(self):
570
        self.network2 = self._create_network(self.netname2)
571
        self._wait_for_network(self.network2['id'], 'ACTIVE')
572

    
573
    def test_list_server_nics(self):
574
        """Test list_server_nics"""
575
        self.server1 = self._create_server(
576
            self.servname1, self.flavorid, self.img)
577
        self.network2 = self._create_network(self.netname2)
578
        self._wait_for_status(self.server1['id'], 'BUILD')
579
        self._wait_for_network(self.network2['id'], 'ACTIVE')
580
        self._test_0280_list_server_nics()
581

    
582
    def _test_0280_list_server_nics(self):
583
        r = self.client.list_server_nics(self.server1['id'])
584
        len0 = len(r)
585
        self.client.connect_server(self.server1['id'], self.network2['id'])
586
        self.assertTrue(
587
            self._wait_for_nic(self.network2['id'], self.server1['id']))
588
        r = self.client.list_server_nics(self.server1['id'])
589
        self.assertTrue(len(r) > len0)
590

    
591
    def test_list_networks(self):
592
        """Test list_network"""
593
        self.network1 = self._create_network(self.netname1)
594
        self._wait_for_network(self.network1['id'], 'ACTIVE')
595
        self._test_0290_list_networks()
596

    
597
    def _test_0290_list_networks(self):
598
        r = self.client.list_networks()
599
        self.assertTrue(len(r) > 1)
600
        ids = [net['id'] for net in r]
601
        names = [net['name'] for net in r]
602
        self.assertTrue('1' in ids)
603
        #self.assertTrue('public' in names)
604
        self.assertTrue(self.network1['id'] in ids)
605
        self.assertTrue(self.network1['name'] in names)
606

    
607
        r = self.client.list_networks(detail=True)
608
        ids = [net['id'] for net in r]
609
        names = [net['name'] for net in r]
610
        for net in r:
611
            self.assertTrue(net['id'] in ids)
612
            self.assertTrue(net['name'] in names)
613
            for term in ('status', 'updated', 'created'):
614
                self.assertTrue(term in net.keys())
615

    
616
    def test_list_network_nics(self):
617
        """Test list_server_nics"""
618
        self.server1 = self._create_server(
619
            self.servname1, self.flavorid, self.img)
620
        self.network1 = self._create_network(self.netname1)
621
        self.network2 = self._create_network(self.netname2)
622
        self._wait_for_status(self.server1['id'], 'BUILD')
623
        self._wait_for_network(self.network1['id'], 'ACTIVE')
624
        self._wait_for_network(self.network2['id'], 'ACTIVE')
625
        self.client.connect_server(self.server1['id'], self.network1['id'])
626
        self.client.connect_server(self.server1['id'], self.network2['id'])
627
        self._wait_for_nic(self.network1['id'], self.server1['id'])
628
        self._wait_for_nic(self.network2['id'], self.server1['id'])
629
        self._test_0293_list_network_nics()
630

    
631
    def _test_0293_list_network_nics(self):
632
        netid1, netid2 = self.network1['id'], self.network2['id']
633
        r = self.client.list_network_nics(netid1)
634
        expected = ['nic-%s-1' % self.server1['id']]
635
        self.assertEqual(r, expected)
636
        r = self.client.list_network_nics(netid2)
637
        expected = ['nic-%s-2' % self.server1['id']]
638
        self.assertEqual(r, expected)
639

    
640
    def test_get_network_details(self):
641
        """Test get_network_details"""
642
        self.network1 = self._create_network(self.netname1)
643
        self._test_0300_get_network_details()
644

    
645
    def _test_0300_get_network_details(self):
646
        r = self.client.get_network_details(self.network1['id'])
647
        net1 = dict(self.network1)
648
        net1.pop('status')
649
        net1.pop('updated', None)
650
        net1.pop('attachments')
651
        r.pop('status')
652
        r.pop('updated', None)
653
        r.pop('attachments')
654
        self.assert_dicts_are_equal(net1, r)
655

    
656
    def test_update_network_name(self):
657
        self.network2 = self._create_network(self.netname2)
658
        self._test_0310_update_network_name()
659

    
660
    def _test_0310_update_network_name(self):
661
        updated_name = self.netname2 + '_upd'
662
        self.client.update_network_name(self.network2['id'], updated_name)
663

    
664
        def netwait(wait):
665
            r = self.client.get_network_details(self.network2['id'])
666
            if r['name'] == updated_name:
667
                return
668
            time.sleep(wait)
669
        self.do_with_progress_bar(
670
            netwait,
671
            'Network %s name is changing:' % self.network2['id'],
672
            self._waits[:5])
673

    
674
        r = self.client.get_network_details(self.network2['id'])
675
        self.assertEqual(r['name'], updated_name)
676

    
677
    """ Don't have auth to test this
678
    def test_delete_image(self):
679
        ""Test delete_image""
680
        self._test_0330_delete_image()
681
    def _test_0330_delete_image(self):
682
        images = self.client.list_images()
683
        self.client.delete_image(images[2]['id'])
684
        try:
685
            r = self.client.get_image_details(images[2]['id'], success=(400))
686
        except ClientError as err:
687
            self.assertEqual(err.status, 404)
688

689
    def test_create_image_metadata(self):
690
        ""Test create_image_metadata""
691
        self._test_0340_create_image_metadata()
692
    def _test_0340_create_image_metadata(self):
693
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
694
        self.assertEqual(r['mykey'], 'myval')
695

696
    def test_update_image_metadata(self):
697
        ""Test update_image_metadata""
698
        self._test_0350_update_image_metadata()
699
    def _test_0350_update_image_metadata(self):
700
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
701
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
702
        self.assertEqual(r['mykey0'], 'myval0')
703

704
    def test_delete_image_metadata(self):
705
        ""Test delete_image_metadata""
706
        self._test_0360_delete_image_metadata()
707
    def _test_0360_delete_image_metadata(self):
708
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
709
        self.client.delete_image_metadata(self.img, 'mykey1')
710
        r = self.client.get_image_metadata(self.img)
711
        self.assertNotEqual('mykey1' in r)
712
    """