Fix remove_router_from_l3_agent for 'dvr' mode agent

It's possible to run command remove_router_from_l3_agent to remove
a DVR router from an agent in 'dvr' mode. But the implicit *binding*
between DVR router and agent in 'dvr' mode should come and go as
dvr serviced port on host come and go, not manually managed.

Closes-Bug: #1540779
Change-Id: Ied6c88c85ced7b956fad3473ede4688020a357a4
This commit is contained in:
lzklibj 2016-01-02 12:44:30 +08:00
parent e720bc29f3
commit af62088fb5
3 changed files with 30 additions and 0 deletions

View File

@ -243,6 +243,10 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
which leads to re-schedule or be added to another agent manually.
"""
agent = self._get_agent(context, agent_id)
agent_mode = self._get_agent_mode(agent)
if agent_mode == constants.L3_AGENT_MODE_DVR:
raise l3agentscheduler.DVRL3CannotRemoveFromDvrAgent()
self._unbind_router(context, router_id, agent_id)
router = self.get_router(context, router_id)

View File

@ -178,6 +178,11 @@ class DVRL3CannotAssignToDvrAgent(exceptions.Conflict):
"agent in 'dvr' mode.")
class DVRL3CannotRemoveFromDvrAgent(exceptions.Conflict):
message = _("Not allowed to manually remove a router from "
"an agent in 'dvr' mode.")
class L3AgentSchedulerPluginBase(object):
"""REST API to operate the l3 agent scheduler.

View File

@ -507,6 +507,27 @@ class L3SchedulerTestBaseMixin(object):
already_scheduled=True,
external_gw=external_gw_info)
def test_remove_router_from_l3_agent_in_dvr_mode(self):
self._register_l3_dvr_agents()
self.assertRaises(l3agent.DVRL3CannotRemoveFromDvrAgent,
self.remove_router_from_l3_agent,
self.adminContext,
self.l3_dvr_agent_id,
mock.ANY)
def test_remove_router_from_l3_agent_in_dvr_snat_mode(self):
self._register_l3_dvr_agents()
router = self._create_router_for_l3_agent_dvr_test(
distributed=True)
agent_id = self.l3_dvr_snat_id
l3_notifier = mock.Mock()
self.agent_notifiers = {constants.AGENT_TYPE_L3: l3_notifier}
self.remove_router_from_l3_agent(self.adminContext, agent_id,
router['router']['id'])
l3_notifier.router_removed_from_agent.assert_called_once_with(
self.adminContext, router['router']['id'],
self.l3_dvr_snat_agent.host)
def _prepare_schedule_dvr_tests(self):
scheduler = l3_agent_scheduler.ChanceScheduler()
agent = agents_db.Agent()