Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / cyclades.py @ 9ced0bd8

History | View | Annotate | Download (25.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
from mock import patch, Mock
34
from unittest import TestCase
35
from json import loads
36

    
37
from kamaki.clients import Client, ClientError
38
from kamaki.clients.cyclades import CycladesClient
39
from kamaki.clients.cyclades_rest_api import CycladesClientApi
40

    
41
img_ref = "1m4g3-r3f3r3nc3"
42
vm_name = "my new VM"
43
fid = 42
44
vm_send = dict(server=dict(
45
    flavorRef=fid,
46
    name=vm_name,
47
    imageRef=img_ref,
48
    metadata=dict(os="debian", users="root")))
49
vm_recv = dict(server=dict(
50
    status="BUILD",
51
    updated="2013-03-01T10:04:00.637152+00:00",
52
    hostId="",
53
    name=vm_name,
54
    imageRef=img_ref,
55
    created="2013-03-01T10:04:00.087324+00:00",
56
    flavorRef=fid,
57
    adminPass="n0n3sh@11p@55",
58
    suspended=False,
59
    progress=0,
60
    id=31173,
61
    metadata=dict(values=dict(os="debian", users="root"))))
62
img_recv = dict(image=dict(
63
    status="ACTIVE",
64
    updated="2013-02-26T11:10:14+00:00",
65
    name="Debian Base",
66
    created="2013-02-26T11:03:29+00:00",
67
    progress=100,
68
    id=img_ref,
69
    metadata=dict(values=dict(
70
        partition_table="msdos",
71
        kernel="2.6.32",
72
        osfamily="linux",
73
        users="root",
74
        gui="No GUI",
75
        sortorder="1",
76
        os="debian",
77
        root_partition="1",
78
        description="Debian 6.0.7 (Squeeze) Base System"))))
79
vm_list = dict(servers=dict(values=[
80
    dict(name='n1', id=1),
81
    dict(name='n2', id=2)]))
82
flavor_list = dict(flavors=dict(values=[
83
        dict(id=41, name="C1R1024D20"),
84
        dict(id=42, name="C1R1024D40"),
85
        dict(id=43, name="C1R1028D20")]))
86
img_list = dict(images=dict(values=[
87
    dict(name="maelstrom", id="0fb03e45-7d5a-4515-bd4e-e6bbf6457f06"),
88
    dict(name="edx_saas", id="1357163d-5fd8-488e-a117-48734c526206"),
89
    dict(name="Debian_Wheezy_Base", id="1f8454f0-8e3e-4b6c-ab8e-5236b728dffe"),
90
    dict(name="CentOS", id="21894b48-c805-4568-ac8b-7d4bb8eb533d"),
91
    dict(name="Ubuntu Desktop", id="37bc522c-c479-4085-bfb9-464f9b9e2e31"),
92
    dict(name="Ubuntu 12.10", id="3a24fef9-1a8c-47d1-8f11-e07bd5e544fd"),
93
    dict(name="Debian Base", id="40ace203-6254-4e17-a5cb-518d55418a7d"),
94
    dict(name="ubuntu_bundled", id="5336e265-5c7c-4127-95cb-2bf832a79903")]))
95
net_send = dict(network=dict(dhcp=False, name='someNet'))
96
net_recv = dict(network=dict(
97
    status="PENDING",
98
    updated="2013-03-05T15:04:51.758780+00:00",
99
    name="someNet",
100
    created="2013-03-05T15:04:51.758728+00:00",
101
    cidr6=None,
102
    id="2130",
103
    gateway6=None,
104
    public=False,
105
    dhcp=False,
106
    cidr="192.168.1.0/24",
107
    type="MAC_FILTERED",
108
    gateway=None,
109
    attachments=dict(values=[dict(name='att1'), dict(name='att2')])))
110

    
111

    
112
class Cyclades(TestCase):
113

    
114
    def assert_dicts_are_equal(self, d1, d2):
115
        for k, v in d1.items():
116
            self.assertTrue(k in d2)
117
            if isinstance(v, dict):
118
                self.assert_dicts_are_equal(v, d2[k])
119
            else:
120
                self.assertEqual(unicode(v), unicode(d2[k]))
121

    
122
    class FR(object):
123
        """FR stands for Fake Response"""
124
        json = vm_recv
125
        headers = {}
126
        content = json
127
        status = None
128
        status_code = 200
129

    
130
        def release(self):
131
            pass
132

    
133
    """Set up a Cyclades thorough test"""
134
    def setUp(self):
135
        self.url = 'http://cyclades.example.com'
136
        self.token = 'cyc14d3s70k3n'
137
        self.client = CycladesClient(self.url, self.token)
138
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
139
        self.C = KamakiHTTPConnection
140

    
141
    def tearDown(self):
142
        self.FR.status_code = 200
143
        self.FR.json = vm_recv
144

    
145
    def test_create_server(self):
146
        self.client.get_image_details = Mock(return_value=img_recv['image'])
147
        with patch.object(Client, 'request', side_effect=ClientError(
148
                'REQUEST ENTITY TOO LARGE',
149
                status=403)):
150
            self.assertRaises(
151
                ClientError,
152
                self.client.create_server,
153
                vm_name, fid, img_ref)
154

    
155
        with patch.object(
156
                self.C,
157
                'perform_request',
158
                return_value=self.FR()) as perform_req:
159
            self.assertRaises(
160
                ClientError,
161
                self.client.create_server,
162
                vm_name, fid, img_ref)
163
            self.FR.status_code = 202
164
            r = self.client.create_server(vm_name, fid, img_ref)
165
            self.assertEqual(self.client.http_client.url, self.url)
166
            self.assertEqual(self.client.http_client.path, '/servers')
167
            (method, data, a_headers, a_params) = perform_req.call_args[0]
168
            self.assert_dicts_are_equal(loads(data), vm_send)
169
            self.assert_dicts_are_equal(r, vm_recv['server'])
170
            prsn = 'Personality string (does not work with real servers)'
171
            self.client.create_server(vm_name, fid, img_ref, prsn)
172
            (method, data, a_headers, a_params) = perform_req.call_args[0]
173
            data = loads(data)
174
            self.assertTrue('personality' in data['server'])
175
            self.assertEqual(prsn, data['server']['personality'])
176

    
177
    def test_list_servers(self):
178
        self.FR.json = vm_list
179
        with patch.object(
180
                self.C,
181
                'perform_request',
182
                return_value=self.FR()) as perform_req:
183
            r = self.client.list_servers()
184
            self.assertEqual(self.client.http_client.url, self.url)
185
            self.assertEqual(self.client.http_client.path, '/servers')
186
            (method, data, a_headers, a_params) = perform_req.call_args[0]
187
            self.assert_dicts_are_equal(dict(values=r), vm_list['servers'])
188
            r = self.client.list_servers(detail=True)
189
            self.assertEqual(self.client.http_client.url, self.url)
190
            self.assertEqual(self.client.http_client.path, '/servers/detail')
191
        with patch.object(
192
                CycladesClientApi,
193
                'servers_get',
194
                return_value=self.FR()) as servers_get:
195
            self.client.list_servers(changes_since=True)
196
            self.assertTrue(servers_get.call_args[1]['changes_since'])
197

    
198
    def test_get_server_details(self):
199
        vm_id = vm_recv['server']['id']
200
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
201
            r = self.client.get_server_details(vm_id)
202
            self.assertEqual(self.client.http_client.url, self.url)
203
            self.assertEqual(
204
                self.client.http_client.path,
205
                '/servers/%s' % vm_id)
206
            self.assert_dicts_are_equal(r, vm_recv['server'])
207

    
208
    def test_update_server_name(self):
209
        vm_id = vm_recv['server']['id']
210
        new_name = vm_name + '_new'
211
        self.FR.status_code = 204
212
        with patch.object(
213
                self.C,
214
                'perform_request',
215
                return_value=self.FR()) as perform_req:
216
            self.client.update_server_name(vm_id, new_name)
217
            self.assertEqual(self.client.http_client.url, self.url)
218
            self.assertEqual(
219
                self.client.http_client.path,
220
                '/servers/%s' % vm_id)
221
            (method, data, a_headers, a_params) = perform_req.call_args[0]
222
            self.assert_dicts_are_equal(
223
                dict(server=dict(name=new_name)),
224
                loads(data))
225

    
226
    def test_reboot_server(self):
227
        vm_id = vm_recv['server']['id']
228
        self.FR.status_code = 202
229
        with patch.object(
230
                self.C,
231
                'perform_request',
232
                return_value=self.FR()) as perform_req:
233
            self.client.reboot_server(vm_id)
234
            self.assertEqual(self.client.http_client.url, self.url)
235
            self.assertEqual(
236
                self.client.http_client.path,
237
                '/servers/%s/action' % vm_id)
238
            (method, data, a_headers, a_params) = perform_req.call_args[0]
239
            self.assert_dicts_are_equal(
240
                dict(reboot=dict(type='SOFT')),
241
                loads(data))
242

    
243
    def test_create_server_metadata(self):
244
        vm_id = vm_recv['server']['id']
245
        metadata = dict(m1='v1', m2='v2', m3='v3')
246
        self.FR.json = dict(meta=vm_recv['server'])
247
        with patch.object(
248
                self.C,
249
                'perform_request',
250
                return_value=self.FR()) as perform_req:
251
            self.assertRaises(
252
                ClientError,
253
                self.client.create_server_metadata,
254
                vm_id, 'key', 'value')
255
            self.FR.status_code = 201
256
            for k, v in metadata.items():
257
                r = self.client.create_server_metadata(vm_id, k, v)
258
                self.assertEqual(self.client.http_client.url, self.url)
259
                self.assertEqual(
260
                    self.client.http_client.path,
261
                    '/servers/%s/meta/%s' % (vm_id, k))
262
                (method, data, a_headers, a_params) = perform_req.call_args[0]
263
                self.assertEqual(dict(meta={k: v}), loads(data))
264
                self.assert_dicts_are_equal(r, vm_recv['server'])
265

    
266
    def test_get_server_metadata(self):
267
        vm_id = vm_recv['server']['id']
268
        metadata = dict(m1='v1', m2='v2', m3='v3')
269
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
270
            self.FR.json = dict(metadata=dict(values=metadata))
271
            r = self.client.get_server_metadata(vm_id)
272
            self.assertEqual(self.client.http_client.url, self.url)
273
            self.assertEqual(
274
                self.client.http_client.path,
275
                '/servers/%s/meta' % vm_id)
276
            self.assert_dicts_are_equal(r, metadata)
277

    
278
            for k, v in metadata.items():
279
                self.FR.json = dict(meta={k: v})
280
                r = self.client.get_server_metadata(vm_id, k)
281
                self.assertEqual(self.client.http_client.url, self.url)
282
                self.assertEqual(
283
                    self.client.http_client.path,
284
                    '/servers/%s/meta/%s' % (vm_id, k))
285
                self.assert_dicts_are_equal(r, {k: v})
286

    
287
    def test_update_server_metadata(self):
288
        vm_id = vm_recv['server']['id']
289
        metadata = dict(m1='v1', m2='v2', m3='v3')
290
        self.FR.json = dict(metadata=metadata)
291
        with patch.object(
292
                CycladesClientApi,
293
                'servers_post',
294
                return_value=self.FR()) as servers_post:
295
            r = self.client.update_server_metadata(vm_id, **metadata)
296
            self.assert_dicts_are_equal(r, metadata)
297
            (called_id, cmd) = servers_post.call_args[0]
298
            self.assertEqual(called_id, vm_id)
299
            self.assertEqual(cmd, 'meta')
300
            data = servers_post.call_args[1]['json_data']
301
            self.assert_dicts_are_equal(data, dict(metadata=metadata))
302

    
303
    def test_delete_server_metadata(self):
304
        vm_id = vm_recv['server']['id']
305
        key = 'metakey'
306
        with patch.object(
307
                CycladesClientApi,
308
                'servers_delete',
309
                return_value=self.FR()) as servers_delete:
310
            self.client.delete_server_metadata(vm_id, key)
311
            self.assertEqual(
312
                (vm_id, 'meta/' + key),
313
                servers_delete.call_args[0])
314

    
315
    def test_list_flavors(self):
316
        self.FR.json = flavor_list
317
        with patch.object(
318
                self.C,
319
                'perform_request',
320
                return_value=self.FR()) as perform_req:
321
            r = self.client.list_flavors()
322
            self.assertEqual(self.client.http_client.url, self.url)
323
            self.assertEqual(self.client.http_client.path, '/flavors')
324
            (method, data, a_headers, a_params) = perform_req.call_args[0]
325
            self.assert_dicts_are_equal(dict(values=r), flavor_list['flavors'])
326
            r = self.client.list_flavors(detail=True)
327
            self.assertEqual(self.client.http_client.url, self.url)
328
            self.assertEqual(self.client.http_client.path, '/flavors/detail')
329

    
330
    def test_get_flavor_details(self):
331
        self.FR.json = dict(flavor=flavor_list['flavors'])
332
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
333
            r = self.client.get_flavor_details(fid)
334
            self.assertEqual(self.client.http_client.url, self.url)
335
            self.assertEqual(
336
                self.client.http_client.path,
337
                '/flavors/%s' % fid)
338
            self.assert_dicts_are_equal(r, flavor_list['flavors'])
339

    
340
    def test_list_images(self):
341
        self.FR.json = img_list
342
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
343
            r = self.client.list_images()
344
            self.assertEqual(self.client.http_client.url, self.url)
345
            self.assertEqual(self.client.http_client.path, '/images')
346
            expected = img_list['images']['values']
347
            for i in range(len(r)):
348
                self.assert_dicts_are_equal(expected[i], r[i])
349
            self.client.list_images(detail=True)
350
            self.assertEqual(self.client.http_client.url, self.url)
351
            self.assertEqual(self.client.http_client.path, '/images/detail')
352

    
353
    def test_get_image_details(self):
354
        self.FR.json = img_recv
355
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
356
            r = self.client.get_image_details(img_ref)
357
            self.assertEqual(self.client.http_client.url, self.url)
358
            self.assertEqual(
359
                self.client.http_client.path,
360
                '/images/%s' % img_ref)
361
            self.assert_dicts_are_equal(r, img_recv['image'])
362

    
363
    def test_get_image_metadata(self):
364
        self.FR.json = dict(metadata=dict(values=img_recv['image']))
365
        with patch.object(
366
                CycladesClient,
367
                'images_get',
368
                return_value=self.FR()) as inner:
369
            r = self.client.get_image_metadata(img_ref)
370
            self.assertEqual(inner.call_args[0], ('%s' % img_ref, '/meta'))
371
            self.assert_dicts_are_equal(img_recv['image'], r)
372
            self.FR.json = dict(meta=img_recv['image'])
373
            key = 'somekey'
374
            self.client.get_image_metadata(img_ref, key)
375
            self.assertEqual(
376
                inner.call_args[0],
377
                ('%s' % img_ref, '/meta/%s' % key))
378

    
379
    def test_shutdown_server(self):
380
        vm_id = vm_recv['server']['id']
381
        self.FR.status_code = 202
382
        with patch.object(
383
                self.C,
384
                'perform_request',
385
                return_value=self.FR()) as perform_req:
386
            self.client.shutdown_server(vm_id)
387
            self.assertEqual(self.client.http_client.url, self.url)
388
            self.assertEqual(
389
                self.client.http_client.path,
390
                '/servers/%s/action' % vm_id)
391
            self.assertEqual(
392
                perform_req.call_args[0],
393
                ('post',  '{"shutdown": {}}', {}, {}))
394

    
395
    def test_start_server(self):
396
        vm_id = vm_recv['server']['id']
397
        self.FR.status_code = 202
398
        with patch.object(
399
                self.C,
400
                'perform_request',
401
                return_value=self.FR()) as perform_req:
402
            self.client.start_server(vm_id)
403
            self.assertEqual(self.client.http_client.url, self.url)
404
            self.assertEqual(
405
                self.client.http_client.path,
406
                '/servers/%s/action' % vm_id)
407
            self.assertEqual(
408
                perform_req.call_args[0],
409
                ('post',  '{"start": {}}', {}, {}))
410

    
411
    def test_get_server_console(self):
412
        cnsl = dict(console=dict(info1='i1', info2='i2', info3='i3'))
413
        self.FR.json = cnsl
414
        vm_id = vm_recv['server']['id']
415
        with patch.object(
416
                self.C,
417
                'perform_request',
418
                return_value=self.FR()) as perform_req:
419
            r = self.client.get_server_console(vm_id)
420
            self.assertEqual(self.client.http_client.url, self.url)
421
            self.assertEqual(
422
                self.client.http_client.path,
423
                '/servers/%s/action' % vm_id)
424
            self.assert_dicts_are_equal(cnsl['console'], r)
425
            self.assertEqual(
426
                perform_req.call_args[0],
427
                ('post',  '{"console": {"type": "vnc"}}', {}, {}))
428

    
429
    def test_get_firewall_profile(self):
430
        vm_id = vm_recv['server']['id']
431
        v = 'Some profile'
432
        ret = {'attachments': {'values': [{'firewallProfile': v, 1:1}]}}
433
        with patch.object(
434
                CycladesClient,
435
                'get_server_details',
436
                return_value=ret) as gsd:
437
            r = self.client.get_firewall_profile(vm_id)
438
            self.assertEqual(r, v)
439
            self.assertEqual(gsd.call_args[0], (vm_id,))
440
            ret['attachments']['values'][0].pop('firewallProfile')
441
            self.assertRaises(
442
                ClientError, self.client.get_firewall_profile,
443
                vm_id)
444

    
445
    def test_set_firewall_profile(self):
446
        vm_id = vm_recv['server']['id']
447
        v = 'Some profile'
448
        self.FR.status_code = 202
449
        with patch.object(
450
                self.C,
451
                'perform_request',
452
                return_value=self.FR()) as perform_req:
453
            self.client.set_firewall_profile(vm_id, v)
454
            self.assertEqual(self.client.http_client.url, self.url)
455
            self.assertEqual(
456
                self.client.http_client.path,
457
                '/servers/%s/action' % vm_id)
458
            self.assertEqual(perform_req.call_args[0], (
459
                'post',
460
                '{"firewallProfile": {"profile": "%s"}}' % v,
461
                {},
462
                {}))
463

    
464
    def test_get_server_stats(self):
465
        vm_id = vm_recv['server']['id']
466
        stats = dict(stat1='v1', stat2='v2', stat3='v3', stat4='v4')
467
        self.FR.json = dict(stats=stats)
468
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
469
            r = self.client.get_server_stats(vm_id)
470
            self.assertEqual(self.client.http_client.url, self.url)
471
            self.assertEqual(
472
                self.client.http_client.path,
473
                '/servers/%s/stats' % vm_id)
474
            self.assert_dicts_are_equal(stats, r)
475

    
476
    def test_create_network(self):
477
        net_name = net_send['network']['name']
478
        self.FR.json = net_recv
479
        self.FR.status_code = 202
480
        with patch.object(
481
                self.C,
482
                'perform_request',
483
                return_value=self.FR()) as perform_req:
484
            full_args = dict(
485
                    cidr='192.168.0.0/24',
486
                    gateway='192.168.0.1',
487
                    type='MAC_FILTERED',
488
                    dhcp=True)
489
            test_args = dict(full_args)
490
            test_args.update(dict(empty=None, full=None))
491
            for arg, val in test_args.items():
492
                kwargs = {} if arg == 'empty' else full_args if (
493
                    arg == 'full') else {arg: val}
494
                r = self.client.create_network(net_name, **kwargs)
495
                self.assertEqual(self.client.http_client.url, self.url)
496
                self.assertEqual(
497
                    self.client.http_client.path,
498
                    '/networks')
499
                self.assert_dicts_are_equal(r, net_recv['network'])
500
                data = perform_req.call_args[0][1]
501
                expected = dict(network=dict(net_send['network']))
502
                expected['network'].update(kwargs)
503
                self.assert_dicts_are_equal(loads(data), expected)
504

    
505
    def test_connect_server(self):
506
        vm_id = vm_recv['server']['id']
507
        net_id = net_recv['network']['id']
508
        self.FR.status_code = 202
509
        with patch.object(
510
            self.C,
511
            'perform_request',
512
            return_value=self.FR()) as perform_req:
513
            self.client.connect_server(vm_id, net_id)
514
            self.assertEqual(self.client.http_client.url, self.url)
515
            self.assertEqual(
516
                self.client.http_client.path,
517
                '/networks/%s/action' % net_id)
518
            self.assertEqual(
519
                perform_req.call_args[0],
520
                ('post', '{"add": {"serverRef": %s}}' % vm_id, {}, {}))
521

    
522
    def test_disconnect_server(self):
523
        vm_id = vm_recv['server']['id']
524
        net_id = net_recv['network']['id']
525
        nic_id = 'nic-%s-%s' % (net_id, vm_id)
526
        vm_nics = [
527
            dict(id=nic_id, network_id=net_id),
528
            dict(id='another-nic-id', network_id='another-net-id'),
529
            dict(id=nic_id * 2, network_id=net_id * 2)]
530
        with patch.object(
531
                CycladesClient,
532
                'list_server_nics',
533
                return_value=vm_nics) as lsn:
534
            with patch.object(
535
                    CycladesClient,
536
                    'networks_post',
537
                    return_value=self.FR()) as np:
538
                r = self.client.disconnect_server(vm_id, nic_id)
539
                self.assertEqual(r, 1)
540
                self.assertEqual(lsn.call_args[0], (vm_id,))
541
                self.assertEqual(np.call_args[0], (net_id, 'action'))
542
                self.assertEqual(np.call_args[1], dict(json_data=dict(
543
                    remove=dict(attachment=nic_id))))
544

    
545
    """
546
    def _test_0280_list_server_nics(self):
547
        r = self.client.list_server_nics(self.server1['id'])
548
        len0 = len(r)
549
        self.client.connect_server(self.server1['id'], self.network2['id'])
550
        self.assertTrue(self._wait_for_nic(
551
            self.network2['id'],
552
            self.server1['id']))
553
        r = self.client.list_server_nics(self.server1['id'])
554
        self.assertTrue(len(r) > len0)
555

556
    def test_list_networks(self):
557
        r = self.client.list_networks()
558
        self.assertTrue(len(r) > 1)
559
        ids = [net['id'] for net in r]
560
        names = [net['name'] for net in r]
561
        self.assertTrue('1' in ids)
562
        #self.assertTrue('public' in names)
563
        self.assertTrue(self.network1['id'] in ids)
564
        self.assertTrue(self.network1['name'] in names)
565

566
        r = self.client.list_networks(detail=True)
567
        ids = [net['id'] for net in r]
568
        names = [net['name'] for net in r]
569
        for net in r:
570
            self.assertTrue(net['id'] in ids)
571
            self.assertTrue(net['name'] in names)
572
            for term in ('status', 'updated', 'created'):
573
                self.assertTrue(term in net.keys())
574

575
    def test_get_network_details(self):
576
        r = self.client.get_network_details(self.network1['id'])
577
        net1 = dict(self.network1)
578
        net1.pop('status')
579
        net1.pop('updated', None)
580
        net1.pop('attachments')
581
        r.pop('status')
582
        r.pop('updated', None)
583
        r.pop('attachments')
584
        self.assert_dicts_are_equal(net1, r)
585

586
    def test_update_network_name(self):
587
        updated_name = self.netname2 + '_upd'
588
        self.client.update_network_name(self.network2['id'], updated_name)
589

590
        def netwait(wait):
591
            r = self.client.get_network_details(self.network2['id'])
592
            if r['name'] == updated_name:
593
                return
594
            time.sleep(wait)
595
        self.do_with_progress_bar(
596
            netwait,
597
            'Network %s name is changing:' % self.network2['id'],
598
            self._waits[:5])
599

600
        r = self.client.get_network_details(self.network2['id'])
601
        self.assertEqual(r['name'], updated_name)
602

603
    def test_delete_image(self):
604
        images = self.client.list_images()
605
        self.client.delete_image(images[2]['id'])
606
        try:
607
            r = self.client.get_image_details(images[2]['id'], success=(400))
608
        except ClientError as err:
609
            self.assertEqual(err.status, 404)
610

611
    def test_create_image_metadata(self):
612
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
613
        self.assertEqual(r['mykey'], 'myval')
614

615
    def test_update_image_metadata(self):
616
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
617
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
618
        self.assertEqual(r['mykey0'], 'myval0')
619

620
    def test_delete_image_metadata(self):
621
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
622
        self.client.delete_image_metadata(self.img, 'mykey1')
623
        r = self.client.get_image_metadata(self.img)
624
        self.assertNotEqual('mykey1' in r)
625
    """