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:
parent
e720bc29f3
commit
af62088fb5
@ -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)
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user