Merge lp:~james-page/charms/precise/quantum-gateway/unit-tests into lp:~charmers/charms/precise/quantum-gateway/trunk

Proposed by James Page
Status: Merged
Approved by: Adam Gandelman
Approved revision: 39
Merged at revision: 37
Proposed branch: lp:~james-page/charms/precise/quantum-gateway/unit-tests
Merge into: lp:~charmers/charms/precise/quantum-gateway/trunk
Diff against target: 198 lines (+159/-4)
2 files modified
setup.cfg (+1/-1)
unit_tests/test_quantum_utils.py (+158/-3)
To merge this branch: bzr merge lp:~james-page/charms/precise/quantum-gateway/unit-tests
Reviewer Review Type Date Requested Status
charmers Pending
Review via email: mp+191913@code.launchpad.net

Description of the change

Improved unit testing coverage including failed agent re-location code.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'setup.cfg'
--- setup.cfg 2013-07-19 09:46:25 +0000
+++ setup.cfg 2013-10-19 23:50:53 +0000
@@ -1,5 +1,5 @@
1[nosetests]1[nosetests]
2verbosity=22verbosity=1
3with-coverage=13with-coverage=1
4cover-erase=14cover-erase=1
5cover-package=hooks5cover-package=hooks
66
=== modified file 'unit_tests/test_quantum_utils.py'
--- unit_tests/test_quantum_utils.py 2013-10-16 12:22:39 +0000
+++ unit_tests/test_quantum_utils.py 2013-10-19 23:50:53 +0000
@@ -1,4 +1,4 @@
1from mock import MagicMock, call1from mock import MagicMock, call, patch
22
3import charmhelpers.contrib.openstack.templating as templating3import charmhelpers.contrib.openstack.templating as templating
44
@@ -26,6 +26,7 @@
26 'headers_package',26 'headers_package',
27 'full_restart',27 'full_restart',
28 'service_running',28 'service_running',
29 'NetworkServiceContext'
29]30]
3031
3132
@@ -57,9 +58,18 @@
5758
58 def test_get_early_packages_nvp(self):59 def test_get_early_packages_nvp(self):
59 self.config.return_value = 'nvp'60 self.config.return_value = 'nvp'
61 self.assertEquals(
62 quantum_utils.get_early_packages(),
63 ['openvswitch-datapath-dkms', 'linux-headers-2.6.18'])
64
65 @patch.object(quantum_utils, 'EARLY_PACKAGES')
66 def test_get_early_packages_no_dkms(self, _early_packages):
67 pass
68
69 def test_get_early_packages_empty(self):
70 self.config.return_value = 'noop'
60 self.assertEquals(quantum_utils.get_early_packages(),71 self.assertEquals(quantum_utils.get_early_packages(),
61 ['openvswitch-datapath-dkms',72 [])
62 'linux-headers-2.6.18'])
6373
64 def test_get_packages_ovs(self):74 def test_get_packages_ovs(self):
65 self.config.return_value = 'ovs'75 self.config.return_value = 'ovs'
@@ -201,3 +211,148 @@
201 def test_get_common_package_neutron(self):211 def test_get_common_package_neutron(self):
202 self.get_os_codename_package.return_value = None212 self.get_os_codename_package.return_value = None
203 self.assertEquals(quantum_utils.get_common_package(), 'neutron-common')213 self.assertEquals(quantum_utils.get_common_package(), 'neutron-common')
214
215
216network_context = {
217 'service_username': 'foo',
218 'service_password': 'bar',
219 'service_tenant': 'baz',
220 'region': 'foo-bar',
221 'keystone_host': 'keystone',
222 'auth_port': 5000
223}
224
225
226class DummyNetworkServiceContext():
227 def __init__(self, return_value):
228 self.return_value = return_value
229
230 def __call__(self):
231 return self.return_value
232
233agents_all_alive = {
234 'DHCP Agent': {
235 'agents': [
236 {'alive': True,
237 'id': '3e3550f2-38cc-11e3-9617-3c970e8b1cf7'},
238 {'alive': True,
239 'id': '53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7'},
240 {'alive': True,
241 'id': '92b8b6bc-38ce-11e3-8537-3c970e8b1cf7'}
242 ]
243 },
244 'L3 Agent': {
245 'agents': [
246 {'alive': True,
247 'id': '7128198e-38ce-11e3-ba78-3c970e8b1cf7'},
248 {'alive': True,
249 'id': '72453824-38ce-11e3-938e-3c970e8b1cf7'},
250 {'alive': True,
251 'id': '84a04126-38ce-11e3-9449-3c970e8b1cf7'}
252 ]
253 }
254}
255
256agents_some_dead = {
257 'DHCP Agent': {
258 'agents': [
259 {'alive': True,
260 'id': '3e3550f2-38cc-11e3-9617-3c970e8b1cf7'},
261 {'alive': False,
262 'id': '53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7'},
263 {'alive': True,
264 'id': '92b8b6bc-38ce-11e3-8537-3c970e8b1cf7'}
265 ]
266 },
267 'L3 Agent': {
268 'agents': [
269 {'alive': True,
270 'id': '7128198e-38ce-11e3-ba78-3c970e8b1cf7'},
271 {'alive': True,
272 'id': '72453824-38ce-11e3-938e-3c970e8b1cf7'},
273 {'alive': False,
274 'id': '84a04126-38ce-11e3-9449-3c970e8b1cf7'}
275 ]
276 }
277}
278
279dhcp_agent_networks = {
280 'networks': [
281 {'id': 'foo'},
282 {'id': 'bar'}
283 ]
284}
285
286l3_agent_routers = {
287 'routers': [
288 {'id': 'baz'},
289 {'id': 'bong'}
290 ]
291}
292
293
294class TestQuantumAgentReallocation(CharmTestCase):
295 def setUp(self):
296 super(TestQuantumAgentReallocation, self).setUp(quantum_utils,
297 TO_PATCH)
298
299 def tearDown(self):
300 # Reset cached cache
301 hookenv.cache = {}
302
303 def test_no_network_context(self):
304 self.NetworkServiceContext.return_value = \
305 DummyNetworkServiceContext(return_value=None)
306 quantum_utils.reassign_agent_resources()
307 self.log.assert_called()
308
309 @patch('neutronclient.v2_0.client.Client')
310 def test_no_down_agents(self, _client):
311 self.NetworkServiceContext.return_value = \
312 DummyNetworkServiceContext(return_value=network_context)
313 dummy_client = MagicMock()
314 dummy_client.list_agents.side_effect = agents_all_alive.itervalues()
315 _client.return_value = dummy_client
316 quantum_utils.reassign_agent_resources()
317 dummy_client.add_router_to_l3_agent.assert_not_called()
318 dummy_client.remove_router_from_l3_agent.assert_not_called()
319 dummy_client.add_network_to_dhcp_agent.assert_not_called()
320 dummy_client.remove_network_from_dhcp_agent.assert_not_called()
321
322 @patch('neutronclient.v2_0.client.Client')
323 def test_agents_down_relocation_required(self, _client):
324 self.NetworkServiceContext.return_value = \
325 DummyNetworkServiceContext(return_value=network_context)
326 dummy_client = MagicMock()
327 dummy_client.list_agents.side_effect = agents_some_dead.itervalues()
328 dummy_client.list_networks_on_dhcp_agent.return_value = \
329 dhcp_agent_networks
330 dummy_client.list_routers_on_l3_agent.return_value = \
331 l3_agent_routers
332 _client.return_value = dummy_client
333 quantum_utils.reassign_agent_resources()
334
335 # Ensure routers removed from dead l3 agent
336 dummy_client.remove_router_from_l3_agent.assert_has_calls(
337 [call(l3_agent='84a04126-38ce-11e3-9449-3c970e8b1cf7',
338 router_id='bong'),
339 call(l3_agent='84a04126-38ce-11e3-9449-3c970e8b1cf7',
340 router_id='baz')], any_order=True)
341 # and re-assigned across the remaining two live agents
342 dummy_client.add_router_to_l3_agent.assert_has_calls(
343 [call(l3_agent='7128198e-38ce-11e3-ba78-3c970e8b1cf7',
344 body={'router_id': 'bong'}),
345 call(l3_agent='72453824-38ce-11e3-938e-3c970e8b1cf7',
346 body={'router_id': 'baz'})], any_order=True)
347 # Ensure networks removed from dead dhcp agent
348 dummy_client.remove_network_from_dhcp_agent.assert_has_calls(
349 [call(dhcp_agent='53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7',
350 network_id='foo'),
351 call(dhcp_agent='53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7',
352 network_id='bar')], any_order=True)
353 # and re-assigned across the remaining two live agents
354 dummy_client.add_network_to_dhcp_agent.assert_has_calls(
355 [call(dhcp_agent='3e3550f2-38cc-11e3-9617-3c970e8b1cf7',
356 body={'network_id': 'foo'}),
357 call(dhcp_agent='92b8b6bc-38ce-11e3-8537-3c970e8b1cf7',
358 body={'network_id': 'bar'})], any_order=True)

Subscribers

People subscribed via source and target branches

to all changes: