From: Édouard Thuleau Date: Tue, 24 Dec 2013 10:48:46 +0000 (+0100) Subject: [ML2] l2-pop MD handle multi create/delete ports X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=7e91362dbb974df5ee44d346e1d0971479510d4b;p=openstack-build%2Fneutron-build.git [ML2] l2-pop MD handle multi create/delete ports If more than one port is added or removed simultaneously, port db entry have status BUILD or DOWN and pass to ACTIVE when agent have finish to configured it. l2-pop mechanism driver use events port pass to ACTIVE or DOWN to send fdb entries. In case of port is the first or the last network port on an agent, the flooding entry need to be add or removed. This patch fix the method to determine how many ports are active on a agent by adding filter on status port to be ACTIVE. Closes-bug: #1263881 Change-Id: I9c1f8bd69dee37bc01a5d42327aa5f737998c5aa --- diff --git a/neutron/plugins/ml2/drivers/l2pop/db.py b/neutron/plugins/ml2/drivers/l2pop/db.py index e7bf92d3b..649002829 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 c67f0c453..a22df7b40 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 44a686e61..c02cd6b27 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}}},