from oslo_serialization import jsonutils
from oslo_utils import timeutils
-from sqlalchemy import sql
from neutron.common import constants as const
from neutron.db import agents_db
l2_const.SUPPORTED_AGENT_TYPES))
return query.first()
- def get_network_ports(self, session, network_id):
+ def _get_active_network_ports(self, session, network_id):
with session.begin(subtransactions=True):
query = session.query(ml2_models.PortBinding,
agents_db.Agent)
ml2_models.PortBinding.host)
query = query.join(models_v2.Port)
query = query.filter(models_v2.Port.network_id == network_id,
- models_v2.Port.admin_state_up == sql.true(),
+ models_v2.Port.status ==
+ const.PORT_STATUS_ACTIVE,
agents_db.Agent.agent_type.in_(
l2_const.SUPPORTED_AGENT_TYPES))
return query
- def get_nondvr_network_ports(self, session, network_id):
- query = self.get_network_ports(session, network_id)
+ def get_nondvr_active_network_ports(self, session, network_id):
+ query = self._get_active_network_ports(session, network_id)
return query.filter(models_v2.Port.device_owner !=
const.DEVICE_OWNER_DVR_INTERFACE)
- def get_dvr_network_ports(self, session, network_id):
+ def get_dvr_active_network_ports(self, session, network_id):
with session.begin(subtransactions=True):
query = session.query(ml2_models.DVRPortBinding,
agents_db.Agent)
ml2_models.DVRPortBinding.host)
query = query.join(models_v2.Port)
query = query.filter(models_v2.Port.network_id == network_id,
- models_v2.Port.admin_state_up == sql.true(),
+ models_v2.Port.status ==
+ const.PORT_STATUS_ACTIVE,
models_v2.Port.device_owner ==
const.DEVICE_OWNER_DVR_INTERFACE,
agents_db.Agent.agent_type.in_(
self.mock_fanout.assert_called_with(
mock.ANY, 'add_fdb_entries', expected)
+ def test_fdb_called_for_active_ports(self):
+ self._register_ml2_agents()
+
+ with self.subnet(network=self._network) as subnet:
+ host_arg = {portbindings.HOST_ID: HOST}
+ with self.port(subnet=subnet,
+ device_owner=DEVICE_OWNER_COMPUTE,
+ arg_list=(portbindings.HOST_ID,),
+ **host_arg) as port1:
+ host_arg = {portbindings.HOST_ID: HOST + '_2'}
+ with self.port(subnet=subnet,
+ device_owner=DEVICE_OWNER_COMPUTE,
+ arg_list=(portbindings.HOST_ID,),
+ **host_arg):
+ p1 = port1['port']
+
+ device1 = 'tap' + p1['id']
+
+ self.mock_cast.reset_mock()
+ self.mock_fanout.reset_mock()
+ self.callbacks.update_device_up(self.adminContext,
+ agent_id=HOST,
+ device=device1)
+
+ p1_ips = [p['ip_address'] for p in p1['fixed_ips']]
+
+ self.assertFalse(self.mock_cast.called)
+
+ expected2 = {p1['network_id']:
+ {'ports':
+ {'20.0.0.1': [constants.FLOODING_ENTRY,
+ l2pop_rpc.PortInfo(
+ p1['mac_address'],
+ p1_ips[0])]},
+ 'network_type': 'vxlan',
+ 'segment_id': 1}}
+
+ self.mock_fanout.assert_called_with(
+ mock.ANY, 'add_fdb_entries', expected2)
+
def test_fdb_add_two_agents(self):
self._register_ml2_agents()
p1 = port1['port']
p2 = port2['port']
- device = 'tap' + p1['id']
+ device1 = 'tap' + p1['id']
+ device2 = 'tap' + p2['id']
self.mock_cast.reset_mock()
self.mock_fanout.reset_mock()
+ self.callbacks.update_device_up(self.adminContext,
+ agent_id=HOST + '_2',
+ device=device2)
self.callbacks.update_device_up(self.adminContext,
agent_id=HOST,
- device=device)
+ device=device1)
p1_ips = [p['ip_address'] for p in p1['fixed_ips']]
p2_ips = [p['ip_address'] for p in p2['fixed_ips']]
p1 = port1['port']
p3 = port3['port']
- device = 'tap' + p3['id']
+ device1 = 'tap' + p1['id']
+ device3 = 'tap' + p3['id']
self.mock_cast.reset_mock()
self.mock_fanout.reset_mock()
+ self.callbacks.update_device_up(
+ self.adminContext, agent_id=HOST + '_2',
+ device=device1)
self.callbacks.update_device_up(
self.adminContext, agent_id=HOST,
- device=device)
+ device=device3)
p1_ips = [p['ip_address']
for p in p1['fixed_ips']]
'get_agent_ip',
side_effect=agent_ip_side_effect),
mock.patch.object(l2pop_db.L2populationDbMixin,
- 'get_nondvr_network_ports',
+ 'get_nondvr_active_network_ports',
new=fdb_network_ports_query),
mock.patch.object(l2pop_db.L2populationDbMixin,
- 'get_dvr_network_ports',
+ 'get_dvr_active_network_ports',
new=tunnel_network_ports_query)):
session = mock.Mock()
agent = mock.Mock()