diff --git a/neutron/plugins/ml2/drivers/l2pop/db.py b/neutron/plugins/ml2/drivers/l2pop/db.py index e7bf92d3b9..6490028293 100644 --- a/neutron/plugins/ml2/drivers/l2pop/db.py +++ b/neutron/plugins/ml2/drivers/l2pop/db.py @@ -17,6 +17,7 @@ # @author: Francois Eleouet, Orange # @author: Mathieu Rohon, Orange +from neutron.common import constants as const from neutron.db import agents_db from neutron.db import db_base_plugin_v2 as base_db from neutron.db import models_v2 @@ -67,11 +68,14 @@ class L2populationDbMixin(base_db.CommonDbMixin): l2_const.SUPPORTED_AGENT_TYPES)) return query - def get_agent_network_port_count(self, session, agent_host, network_id): + def get_agent_network_active_port_count(self, session, agent_host, + network_id): with session.begin(subtransactions=True): query = session.query(models_v2.Port) query = query.join(ml2_models.PortBinding) query = query.filter(models_v2.Port.network_id == network_id, + models_v2.Port.status == + const.PORT_STATUS_ACTIVE, ml2_models.PortBinding.host == agent_host) return query.count() diff --git a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py index c67f0c453a..a22df7b40d 100644 --- a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py +++ b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py @@ -143,17 +143,17 @@ class L2populationMechanismDriver(api.MechanismDriver, network_id = port_context['network_id'] session = db_api.get_session() - agent_ports = self.get_agent_network_port_count(session, agent_host, - network_id) + 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: []}}} - if agent_ports == 1 or ( + if agent_active_ports == 1 or ( self.get_agent_uptime(agent) < cfg.CONF.l2pop.agent_boot_time): - # First port plugged on current agent in this network, + # First port activated on current agent in this network, # we have to provide it with the whole list of fdb entries agent_fdb_entries = {network_id: {'segment_id': segment['segmentation_id'], @@ -203,16 +203,16 @@ class L2populationMechanismDriver(api.MechanismDriver, network_id = port_context['network_id'] session = db_api.get_session() - agent_ports = self.get_agent_network_port_count(session, agent_host, - network_id) + 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: []}}} - if agent_ports == 1: - # Agent is removing its last port in this network, + if agent_active_ports == 1: + # Agent is removing its last activated port in this network, # other agents needs to be notified to delete their flooding entry. other_fdb_entries[network_id]['ports'][agent_ip].append( const.FLOODING_ENTRY) diff --git a/neutron/tests/unit/ml2/drivers/test_l2population.py b/neutron/tests/unit/ml2/drivers/test_l2population.py index 44a686e614..c02cd6b277 100644 --- a/neutron/tests/unit/ml2/drivers/test_l2population.py +++ b/neutron/tests/unit/ml2/drivers/test_l2population.py @@ -164,7 +164,8 @@ class TestL2PopulationRpcTestCase(test_plugin.NeutronDbPluginV2TestCase): {'fdb_entries': {p1['network_id']: {'ports': - {'20.0.0.1': [[p1['mac_address'], + {'20.0.0.1': [constants.FLOODING_ENTRY, + [p1['mac_address'], p1_ips[0]]]}, 'network_type': 'vxlan', 'segment_id': 1}}}, @@ -396,7 +397,8 @@ class TestL2PopulationRpcTestCase(test_plugin.NeutronDbPluginV2TestCase): {'fdb_entries': {p1['network_id']: {'ports': - {'20.0.0.1': [[p1['mac_address'], + {'20.0.0.1': [constants.FLOODING_ENTRY, + [p1['mac_address'], p1_ips[0]]]}, 'network_type': 'vxlan', 'segment_id': 1}}},