Merge "Notify L2pop driver from update_device_(up|down)"

This commit is contained in:
Jenkins 2017-05-25 02:40:04 +00:00 committed by Gerrit Code Review
commit 7f94f579da
2 changed files with 34 additions and 24 deletions

View File

@ -233,8 +233,8 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
"executed concurrently. Ignoring StaleDataError.") "executed concurrently. Ignoring StaleDataError.")
return {'device': device, return {'device': device,
'exists': port_exists} 'exists': port_exists}
self.notify_ha_port_status(port_id, rpc_context, self.notify_l2pop_port_wiring(port_id, rpc_context,
n_const.PORT_STATUS_DOWN, host) n_const.PORT_STATUS_DOWN, host)
return {'device': device, return {'device': device,
'exists': port_exists} 'exists': port_exists}
@ -268,8 +268,8 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
return return
else: else:
self.update_port_status_to_active(port, rpc_context, port_id, host) self.update_port_status_to_active(port, rpc_context, port_id, host)
self.notify_ha_port_status(port_id, rpc_context, self.notify_l2pop_port_wiring(port_id, rpc_context,
n_const.PORT_STATUS_ACTIVE, host, port=port) n_const.PORT_STATUS_ACTIVE, host)
def update_port_status_to_active(self, port, rpc_context, port_id, host): def update_port_status_to_active(self, port, rpc_context, port_id, host):
plugin = directory.get_plugin() plugin = directory.get_plugin()
@ -292,29 +292,39 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
rpc_context, port['id'], resources.PORT, rpc_context, port['id'], resources.PORT,
provisioning_blocks.L2_AGENT_ENTITY) provisioning_blocks.L2_AGENT_ENTITY)
def notify_ha_port_status(self, port_id, rpc_context, def notify_l2pop_port_wiring(self, port_id, rpc_context,
status, host, port=None): status, host):
"""Notify the L2pop driver that a port has been wired/unwired.
The L2pop driver uses this notification to broadcast forwarding
entries to other agents on the same network as the port for port_id.
"""
plugin = directory.get_plugin() plugin = directory.get_plugin()
l2pop_driver = plugin.mechanism_manager.mech_drivers.get( l2pop_driver = plugin.mechanism_manager.mech_drivers.get(
'l2population') 'l2population')
if not l2pop_driver: if not l2pop_driver:
return return
if not port: port_context = plugin.get_bound_port_context(
port = ml2_db.get_port(rpc_context, port_id) rpc_context, port_id)
if not port: if not port_context:
# port deleted
return
port = port_context.current
if (status == n_const.PORT_STATUS_ACTIVE and
port[portbindings.HOST_ID] != host and
not l3_hamode_db.is_ha_router_port(rpc_context,
port['device_owner'],
port['device_id'])):
# don't setup ACTIVE forwarding entries unless bound to this
# host or if it's an HA port (which is special-cased in the
# mech driver)
return return
is_ha_port = l3_hamode_db.is_ha_router_port(rpc_context, port_context.current['status'] = status
port['device_owner'], port_context.current[portbindings.HOST_ID] = host
port['device_id']) if status == n_const.PORT_STATUS_ACTIVE:
if is_ha_port: l2pop_driver.obj.update_port_up(port_context)
port_context = plugin.get_bound_port_context( else:
rpc_context, port_id) l2pop_driver.obj.update_port_down(port_context)
port_context.current['status'] = status
port_context.current[portbindings.HOST_ID] = host
if status == n_const.PORT_STATUS_ACTIVE:
l2pop_driver.obj.update_port_up(port_context)
else:
l2pop_driver.obj.update_port_down(port_context)
def update_device_list(self, rpc_context, **kwargs): def update_device_list(self, rpc_context, **kwargs):
devices_up = [] devices_up = []

View File

@ -59,7 +59,7 @@ class RpcCallbacksTestCase(base.BaseTestCase):
} }
with mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin' with mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin'
'._device_to_port_id'),\ '._device_to_port_id'),\
mock.patch.object(self.callbacks, 'notify_ha_port_status'): mock.patch.object(self.callbacks, 'notify_l2pop_port_wiring'):
with mock.patch('neutron.db.provisioning_blocks.' with mock.patch('neutron.db.provisioning_blocks.'
'provisioning_complete') as pc: 'provisioning_complete') as pc:
self.callbacks.update_device_up(mock.Mock(), **kwargs) self.callbacks.update_device_up(mock.Mock(), **kwargs)
@ -212,7 +212,7 @@ class RpcCallbacksTestCase(base.BaseTestCase):
def _test_update_device_not_bound_to_host(self, func): def _test_update_device_not_bound_to_host(self, func):
self.plugin.port_bound_to_host.return_value = False self.plugin.port_bound_to_host.return_value = False
self.callbacks.notify_ha_port_status = mock.Mock() self.callbacks.notify_l2pop_port_wiring = mock.Mock()
self.plugin._device_to_port_id.return_value = 'fake_port_id' self.plugin._device_to_port_id.return_value = 'fake_port_id'
res = func(mock.Mock(), device='fake_device', host='fake_host') res = func(mock.Mock(), device='fake_device', host='fake_host')
self.plugin.port_bound_to_host.assert_called_once_with(mock.ANY, self.plugin.port_bound_to_host.assert_called_once_with(mock.ANY,
@ -235,7 +235,7 @@ class RpcCallbacksTestCase(base.BaseTestCase):
def test_update_device_down_call_update_port_status(self): def test_update_device_down_call_update_port_status(self):
self.plugin.update_port_status.return_value = False self.plugin.update_port_status.return_value = False
self.callbacks.notify_ha_port_status = mock.Mock() self.callbacks.notify_l2pop_port_wiring = mock.Mock()
self.plugin._device_to_port_id.return_value = 'fake_port_id' self.plugin._device_to_port_id.return_value = 'fake_port_id'
self.assertEqual( self.assertEqual(
{'device': 'fake_device', 'exists': False}, {'device': 'fake_device', 'exists': False},