agent_host = context.host
else:
agent_host = context.original_host
- port_infos = self._get_port_infos(
- context, orig, agent_host)
- if not port_infos:
- return
- agent, agent_ip, segment, port_fdb_entries = port_infos
+
+ agent_ip = self.get_agent_ip_by_host(db_api.get_session(), agent_host)
orig_mac_ip = [l2pop_rpc.PortInfo(mac_address=port['mac_address'],
ip_address=ip)
self.L2populationAgentNotify.remove_fdb_entries(
self.rpc_ctx, fdb_entries)
- def _get_port_infos(self, context, port, agent_host):
- if not agent_host:
- return
-
- session = db_api.get_session()
- agent = self.get_agent_by_host(session, agent_host)
- if not agent:
- LOG.warning(_LW("Unable to retrieve active L2 agent on host %s"),
- agent_host)
- return
-
- agent_ip = self.get_agent_ip(agent)
-
+ def _get_and_validate_segment(self, context, port_id, agent):
segment = context.bottom_bound_segment
if not segment:
LOG.debug("Port %(port)s updated by agent %(agent)s isn't bound "
- "to any segment", {'port': port['id'], 'agent': agent})
+ "to any segment", {'port': port_id, 'agent': agent})
return
network_types = self.get_agent_l2pop_network_types(agent)
if segment['network_type'] not in network_types:
return
- fdb_entries = self._get_port_fdb_entries(port)
-
- return agent, agent_ip, segment, fdb_entries
+ return segment
def _create_agent_fdb(self, session, agent, segment, network_id):
agent_fdb_entries = {network_id:
def _update_port_up(self, context):
port = context.current
agent_host = context.host
- port_infos = self._get_port_infos(context, port, agent_host)
- if not port_infos:
+ session = db_api.get_session()
+ agent = self.get_agent_by_host(session, agent_host)
+ if not agent:
+ LOG.warning(_LW("Unable to retrieve active L2 agent on host %s"),
+ agent_host)
return
- agent, agent_ip, segment, port_fdb_entries = port_infos
network_id = port['network_id']
- session = db_api.get_session()
agent_active_ports = self.get_agent_network_active_port_count(
session, agent_host, network_id)
- other_fdb_entries = {network_id:
- {'segment_id': segment['segmentation_id'],
- 'network_type': segment['network_type'],
- 'ports': {agent_ip: []}}}
+ agent_ip = self.get_agent_ip(agent)
+ segment = self._get_and_validate_segment(context, port['id'], agent)
+ if not segment:
+ return
+ other_fdb_entries = self._get_fdb_entries_template(
+ segment, agent_ip, network_id)
other_fdb_ports = other_fdb_entries[network_id]['ports']
if agent_active_ports == 1 or (
# Notify other agents to add fdb rule for current port
if port['device_owner'] != const.DEVICE_OWNER_DVR_INTERFACE:
- other_fdb_ports[agent_ip] += port_fdb_entries
+ other_fdb_ports[agent_ip] += self._get_port_fdb_entries(port)
self.L2populationAgentNotify.add_fdb_entries(self.rpc_ctx,
other_fdb_entries)
def _get_agent_fdb(self, context, port, agent_host):
- port_infos = self._get_port_infos(context, port, agent_host)
- if not port_infos:
- return
- agent, agent_ip, segment, port_fdb_entries = port_infos
-
network_id = port['network_id']
session = db_api.get_session()
agent_active_ports = self.get_agent_network_active_port_count(
session, agent_host, network_id)
- other_fdb_entries = {network_id:
- {'segment_id': segment['segmentation_id'],
- 'network_type': segment['network_type'],
- 'ports': {agent_ip: []}}}
+ agent = self.get_agent_by_host(db_api.get_session(), agent_host)
+ segment = self._get_and_validate_segment(context, port['id'], agent)
+ agent_ip = self.get_agent_ip(agent)
+ other_fdb_entries = self._get_fdb_entries_template(
+ segment, agent_ip, port['network_id'])
if agent_active_ports == 0:
# Agent is removing its last activated port in this network,
# other agents needs to be notified to delete their flooding entry.
const.FLOODING_ENTRY)
# Notify other agents to remove fdb rules for current port
if port['device_owner'] != const.DEVICE_OWNER_DVR_INTERFACE:
- fdb_entries = port_fdb_entries
+ fdb_entries = self._get_port_fdb_entries(port)
other_fdb_entries[network_id]['ports'][agent_ip] += fdb_entries
return other_fdb_entries
+
+ @classmethod
+ def _get_fdb_entries_template(cls, segment, agent_ip, network_id):
+ return {
+ network_id:
+ {'segment_id': segment['segmentation_id'],
+ 'network_type': segment['network_type'],
+ 'ports': {agent_ip: []}}}