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
1=== modified file 'setup.cfg'
2--- setup.cfg 2013-07-19 09:46:25 +0000
3+++ setup.cfg 2013-10-19 23:50:53 +0000
4@@ -1,5 +1,5 @@
5 [nosetests]
6-verbosity=2
7+verbosity=1
8 with-coverage=1
9 cover-erase=1
10 cover-package=hooks
11
12=== modified file 'unit_tests/test_quantum_utils.py'
13--- unit_tests/test_quantum_utils.py 2013-10-16 12:22:39 +0000
14+++ unit_tests/test_quantum_utils.py 2013-10-19 23:50:53 +0000
15@@ -1,4 +1,4 @@
16-from mock import MagicMock, call
17+from mock import MagicMock, call, patch
18
19 import charmhelpers.contrib.openstack.templating as templating
20
21@@ -26,6 +26,7 @@
22 'headers_package',
23 'full_restart',
24 'service_running',
25+ 'NetworkServiceContext'
26 ]
27
28
29@@ -57,9 +58,18 @@
30
31 def test_get_early_packages_nvp(self):
32 self.config.return_value = 'nvp'
33+ self.assertEquals(
34+ quantum_utils.get_early_packages(),
35+ ['openvswitch-datapath-dkms', 'linux-headers-2.6.18'])
36+
37+ @patch.object(quantum_utils, 'EARLY_PACKAGES')
38+ def test_get_early_packages_no_dkms(self, _early_packages):
39+ pass
40+
41+ def test_get_early_packages_empty(self):
42+ self.config.return_value = 'noop'
43 self.assertEquals(quantum_utils.get_early_packages(),
44- ['openvswitch-datapath-dkms',
45- 'linux-headers-2.6.18'])
46+ [])
47
48 def test_get_packages_ovs(self):
49 self.config.return_value = 'ovs'
50@@ -201,3 +211,148 @@
51 def test_get_common_package_neutron(self):
52 self.get_os_codename_package.return_value = None
53 self.assertEquals(quantum_utils.get_common_package(), 'neutron-common')
54+
55+
56+network_context = {
57+ 'service_username': 'foo',
58+ 'service_password': 'bar',
59+ 'service_tenant': 'baz',
60+ 'region': 'foo-bar',
61+ 'keystone_host': 'keystone',
62+ 'auth_port': 5000
63+}
64+
65+
66+class DummyNetworkServiceContext():
67+ def __init__(self, return_value):
68+ self.return_value = return_value
69+
70+ def __call__(self):
71+ return self.return_value
72+
73+agents_all_alive = {
74+ 'DHCP Agent': {
75+ 'agents': [
76+ {'alive': True,
77+ 'id': '3e3550f2-38cc-11e3-9617-3c970e8b1cf7'},
78+ {'alive': True,
79+ 'id': '53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7'},
80+ {'alive': True,
81+ 'id': '92b8b6bc-38ce-11e3-8537-3c970e8b1cf7'}
82+ ]
83+ },
84+ 'L3 Agent': {
85+ 'agents': [
86+ {'alive': True,
87+ 'id': '7128198e-38ce-11e3-ba78-3c970e8b1cf7'},
88+ {'alive': True,
89+ 'id': '72453824-38ce-11e3-938e-3c970e8b1cf7'},
90+ {'alive': True,
91+ 'id': '84a04126-38ce-11e3-9449-3c970e8b1cf7'}
92+ ]
93+ }
94+}
95+
96+agents_some_dead = {
97+ 'DHCP Agent': {
98+ 'agents': [
99+ {'alive': True,
100+ 'id': '3e3550f2-38cc-11e3-9617-3c970e8b1cf7'},
101+ {'alive': False,
102+ 'id': '53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7'},
103+ {'alive': True,
104+ 'id': '92b8b6bc-38ce-11e3-8537-3c970e8b1cf7'}
105+ ]
106+ },
107+ 'L3 Agent': {
108+ 'agents': [
109+ {'alive': True,
110+ 'id': '7128198e-38ce-11e3-ba78-3c970e8b1cf7'},
111+ {'alive': True,
112+ 'id': '72453824-38ce-11e3-938e-3c970e8b1cf7'},
113+ {'alive': False,
114+ 'id': '84a04126-38ce-11e3-9449-3c970e8b1cf7'}
115+ ]
116+ }
117+}
118+
119+dhcp_agent_networks = {
120+ 'networks': [
121+ {'id': 'foo'},
122+ {'id': 'bar'}
123+ ]
124+}
125+
126+l3_agent_routers = {
127+ 'routers': [
128+ {'id': 'baz'},
129+ {'id': 'bong'}
130+ ]
131+}
132+
133+
134+class TestQuantumAgentReallocation(CharmTestCase):
135+ def setUp(self):
136+ super(TestQuantumAgentReallocation, self).setUp(quantum_utils,
137+ TO_PATCH)
138+
139+ def tearDown(self):
140+ # Reset cached cache
141+ hookenv.cache = {}
142+
143+ def test_no_network_context(self):
144+ self.NetworkServiceContext.return_value = \
145+ DummyNetworkServiceContext(return_value=None)
146+ quantum_utils.reassign_agent_resources()
147+ self.log.assert_called()
148+
149+ @patch('neutronclient.v2_0.client.Client')
150+ def test_no_down_agents(self, _client):
151+ self.NetworkServiceContext.return_value = \
152+ DummyNetworkServiceContext(return_value=network_context)
153+ dummy_client = MagicMock()
154+ dummy_client.list_agents.side_effect = agents_all_alive.itervalues()
155+ _client.return_value = dummy_client
156+ quantum_utils.reassign_agent_resources()
157+ dummy_client.add_router_to_l3_agent.assert_not_called()
158+ dummy_client.remove_router_from_l3_agent.assert_not_called()
159+ dummy_client.add_network_to_dhcp_agent.assert_not_called()
160+ dummy_client.remove_network_from_dhcp_agent.assert_not_called()
161+
162+ @patch('neutronclient.v2_0.client.Client')
163+ def test_agents_down_relocation_required(self, _client):
164+ self.NetworkServiceContext.return_value = \
165+ DummyNetworkServiceContext(return_value=network_context)
166+ dummy_client = MagicMock()
167+ dummy_client.list_agents.side_effect = agents_some_dead.itervalues()
168+ dummy_client.list_networks_on_dhcp_agent.return_value = \
169+ dhcp_agent_networks
170+ dummy_client.list_routers_on_l3_agent.return_value = \
171+ l3_agent_routers
172+ _client.return_value = dummy_client
173+ quantum_utils.reassign_agent_resources()
174+
175+ # Ensure routers removed from dead l3 agent
176+ dummy_client.remove_router_from_l3_agent.assert_has_calls(
177+ [call(l3_agent='84a04126-38ce-11e3-9449-3c970e8b1cf7',
178+ router_id='bong'),
179+ call(l3_agent='84a04126-38ce-11e3-9449-3c970e8b1cf7',
180+ router_id='baz')], any_order=True)
181+ # and re-assigned across the remaining two live agents
182+ dummy_client.add_router_to_l3_agent.assert_has_calls(
183+ [call(l3_agent='7128198e-38ce-11e3-ba78-3c970e8b1cf7',
184+ body={'router_id': 'bong'}),
185+ call(l3_agent='72453824-38ce-11e3-938e-3c970e8b1cf7',
186+ body={'router_id': 'baz'})], any_order=True)
187+ # Ensure networks removed from dead dhcp agent
188+ dummy_client.remove_network_from_dhcp_agent.assert_has_calls(
189+ [call(dhcp_agent='53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7',
190+ network_id='foo'),
191+ call(dhcp_agent='53d6eefc-38cc-11e3-b3c8-3c970e8b1cf7',
192+ network_id='bar')], any_order=True)
193+ # and re-assigned across the remaining two live agents
194+ dummy_client.add_network_to_dhcp_agent.assert_has_calls(
195+ [call(dhcp_agent='3e3550f2-38cc-11e3-9617-3c970e8b1cf7',
196+ body={'network_id': 'foo'}),
197+ call(dhcp_agent='92b8b6bc-38ce-11e3-8537-3c970e8b1cf7',
198+ body={'network_id': 'bar'})], any_order=True)

Subscribers

People subscribed via source and target branches

to all changes: