Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / cyclades.py @ e6ec9ea6

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

    
506
    """
507
    def test_connect_server(self):
508
        self.client.connect_server(self.server1['id'], self.network1['id'])
509
        self.assertTrue(self._wait_for_nic(
510
            self.network1['id'],
511
            self.server1['id']))
512

513
    def test_disconnect_server(self):
514
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
515
        self.assertTrue(self._wait_for_nic(
516
            self.network1['id'],
517
            self.server1['id'],
518
            in_creation=False))
519

520
    def _test_0260_wait_for_second_network(self):
521
        self.server1 = self._create_server(
522
            self.servname1,
523
            self.flavorid,
524
            self.img)
525
        self.network2 = self._create_network(self.netname2)
526
        self._wait_for_status(self.server1['id'], 'BUILD')
527
        self._wait_for_network(self.network2['id'], 'ACTIVE')
528
        self._test_0280_list_server_nics()
529

530
    def _test_0280_list_server_nics(self):
531
        r = self.client.list_server_nics(self.server1['id'])
532
        len0 = len(r)
533
        self.client.connect_server(self.server1['id'], self.network2['id'])
534
        self.assertTrue(self._wait_for_nic(
535
            self.network2['id'],
536
            self.server1['id']))
537
        r = self.client.list_server_nics(self.server1['id'])
538
        self.assertTrue(len(r) > len0)
539

540
    def test_list_networks(self):
541
        r = self.client.list_networks()
542
        self.assertTrue(len(r) > 1)
543
        ids = [net['id'] for net in r]
544
        names = [net['name'] for net in r]
545
        self.assertTrue('1' in ids)
546
        #self.assertTrue('public' in names)
547
        self.assertTrue(self.network1['id'] in ids)
548
        self.assertTrue(self.network1['name'] in names)
549

550
        r = self.client.list_networks(detail=True)
551
        ids = [net['id'] for net in r]
552
        names = [net['name'] for net in r]
553
        for net in r:
554
            self.assertTrue(net['id'] in ids)
555
            self.assertTrue(net['name'] in names)
556
            for term in ('status', 'updated', 'created'):
557
                self.assertTrue(term in net.keys())
558

559
    def test_get_network_details(self):
560
        r = self.client.get_network_details(self.network1['id'])
561
        net1 = dict(self.network1)
562
        net1.pop('status')
563
        net1.pop('updated', None)
564
        net1.pop('attachments')
565
        r.pop('status')
566
        r.pop('updated', None)
567
        r.pop('attachments')
568
        self.assert_dicts_are_equal(net1, r)
569

570
    def test_update_network_name(self):
571
        updated_name = self.netname2 + '_upd'
572
        self.client.update_network_name(self.network2['id'], updated_name)
573

574
        def netwait(wait):
575
            r = self.client.get_network_details(self.network2['id'])
576
            if r['name'] == updated_name:
577
                return
578
            time.sleep(wait)
579
        self.do_with_progress_bar(
580
            netwait,
581
            'Network %s name is changing:' % self.network2['id'],
582
            self._waits[:5])
583

584
        r = self.client.get_network_details(self.network2['id'])
585
        self.assertEqual(r['name'], updated_name)
586

587
    def test_delete_image(self):
588
        images = self.client.list_images()
589
        self.client.delete_image(images[2]['id'])
590
        try:
591
            r = self.client.get_image_details(images[2]['id'], success=(400))
592
        except ClientError as err:
593
            self.assertEqual(err.status, 404)
594

595
    def test_create_image_metadata(self):
596
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
597
        self.assertEqual(r['mykey'], 'myval')
598

599
    def test_update_image_metadata(self):
600
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
601
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
602
        self.assertEqual(r['mykey0'], 'myval0')
603

604
    def test_delete_image_metadata(self):
605
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
606
        self.client.delete_image_metadata(self.img, 'mykey1')
607
        r = self.client.get_image_metadata(self.img)
608
        self.assertNotEqual('mykey1' in r)
609
    """