Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / cyclades.py @ 2feb9477

History | View | Annotate | Download (29.2 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['image', '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 + 2,
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,
92
            flavorid,
93
            imageid,
94
            personality)
95
        print('CREATE VM %s (%s)' % (server['id'], server['name']))
96
        self.servers[servername] = server
97
        return server
98

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

    
111
    def _create_network(self, netname, **kwargs):
112
        net = self.client.create_network(netname, **kwargs)
113
        self.networks[net['id']] = net
114
        return net
115

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

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

    
133
    def _wait_for_network(self, netid, status):
134

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

    
145
    def _wait_for_nic(self, netid, servid, in_creation=True):
146
        self._wait_for_network(netid, 'ACTIVE')
147

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

    
168
    def _has_status(self, servid, status):
169
        r = self.client.get_server_details(servid)
170
        return r['status'] == status
171

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

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

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

    
241
    def _test_0010_create_server(self):
242
        self.assertEqual(self.server1["name"], self.servname1)
243
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
244
        self.assertEqual(self.server1["imageRef"], self.img)
245
        self.assertEqual(self.server1["status"], "BUILD")
246

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

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

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

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

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

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

    
297
    def _test_0040_get_server_details(self):
298
        r = self.client.get_server_details(self.server1['id'])
299
        self.assertEqual(r["name"], self.servname1)
300
        self.assertEqual(r["flavorRef"], self.flavorid)
301
        self.assertEqual(r["imageRef"], self.img)
302
        self.assertEqual(r["status"], "ACTIVE")
303

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

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

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

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

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

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

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

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

    
376
    def _test_0090_get_server_metadata(self):
377
        self.client.create_server_metadata(
378
            self.server1['id'],
379
            'mymeta_0',
380
            'val_0')
381
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
382
        self.assertEqual(r['mymeta_0'], 'val_0')
383

    
384
    def test_update_server_metadata(self):
385
        """Test update_server_metadata"""
386
        self.server1 = self._create_server(
387
            self.servname1,
388
            self.flavorid,
389
            self.img)
390
        self._test_0100_update_server_metadata()
391

    
392
    def _test_0100_update_server_metadata(self):
393
        r1 = self.client.create_server_metadata(
394
            self.server1['id'],
395
            'mymeta3',
396
            'val2')
397
        self.assertTrue('mymeta3'in r1)
398
        r2 = self.client.update_server_metadata(
399
            self.server1['id'],
400
            mymeta3='val3')
401
        self.assertTrue(r2['mymeta3'], 'val3')
402

    
403
    def test_delete_server_metadata(self):
404
        """Test delete_server_metadata"""
405
        self.server1 = self._create_server(
406
            self.servname1,
407
            self.flavorid,
408
            self.img)
409
        self._test_0110_delete_server_metadata()
410

    
411
    def _test_0110_delete_server_metadata(self):
412
        r1 = self.client.create_server_metadata(
413
            self.server1['id'],
414
            'mymeta',
415
            'val')
416
        self.assertTrue('mymeta' in r1)
417
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
418
        try:
419
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
420
            raise ClientError('Wrong Error', status=100)
421
        except ClientError as err:
422
            self.assertEqual(err.status, 404)
423

    
424
    def test_list_flavors(self):
425
        """Test flavors_get"""
426
        self._test_0120_list_flavors()
427

    
428
    def _test_0120_list_flavors(self):
429
        r = self.client.list_flavors()
430
        self.assertTrue(len(r) > 1)
431
        r = self.client.list_flavors(detail=True)
432
        self.assertTrue('SNF:disk_template' in r[0])
433

    
434
    def test_get_flavor_details(self):
435
        """Test test_get_flavor_details"""
436
        self._test_0130_get_flavor_details()
437

    
438
    def _test_0130_get_flavor_details(self):
439
        r = self.client.get_flavor_details(self.flavorid)
440
        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
441

    
442
    def test_list_images(self):
443
        """Test list_images"""
444
        self._test_0140_list_images()
445

    
446
    def _test_0140_list_images(self):
447
        r = self.client.list_images()
448
        self.assertTrue(len(r) > 1)
449
        r = self.client.list_images(detail=True)
450
        for detailed_img in r:
451
            if detailed_img['id'] == self.img:
452
                break
453
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
454

    
455
    def test_get_image_details(self):
456
        """Test image_details"""
457
        self._test_0150_get_image_details()
458

    
459
    def _test_0150_get_image_details(self):
460
        r = self.client.get_image_details(self.img)
461
        self.assert_dicts_are_deeply_equal(r, self.img_details)
462

    
463
    def test_get_image_metadata(self):
464
        """Test get_image_metadata"""
465
        self._test_0160_get_image_metadata()
466

    
467
    def _test_0160_get_image_metadata(self):
468
        r = self.client.get_image_metadata(self.img)
469
        self.assert_dicts_are_deeply_equal(
470
            self.img_details['metadata']['values'], r)
471
        for key, val in self.img_details['metadata']['values'].items():
472
            r = self.client.get_image_metadata(self.img, key)
473
            self.assertEqual(r[key], val)
474

    
475
    def test_shutdown_server(self):
476
        """Test shutdown_server"""
477
        self.server1 = self._create_server(
478
            self.servname1,
479
            self.flavorid,
480
            self.img)
481
        self._wait_for_status(self.server1['id'], 'BUILD')
482
        self._test_0170_shutdown_server()
483

    
484
    def _test_0170_shutdown_server(self):
485
        self.client.shutdown_server(self.server1['id'])
486
        self._wait_for_status(self.server1['id'], 'ACTIVE')
487
        r = self.client.get_server_details(self.server1['id'])
488
        self.assertEqual(r['status'], 'STOPPED')
489

    
490
    def test_start_server(self):
491
        """Test start_server"""
492
        self.server1 = self._create_server(
493
            self.servname1,
494
            self.flavorid,
495
            self.img)
496
        self._wait_for_status(self.server1['id'], 'BUILD')
497
        self.client.shutdown_server(self.server1['id'])
498
        self._wait_for_status(self.server1['id'], 'ACTIVE')
499
        self._test_0180_start_server()
500

    
501
    def _test_0180_start_server(self):
502
        self.client.start_server(self.server1['id'])
503
        self._wait_for_status(self.server1['id'], 'STOPPED')
504
        r = self.client.get_server_details(self.server1['id'])
505
        self.assertEqual(r['status'], 'ACTIVE')
506

    
507
    def test_get_server_console(self):
508
        """Test get_server_console"""
509
        self.server2 = self._create_server(
510
            self.servname2,
511
            self.flavorid + 2,
512
            self.img)
513
        self._wait_for_status(self.server2['id'], 'BUILD')
514
        self._test_0190_get_server_console()
515

    
516
    def _test_0190_get_server_console(self):
517
        r = self.client.get_server_console(self.server2['id'])
518
        self.assertTrue('host' in r)
519
        self.assertTrue('password' in r)
520
        self.assertTrue('port' in r)
521
        self.assertTrue('type' in r)
522

    
523
    def test_get_firewall_profile(self):
524
        """Test get_firewall_profile"""
525
        self.server1 = self._create_server(
526
            self.servname1,
527
            self.flavorid,
528
            self.img)
529
        self._test_0200_get_firewall_profile()
530

    
531
    def _test_0200_get_firewall_profile(self):
532
        self._wait_for_status(self.server1['id'], 'BUILD')
533
        fprofile = self.client.get_firewall_profile(self.server1['id'])
534
        self.assertTrue(fprofile in self.PROFILES)
535

    
536
    def test_set_firewall_profile(self):
537
        """Test set_firewall_profile"""
538
        self.server1 = self._create_server(
539
            self.servname1,
540
            self.flavorid,
541
            self.img)
542
        self._test_0210_set_firewall_profile()
543

    
544
    def _test_0210_set_firewall_profile(self):
545

    
546
        self._wait_for_status(self.server1['id'], 'BUILD')
547
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
548
        fprofile = self.client.get_firewall_profile(self.server1['id'])
549
        print('')
550
        count_success = 0
551
        for counter, fprofile in enumerate(PROFILES):
552
            npos = counter + 1
553
            try:
554
                nprofile = PROFILES[npos]
555
            except IndexError:
556
                nprofile = PROFILES[0]
557
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
558
            self.client.set_firewall_profile(self.server1['id'], nprofile)
559
            time.sleep(0.5)
560
            self.client.reboot_server(self.server1['id'], hard=True)
561
            time.sleep(1)
562
            self._wait_for_status(self.server1['id'], 'REBOOT')
563
            time.sleep(0.5)
564
            changed = self.client.get_firewall_profile(self.server1['id'])
565
            try:
566
                self.assertEqual(changed, nprofile)
567
            except AssertionError as err:
568
                if count_success:
569
                    print('\tFAIL in swap #%s' % npos)
570
                    break
571
                else:
572
                    raise err
573
            count_success += 1
574

    
575
    def test_get_server_stats(self):
576
        self.server1 = self._create_server(
577
            self.servname1,
578
            self.flavorid,
579
            self.img)
580
        self._test_0220_get_server_stats()
581

    
582
    def _test_0220_get_server_stats(self):
583
        r = self.client.get_server_stats(self.server1['id'])
584
        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
585
        for term in it:
586
            self.assertTrue(term in r)
587

    
588
    def test_create_network(self):
589
        """Test create_network"""
590
        self._test_0230_create_network()
591

    
592
    def _test_0230_create_network(self):
593
        print('\twith no params')
594
        self.network1 = self._create_network(self.netname1)
595
        self._wait_for_network(self.network1['id'], 'ACTIVE')
596
        n1id = self.network1['id']
597
        self.network1 = self.client.get_network_details(n1id)
598
        nets = self.client.list_networks(self.network1['id'])
599
        chosen = [net for net in nets if net['id'] == n1id][0]
600
        chosen.pop('updated')
601
        net1 = dict(self.network1)
602
        net1.pop('updated')
603
        self.assert_dicts_are_deeply_equal(chosen, net1)
604
        full_args = dict(
605
                cidr='192.168.1.0/24',
606
                gateway='192.168.1.1',
607
                type='MAC_FILTERED',
608
                dhcp=True)
609
        try_args = dict(all=True)
610
        try_args.update(full_args)
611
        for param, val in try_args.items():
612
            print('\tdelete %s to avoid max net limit' % n1id)
613
            self._delete_network(n1id)
614
            kwargs = full_args if param == 'all' else {param: val}
615
            print('\twith %s=%s' % (param, val))
616
            self.network1 = self._create_network(self.netname1, **kwargs)
617
            n1id = self.network1['id']
618
            self._wait_for_network(n1id, 'ACTIVE')
619
            self.network1 = self.client.get_network_details(n1id)
620
            if param == 'all':
621
                for p, v in full_args.items():
622
                    self.assertEqual(self.network1[p], v)
623
            else:
624
                self.assertEqual(self.network1[param], val)
625

    
626
    def test_connect_server(self):
627
        """Test connect_server"""
628
        self.server1 = self._create_server(
629
            self.servname1,
630
            self.flavorid,
631
            self.img)
632
        self.network1 = self._create_network(self.netname1)
633
        self._wait_for_status(self.server1['id'], 'BUILD')
634
        self._wait_for_network(self.network1['id'], 'ACTIVE')
635
        self._test_0240_connect_server()
636

    
637
    def _test_0250_connect_server(self):
638
        self.client.connect_server(self.server1['id'], self.network1['id'])
639
        self.assertTrue(self._wait_for_nic(
640
            self.network1['id'],
641
            self.server1['id']))
642

    
643
    def test_disconnect_server(self):
644
        """Test disconnect_server"""
645
        self.test_connect_server()
646
        self._test_0250_disconnect_server()
647

    
648
    def _test_0250_disconnect_server(self):
649
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
650
        self.assertTrue(self._wait_for_nic(
651
            self.network1['id'],
652
            self.server1['id'],
653
            in_creation=False))
654

    
655
    def _test_0260_wait_for_second_network(self):
656
        self.network2 = self._create_network(self.netname2)
657
        self._wait_for_network(self.network2['id'], 'ACTIVE')
658

    
659
    def test_list_server_nics(self):
660
        """Test list_server_nics"""
661
        self.server1 = self._create_server(
662
            self.servname1,
663
            self.flavorid,
664
            self.img)
665
        self.network2 = self._create_network(self.netname2)
666
        self._wait_for_status(self.server1['id'], 'BUILD')
667
        self._wait_for_network(self.network2['id'], 'ACTIVE')
668
        self._test_0280_list_server_nics()
669

    
670
    def _test_0280_list_server_nics(self):
671
        r = self.client.list_server_nics(self.server1['id'])
672
        len0 = len(r)
673
        self.client.connect_server(self.server1['id'], self.network2['id'])
674
        self.assertTrue(self._wait_for_nic(
675
            self.network2['id'],
676
            self.server1['id']))
677
        r = self.client.list_server_nics(self.server1['id'])
678
        self.assertTrue(len(r) > len0)
679

    
680
    def test_list_networks(self):
681
        """Test list_network"""
682
        self.network1 = self._create_network(self.netname1)
683
        self._wait_for_network(self.network1['id'], 'ACTIVE')
684
        self._test_0290_list_networks()
685

    
686
    def _test_0290_list_networks(self):
687
        r = self.client.list_networks()
688
        self.assertTrue(len(r) > 1)
689
        ids = [net['id'] for net in r]
690
        names = [net['name'] for net in r]
691
        self.assertTrue('1' in ids)
692
        #self.assertTrue('public' in names)
693
        self.assertTrue(self.network1['id'] in ids)
694
        self.assertTrue(self.network1['name'] in names)
695

    
696
        r = self.client.list_networks(detail=True)
697
        ids = [net['id'] for net in r]
698
        names = [net['name'] for net in r]
699
        for net in r:
700
            self.assertTrue(net['id'] in ids)
701
            self.assertTrue(net['name'] in names)
702
            for term in ('status', 'updated', 'created'):
703
                self.assertTrue(term in net.keys())
704

    
705
    def test_list_network_nics(self):
706
        """Test list_server_nics"""
707
        self.server1 = self._create_server(
708
            self.servname1,
709
            self.flavorid,
710
            self.img)
711
        self.network1 = self._create_network(self.netname1)
712
        self.network2 = self._create_network(self.netname2)
713
        self._wait_for_status(self.server1['id'], 'BUILD')
714
        self._wait_for_network(self.network1['id'], 'ACTIVE')
715
        self._wait_for_network(self.network2['id'], 'ACTIVE')
716
        self.client.connect_server(self.server1['id'], self.network1['id'])
717
        self.client.connect_server(self.server1['id'], self.network2['id'])
718
        self._wait_for_nic(self.network1['id'], self.server1['id'])
719
        self._wait_for_nic(self.network2['id'], self.server1['id'])
720
        self._test_0293_list_network_nics()
721

    
722
    def _test_0293_list_network_nics(self):
723
        netid1 = self.network1['id']
724
        netid2 = self.network2['id']
725
        r = self.client.list_network_nics(netid1)
726
        expected = ['nic-%s-1' % self.server1['id']]
727
        self.assertEqual(r, expected)
728
        r = self.client.list_network_nics(netid2)
729
        expected = ['nic-%s-2' % self.server1['id']]
730
        self.assertEqual(r, expected)
731

    
732
    def test_get_network_details(self):
733
        """Test get_network_details"""
734
        self.network1 = self._create_network(self.netname1)
735
        self._test_0300_get_network_details()
736

    
737
    def _test_0300_get_network_details(self):
738
        r = self.client.get_network_details(self.network1['id'])
739
        net1 = dict(self.network1)
740
        net1.pop('status')
741
        net1.pop('updated', None)
742
        net1.pop('attachments')
743
        r.pop('status')
744
        r.pop('updated', None)
745
        r.pop('attachments')
746
        self.assert_dicts_are_deeply_equal(net1, r)
747

    
748
    def test_update_network_name(self):
749
        self.network2 = self._create_network(self.netname2)
750
        self._test_0310_update_network_name()
751

    
752
    def _test_0310_update_network_name(self):
753
        updated_name = self.netname2 + '_upd'
754
        self.client.update_network_name(self.network2['id'], updated_name)
755

    
756
        def netwait(wait):
757
            r = self.client.get_network_details(self.network2['id'])
758
            if r['name'] == updated_name:
759
                return
760
            time.sleep(wait)
761
        self.do_with_progress_bar(
762
            netwait,
763
            'Network %s name is changing:' % self.network2['id'],
764
            self._waits[:5])
765

    
766
        r = self.client.get_network_details(self.network2['id'])
767
        self.assertEqual(r['name'], updated_name)
768

    
769
    """ Don't have auth to test this
770
    def test_delete_image(self):
771
        ""Test delete_image""
772
        self._test_0330_delete_image()
773
    def _test_0330_delete_image(self):
774
        images = self.client.list_images()
775
        self.client.delete_image(images[2]['id'])
776
        try:
777
            r = self.client.get_image_details(images[2]['id'], success=(400))
778
        except ClientError as err:
779
            self.assertEqual(err.status, 404)
780

781
    def test_create_image_metadata(self):
782
        ""Test create_image_metadata""
783
        self._test_0340_create_image_metadata()
784
    def _test_0340_create_image_metadata(self):
785
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
786
        self.assertEqual(r['mykey'], 'myval')
787

788
    def test_update_image_metadata(self):
789
        ""Test update_image_metadata""
790
        self._test_0350_update_image_metadata()
791
    def _test_0350_update_image_metadata(self):
792
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
793
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
794
        self.assertEqual(r['mykey0'], 'myval0')
795

796
    def test_delete_image_metadata(self):
797
        ""Test delete_image_metadata""
798
        self._test_0360_delete_image_metadata()
799
    def _test_0360_delete_image_metadata(self):
800
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
801
        self.client.delete_image_metadata(self.img, 'mykey1')
802
        r = self.client.get_image_metadata(self.img)
803
        self.assertNotEqual('mykey1' in r)
804
    """