if not port:
return
- l3plugin = manager.NeutronManager.get_service_plugins().get(
- service_constants.L3_ROUTER_NAT)
- mac_address_updated = kwargs.get('mac_address_updated')
- update_device_up = kwargs.get('update_device_up')
- context = kwargs['context']
- if mac_address_updated or update_device_up:
- l3plugin.dvr_vmarp_table_update(context, port, "add")
if n_utils.is_dvr_serviced(port['device_owner']):
+ l3plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ context = kwargs['context']
l3plugin.dvr_update_router_addvm(context, port)
+ l3plugin.dvr_vmarp_table_update(context, port, "add")
def _notify_port_delete(event, resource, trigger, **kwargs):
if new_port and original_port:
original_device_owner = original_port.get('device_owner', '')
new_device_owner = new_port.get('device_owner', '')
+ l3plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ context = kwargs['context']
is_port_no_longer_serviced = (
n_utils.is_dvr_serviced(original_device_owner) and
not n_utils.is_dvr_serviced(new_device_owner))
original_port[portbindings.HOST_ID] !=
new_port[portbindings.HOST_ID])
if is_port_no_longer_serviced or is_port_moved:
- l3plugin = manager.NeutronManager.get_service_plugins().get(
- service_constants.L3_ROUTER_NAT)
- context = kwargs['context']
removed_routers = l3plugin.dvr_deletens_if_no_port(
context,
original_port['id'],
event, resource, trigger, **removed_router_args)
if not n_utils.is_dvr_serviced(new_device_owner):
return
-
- _notify_l3_agent_new_port(resource, event, trigger, **kwargs)
+ is_new_port_binding_changed = (
+ new_port[portbindings.HOST_ID] and
+ (original_port[portbindings.HOST_ID] !=
+ new_port[portbindings.HOST_ID]))
+ if (is_new_port_binding_changed and
+ n_utils.is_dvr_serviced(new_device_owner)):
+ l3plugin.dvr_update_router_addvm(context, new_port)
+ l3plugin.dvr_vmarp_table_update(context, new_port, "add")
+ elif kwargs.get('mac_address_updated'):
+ l3plugin.dvr_vmarp_table_update(context, new_port, "add")
def subscribe():
return_value={'L3_ROUTER_NAT': l3plugin}):
l3_dvrscheduler_db._notify_l3_agent_port_update(
'port', 'after_update', plugin, **kwargs)
+ self.assertFalse(l3plugin.dvr_vmarp_table_update.called)
+ self.assertFalse(l3plugin.dvr_update_router_addvm.called)
+ self.assertFalse(l3plugin.remove_router_from_l3_agent.called)
+ self.assertFalse(l3plugin.dvr_deletens_if_no_port.called)
+
+ def test__notify_l3_agent_new_port_action(self):
+ kwargs = {
+ 'context': self.adminContext,
+ 'original_port': None,
+ 'port': {
+ 'device_owner': DEVICE_OWNER_COMPUTE,
+ },
+ }
+ l3plugin = mock.Mock()
+ with mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}):
+ l3_dvrscheduler_db._notify_l3_agent_new_port(
+ 'port', 'after_create', mock.ANY, **kwargs)
+ l3plugin.dvr_vmarp_table_update.assert_called_once_with(
+ self.adminContext, kwargs.get('port'), 'add')
+ l3plugin.dvr_update_router_addvm.assert_called_once_with(
+ self.adminContext, kwargs.get('port'))
+
+ def test__notify_l3_agent_new_port_no_action(self):
+ kwargs = {
+ 'context': self.adminContext,
+ 'original_port': None,
+ 'port': {
+ 'device_owner': 'network:None',
+ }
+ }
+ l3plugin = mock.Mock()
+ with mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}):
+ l3_dvrscheduler_db._notify_l3_agent_new_port(
+ 'port', 'after_create', mock.ANY, **kwargs)
+ self.assertFalse(l3plugin.dvr_vmarp_table_update.called)
+ self.assertFalse(l3plugin.dvr_update_router_addvm.called)
+
+ def test__notify_l3_agent_update_port_no_action(self):
+ kwargs = {
+ 'context': self.adminContext,
+ 'original_port': {
+ portbindings.HOST_ID: 'vm-host',
+ 'device_owner': DEVICE_OWNER_COMPUTE,
+ },
+ 'port': {
+ portbindings.HOST_ID: 'vm-host',
+ 'device_owner': DEVICE_OWNER_COMPUTE,
+ },
+ }
+ l3plugin = mock.Mock()
+ with mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}):
+ l3_dvrscheduler_db._notify_l3_agent_port_update(
+ 'port', 'after_update', mock.ANY, **kwargs)
self.assertFalse(l3plugin.dvr_vmarp_table_update.called)
self.assertFalse(l3plugin.dvr_update_router_addvm.called)
self.assertFalse(l3plugin.remove_router_from_l3_agent.called)
self.assertFalse(l3plugin.dvr_deletens_if_no_port.called)
+ def test__notify_l3_agent_update_port_with_mac_address_update(self):
+ kwargs = {
+ 'context': self.adminContext,
+ 'original_port': {
+ portbindings.HOST_ID: 'vm-host',
+ 'mac_address': '02:04:05:17:18:19'
+ },
+ 'port': {
+ portbindings.HOST_ID: 'vm-host',
+ 'mac_address': '02:04:05:17:18:29'
+ },
+ 'mac_address_updated': True
+ }
+ l3plugin = mock.Mock()
+ with mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}):
+ l3_dvrscheduler_db._notify_l3_agent_port_update(
+ 'port', 'after_update', mock.ANY, **kwargs)
+
+ l3plugin.dvr_vmarp_table_update.assert_called_once_with(
+ self.adminContext, kwargs.get('port'), 'add')
+ self.assertFalse(l3plugin.dvr_update_router_addvm.called)
+
+ def test__notify_l3_agent_update_port_with_port_binding_change(self):
+ kwargs = {
+ 'context': self.adminContext,
+ 'original_port': {
+ 'id': str(uuid.uuid4()),
+ portbindings.HOST_ID: 'vm-host1',
+ 'device_owner': DEVICE_OWNER_COMPUTE,
+ },
+ 'port': {
+ portbindings.HOST_ID: 'vm-host2',
+ 'device_owner': DEVICE_OWNER_COMPUTE,
+ },
+ }
+ l3plugin = mock.Mock()
+ with mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}),\
+ mock.patch.object(l3plugin, 'dvr_deletens_if_no_port',
+ return_value=[{'agent_id': 'foo_agent',
+ 'router_id': 'foo_id'}]):
+ l3_dvrscheduler_db._notify_l3_agent_port_update(
+ 'port', 'after_update', mock.ANY, **kwargs)
+ l3plugin.remove_router_from_l3_agent.assert_called_once_with(
+ self.adminContext, 'foo_agent', 'foo_id')
+ self.assertEqual(2, l3plugin.dvr_vmarp_table_update.call_count)
+ l3plugin.dvr_update_router_addvm.assert_called_once_with(
+ self.adminContext, kwargs.get('port'))
+
def test__notify_l3_agent_update_port_removing_routers(self):
port_id = 'fake-port'
kwargs = {