Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (29 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,
81
            self.flavorid,
82
            self.img)
83
        self.server2 = self._create_server(
84
            self.servname2,
85
            self.flavorid,
86
            self.img)
87
        super(self.__class__, self).test_000()
88

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

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

    
108
    def _create_network(self, netname, **kwargs):
109
        net = self.client.create_network(netname, **kwargs)
110
        self.networks[net['id']] = net
111
        return net
112

    
113
    def _delete_network(self, netid):
114
        if not netid in self.networks:
115
            return None
116
        print('Disconnect nics of network %s' % netid)
117
        self.client.disconnect_network_nics(netid)
118

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

    
130
    def _wait_for_network(self, netid, status):
131

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

    
142
    def _wait_for_nic(self, netid, servid, in_creation=True):
143
        self._wait_for_network(netid, 'ACTIVE')
144

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

    
165
    def _has_status(self, servid, status):
166
        r = self.client.get_server_details(servid)
167
        #print 'MY STATUS IS ', r['status']
168
        return r['status'] == status
169

    
170
    def _wait_for_status(self, servid, status):
171
        (wait_bar, wait_cb) = self._safe_progress_bar(
172
            'Server %s in %s' % (servid, status))
173
        self.client.wait_server(servid, status, wait_cb=wait_cb)
174
        self._safe_progress_bar_finish(wait_bar)
175

    
176
    def test_parallel_creation(self):
177
        """test create with multiple threads
178
        Do not use this in regular livetest
179
        """
180
        from kamaki.clients import SilentEvent
181
        c1 = SilentEvent(
182
            self._create_server,
183
            self.servname1,
184
            self.flavorid,
185
            self.img)
186
        c2 = SilentEvent(
187
            self._create_server,
188
            self.servname2,
189
            self.flavorid,
190
            self.img)
191
        c3 = SilentEvent(
192
            self._create_server,
193
            self.servname1,
194
            self.flavorid,
195
            self.img)
196
        c4 = SilentEvent(
197
            self._create_server,
198
            self.servname2,
199
            self.flavorid,
200
            self.img)
201
        c5 = SilentEvent(
202
            self._create_server,
203
            self.servname1,
204
            self.flavorid,
205
            self.img)
206
        c6 = SilentEvent(
207
            self._create_server,
208
            self.servname2,
209
            self.flavorid,
210
            self.img)
211
        c7 = SilentEvent(
212
            self._create_server,
213
            self.servname1,
214
            self.flavorid,
215
            self.img)
216
        c8 = SilentEvent(
217
            self._create_server,
218
            self.servname2,
219
            self.flavorid,
220
            self.img)
221
        c1.start()
222
        c2.start()
223
        c3.start()
224
        c4.start()
225
        c5.start()
226
        c6.start()
227
        c7.start()
228
        c8.start()
229

    
230
    def test_create_server(self):
231
        """Test create_server"""
232
        self.server1 = self._create_server(
233
            self.servname1,
234
            self.flavorid,
235
            self.img)
236
        self._wait_for_status(self.server1['id'], 'BUILD')
237
        self._test_0010_create_server()
238

    
239
    def _test_0010_create_server(self):
240
        self.assertEqual(self.server1["name"], self.servname1)
241
        self.assertEqual(self.server1["flavor"]["id"], self.flavorid)
242
        self.assertEqual(self.server1["image"]["id"], self.img)
243
        self.assertEqual(self.server1["status"], "BUILD")
244

    
245
    def test_list_servers(self):
246
        """Test list servers"""
247
        self.server1 = self._create_server(
248
            self.servname1,
249
            self.flavorid,
250
            self.img)
251
        self.server2 = self._create_server(
252
            self.servname2,
253
            self.flavorid,
254
            self.img)
255
        self._test_0020_list_servers()
256

    
257
    def _test_0020_list_servers(self):
258
        servers = self.client.list_servers()
259
        dservers = self.client.list_servers(detail=True)
260

    
261
        """detailed and simple are same size"""
262
        self.assertEqual(len(dservers), len(servers))
263
        for i in range(len(servers)):
264
            for field in (
265
                    'created',
266
                    'flavor',
267
                    'hostId',
268
                    'image',
269
                    'progress',
270
                    'status',
271
                    'updated'):
