26
27
from neutron.extensions import portbindings
27
28
from neutron.extensions import providernet as pnet
28
29
from neutron import manager
30
from neutron.plugins.ml2.common import exceptions as ml2_exc
31
from neutron.plugins.ml2 import driver_context
29
32
from neutron.plugins.ml2.drivers.l2pop import db as l2pop_db
30
33
from neutron.plugins.ml2.drivers.l2pop import mech_driver as l2pop_mech_driver
31
34
from neutron.plugins.ml2.drivers.l2pop import rpc as l2pop_rpc
83
'binary': 'neutron-ofagent-agent',
86
'binary': 'neutron-fake-agent',
84
87
'host': HOST + '_5',
85
88
'topic': constants.L2_AGENT_TOPIC,
86
89
'configurations': {'tunneling_ip': '20.0.0.5',
87
90
'tunnel_types': [],
88
91
'interface_mappings': {'physnet1': 'eth9'},
89
92
'l2pop_network_types': ['vlan']},
93
# NOTE(yamamoto): mech_fake_agent has a comment to explain why
90
95
'agent_type': constants.AGENT_TYPE_OFA,
99
104
class TestL2PopulationRpcTestCase(test_plugin.Ml2PluginV2TestCase):
100
_mechanism_drivers = ['openvswitch', 'ofagent', 'l2population']
105
_mechanism_drivers = ['openvswitch', 'fake_agent', 'l2population']
103
108
super(TestL2PopulationRpcTestCase, self).setUp()
303
308
self.mock_fanout.assert_called_with(
304
309
mock.ANY, 'add_fdb_entries', expected)
311
def test_fdb_called_for_active_ports(self):
312
self._register_ml2_agents()
314
with self.subnet(network=self._network) as subnet:
315
host_arg = {portbindings.HOST_ID: HOST}
316
with self.port(subnet=subnet,
317
device_owner=DEVICE_OWNER_COMPUTE,
318
arg_list=(portbindings.HOST_ID,),
319
**host_arg) as port1:
320
host_arg = {portbindings.HOST_ID: HOST + '_2'}
321
with self.port(subnet=subnet,
322
device_owner=DEVICE_OWNER_COMPUTE,
323
arg_list=(portbindings.HOST_ID,),
327
device1 = 'tap' + p1['id']
329
self.mock_cast.reset_mock()
330
self.mock_fanout.reset_mock()
331
self.callbacks.update_device_up(self.adminContext,
335
p1_ips = [p['ip_address'] for p in p1['fixed_ips']]
337
self.assertFalse(self.mock_cast.called)
339
expected2 = {p1['network_id']:
341
{'20.0.0.1': [constants.FLOODING_ENTRY,
345
'network_type': 'vxlan',
348
self.mock_fanout.assert_called_with(
349
mock.ANY, 'add_fdb_entries', expected2)
306
351
def test_fdb_add_two_agents(self):
307
352
self._register_ml2_agents()
323
368
p1 = port1['port']
324
369
p2 = port2['port']
326
device = 'tap' + p1['id']
371
device1 = 'tap' + p1['id']
372
device2 = 'tap' + p2['id']
328
374
self.mock_cast.reset_mock()
329
375
self.mock_fanout.reset_mock()
330
376
self.callbacks.update_device_up(self.adminContext,
377
agent_id=HOST + '_2',
379
self.callbacks.update_device_up(self.adminContext,
334
383
p1_ips = [p['ip_address'] for p in p1['fixed_ips']]
335
384
p2_ips = [p['ip_address'] for p in p2['fixed_ips']]
381
430
p1 = port1['port']
382
431
p3 = port3['port']
384
device = 'tap' + p3['id']
433
device1 = 'tap' + p1['id']
434
device3 = 'tap' + p3['id']
386
436
self.mock_cast.reset_mock()
387
437
self.mock_fanout.reset_mock()
388
438
self.callbacks.update_device_up(
439
self.adminContext, agent_id=HOST + '_2',
441
self.callbacks.update_device_up(
389
442
self.adminContext, agent_id=HOST,
392
445
p1_ips = [p['ip_address']
393
446
for p in p1['fixed_ips']]
887
940
side_effect=agent_ip_side_effect),
888
941
mock.patch.object(l2pop_db.L2populationDbMixin,
889
'get_nondvr_network_ports',
942
'get_nondvr_active_network_ports',
890
943
new=fdb_network_ports_query),
891
944
mock.patch.object(l2pop_db.L2populationDbMixin,
892
'get_dvr_network_ports',
945
'get_dvr_active_network_ports',
893
946
new=tunnel_network_ports_query)):
894
947
session = mock.Mock()
895
948
agent = mock.Mock()
947
1000
[constants.FLOODING_ENTRY]}}
948
1001
self.assertEqual(expected_result, result)
1003
def test_update_port_postcommit_mac_address_changed_raises(self):
1004
port = {'status': u'ACTIVE',
1005
'device_owner': u'compute:None',
1006
'mac_address': u'12:34:56:78:4b:0e',
1009
original_port = port.copy()
1010
original_port['mac_address'] = u'12:34:56:78:4b:0f'
1012
with mock.patch.object(driver_context.db, 'get_network_segments'):
1013
ctx = driver_context.PortContext(mock.Mock(),
1019
original_port=original_port)
1021
mech_driver = l2pop_mech_driver.L2populationMechanismDriver()
1022
with testtools.ExpectedException(ml2_exc.MechanismDriverError):
1023
mech_driver.update_port_postcommit(ctx)