'dead_time': agent_dead_limit})
self.reschedule_router(context, binding.router_id)
+ def validate_agent_router_combination(self, context, agent, router):
+ """Validate if the router can be correctly assigned to the agent.
+
+ :raises: RouterL3AgentMismatch if attempting to assign DVR router
+ to legacy agent, or centralized router to compute's L3 agents.
+ :raises: InvalidL3Agent if attempting to assign router to an
+ unsuitable agent (disabled, type != L3, incompatible configuration)
+ """
+ is_distributed = router.get('distributed')
+ agent_conf = self.get_configuration_dict(agent)
+ agent_mode = agent_conf.get('agent_mode', 'legacy')
+
+ is_agent_router_types_incompatible = (
+ agent_mode == 'dvr' and not is_distributed
+ or agent_mode == 'legacy' and is_distributed
+ )
+ if is_agent_router_types_incompatible:
+ router_type = ('distributed' if is_distributed else 'centralized')
+ raise l3agentscheduler.RouterL3AgentMismatch(
+ router_type=router_type, router_id=router['id'],
+ agent_mode=agent_mode, agent_id=agent['id'])
+
+ is_wrong_type_or_unsuitable_agent = (
+ agent['agent_type'] != constants.AGENT_TYPE_L3 or
+ not agent['admin_state_up'] or
+ not self.get_l3_agent_candidates(context, router, [agent])
+ )
+ if is_wrong_type_or_unsuitable_agent:
+ raise l3agentscheduler.InvalidL3Agent(id=agent['id'])
+
+ def validate_agent_router_existing_binding(self, context, agent, router):
+ """Validate if the router is already assigned to the agent.
+
+ :raises: RouterHostedByL3Agent if router is already assigned
+ """
+ router_id = router['id']
+ agent_id = agent['id']
+ query = context.session.query(RouterL3AgentBinding)
+ if router.get('distributed'):
+ binding = query.filter_by(router_id=router_id,
+ l3_agent_id=agent_id).first()
+ if binding:
+ raise l3agentscheduler.RouterHostedByL3Agent(
+ router_id=router_id,
+ agent_id=binding.l3_agent_id)
+ else:
+ try:
+ binding = query.filter_by(router_id=router_id).one()
+
+ raise l3agentscheduler.RouterHostedByL3Agent(
+ router_id=router_id,
+ agent_id=binding.l3_agent_id)
+ except exc.NoResultFound:
+ pass
+
+ def create_router_to_agent_binding(self, context, agent, router):
+ """Create router to agent binding."""
+ router_id = router['id']
+ agent_id = agent['id']
+ result = self.auto_schedule_routers(context, agent.host, [router_id])
+ if not result:
+ raise l3agentscheduler.RouterSchedulingFailed(
+ router_id=router_id, agent_id=agent_id)
+
def add_router_to_l3_agent(self, context, agent_id, router_id):
"""Add a l3 agent to host a router."""
- router = self.get_router(context, router_id)
- distributed = router.get('distributed')
with context.session.begin(subtransactions=True):
- agent_db = self._get_agent(context, agent_id)
- agent_conf = self.get_configuration_dict(agent_db)
- agent_mode = agent_conf.get('agent_mode', 'legacy')
- if (not distributed and agent_mode == 'dvr' or
- distributed and agent_mode == 'legacy'):
- router_type = ('distributed' if distributed else 'centralized')
- raise l3agentscheduler.RouterL3AgentMismatch(
- router_type=router_type, router_id=router_id,
- agent_mode=agent_mode, agent_id=agent_id)
- if (agent_db['agent_type'] != constants.AGENT_TYPE_L3 or
- not agent_db['admin_state_up'] or
- not self.get_l3_agent_candidates(context,
- router,
- [agent_db])):
- raise l3agentscheduler.InvalidL3Agent(id=agent_id)
- query = context.session.query(RouterL3AgentBinding)
- if distributed:
- binding = query.filter_by(router_id=router_id,
- l3_agent_id=agent_id).first()
- if binding:
- raise l3agentscheduler.RouterHostedByL3Agent(
- router_id=router_id,
- agent_id=binding.l3_agent_id)
- else:
- try:
- binding = query.filter_by(router_id=router_id).one()
-
- raise l3agentscheduler.RouterHostedByL3Agent(
- router_id=router_id,
- agent_id=binding.l3_agent_id)
- except exc.NoResultFound:
- pass
-
- result = self.auto_schedule_routers(context,
- agent_db.host,
- [router_id])
- if not result:
- raise l3agentscheduler.RouterSchedulingFailed(
- router_id=router_id, agent_id=agent_id)
+ router = self.get_router(context, router_id)
+ agent = self._get_agent(context, agent_id)
+ self.validate_agent_router_combination(context, agent, router)
+ self.validate_agent_router_existing_binding(context, agent, router)
+ self.create_router_to_agent_binding(context, agent, router)
l3_notifier = self.agent_notifiers.get(constants.AGENT_TYPE_L3)
if l3_notifier:
l3_notifier.router_added_to_agent(
- context, [router_id], agent_db.host)
+ context, [router_id], agent.host)
def remove_router_from_l3_agent(self, context, agent_id, router_id):
"""Remove the router from l3 agent.