Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / test.py @ 03033b54

History | View | Annotate | Download (22.2 kB)

1
# Copyright 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
from mock import patch, call
35
from unittest import TestCase
36
from itertools import product
37
from json import dumps
38

    
39
from kamaki.clients import ClientError, compute
40

    
41

    
42
rest_pkg = 'kamaki.clients.compute.rest_api.ComputeRestClient'
43
compute_pkg = 'kamaki.clients.compute.ComputeClient'
44

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

    
100

    
101
class FR(object):
102
    """FR stands for Fake Response"""
103
    json = vm_recv
104
    headers = {}
105
    content = json
106
    status = None
107
    status_code = 200
108

    
109

    
110
class ComputeRestClient(TestCase):
111

    
112
    """Set up a ComputesRest thorough test"""
113
    def setUp(self):
114
        self.url = 'http://cyclades.example.com'
115
        self.token = 'cyc14d3s70k3n'
116
        self.client = compute.ComputeRestClient(self.url, self.token)
117

    
118
    def tearDown(self):
119
        FR.json = vm_recv
120

    
121
    @patch('%s.get' % rest_pkg, return_value=FR())
122
    def _test_get(self, service, get):
123
        for args in product(
124
                ('', '%s_id' % service),
125
                ('', 'cmd'),
126
                (200, 204),
127
                ({}, {'k': 'v'})):
128
            (srv_id, command, success, kwargs) = args
129
            method = getattr(self.client, '%s_get' % service)
130
            method(*args[:3], **kwargs)
131
            srv_str = '/%s' % srv_id if srv_id else ''
132
            cmd_str = '/%s' % command if command else ''
133
            self.assertEqual(get.mock_calls[-1], call(
134
                '/%s%s%s' % (service, srv_str, cmd_str),
135
                success=success,
136
                **kwargs))
137

    
138
    def test_servers_get(self):
139
        self._test_get('servers')
140

    
141
    def test_flavors_get(self):
142
        self._test_get('flavors')
143

    
144
    def test_images_get(self):
145
        self._test_get('images')
146

    
147
    @patch('%s.delete' % rest_pkg, return_value=FR())
148
    def _test_delete(self, service, delete):
149
        for args in product(
150
                ('', '%s_id' % service),
151
                ('', 'cmd'),
152
                (204, 208),
153
                ({}, {'k': 'v'})):
154
            (srv_id, command, success, kwargs) = args
155
            method = getattr(self.client, '%s_delete' % service)
156
            method(*args[:3], **kwargs)
157
            vm_str = '/%s' % srv_id if srv_id else ''
158
            cmd_str = '/%s' % command if command else ''
159
            self.assertEqual(delete.mock_calls[-1], call(
160
                '/%s%s%s' % (service, vm_str, cmd_str),
161
                success=success,
162
                **kwargs))
163

    
164
    def test_servers_delete(self):
165
        self._test_delete('servers')
166

    
167
    def test_images_delete(self):
168
        self._test_delete('images')
169

    
170
    @patch('%s.set_header' % rest_pkg)
171
    @patch('%s.post' % rest_pkg, return_value=FR())
172
    def _test_post(self, service, post, SH):
173
        for args in product(
174
                ('', '%s_id' % service),
175
                ('', 'cmd'),
176
                (None, [dict(json="data"), dict(data="json")]),
177
                (202, 204),
178
                ({}, {'k': 'v'})):
179
            (srv_id, command, json_data, success, kwargs) = args
180
            method = getattr(self.client, '%s_post' % service)
181
            method(*args[:4], **kwargs)
182
            vm_str = '/%s' % srv_id if srv_id else ''
183
            cmd_str = '/%s' % command if command else ''
184
            if json_data:
185
                json_data = dumps(json_data)
186
                self.assertEqual(SH.mock_calls[-2:], [
187
                    call('Content-Type', 'application/json'),
188
                    call('Content-Length', len(json_data))])
189
            self.assertEqual(post.mock_calls[-1], call(
190
                '/%s%s%s' % (service, vm_str, cmd_str),
191
                data=json_data, success=success,
192
                **kwargs))
193

    
194
    def test_servers_post(self):
195
        self._test_post('servers')
196

    
197
    def test_images_post(self):
198
        self._test_post('images')
