Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / test.py @ c088076b

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(meta=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(meta={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
        FR.json = dict(meta=metadata)
397
        SG.assert_called_once_with(vm_id, '/metadata')
398
        self.assert_dicts_are_equal(r, metadata)
399

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
562

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