[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
This commit is contained in:
Édouard Thuleau 2013-12-24 11:48:46 +01:00
parent 84aeb9a407
commit 7e91362dbb
3 changed files with 17 additions and 11 deletions

View File

@ -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()

View File

@ -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)

View File

@ -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}}},