272
                self.assertFalse(field in servers[i])
273
                self.assertTrue(field in dservers[i])
274

    
275
        """detailed and simple contain same names"""
276
        names = sorted(map(lambda x: x["name"], servers))
277
        dnames = sorted(map(lambda x: x["name"], dservers))
278
        self.assertEqual(names, dnames)
279

    
280
    def _test_0030_wait_test_servers_to_build(self):
281
        """Pseudo-test to wait for VMs to load"""
282
        print('')
283
        self._wait_for_status(self.server1['id'], 'BUILD')
284
        self._wait_for_status(self.server2['id'], 'BUILD')
285

    
286
    def test_get_server_details(self):
287
        """Test get_server_details"""
288
        self.server1 = self._create_server(
289
            self.servname1,
290
            self.flavorid,
291
            self.img)
292
        self._wait_for_status(self.server1['id'], 'BUILD')
293
        self._test_0040_get_server_details()
294

    
295
    def _test_0040_get_server_details(self):
296
        r = self.client.get_server_details(self.server1['id'])
297
        self.assertEqual(r["name"], self.servname1)
298
        self.assertEqual(r["flavor"]["id"], self.flavorid)
299
        self.assertEqual(r["image"]["id"], self.img)
300
        self.assertEqual(r["status"], "ACTIVE")
301

    
302
    def test_update_server_name(self):
303
        """Test update_server_name"""
304
        self.server1 = self._create_server(
305
            self.servname1,
306
            self.flavorid,
307
            self.img)
308
        self._test_0050_update_server_name()
309

    
310
    def _test_0050_update_server_name(self):
311
        new_name = self.servname1 + '_new_name'
312
        self.client.update_server_name(self.server1['id'], new_name)
313
        r = self.client.get_server_details(
314
            self.server1['id'],
315
            success=(200, 400))
316
        self.assertEqual(r['name'], new_name)
317
        changed = self.servers.pop(self.servname1)
318
        changed['name'] = new_name
319
        self.servers[new_name] = changed
320

    
321
    def test_reboot_server(self):
322
        """Test reboot server"""
323
        self.server1 = self._create_server(
324
            self.servname1,
325
            self.flavorid,
326
            self.img)
327
        self._wait_for_status(self.server1['id'], 'BUILD')
328
        self.server2 = self._create_server(
329
            self.servname2,
330
            self.flavorid + 1,
331
            self.img)
332
        self._wait_for_status(self.server2['id'], 'BUILD')
333
        self._test_0060_reboot_server()
334
        self._wait_for_status(self.server1['id'], 'REBOOT')
335
        self._wait_for_status(self.server2['id'], 'REBOOT')
336

    
337
    def _test_0060_reboot_server(self):
338
        self.client.reboot_server(self.server1['id'])
339
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
340
        self.client.reboot_server(self.server2['id'], hard=True)
341
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
342

    
343
    def _test_0070_wait_test_servers_to_reboot(self):
344
        """Pseudo-test to wait for VMs to load"""
345
        print('')
346
        self._wait_for_status(self.server1['id'], 'REBOOT')
347
        self._wait_for_status(self.server2['id'], 'REBOOT')
348

    
349
    def test_create_server_metadata(self):
350
        """Test create_server_metadata"""
351
        self.server1 = self._create_server(
352
            self.servname1,
353
            self.flavorid,
354
            self.img)
355
        self._test_0080_create_server_metadata()
356

    
357
    def _test_0080_create_server_metadata(self):
358
        r1 = self.client.create_server_metadata(
359
            self.server1['id'],
360
            'mymeta',
361
            'mymeta val')
362
        self.assertTrue('mymeta' in r1)
363
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
364
        self.assert_dicts_are_equal(r1, r2)
365

    
366
    def test_get_server_metadata(self):
367
        """Test get server_metadata"""
368
        self.server1 = self._create_server(
369
            self.servname1,
370
            self.flavorid,
371
            self.img)
372
        self._test_0090_get_server_metadata()
373

    
374
    def _test_0090_get_server_metadata(self):
375
        self.client.update_server_metadata(
376
            self.server1['id'], mymeta_0='val_0')
