Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / cyclades.py @ 8a8faf8c

History | View | Annotate | Download (29.5 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)
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 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(servid, status, wait_cb=wait_cb)
170
        self._safe_progress_bar_finish(wait_bar)
171

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

    
226
    def test_create_server(self):
227
        """Test create_server"""
228
        self.server1 = self._create_server(
229
            self.servname1,
230
            self.flavorid,
231
            self.img)
232
        self._wait_for_status(self.server1['id'], 'BUILD')
233
        self._test_0010_create_server()
234

    
235
    def _test_0010_create_server(self):
236
        self.assertEqual(self.server1["name"], self.servname1)
237
        self.assertEqual(self.server1["flavor"]["id"], self.flavorid)
238
        self.assertEqual(self.server1["image"]["id"], self.img)
239
        self.assertEqual(self.server1["status"], "BUILD")
240

    
241
    def test_list_servers(self):
242
        """Test list servers"""
243
        self.server1 = self._create_server(
244
            self.servname1,
245
            self.flavorid,
246
            self.img)
247
        self.server2 = self._create_server(
248
            self.servname2,
249
            self.flavorid,
250
            self.img)
251
        self._test_0020_list_servers()
252

    
253
    def _test_0020_list_servers(self):
254
        servers = self.client.list_servers()
255
        dservers = self.client.list_servers(detail=True)
256

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

    
271
        """detailed and simple contain same names"""
272
        names = sorted(map(lambda x: x["name"], servers))
273
        dnames = sorted(map(lambda x: x["name"], dservers))
274
        self.assertEqual(names, dnames)
275

    
276
    def _test_0030_wait_test_servers_to_build(self):
277
        """Pseudo-test to wait for VMs to load"""
278
        print('')
279
        self._wait_for_status(self.server1['id'], 'BUILD')
280
        self._wait_for_status(self.server2['id'], 'BUILD')
281

    
282
    def test_get_server_details(self):
283
        """Test get_server_details"""
284
        self.server1 = self._create_server(
285
            self.servname1,
286
            self.flavorid,
287
            self.img)
288
        self._wait_for_status(self.server1['id'], 'BUILD')
289
        self._test_0040_get_server_details()
290

    
291
    def _test_0040_get_server_details(self):
292
        r = self.client.get_server_details(self.server1['id'])
293
        self.assertEqual(r["name"], self.servname1)
294
        self.assertEqual(r["flavor"]["id"], self.flavorid)
295
        self.assertEqual(r["image"]["id"], self.img)
296
        self.assertEqual(r["status"], "ACTIVE")
297

    
298
    def test_update_server_name(self):
299
        """Test update_server_name"""
300
        self.server1 = self._create_server(
301
            self.servname1,
302
            self.flavorid,
303
            self.img)
304
        self._test_0050_update_server_name()
305

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

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

    
333
    def _test_0060_reboot_server(self):
334
        self.client.reboot_server(self.server1['id'])
335
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
336
        self.client.reboot_server(self.server2['id'], hard=True)
337
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
338

    
339
    def test_resize_server(self):
340
        """Modify the flavor of a server"""
341
        self.server1 = self._create_server(
342
            self.servname1, self.flavorid, self.img)
343
        self._test_0065_resize_server()
344
        self.delete_server(self.server1['id'])
345
        self.server1 = self._create_server(
346
            self.servname1, self.flavorid, self.img)
347

    
348
    def test_0065_resize_server(self):
349
        self.client.resize_server(self.servname1, self.flavorid + 1, self.img)
350
        srv = self.client.get_flavor_details(self.server1['id'])
351
        self.assertEqual(srv['flavor']['id'], self.flavorid + 1)
352

    
353
    def _test_0070_wait_test_servers_to_reboot(self):
354
        """Pseudo-test to wait for VMs to load"""
355
        print('')
356
        self._wait_for_status(self.server1['id'], 'REBOOT')
357
        self._wait_for_status(self.server2['id'], 'REBOOT')
358

    
359
    def test_create_server_metadata(self):
360
        """Test create_server_metadata"""
361
        self.server1 = self._create_server(
362
            self.servname1,
363
            self.flavorid,
364
            self.img)
365
        self._test_0080_create_server_metadata()
366

    
367
    def _test_0080_create_server_metadata(self):
368
        r1 = self.client.create_server_metadata(
369
            self.server1['id'],
370
            'mymeta',
371
            'mymeta val')
372
        self.assertTrue('mymeta' in r1)
373
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
374
        self.assert_dicts_are_equal(r1, r2)
375

    
376
    def test_get_server_metadata(self):
377
        """Test get server_metadata"""
378
        self.server1 = self._create_server(
379
            self.servname1,
380
            self.flavorid,
381
            self.img)
382
        self._test_0090_get_server_metadata()
383

    
384
    def _test_0090_get_server_metadata(self):
385
        self.client.update_server_metadata(
386
            self.server1['id'], mymeta_0='val_0')
387
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
388
        self.assertEqual(r['mymeta_0'], 'val_0')
389

    
390
    def test_update_server_metadata(self):
391
        """Test update_server_metadata"""
392
        self.server1 = self._create_server(
393
            self.servname1,
394
            self.flavorid,
395
            self.img)
396
        self._test_0100_update_server_metadata()
397

    
398
    def _test_0100_update_server_metadata(self):
399
        r1 = self.client.update_server_metadata(
400
            self.server1['id'], mymeta3='val2')
401
        self.assertTrue('mymeta3'in r1)
402
        r2 = self.client.update_server_metadata(
403
            self.server1['id'], mymeta3='val3')
404
        self.assertTrue(r2['mymeta3'], 'val3')
405

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
543
    def _test_0210_set_firewall_profile(self):
544

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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