199

    
200
    @patch('%s.set_header' % rest_pkg)
201
    @patch('%s.put' % rest_pkg, return_value=FR())
202
    def _test_put(self, service, put, SH):
203
        for args in product(
204
                ('', '%s_id' % service),
205
                ('', 'cmd'),
206
                (None, [dict(json="data"), dict(data="json")]),
207
                (204, 504),
208
                ({}, {'k': 'v'})):
209
            (server_id, command, json_data, success, kwargs) = args
210
            method = getattr(self.client, '%s_put' % service)
211
            method(*args[:4], **kwargs)
212
            vm_str = '/%s' % server_id if server_id else ''
213
            cmd_str = '/%s' % command if command else ''
214
            if json_data:
215
                json_data = dumps(json_data)
216
                self.assertEqual(SH.mock_calls[-2:], [
217
                    call('Content-Type', 'application/json'),
218
                    call('Content-Length', len(json_data))])
219
            self.assertEqual(put.mock_calls[-1], call(
220
                '/%s%s%s' % (service, vm_str, cmd_str),
221
                data=json_data, success=success,
222
                **kwargs))
223

    
224
    def test_servers_put(self):
225
        self._test_put('servers')
226

    
227
    def test_images_put(self):
228
        self._test_put('images')
229

    
230
    @patch('%s.get' % rest_pkg, return_value=FR())
231
    def test_floating_ip_pools_get(self, get):
232
        for args in product(
233
                ('tenant1', 'tenant2'),
234
                (200, 204),
235
                ({}, {'k': 'v'})):
236
            tenant_id, success, kwargs = args
237
            r = self.client.floating_ip_pools_get(tenant_id, success, **kwargs)
238
            self.assertTrue(isinstance(r, FR))
239
            self.assertEqual(get.mock_calls[-1], call(
240
                '/%s/os-floating-ip-pools' % tenant_id,
241
                success=success, **kwargs))
242

    
243
    @patch('%s.get' % rest_pkg, return_value=FR())
244
    def test_floating_ips_get(self, get):
245
        for args in product(
246
                ('tenant1', 'tenant2'),
247
                ('', '192.193.194.195'),
248
                (200, 204),
249
                ({}, {'k': 'v'})):
250
            tenant_id, ip, success, kwargs = args
251
            r = self.client.floating_ips_get(*args[:3], **kwargs)
252
            self.assertTrue(isinstance(r, FR))
253
            expected = '' if not ip else '/%s' % ip
254
            self.assertEqual(get.mock_calls[-1], call(
255
                '/%s/os-floating-ips%s' % (tenant_id, expected),
256
                success=success, **kwargs))
257

    
258
    @patch('%s.set_header' % rest_pkg)
259
    @patch('%s.post' % rest_pkg, return_value=FR())
260
    def test_floating_ips_post(self, post, SH):
261
        for args in product(
262
                ('tenant1', 'tenant2'),
263
                (None, [dict(json="data"), dict(data="json")]),
264
                ('', '192.193.194.195'),
265
                (202, 204),
266
                ({}, {'k': 'v'})):
267
            (tenant_id, json_data, ip, success, kwargs) = args
268
            self.client.floating_ips_post(*args[:4], **kwargs)
269
            if json_data:
270
                json_data = dumps(json_data)
271
                self.assertEqual(SH.mock_calls[-2:], [
272
                    call('Content-Type', 'application/json'),
273
                    call('Content-Length', len(json_data))])
274
            expected = '' if not ip else '/%s' % ip
275
            self.assertEqual(post.mock_calls[-1], call(
276
                '/%s/os-floating-ips%s' % (tenant_id, expected),
277
                data=json_data, success=success,
278
                **kwargs))
279

    
280
    @patch('%s.delete' % rest_pkg, return_value=FR())
281
    def test_floating_ips_delete(self, delete):
282
        for args in product(
283
                ('tenant1', 'tenant2'),
284
                ('', '192.193.194.195'),
285
                (204,),
286
                ({}, {'k': 'v'})):
287
            tenant_id, ip, success, kwargs = args
288
            r = self.client.floating_ips_delete(*args[:3], **kwargs)
289
            self.assertTrue(isinstance(r, FR))
290
            expected = '' if not ip else '/%s' % ip
291
            self.assertEqual(delete.mock_calls[-1], call(
292
                '/%s/os-floating-ips%s' % (tenant_id, expected),
293
                success=success, **kwargs))
294

    
295

    
296
class ComputeClient(TestCase):
297

    
298
    def assert_dicts_are_equal(self, d1, d2):
299
        for k, v in d1.items():
300
            self.assertTrue(k in d2)
301
            if isinstance(v, dict):
302
                self.assert_dicts_are_equal(v, d2[k])
303
            else:
304
                self.assertEqual(unicode(v), unicode(d2[k]))
305

    
306
    """Set up a Cyclades thorough test"""
307
    def setUp(self):
308
        self.url = 'http://cyclades.example.com'
309
        self.token = 'cyc14d3s70k3n'
310
        self.client = compute.ComputeClient(self.url, self.token)
311

    
312
    def tearDown(self):
313
        FR.status_code = 200
314
        FR.json = vm_recv
315

    
316
    @patch(
317
        '%s.get_image_details' % compute_pkg,
318
        return_value=img_recv['image'])
319
    def test_create_server(self, GID):
320
        with patch.object(
321
                compute.ComputeClient, 'servers_post',
322
                side_effect=ClientError(
323
                    'REQUEST ENTITY TOO LARGE',
324
                    status=403)):
325
            self.assertRaises(
326
                ClientError,
327
                self.client.create_server,
328
                vm_name, fid, img_ref)
329

    
330
        with patch.object(
331
                compute.ComputeClient, 'servers_post',
332
                return_value=FR()) as post:
333
            r = self.client.create_server(vm_name, fid, img_ref)
334
            self.assertEqual(r, FR.json['server'])
335
            self.assertEqual(GID.mock_calls[-1], call(img_ref))
336
            self.assertEqual(post.mock_calls[-1], call(json_data=vm_send))
337
            prsn = 'Personality string (does not work with real servers)'
338
            self.client.create_server(vm_name, fid, img_ref, prsn)
339
            expected = dict(server=dict(vm_send['server']))
340
            expected['server']['personality'] = prsn
341
            self.assertEqual(post.mock_calls[-1], call(json_data=expected))
342

    
343
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
344
    def test_list_servers(self, SG):
345
        FR.json = vm_list
346
        for detail in (False, True):
347
            r = self.client.list_servers(detail)
348
            self.assertEqual(SG.mock_calls[-1], call(
349
                command='detail' if detail else ''))
350
            for i, vm in enumerate(vm_list['servers']):
351
                self.assert_dicts_are_equal(r[i], vm)
352
            self.assertEqual(i + 1, len(r))
353

    
354
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
355
    def test_get_server_details(self, SG):
356
        vm_id = vm_recv['server']['id']
357
        r = self.client.get_server_details(vm_id)
358
        SG.assert_called_once_with(vm_id)
359
        self.assert_dicts_are_equal(r, vm_recv['server'])
360

    
361
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
362
    def test_update_server_name(self, SP):
363
        vm_id = vm_recv['server']['id']
364
        new_name = vm_name + '_new'
365
        self.client.update_server_name(vm_id, new_name)
366
        SP.assert_called_once_with(vm_id, json_data=dict(
367
            server=dict(name=new_name)))
368

    
369
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
370
    def test_reboot_server(self, SP):
371
        vm_id = vm_recv['server']['id']
372
        for hard in (None, True):
373
            self.client.reboot_server(vm_id, hard=hard)
374
            self.assertEqual(SP.mock_calls[-1], call(
375
                vm_id, 'action',
376
                json_data=dict(reboot=dict(type='HARD' if hard else 'SOFT'))))
377

    
378
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
379
    def test_create_server_metadata(self, SP):
380
        vm_id = vm_recv['server']['id']
381
        metadata = dict(m1='v1', m2='v2', m3='v3')
382
        FR.json = dict(metadata=vm_recv['server'])
383
        for k, v in metadata.items():
384
            r = self.client.create_server_metadata(vm_id, k, v)
385
            self.assert_dicts_are_equal(r, vm_recv['server'])
386
            self.assertEqual(SP.mock_calls[-1], call(
387
                vm_id, 'metadata/%s' % k,
388
                json_data=dict(metadata={k: v}), success=201))
389

    
390
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
391
    def test_get_server_metadata(self, SG):
