Add scheduler unit tests to enable bug fixes and refactoring
Improves the coverage for DVR scheduling and will allow safer bug fixes and refactoring in follow-on patches. Change-Id: I02d0126e31adcab88a7ee82ba1cb76f952c9a68c Partial-bug: #1353266 Partial-bug: #1356639 Co-Authored-By: Swaminathan Vasudevan <swaminathan.vasudevan@hp.com>
This commit is contained in:
parent
a29482c059
commit
f841ffcffd
@ -344,28 +344,75 @@ class L3SchedulerTestCase(l3_agentschedulers_db.L3AgentSchedulerDbMixin,
|
|||||||
self._test_add_router_to_l3_agent(distributed=True,
|
self._test_add_router_to_l3_agent(distributed=True,
|
||||||
already_scheduled=True)
|
already_scheduled=True)
|
||||||
|
|
||||||
def test_schedule_router_distributed(self):
|
def _prepare_schedule_dvr_tests(self):
|
||||||
scheduler = l3_agent_scheduler.ChanceScheduler()
|
scheduler = l3_agent_scheduler.ChanceScheduler()
|
||||||
agent = agents_db.Agent()
|
agent = agents_db.Agent()
|
||||||
agent.admin_state_up = True
|
agent.admin_state_up = True
|
||||||
agent.heartbeat_timestamp = timeutils.utcnow()
|
agent.heartbeat_timestamp = timeutils.utcnow()
|
||||||
|
plugin = mock.Mock()
|
||||||
|
plugin.get_l3_agents_hosting_routers.return_value = []
|
||||||
|
plugin.get_l3_agents.return_value = [agent]
|
||||||
|
plugin.get_l3_agent_candidates.return_value = [agent]
|
||||||
|
|
||||||
|
return scheduler, agent, plugin
|
||||||
|
|
||||||
|
def test_schedule_dvr_router_without_snatbinding_and_no_gw(self):
|
||||||
|
scheduler, agent, plugin = self._prepare_schedule_dvr_tests()
|
||||||
sync_router = {
|
sync_router = {
|
||||||
'id': 'foo_router_id',
|
'id': 'foo_router_id',
|
||||||
'distributed': True
|
'distributed': True
|
||||||
}
|
}
|
||||||
plugin = mock.Mock()
|
|
||||||
plugin.get_router.return_value = sync_router
|
plugin.get_router.return_value = sync_router
|
||||||
plugin.get_l3_agents_hosting_routers.return_value = []
|
|
||||||
plugin.get_l3_agents.return_value = [agent]
|
|
||||||
plugin.get_l3_agent_candidates.return_value = [agent]
|
|
||||||
with mock.patch.object(scheduler, 'bind_router'):
|
with mock.patch.object(scheduler, 'bind_router'):
|
||||||
scheduler._schedule_router(
|
scheduler._schedule_router(
|
||||||
plugin, self.adminContext,
|
plugin, self.adminContext,
|
||||||
'foo_router_id', None, {'gw_exists': True})
|
'foo_router_id', None)
|
||||||
|
expected_calls = [
|
||||||
|
mock.call.get_router(mock.ANY, 'foo_router_id'),
|
||||||
|
mock.call.get_l3_agents_hosting_routers(
|
||||||
|
mock.ANY, ['foo_router_id'], admin_state_up=True),
|
||||||
|
mock.call.get_l3_agents(mock.ANY, active=True),
|
||||||
|
mock.call.get_l3_agent_candidates(
|
||||||
|
mock.ANY, sync_router, [agent], None),
|
||||||
|
]
|
||||||
|
plugin.assert_has_calls(expected_calls)
|
||||||
|
|
||||||
|
def test_schedule_dvr_router_with_snatbinding_no_gw(self):
|
||||||
|
scheduler, agent, plugin = self._prepare_schedule_dvr_tests()
|
||||||
|
sync_router = {'id': 'foo_router_id',
|
||||||
|
'distributed': True}
|
||||||
|
plugin.get_router.return_value = sync_router
|
||||||
|
with mock.patch.object(scheduler, 'bind_router'):
|
||||||
|
scheduler._schedule_router(
|
||||||
|
plugin, self.adminContext,
|
||||||
|
'foo_router_id', None)
|
||||||
|
expected_calls = [
|
||||||
|
mock.call.get_router(mock.ANY, 'foo_router_id'),
|
||||||
|
mock.call.get_l3_agents_hosting_routers(
|
||||||
|
mock.ANY, ['foo_router_id'], admin_state_up=True),
|
||||||
|
mock.call.get_l3_agents(mock.ANY, active=True),
|
||||||
|
mock.call.get_l3_agent_candidates(
|
||||||
|
mock.ANY, sync_router, [agent], None),
|
||||||
|
]
|
||||||
|
plugin.assert_has_calls(expected_calls)
|
||||||
|
|
||||||
|
def test_schedule_router_distributed(self):
|
||||||
|
scheduler, agent, plugin = self._prepare_schedule_dvr_tests()
|
||||||
|
sync_router = {
|
||||||
|
'id': 'foo_router_id',
|
||||||
|
'distributed': True,
|
||||||
|
'external_gateway_info': {
|
||||||
|
'network_id': str(uuid.uuid4()),
|
||||||
|
'enable_snat': True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plugin.get_router.return_value = sync_router
|
||||||
|
with mock.patch.object(scheduler, 'bind_router'):
|
||||||
|
scheduler._schedule_router(
|
||||||
|
plugin, self.adminContext,
|
||||||
|
'foo_router_id', None)
|
||||||
expected_calls = [
|
expected_calls = [
|
||||||
mock.call.get_router(mock.ANY, 'foo_router_id'),
|
mock.call.get_router(mock.ANY, 'foo_router_id'),
|
||||||
mock.call.schedule_snat_router(
|
|
||||||
mock.ANY, 'foo_router_id', sync_router, True),
|
|
||||||
mock.call.get_l3_agents_hosting_routers(
|
mock.call.get_l3_agents_hosting_routers(
|
||||||
mock.ANY, ['foo_router_id'], admin_state_up=True),
|
mock.ANY, ['foo_router_id'], admin_state_up=True),
|
||||||
mock.call.get_l3_agents(mock.ANY, active=True),
|
mock.call.get_l3_agents(mock.ANY, active=True),
|
||||||
@ -690,16 +737,65 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase,
|
|||||||
self.assertTrue(result)
|
self.assertTrue(result)
|
||||||
self.assertEqual(dvr_serv_fn.call_count, 1)
|
self.assertEqual(dvr_serv_fn.call_count, 1)
|
||||||
|
|
||||||
def test_schedule_snat_router_with_snat_candidates(self):
|
def _prepare_schedule_snat_tests(self):
|
||||||
agent = agents_db.Agent()
|
agent = agents_db.Agent()
|
||||||
agent.admin_state_up = True
|
agent.admin_state_up = True
|
||||||
agent.heartbeat_timestamp = timeutils.utcnow()
|
agent.heartbeat_timestamp = timeutils.utcnow()
|
||||||
|
router = {
|
||||||
|
'id': 'foo_router_id',
|
||||||
|
'distributed': True,
|
||||||
|
'external_gateway_info': {
|
||||||
|
'network_id': str(uuid.uuid4()),
|
||||||
|
'enable_snat': True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return agent, router
|
||||||
|
|
||||||
|
def test_schedule_snat_router_with_gateway_and_nobinding(self):
|
||||||
|
agent, router = self._prepare_schedule_snat_tests()
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
mock.patch.object(query.Query, 'first'),
|
mock.patch.object(query.Query, 'first'),
|
||||||
mock.patch.object(self.dut, 'get_l3_agents'),
|
mock.patch.object(self.dut, 'get_l3_agents'),
|
||||||
mock.patch.object(self.dut, 'get_snat_candidates'),
|
mock.patch.object(self.dut, 'get_snat_candidates'),
|
||||||
|
mock.patch.object(self.dut, 'get_router'),
|
||||||
|
mock.patch.object(self.dut, 'bind_dvr_router_servicenode'),
|
||||||
mock.patch.object(self.dut, 'bind_snat_servicenode')) as (
|
mock.patch.object(self.dut, 'bind_snat_servicenode')) as (
|
||||||
mock_query, mock_agents, mock_candidates, mock_bind):
|
mock_query, mock_agents,
|
||||||
|
mock_candidates, mock_rd, mock_dvr, mock_bind):
|
||||||
|
mock_rd.return_value = router
|
||||||
|
mock_query.return_value = []
|
||||||
|
mock_agents.return_value = [agent]
|
||||||
|
mock_candidates.return_value = [agent]
|
||||||
|
self.dut.schedule_snat_router(
|
||||||
|
self.adminContext, 'foo_router_id', router, True)
|
||||||
|
self.assertFalse(mock_dvr.called)
|
||||||
|
|
||||||
|
def test_schedule_router_unbind_snat_servicenode_negativetest(self):
|
||||||
|
router = {
|
||||||
|
'id': 'foo_router_id',
|
||||||
|
'distributed': True
|
||||||
|
}
|
||||||
|
with contextlib.nested(
|
||||||
|
mock.patch.object(self.dut, 'get_router'),
|
||||||
|
mock.patch.object(self.dut, 'unbind_snat_servicenode')) as (
|
||||||
|
mock_rd, mock_unbind):
|
||||||
|
mock_rd.return_value = router
|
||||||
|
self.dut.schedule_snat_router(
|
||||||
|
self.adminContext, 'foo_router_id', router, True)
|
||||||
|
self.assertFalse(mock_unbind.called)
|
||||||
|
|
||||||
|
def test_schedule_snat_router_with_snat_candidates(self):
|
||||||
|
agent, router = self._prepare_schedule_snat_tests()
|
||||||
|
with contextlib.nested(
|
||||||
|
mock.patch.object(query.Query, 'first'),
|
||||||
|
mock.patch.object(self.dut, 'get_l3_agents'),
|
||||||
|
mock.patch.object(self.dut, 'get_snat_candidates'),
|
||||||
|
mock.patch.object(self.dut, 'get_router'),
|
||||||
|
mock.patch.object(self.dut, 'bind_dvr_router_servicenode'),
|
||||||
|
mock.patch.object(self.dut, 'bind_snat_servicenode')) as (
|
||||||
|
mock_query, mock_agents,
|
||||||
|
mock_candidates, mock_rd, mock_dvr, mock_bind):
|
||||||
|
mock_rd.return_value = router
|
||||||
mock_query.return_value = []
|
mock_query.return_value = []
|
||||||
mock_agents.return_value = [agent]
|
mock_agents.return_value = [agent]
|
||||||
mock_candidates.return_value = [agent]
|
mock_candidates.return_value = [agent]
|
||||||
|
Loading…
Reference in New Issue
Block a user