377
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
378
        self.assertEqual(r['mymeta_0'], 'val_0')
379

    
380
    def test_update_server_metadata(self):
381
        """Test update_server_metadata"""
382
        self.server1 = self._create_server(
383
            self.servname1,
384
            self.flavorid,
385
            self.img)
386
        self._test_0100_update_server_metadata()
387

    
388
    def _test_0100_update_server_metadata(self):
389
        r1 = self.client.update_server_metadata(
390
            self.server1['id'], mymeta3='val2')
391
        self.assertTrue('mymeta3'in r1)
392
        r2 = self.client.update_server_metadata(
393
            self.server1['id'], mymeta3='val3')
394
        self.assertTrue(r2['mymeta3'], 'val3')
395

    
396
    def test_delete_server_metadata(self):
397
        """Test delete_server_metadata"""
398
        self.server1 = self._create_server(
399
            self.servname1, self.flavorid, self.img)
400
        self._test_0110_delete_server_metadata()
401

    
402
    def _test_0110_delete_server_metadata(self):
403
        r1 = self.client.update_server_metadata(
404
            self.server1['id'], mymeta='val')
405
        self.assertTrue('mymeta' in r1)
406
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
407
        try:
408
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
409
            raise ClientError('Wrong Error', status=100)
410
        except ClientError as err:
411
            self.assertEqual(err.status, 404)
412

    
413
    def test_list_flavors(self):
414
        """Test flavors_get"""
415
        self._test_0120_list_flavors()
416

    
417
    def _test_0120_list_flavors(self):
418
        r = self.client.list_flavors()
419
        self.assertTrue(len(r) > 1)
420
        r = self.client.list_flavors(detail=True)
421
        self.assertTrue('SNF:disk_template' in r[0])
422

    
423
    def test_get_flavor_details(self):
424
        """Test test_get_flavor_details"""
425
        self._test_0130_get_flavor_details()
426

    
427
    def _test_0130_get_flavor_details(self):
428
        r = self.client.get_flavor_details(self.flavorid)
429
        self.assert_dicts_are_equal(self._flavor_details, r)
430

    
431
    #def test_list_images(self):
432
    #    """Test list_images"""
433
    #    self._test_0140_list_images()
434

    
435
    #def _test_0140_list_images(self):
436
    #    r = self.client.list_images()
437
    #    self.assertTrue(len(r) > 1)
438
    #    r = self.client.list_images(detail=True)
439
    #    for detailed_img in r:
440
    #        if detailed_img['id'] == self.img:
441
    #            break
442
    #    self.assert_dicts_are_equal(detailed_img, self.img_details)
443

    
444
    def test_get_image_details(self):
445
        """Test image_details"""
446
        self._test_0150_get_image_details()
447

    
448
    def _test_0150_get_image_details(self):
449
        r = self.client.get_image_details(self.img)
450
        self.assert_dicts_are_equal(r, self.img_details)
451

    
452
    def test_get_image_metadata(self):
453
        """Test get_image_metadata"""
454
        self._test_0160_get_image_metadata()
455

    
456
    def _test_0160_get_image_metadata(self):
457
        r = self.client.get_image_metadata(self.img)
458
        self.assert_dicts_are_equal(
459
            self.img_details['metadata'], r)
460
        for key, val in self.img_details['metadata'].items():
461
            r = self.client.get_image_metadata(self.img, key)
462
            self.assertEqual(r[key], val)
463

    
464
    def test_shutdown_server(self):
465
        """Test shutdown_server"""
466
        self.server1 = self._create_server(
467
            self.servname1,
468
            self.flavorid,
469
            self.img)
470
        self._wait_for_status(self.server1['id'], 'BUILD')
471
        self._test_0170_shutdown_server()
472

    
473
    def _test_0170_shutdown_server(self):
474
        self.client.shutdown_server(self.server1['id'])
475
        self._wait_for_status(self.server1['id'], 'ACTIVE')
476
        r = self.client.get_server_details(self.server1['id'])
477
        self.assertEqual(r['status'], 'STOPPED')
478

    
479
    def test_start_server(self):
480
        """Test start_server"""