392
        vm_id = vm_recv['server']['id']
393
        metadata = dict(m1='v1', m2='v2', m3='v3')
394
        FR.json = dict(metadata=metadata)
395
        r = self.client.get_server_metadata(vm_id)
396
        SG.assert_called_once_with(vm_id, '/metadata')
397
        self.assert_dicts_are_equal(r, metadata)
398

    
399
        for k, v in metadata.items():
400
            FR.json = dict(metadata={k: v})
401
            r = self.client.get_server_metadata(vm_id, k)
402
            self.assert_dicts_are_equal(r, {k: v})
403
            self.assertEqual(
404
                SG.mock_calls[-1], call(vm_id, '/metadata/%s' % k))
405

    
406
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
407
    def test_update_server_metadata(self, SP):
408
        vm_id = vm_recv['server']['id']
409
        metadata = dict(m1='v1', m2='v2', m3='v3')
410
        FR.json = dict(metadata=metadata)
411
        r = self.client.update_server_metadata(vm_id, **metadata)
412
        self.assert_dicts_are_equal(r, metadata)
413
        SP.assert_called_once_with(
414
            vm_id, 'metadata',
415
            json_data=dict(metadata=metadata), success=201)
416

    
417
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
418
    def test_delete_server_metadata(self, SD):
419
        vm_id = vm_recv['server']['id']
420
        key = 'metakey'
421
        self.client.delete_server_metadata(vm_id, key)
422
        SD.assert_called_once_with(vm_id, 'metadata/' + key)
423

    
424
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
425
    def test_list_flavors(self, FG):
426
        FR.json = flavor_list
427
        for cmd in ('', 'detail'):
428
            r = self.client.list_flavors(detail=(cmd == 'detail'))
429
            self.assertEqual(FG.mock_calls[-1], call(command=cmd))
430
            self.assertEqual(r, flavor_list['flavors'])
431

    
432
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
433
    def test_get_flavor_details(self, FG):
434
        FR.json = dict(flavor=flavor_list['flavors'][0])
435
        r = self.client.get_flavor_details(fid)
436
        FG.assert_called_once_with(fid)
437
        self.assert_dicts_are_equal(r, flavor_list['flavors'][0])
438

    
439
    @patch('%s.images_get' % compute_pkg, return_value=FR())
440
    def test_list_images(self, IG):
441
        FR.json = img_list
442
        for cmd in ('', 'detail'):
443
            r = self.client.list_images(detail=(cmd == 'detail'))
444
            self.assertEqual(IG.mock_calls[-1], call(command=cmd))
445
            expected = img_list['images']
446
            for i in range(len(r)):
447
                self.assert_dicts_are_equal(expected[i], r[i])
448

    
449
    @patch('%s.images_get' % compute_pkg, return_value=FR())
450
    def test_get_image_details(self, IG):
451
        FR.json = img_recv
452
        r = self.client.get_image_details(img_ref)
453
        IG.assert_called_once_with(img_ref)
454
        self.assert_dicts_are_equal(r, img_recv['image'])
455

    
456
    @patch('%s.images_get' % compute_pkg, return_value=FR())
457
    def test_get_image_metadata(self, IG):
458
        for key in ('', '50m3k3y'):
459
            FR.json = dict(metadata=img_recv['image']) if (
460
                key) else dict(metadata=img_recv['image'])
461
            r = self.client.get_image_metadata(img_ref, key)
462
            self.assertEqual(IG.mock_calls[-1], call(
463
                '%s' % img_ref,
464
                '/metadata%s' % (('/%s' % key) if key else '')))
465
            self.assert_dicts_are_equal(img_recv['image'], r)
466

    
467
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
468
    def test_delete_server(self, SD):
469
        vm_id = vm_recv['server']['id']
470
        self.client.delete_server(vm_id)
471
        SD.assert_called_once_with(vm_id)
472

    
473
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
474
    def test_delete_image(self, ID):
475
        self.client.delete_image(img_ref)
476
        ID.assert_called_once_with(img_ref)
477

    
478
    @patch('%s.images_put' % compute_pkg, return_value=FR())
479
    def test_create_image_metadata(self, IP):
480
        (key, val) = ('k1', 'v1')
481
        FR.json = dict(metadata=img_recv['image'])
482
        r = self.client.create_image_metadata(img_ref, key, val)
