root / kamaki / clients / networking / test.py @ c95ff061
History | View | Annotate | Download (12.8 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 networking |
40 |
|
41 |
|
42 |
class NetworkingRestClient(TestCase): |
43 |
|
44 |
"""Set up a ComputesRest thorough test"""
|
45 |
def setUp(self): |
46 |
self.url = 'http://networking.example.com' |
47 |
self.token = 'n2tw0rk70k3n' |
48 |
self.client = networking.NetworkingRestClient(self.url, self.token) |
49 |
|
50 |
def tearDown(self): |
51 |
del self.client |
52 |
|
53 |
def _assert(self, method_call, path, set_param=None, params=(), **kwargs): |
54 |
"""Assert the REST method call is called as expected"""
|
55 |
x0 = - len(params)
|
56 |
for i, (k, v, c) in enumerate(params): |
57 |
self.assertEqual(set_param.mock_calls[x0 + i], call(k, v, iff=c))
|
58 |
|
59 |
self.assertEqual(method_call.mock_calls[-1], call(path, **kwargs)) |
60 |
|
61 |
@patch('kamaki.clients.Client.get', return_value='ret val') |
62 |
def test_networks_get(self, get): |
63 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
64 |
self.assertEqual(self.client.networks_get(**kwargs), 'ret val') |
65 |
self._assert(get, '/networks', **kwargs) |
66 |
|
67 |
netid = 'netid'
|
68 |
self.assertEqual(
|
69 |
self.client.networks_get(network_id=netid, **kwargs),
|
70 |
'ret val')
|
71 |
self._assert(get, '/networks/%s' % netid, **kwargs) |
72 |
|
73 |
@patch('kamaki.clients.Client.set_param') |
74 |
@patch('kamaki.clients.Client.post', return_value='ret val') |
75 |
def test_networks_post(self, post, set_param): |
76 |
for params, kwargs in product( |
77 |
( |
78 |
(('shared', False, None), ), |
79 |
(('shared', True, True), )), |
80 |
(dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))): |
81 |
|
82 |
callargs = dict()
|
83 |
for p in params: |
84 |
callargs[p[0]] = p[2] |
85 |
callargs.update(kwargs) |
86 |
|
87 |
self.assertEqual(self.client.networks_post(**callargs), 'ret val') |
88 |
self._assert(
|
89 |
post, '/networks', set_param,
|
90 |
params=params, data=None, **kwargs)
|
91 |
|
92 |
json_data = dict(id='some id', other_param='other val') |
93 |
callargs['json_data'] = json_data
|
94 |
self.assertEqual(self.client.networks_post(**callargs), 'ret val') |
95 |
self._assert(
|
96 |
post, '/networks', set_param, params,
|
97 |
data=dumps(json_data), **kwargs) |
98 |
|
99 |
@patch('kamaki.clients.Client.set_param') |
100 |
@patch('kamaki.clients.Client.put', return_value='ret val') |
101 |
def test_networks_put(self, put, set_param): |
102 |
netid = 'netid'
|
103 |
for params, kwargs in product( |
104 |
[p for p in product( |
105 |
( |
106 |
('admin_state_up', False, None), |
107 |
('admin_state_up', True, True)), |
108 |
(('shared', False, None), ('shared', True, True)), |
109 |
)], |
110 |
(dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))): |
111 |
|
112 |
callargs = dict()
|
113 |
for p in params: |
114 |
callargs[p[0]] = p[2] |
115 |
callargs.update(kwargs) |
116 |
|
117 |
self.assertEqual(
|
118 |
self.client.networks_put(netid, **callargs), 'ret val') |
119 |
self._assert(
|
120 |
put, '/networks/%s' % netid, set_param, params,
|
121 |
data=None, **kwargs)
|
122 |
|
123 |
json_data = dict(id='some id', other_param='other val') |
124 |
callargs['json_data'] = json_data
|
125 |
self.assertEqual(
|
126 |
self.client.networks_put(netid, **callargs), 'ret val') |
127 |
self._assert(
|
128 |
put, '/networks/%s' % netid, set_param, params,
|
129 |
data=dumps(json_data), **kwargs) |
130 |
|
131 |
@patch('kamaki.clients.Client.delete', return_value='ret val') |
132 |
def test_networks_delete(self, delete): |
133 |
netid = 'netid'
|
134 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
135 |
self.assertEqual(
|
136 |
self.client.networks_delete(netid, **kwargs), 'ret val') |
137 |
self._assert(delete, '/networks/%s' % netid, **kwargs) |
138 |
|
139 |
@patch('kamaki.clients.Client.get', return_value='ret val') |
140 |
def test_subnets_get(self, get): |
141 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
142 |
self.assertEqual(self.client.subnets_get(**kwargs), 'ret val') |
143 |
self._assert(get, '/subnets', **kwargs) |
144 |
|
145 |
subnet_id = 'subnet id'
|
146 |
self.assertEqual(
|
147 |
self.client.subnets_get(subnet_id=subnet_id, **kwargs),
|
148 |
'ret val')
|
149 |
self._assert(get, '/subnets/%s' % subnet_id, **kwargs) |
150 |
|
151 |
@patch('kamaki.clients.Client.post', return_value='ret val') |
152 |
def test_subnets_post(self, post): |
153 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
154 |
self.assertEqual(self.client.subnets_post(**kwargs), 'ret val') |
155 |
self._assert(post, '/subnets', **kwargs) |
156 |
|
157 |
@patch('kamaki.clients.Client.put', return_value='ret val') |
158 |
def test_subnets_put(self, put): |
159 |
subnet_id = 'subid'
|
160 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
161 |
self.assertEqual(
|
162 |
self.client.subnets_put(subnet_id, **kwargs), 'ret val') |
163 |
self._assert(put, '/subnets/%s' % subnet_id, **kwargs) |
164 |
|
165 |
@patch('kamaki.clients.Client.delete', return_value='ret val') |
166 |
def test_subnets_delete(self, delete): |
167 |
netid = 'netid'
|
168 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
169 |
self.assertEqual(
|
170 |
self.client.subnets_delete(netid, **kwargs), 'ret val') |
171 |
self._assert(delete, '/subnets/%s' % netid, **kwargs) |
172 |
|
173 |
@patch('kamaki.clients.Client.get', return_value='ret val') |
174 |
def test_ports_get(self, get): |
175 |
for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')): |
176 |
self.assertEqual(self.client.ports_get(**kwargs), 'ret val') |
177 |
self._assert(get, '/ports', **kwargs) |
178 |
|
179 |
port_id = 'port id'
|
180 |
self.assertEqual(
|
181 |
self.client.ports_get(port_id=port_id, **kwargs),
|
182 |
'ret val')
|
183 |
self._assert(get, '/ports/%s' % port_id, **kwargs) |
184 |
|
185 |
@patch('kamaki.clients.Client.set_param') |
186 |
@patch('kamaki.clients.Client.post', return_value='ret val') |
187 |
def test_ports_post(self, post, set_param): |
188 |
for params, kwargs in product( |
189 |
[p for p in product( |
190 |
( |
191 |
('name', 'port name', 'port name'), |
192 |
('name', None, None)), |
193 |
( |
194 |
('mac_address', 'max address', 'max address'), |
195 |
('mac_address', None, None)), |
196 |
( |
197 |
('fixed_ips', 'fixed ip', 'fixed ip'), |
198 |
('fixed_ips', None, None)), |
199 |
( |
200 |
('security_groups', 'sec groups', 'sec groups'), |
201 |
('security_groups', None, None)) |
202 |
)], |
203 |
(dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))): |
204 |
|
205 |
callargs = dict()
|
206 |
for p in params: |
207 |
callargs[p[0]] = p[2] |
208 |
callargs.update(kwargs) |
209 |
|
210 |
self.assertEqual(self.client.ports_post(**callargs), 'ret val') |
211 |
self._assert(
|
212 |
post, '/ports', set_param,
|
213 |
params=params, data=None, **kwargs)
|
214 |
|
215 |
json_data = dict(id='some id', other_param='other val') |
216 |
callargs['json_data'] = json_data
|
217 |
self.assertEqual(self.client.ports_post(**callargs), 'ret val') |
218 |
self._assert(
|
219 |
post, '/ports', set_param, params,
|
220 |
data=dumps(json_data), **kwargs) |
221 |
|
222 |
@patch('kamaki.clients.Client.set_param') |
223 |
@patch('kamaki.clients.Client.put', return_value='ret val') |
224 |
def test_ports_put(self, put, set_param): |
225 |
port_id = 'portid'
|
226 |
for params, kwargs in product( |
227 |
[p for p in product( |
228 |
( |
229 |
('name', 'port name', 'port name'), |
230 |
('name', None, None)), |
231 |
( |
232 |
('mac_address', 'max address', 'max address'), |
233 |
('mac_address', None, None)), |
234 |
( |
235 |
('fixed_ips', 'fixed ip', 'fixed ip'), |
236 |
('fixed_ips', None, None)), |
237 |
( |
238 |
('security_groups', 'sec groups', 'sec groups'), |
239 |
('security_groups', None, None)) |
240 |
)], |
241 |
(dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))): |
242 |
|
243 |
callargs = dict()
|
244 |
for p in params: |
245 |
callargs[p[0]] = p[2] |
246 |
callargs.update(kwargs) |
247 |
|
248 |
self.assertEqual(
|
249 |
self.client.ports_put(port_id, **callargs), 'ret val') |
250 |
self._assert(
|
251 |
put, '/ports/%s' % port_id, set_param,
|
252 |
params=params, data=None, **kwargs)
|
253 |
|
254 |
json_data = dict(id='some id', other_param='other val') |
255 |
callargs['json_data'] = json_data
|
256 |
self.assertEqual(
|
257 |
self.client.ports_put(port_id, **callargs), 'ret val') |
258 |
self._assert(
|
259 |
put, '/ports/%s' % port_id, set_param, params,
|
260 |
data=dumps(json_data), **kwargs) |
261 |
|
262 |
|
263 |
class FakeObject(object): |
264 |
|
265 |
json = None
|
266 |
|
267 |
|
268 |
class NetworkingClient(TestCase): |
269 |
|
270 |
"""Set up a ComputesRest thorough test"""
|
271 |
def setUp(self): |
272 |
self.url = 'http://network.example.com' |
273 |
self.token = 'n2tw0rk70k3n' |
274 |
self.client = networking.NetworkingClient(self.url, self.token) |
275 |
|
276 |
def tearDown(self): |
277 |
del self.client |
278 |
|
279 |
@patch(
|
280 |
'kamaki.clients.networking.NetworkingClient.networks_get',
|
281 |
return_value=FakeObject()) |
282 |
def test_list_networks(self, networks_get): |
283 |
FakeObject.json = dict(networks='ret val') |
284 |
self.assertEqual(self.client.list_networks(), 'ret val') |
285 |
networks_get.assert_called_once_with(success=200)
|
286 |
|
287 |
@patch(
|
288 |
'kamaki.clients.networking.NetworkingClient.networks_post',
|
289 |
return_value=FakeObject()) |
290 |
def test_create_network(self, networks_post): |
291 |
FakeObject.json = dict(network='ret val') |
292 |
req = dict()
|
293 |
for kwargs in (dict(shared=None), dict(shared=True)): |
294 |
for body_params in product( |
295 |
(('name', None, ''), ('name', 'some name', 'some name')), |
296 |
( |
297 |
('admin_state_up', None, False), |
298 |
('admin_state_up', True, True))): |
299 |
fullargs = dict(kwargs)
|
300 |
for k, v, exp in body_params: |
301 |
fullargs[k] = v |
302 |
req[k] = exp |
303 |
self.assertEqual(
|
304 |
self.client.create_network(**fullargs), 'ret val') |
305 |
expargs = dict(kwargs)
|
306 |
expargs = dict(json_data=dict(network=req), success=201) |
307 |
expargs.update(kwargs) |
308 |
self.assertEqual(networks_post.mock_calls[-1], call(**expargs)) |
309 |
|
310 |
|
311 |
if __name__ == '__main__': |
312 |
from sys import argv |
313 |
from kamaki.clients.test import runTestCase |
314 |
not_found = True
|
315 |
if not argv[1:] or argv[1] == 'NetworkingClient': |
316 |
not_found = False
|
317 |
runTestCase(NetworkingClient, 'Networking Client', argv[2:]) |
318 |
if not argv[1:] or argv[1] == 'NetworkingRest': |
319 |
not_found = False
|
320 |
runTestCase(NetworkingRestClient, 'NetworkingRest Client', argv[2:]) |
321 |
if not_found:
|
322 |
print('TestCase %s not found' % argv[1]) |