481
        self.server1 = self._create_server(
482
            self.servname1,
483
            self.flavorid,
484
            self.img)
485
        self._wait_for_status(self.server1['id'], 'BUILD')
486
        self.client.shutdown_server(self.server1['id'])
487
        self._wait_for_status(self.server1['id'], 'ACTIVE')
488
        self._test_0180_start_server()
489

    
490
    def _test_0180_start_server(self):
491
        self.client.start_server(self.server1['id'])
492
        self._wait_for_status(self.server1['id'], 'STOPPED')
493
        r = self.client.get_server_details(self.server1['id'])
494
        self.assertEqual(r['status'], 'ACTIVE')
495

    
496
    def test_get_server_console(self):
497
        """Test get_server_console"""
498
        self.server2 = self._create_server(
499
            self.servname2,
500
            self.flavorid,
501
            self.img)
502
        self._wait_for_status(self.server2['id'], 'BUILD')
503
        self._test_0190_get_server_console()
504

    
505
    def _test_0190_get_server_console(self):
506
        r = self.client.get_server_console(self.server2['id'])
507
        self.assertTrue('host' in r)
508
        self.assertTrue('password' in r)
509
        self.assertTrue('port' in r)
510
        self.assertTrue('type' in r)
511

    
512
    def test_get_firewall_profile(self):
513
        """Test get_firewall_profile"""
514
        self.server1 = self._create_server(
515
            self.servname1,
516
            self.flavorid,
517
            self.img)
518
        self._test_0200_get_firewall_profile()
519

    
520
    def _test_0200_get_firewall_profile(self):
521
        self._wait_for_status(self.server1['id'], 'BUILD')
522
        fprofile = self.client.get_firewall_profile(self.server1['id'])
523
        self.assertTrue(fprofile in self.PROFILES)
524

    
525
    def test_set_firewall_profile(self):
526
        """Test set_firewall_profile"""
527
        self.server1 = self._create_server(
528
            self.servname1,
529
            self.flavorid,
530
            self.img)
531
        self._test_0210_set_firewall_profile()
532

    
533
    def _test_0210_set_firewall_profile(self):
534

    
535
        self._wait_for_status(self.server1['id'], 'BUILD')
536
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
537
        fprofile = self.client.get_firewall_profile(self.server1['id'])
538
        print('')
539
        count_success = 0
540
        for counter, fprofile in enumerate(PROFILES):
541
            npos = counter + 1
542
            try:
543
                nprofile = PROFILES[npos]
544
            except IndexError:
545
                nprofile = PROFILES[0]
546
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
547
            self.client.set_firewall_profile(self.server1['id'], nprofile)
548
            time.sleep(0.5)
549
            self.client.reboot_server(self.server1['id'], hard=True)
550
            time.sleep(1)
551
            self._wait_for_status(self.server1['id'], 'REBOOT')
552
            time.sleep(0.5)
553
            changed = self.client.get_firewall_profile(self.server1['id'])
554
            try:
555
                self.assertEqual(changed, nprofile)
556
            except AssertionError as err:
557
                if count_success:
558
                    print('\tFAIL in swap #%s' % npos)
559
                    break
560
                else:
561
                    raise err
562
            count_success += 1
563

    
564
    def test_get_server_stats(self):
565
        self.server1 = self._create_server(
566
            self.servname1,
567
            self.flavorid,
568
            self.img)
569
        self._test_0220_get_server_stats()
570

    
571
    def _test_0220_get_server_stats(self):
572
        r = self.client.get_server_stats(self.server1['id'])
573
        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
574
        for term in it:
575
            self.assertTrue(term in r)
576

    
577
    def test_create_network(self):
578
        """Test create_network"""
579
        self._test_0230_create_network()
580

    
581
    def _test_0230_create_network(self):
582
        print('\twith no params')
583
        self.network1 = self._create_network(self.netname1)
584
        self._wait_for_network(self.network1['id'], 'ACTIVE')
585
        n1id = self.network1['id']
586
        self.network1 = self.client.get_network_details(n1id)
587
        nets = self.client.list_networks(self.network1['id'])
588
        chosen = [net for net in nets if net['id'] == n1id][0]
589
        chosen.pop('updated')
590
        net1 = dict(self.network1)