483
        IP.assert_called_once_with(
484
            img_ref, 'metadata/%s' % key,
485
            json_data=dict(metadata={key: val}))
486
        self.assert_dicts_are_equal(r, img_recv['image'])
487

    
488
    @patch('%s.images_post' % compute_pkg, return_value=FR())
489
    def test_update_image_metadata(self, IP):
490
        metadata = dict(m1='v1', m2='v2', m3='v3')
491
        FR.json = dict(metadata=metadata)
492
        r = self.client.update_image_metadata(img_ref, **metadata)
493
        IP.assert_called_once_with(
494
            img_ref, 'metadata',
495
            json_data=dict(metadata=metadata))
496
        self.assert_dicts_are_equal(r, metadata)
497

    
498
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
499
    def test_delete_image_metadata(self, ID):
500
        key = 'metakey'
501
        self.client.delete_image_metadata(img_ref, key)
502
        ID.assert_called_once_with(img_ref, '/metadata/%s' % key)
503

    
504
    @patch('%s.floating_ip_pools_get' % compute_pkg, return_value=FR())
505
    def test_get_floating_ip_pools(self, get):
506
        tid = 't3n@nt_1d'
507
        r = self.client.get_floating_ip_pools(tid)
508
        self.assert_dicts_are_equal(r, FR.json)
509
        self.assertEqual(get.mock_calls[-1], call(tid))
510

    
511
    @patch('%s.floating_ips_get' % compute_pkg, return_value=FR())
512
    def test_get_floating_ips(self, get):
513
        tid = 't3n@nt_1d'
514
        r = self.client.get_floating_ips(tid)
515
        self.assert_dicts_are_equal(r, FR.json)
516
        self.assertEqual(get.mock_calls[-1], call(tid))
517

    
518
    @patch('%s.floating_ips_post' % compute_pkg, return_value=FR())
519
    def test_alloc_floating_ip(self, post):
520
        FR.json = dict(floating_ip=dict(
521
            fixed_ip='fip',
522
            id=1,
523
            instance_id='lala',
524
            ip='102.0.0.1',
525
            pool='pisine'))
526
        for args in product(
527
                ('t1', 't2'),
528
                (None, 'pisine')):
529
            r = self.client.alloc_floating_ip(*args)
530
            tenant_id, pool = args
531
            self.assert_dicts_are_equal(r, FR.json['floating_ip'])
532
            expected = dict(pool=pool) if pool else dict()
533
            self.assertEqual(post.mock_calls[-1], call(tenant_id, expected))
534

    
535
    @patch('%s.floating_ips_get' % compute_pkg, return_value=FR())
536
    def test_get_floating_ip(self, get):
537
        FR.json = dict(floating_ips=[dict(
538
            fixed_ip='fip',
539
            id=1,
540
            instance_id='lala',
541
            ip='102.0.0.1',
542
            pool='pisine'), ])
543
        for args in product(
544
                ('t1', 't2'),
545
                (None, 'fip')):
546
            r = self.client.get_floating_ip(*args)
547
            tenant_id, fip = args
548
            self.assertEqual(r, FR.json['floating_ips'])
549
            self.assertEqual(get.mock_calls[-1], call(tenant_id, fip))
550

    
551
    @patch('%s.floating_ips_delete' % compute_pkg, return_value=FR())
552
    def test_delete_floating_ip(self, delete):
553
        for args in product(
554
                ('t1', 't2'),
555
                (None, 'fip')):
556
            r = self.client.delete_floating_ip(*args)
557
            tenant_id, fip = args
558
            self.assertEqual(r, FR.headers)
559
            self.assertEqual(delete.mock_calls[-1], call(tenant_id, fip))
560

    
561

    
562
if __name__ == '__main__':
563
    from sys import argv
564
    from kamaki.clients.test import runTestCase
565
    not_found = True
566
    if not argv[1:] or argv[1] == 'ComputeClient':
567
        not_found = False
568
        runTestCase(ComputeClient, 'Compute Client', argv[2:])
569
    if not argv[1:] or argv[1] == 'ComputeRest':
570
        not_found = False
571
        runTestCase(ComputeRestClient, 'ComputeRest Client', argv[2:])
572
    if not_found:
573
        print('TestCase %s not found' % argv[1])