Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests / cyclades.py @ 2005b18e

History | View | Annotate | Download (26.6 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 tests, ClientError
37
from kamaki.clients.cyclades import CycladesClient
38

    
39

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

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

    
62
        self.client = CycladesClient(self['compute', 'url'], self['token'])
63

    
64
    def tearDown(self):
65
        """Destoy servers used in testing"""
66
        for net in self.networks.keys():
67
            self._delete_network(net)
68
        for server in self.servers.values():
69
            self._delete_server(server['id'])
70
            print('DEL VM %s (%s)' % (server['id'], server['name']))
71

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

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

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

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

    
111
    def _delete_network(self, netid):
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

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

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

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

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

    
160
    def _has_status(self, servid, status):
161
        r = self.client.get_server_details(servid)
162
        return r['status'] == status
163

    
164
    def _wait_for_status(self, servid, status):
165
        (wait_bar, wait_cb) = self._safe_progress_bar(
166
            'Server %s in %s' % (servid, status))
167
        self.client.wait_server(servid, status, wait_cb=wait_cb)
168
        self._safe_progress_bar_finish(wait_bar)
169

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

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

    
233
    def _test_0010_create_server(self):
234
        self.assertEqual(self.server1["name"], self.servname1)
235
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
236
        self.assertEqual(self.server1["imageRef"], self.img)
237
        self.assertEqual(self.server1["status"], "BUILD")
238

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

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

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

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

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

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

    
289
    def _test_0040_get_server_details(self):
290
        r = self.client.get_server_details(self.server1['id'])
291
        self.assertEqual(r["name"], self.servname1)
292
        self.assertEqual(r["flavorRef"], self.flavorid)
293
        self.assertEqual(r["imageRef"], self.img)
294
        self.assertEqual(r["status"], "ACTIVE")
295

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

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

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

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

    
337
    def _test_0070_wait_test_servers_to_reboot(self):
338
        """Pseudo-test to wait for VMs to load"""
339
        print('')
340
        self._wait_for_status(self.server1['id'], 'REBOOT')
341
        self._wait_for_status(self.server2['id'], 'REBOOT')
342

    
343
    def test_create_server_metadata(self):
344
        """Test create_server_metadata"""
345
        self.server1 = self._create_server(
346
            self.servname1,
347
            self.flavorid,
348
            self.img)
349
        self._test_0080_create_server_metadata()
350

    
351
    def _test_0080_create_server_metadata(self):
352
        r1 = self.client.create_server_metadata(
353
            self.server1['id'],
354
            'mymeta',
355
            'mymeta val')
356
        self.assertTrue('mymeta' in r1)
357
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
358
        self.assert_dicts_are_deeply_equal(r1, r2)
359

    
360
    def test_get_server_metadata(self):
361
        """Test get server_metadata"""
362
        self.server1 = self._create_server(
363
            self.servname1,
364
            self.flavorid,
365
            self.img)
366
        self._test_0090_get_server_metadata()
367

    
368
    def _test_0090_get_server_metadata(self):
369
        self.client.create_server_metadata(
370
            self.server1['id'],
371
            'mymeta_0',
372
            'val_0')
373
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
374
        self.assertEqual(r['mymeta_0'], 'val_0')
375

    
376
    def test_update_server_metadata(self):
377
        """Test update_server_metadata"""
378
        self.server1 = self._create_server(
379
            self.servname1,
380
            self.flavorid,
381
            self.img)
382
        self._test_0100_update_server_metadata()
383

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

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

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

    
416
    def test_list_flavors(self):
417
        """Test flavors_get"""
418
        self._test_0120_list_flavors()
419

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

    
426
    def test_get_flavor_details(self):
427
        """Test test_get_flavor_details"""
428
        self._test_0130_get_flavor_details()
429

    
430
    def _test_0130_get_flavor_details(self):
431
        r = self.client.get_flavor_details(self.flavorid)
432
        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
433

    
434
    def test_list_images(self):
435
        """Test list_images"""
436
        self._test_0140_list_images()
437

    
438
    def _test_0140_list_images(self):
439
        r = self.client.list_images()
440
        self.assertTrue(len(r) > 1)
441
        r = self.client.list_images(detail=True)
442
        for detailed_img in r:
443
            if detailed_img['id'] == self.img:
444
                break
445
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
446

    
447
    def test_get_image_details(self):
448
        """Test image_details"""
449
        self._test_0150_get_image_details()
450

    
451
    def _test_0150_get_image_details(self):
452
        r = self.client.get_image_details(self.img)
453
        r.pop('updated')
454
        self.assert_dicts_are_deeply_equal(r, self.img_details)
455

    
456
    def test_get_image_metadata(self):
457
        """Test get_image_metadata"""
458
        self._test_0160_get_image_metadata()
459

    
460
    def _test_0160_get_image_metadata(self):
461
        r = self.client.get_image_metadata(self.img)
462
        self.assert_dicts_are_deeply_equal(
463
            self.img_details['metadata']['values'], r)
464
        for key, val in self.img_details['metadata']['values'].items():
465
            r = self.client.get_image_metadata(self.img, key)
466
            self.assertEqual(r[key], val)
467

    
468
    def test_shutdown_server(self):
469
        """Test shutdown_server"""
470
        self.server1 = self._create_server(
471
            self.servname1,
472
            self.flavorid,
473
            self.img)
474
        self._wait_for_status(self.server1['id'], 'BUILD')
475
        self._test_0170_shutdown_server()
476

    
477
    def _test_0170_shutdown_server(self):
478
        self.client.shutdown_server(self.server1['id'])
479
        self._wait_for_status(self.server1['id'], 'ACTIVE')
480
        r = self.client.get_server_details(self.server1['id'])
481
        self.assertEqual(r['status'], 'STOPPED')
482

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

    
494
    def _test_0180_start_server(self):
495
        self.client.start_server(self.server1['id'])
496
        self._wait_for_status(self.server1['id'], 'STOPPED')
497
        r = self.client.get_server_details(self.server1['id'])
498
        self.assertEqual(r['status'], 'ACTIVE')
499

    
500
    def test_get_server_console(self):
501
        """Test get_server_console"""
502
        self.server2 = self._create_server(
503
            self.servname2,
504
            self.flavorid + 2,
505
            self.img)
506
        self._wait_for_status(self.server2['id'], 'BUILD')
507
        self._test_0190_get_server_console()
508

    
509
    def _test_0190_get_server_console(self):
510
        r = self.client.get_server_console(self.server2['id'])
511
        self.assertTrue('host' in r)
512
        self.assertTrue('password' in r)
513
        self.assertTrue('port' in r)
514
        self.assertTrue('type' in r)
515

    
516
    def test_get_firewall_profile(self):
517
        """Test get_firewall_profile"""
518
        self.server1 = self._create_server(
519
            self.servname1,
520
            self.flavorid,
521
            self.img)
522
        self._test_0200_get_firewall_profile()
523

    
524
    def _test_0200_get_firewall_profile(self):
525
        self._wait_for_status(self.server1['id'], 'BUILD')
526
        fprofile = self.client.get_firewall_profile(self.server1['id'])
527
        self.assertTrue(fprofile in self.PROFILES)
528

    
529
    def test_set_firewall_profile(self):
530
        """Test set_firewall_profile"""
531
        self.server1 = self._create_server(
532
            self.servname1,
533
            self.flavorid,
534
            self.img)
535
        self._test_0210_set_firewall_profile()
536

    
537
    def _test_0210_set_firewall_profile(self):
538

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

    
568
    def test_get_server_stats(self):
569
        self.server1 = self._create_server(
570
            self.servname1,
571
            self.flavorid,
572
            self.img)
573
        self._test_0220_get_server_stats()
574

    
575
    def _test_0220_get_server_stats(self):
576
        r = self.client.get_server_stats(self.server1['id'])
577
        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
578
        for term in it:
579
            self.assertTrue(term in r)
580

    
581
    def test_create_network(self):
582
        """Test create_network"""
583
        self._test_0230_create_network()
584

    
585
    def _test_0230_create_network(self):
586
        self.network1 = self._create_network(self.netname1)
587
        self._wait_for_network(self.network1['id'], 'ACTIVE')
588
        self.network1 = self.client.get_network_details(self.network1['id'])
589
        nets = self.client.list_networks(self.network1['id'])
590
        chosen = [net for net in nets if net['id'] == self.network1['id']][0]
591
        chosen.pop('updated')
592
        net1 = dict(self.network1)
593
        net1.pop('updated')
594
        self.assert_dicts_are_deeply_equal(chosen, net1)
595

    
596
    def test_connect_server(self):
597
        """Test connect_server"""
598
        self.server1 = self._create_server(
599
            self.servname1,
600
            self.flavorid,
601
            self.img)
602
        self.network1 = self._create_network(self.netname1)
603
        self._wait_for_status(self.server1['id'], 'BUILD')
604
        self._wait_for_network(self.network1['id'], 'ACTIVE')
605
        self._test_0240_connect_server()
606

    
607
    def _test_0250_connect_server(self):
608
        self.client.connect_server(self.server1['id'], self.network1['id'])
609
        self.assertTrue(self._wait_for_nic(
610
            self.network1['id'],
611
            self.server1['id']))
612

    
613
    def test_disconnect_server(self):
614
        """Test disconnect_server"""
615
        self.test_connect_server()
616
        self._test_0250_disconnect_server()
617

    
618
    def _test_0250_disconnect_server(self):
619
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
620
        self.assertTrue(self._wait_for_nic(
621
            self.network1['id'],
622
            self.server1['id'],
623
            in_creation=False))
624

    
625
    def _test_0260_wait_for_second_network(self):
626
        self.network2 = self._create_network(self.netname2)
627
        self._wait_for_network(self.network2['id'], 'ACTIVE')
628

    
629
    def test_list_server_nics(self):
630
        """Test list_server_nics"""
631
        self.server1 = self._create_server(
632
            self.servname1,
633
            self.flavorid,
634
            self.img)
635
        self.network2 = self._create_network(self.netname2)
636
        self._wait_for_status(self.server1['id'], 'BUILD')
637
        self._wait_for_network(self.network2['id'], 'ACTIVE')
638
        self._test_0280_list_server_nics()
639

    
640
    def _test_0280_list_server_nics(self):
641
        r = self.client.list_server_nics(self.server1['id'])
642
        len0 = len(r)
643
        self.client.connect_server(self.server1['id'], self.network2['id'])
644
        self.assertTrue(self._wait_for_nic(
645
            self.network2['id'],
646
            self.server1['id']))
647
        r = self.client.list_server_nics(self.server1['id'])
648
        self.assertTrue(len(r) > len0)
649

    
650
    def test_list_networks(self):
651
        """Test list_network"""
652
        self.network1 = self._create_network(self.netname1)
653
        self._wait_for_network(self.network1['id'], 'ACTIVE')
654
        self._test_0290_list_networks()
655

    
656
    def _test_0290_list_networks(self):
657
        r = self.client.list_networks()
658
        self.assertTrue(len(r) > 1)
659
        ids = [net['id'] for net in r]
660
        names = [net['name'] for net in r]
661
        self.assertTrue('1' in ids)
662
        #self.assertTrue('public' in names)
663
        self.assertTrue(self.network1['id'] in ids)
664
        self.assertTrue(self.network1['name'] in names)
665

    
666
        r = self.client.list_networks(detail=True)
667
        ids = [net['id'] for net in r]
668
        names = [net['name'] for net in r]
669
        for net in r:
670
            self.assertTrue(net['id'] in ids)
671
            self.assertTrue(net['name'] in names)
672
            for term in ('status', 'updated', 'created'):
673
                self.assertTrue(term in net.keys())
674

    
675
    def test_get_network_details(self):
676
        """Test get_network_details"""
677
        self.network1 = self._create_network(self.netname1)
678
        self._test_0300_get_network_details()
679

    
680
    def _test_0300_get_network_details(self):
681
        r = self.client.get_network_details(self.network1['id'])
682
        net1 = dict(self.network1)
683
        net1.pop('status')
684
        net1.pop('updated', None)
685
        net1.pop('attachments')
686
        r.pop('status')
687
        r.pop('updated', None)
688
        r.pop('attachments')
689
        self.assert_dicts_are_deeply_equal(net1, r)
690

    
691
    def test_update_network_name(self):
692
        self.network2 = self._create_network(self.netname2)
693
        self._test_0310_update_network_name()
694

    
695
    def _test_0310_update_network_name(self):
696
        updated_name = self.netname2 + '_upd'
697
        self.client.update_network_name(self.network2['id'], updated_name)
698

    
699
        def netwait(wait):
700
            r = self.client.get_network_details(self.network2['id'])
701
            if r['name'] == updated_name:
702
                return
703
            time.sleep(wait)
704
        self.do_with_progress_bar(
705
            netwait,
706
            'Network %s name is changing:' % self.network2['id'],
707
            self._waits[:5])
708

    
709
        r = self.client.get_network_details(self.network2['id'])
710
        self.assertEqual(r['name'], updated_name)
711

    
712
    """ Don't have auth to test this
713
    def test_delete_image(self):
714
        ""Test delete_image""
715
        self._test_0330_delete_image()
716
    def _test_0330_delete_image(self):
717
        images = self.client.list_images()
718
        self.client.delete_image(images[2]['id'])
719
        try:
720
            r = self.client.get_image_details(images[2]['id'], success=(400))
721
        except ClientError as err:
722
            self.assertEqual(err.status, 404)
723

724
    def test_create_image_metadata(self):
725
        ""Test create_image_metadata""
726
        self._test_0340_create_image_metadata()
727
    def _test_0340_create_image_metadata(self):
728
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
729
        self.assertEqual(r['mykey'], 'myval')
730

731
    def test_update_image_metadata(self):
732
        ""Test update_image_metadata""
733
        self._test_0350_update_image_metadata()
734
    def _test_0350_update_image_metadata(self):
735
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
736
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
737
        self.assertEqual(r['mykey0'], 'myval0')
738

739
    def test_delete_image_metadata(self):
740
        ""Test delete_image_metadata""
741
        self._test_0360_delete_image_metadata()
742
    def _test_0360_delete_image_metadata(self):
743
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
744
        self.client.delete_image_metadata(self.img, 'mykey1')
745
        r = self.client.get_image_metadata(self.img)
746
        self.assertNotEqual('mykey1' in r)
747
    """