591
        net1.pop('updated')
592
        self.assert_dicts_are_equal(chosen, net1)
593
        full_args = dict(
594
                cidr='192.168.1.0/24',
595
                gateway='192.168.1.1',
596
                type='MAC_FILTERED',
597
                dhcp=True)
598
        try_args = dict(all=True)
599
        try_args.update(full_args)
600
        for param, val in try_args.items():
601
            print('\tdelete %s to avoid max net limit' % n1id)
602
            self._delete_network(n1id)
603
            kwargs = full_args if param == 'all' else {param: val}
604
            print('\twith %s=%s' % (param, val))
605
            self.network1 = self._create_network(self.netname1, **kwargs)
606
            n1id = self.network1['id']
607
            self._wait_for_network(n1id, 'ACTIVE')
608
            self.network1 = self.client.get_network_details(n1id)
609
            if param == 'all':
610
                for p, v in full_args.items():
611
                    self.assertEqual(self.network1[p], v)
612
            else:
613
                self.assertEqual(self.network1[param], val)
614

    
615
    def test_connect_server(self):
616
        """Test connect_server"""
617
        self.server1 = self._create_server(
618
            self.servname1,
619
            self.flavorid,
620
            self.img)
621
        self.network1 = self._create_network(self.netname1)
622
        self._wait_for_status(self.server1['id'], 'BUILD')
623
        self._wait_for_network(self.network1['id'], 'ACTIVE')
624
        self._test_0240_connect_server()
625

    
626
    def _test_0250_connect_server(self):
627
        self.client.connect_server(self.server1['id'], self.network1['id'])
628
        self.assertTrue(self._wait_for_nic(
629
            self.network1['id'],
630
            self.server1['id']))
631

    
632
    def test_disconnect_server(self):
633
        """Test disconnect_server"""
634
        self.test_connect_server()
635
        self._test_0250_disconnect_server()
636

    
637
    def _test_0250_disconnect_server(self):
638
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
639
        self.assertTrue(self._wait_for_nic(
640
            self.network1['id'],
641
            self.server1['id'],
642
            in_creation=False))
643

    
644
    def _test_0260_wait_for_second_network(self):
645
        self.network2 = self._create_network(self.netname2)
646
        self._wait_for_network(self.network2['id'], 'ACTIVE')
647

    
648
    def test_list_server_nics(self):
649
        """Test list_server_nics"""
650
        self.server1 = self._create_server(
651
            self.servname1,
652
            self.flavorid,
653
            self.img)
654
        self.network2 = self._create_network(self.netname2)
655
        self._wait_for_status(self.server1['id'], 'BUILD')
656
        self._wait_for_network(self.network2['id'], 'ACTIVE')
657
        self._test_0280_list_server_nics()
658

    
659
    def _test_0280_list_server_nics(self):
660
        r = self.client.list_server_nics(self.server1['id'])
661
        len0 = len(r)
662
        self.client.connect_server(self.server1['id'], self.network2['id'])
663
        self.assertTrue(self._wait_for_nic(
664
            self.network2['id'],
665
            self.server1['id']))
666
        r = self.client.list_server_nics(self.server1['id'])
667
        self.assertTrue(len(r) > len0)
668

    
669
    def test_list_networks(self):
670
        """Test list_network"""
671
        self.network1 = self._create_network(self.netname1)
672
        self._wait_for_network(self.network1['id'], 'ACTIVE')
673
        self._test_0290_list_networks()
674

    
675
    def _test_0290_list_networks(self):
676
        r = self.client.list_networks()
677
        self.assertTrue(len(r) > 1)
678
        ids = [net['id'] for net in r]
679
        names = [net['name'] for net in r]
680
        self.assertTrue('1' in ids)
681
        #self.assertTrue('public' in names)
682
        self.assertTrue(self.network1['id'] in ids)
683
        self.assertTrue(self.network1['name'] in names)
684

    
685
        r = self.client.list_networks(detail=True)
686
        ids = [net['id'] for net in r]
687
        names = [net['name'] for net in r]
688
        for net in r:
689
            self.assertTrue(net['id'] in ids)
690
            self.assertTrue(net['name'] in names)
691
            for term in ('status', 'updated', 'created'):
692
                self.assertTrue(term in net.keys())
693

    
694
    def test_list_network_nics(self):
695
        """Test list_server_nics"""
696
        self.server1 = self._create_server(
697
            self.servname1,
698
            self.flavorid,
699
            self.img)
700
        self.network1 = self._create_network(self.netname1)
701
        self.network2 = self._create_network(self.netname2)
702
        self._wait_for_status(self.server1['id'], 'BUILD')
703
        self._wait_for_network(self.network1['id'], 'ACTIVE')
704
        self._wait_for_network(self.network2['id'], 'ACTIVE')
705
        self.client.connect_server(self.server1['id'], self.network1['id'])
706
        self.client.connect_server(self.server1['id'], self.network2['id'])
707
        self._wait_for_nic(self.network1['id'], self.server1['id'])
708
        self._wait_for_nic(self.network2['id'], self.server1['id'])
709
        self._test_0293_list_network_nics()
710

    
711
    def _test_0293_list_network_nics(self):
712
        netid1 = self.network1['id']
713
        netid2 = self.network2['id']
714
        r = self.client.list_network_nics(netid1)
715
        expected = ['nic-%s-1' % self.server1['id']]
716
        self.assertEqual(r, expected)
717
        r = self.client.list_network_nics(netid2)
718
        expected = ['nic-%s-2' % self.server1['id']]
719
        self.assertEqual(r, expected)
720

    
721
    def test_get_network_details(self):
722
        """Test get_network_details"""
723
        self.network1 = self._create_network(self.netname1)
724
        self._test_0300_get_network_details()
725

    
726
    def _test_0300_get_network_details(self):
727
        r = self.client.get_network_details(self.network1['id'])
728
        net1 = dict(self.network1)
729
        net1.pop('status')
730
        net1.pop('updated', None)
731
        net1.pop('attachments')
732
        r.pop('status')
733
        r.pop('updated', None)
734
        r.pop('attachments')
735
        self.assert_dicts_are_equal(net1, r)
736

    
737
    def test_update_network_name(self):
738
        self.network2 = self._create_network(self.netname2)
739
        self._test_0310_update_network_name()
740

    
741
    def _test_0310_update_network_name(self):
742
        updated_name = self.netname2 + '_upd'
743
        self.client.update_network_name(self.network2['id'], updated_name)
744

    
745
        def netwait(wait):
746
            r = self.client.get_network_details(self.network2['id'])
747
            if r['name'] == updated_name:
748
                return
749
            time.sleep(wait)
750
        self.do_with_progress_bar(
751
            netwait,
752
            'Network %s name is changing:' % self.network2['id'],
753
            self._waits[:5])
754

    
755
        r = self.client.get_network_details(self.network2['id'])
756
        self.assertEqual(r['name'], updated_name)
757

    
758
    """ Don't have auth to test this
759
    def test_delete_image(self):
760
        ""Test delete_image""
761
        self._test_0330_delete_image()
762
    def _test_0330_delete_image(self):
763
        images = self.client.list_images()
764
        self.client.delete_image(images[2]['id'])
765
        try:
766
            r = self.client.get_image_details(images[2]['id'], success=(400))
767
        except ClientError as err:
768
            self.assertEqual(err.status, 404)
769

770
    def test_create_image_metadata(self):
771
        ""Test create_image_metadata""
772
        self._test_0340_create_image_metadata()
773
    def _test_0340_create_image_metadata(self):
774
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
775
        self.assertEqual(r['mykey'], 'myval')
776

777
    def test_update_image_metadata(self):
778
        ""Test update_image_metadata""
779
        self._test_0350_update_image_metadata()
780
    def _test_0350_update_image_metadata(self):
781
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
782
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
783
        self.assertEqual(r['mykey0'], 'myval0')
784

785
    def test_delete_image_metadata(self):
786
        ""Test delete_image_metadata""
787
        self._test_0360_delete_image_metadata()
788
    def _test_0360_delete_image_metadata(self):
789
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
790
        self.client.delete_image_metadata(self.img, 'mykey1')
791
        r = self.client.get_image_metadata(self.img)
792
        self.assertNotEqual('mykey1' in r)
793
    """