Merge "DVR: Cleanup ml2 dvr portbindings on migration"

This commit is contained in:
Zuul
2019-08-30 11:27:35 +00:00
committed by Gerrit Code Review
3 changed files with 46 additions and 0 deletions

View File

@@ -186,6 +186,19 @@ class DVRResourceOperationHandler(object):
payload.context, payload.desired_state,
'distributed', migrating_to_distributed)
@registry.receives(resources.ROUTER, [events.AFTER_UPDATE],
priority_group.PRIORITY_ROUTER_EXTENDED_ATTRIBUTE)
def _delete_distributed_port_bindings_after_change(self, resource, event,
trigger, context,
router_id, router,
request_attrs,
router_db, **kwargs):
old_router = kwargs['old_router']
if (old_router and old_router['distributed'] and not
router['distributed']):
self._core_plugin.delete_distributed_port_bindings_by_router_id(
context.elevated(), router_db['id'])
@registry.receives(resources.ROUTER, [events.AFTER_UPDATE],
priority_group.PRIORITY_ROUTER_EXTENDED_ATTRIBUTE)
def _delete_snat_interfaces_after_change(self, resource, event, trigger,

View File

@@ -1811,6 +1811,13 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# merge into session to reflect changes
binding.persist_state_to_session(plugin_context.session)
def delete_distributed_port_bindings_by_router_id(self, context,
router_id):
for binding in (context.session.query(models.DistributedPortBinding).
filter_by(router_id=router_id)):
db.clear_binding_levels(context, binding.port_id, binding.host)
context.session.delete(binding)
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def update_distributed_port_binding(self, context, id, port):

View File

@@ -224,6 +224,32 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):
self.assertEqual(1,
self.mixin._migrate_router_ports.call_count)
def test_update_router_db_distributed_to_centralized(self):
router = {'name': 'foo_router', 'admin_state_up': True,
'distributed': True}
agent = {'id': _uuid(), 'host': 'xyz'}
router_db = self._create_router(router)
router_id = router_db['id']
self.assertTrue(router_db.extra_attributes.distributed)
self.mixin._get_router = mock.Mock(return_value=router_db)
self.mixin._validate_router_migration = mock.Mock()
self.mixin._migrate_router_ports = mock.Mock()
self.mixin._core_plugin.\
delete_distributed_port_bindings_by_router_id = mock.Mock()
self.mixin.list_l3_agents_hosting_router = mock.Mock(
return_value={'agents': [agent]})
self.mixin._unbind_router = mock.Mock()
updated_router = self.mixin.update_router(self.ctx, router_id,
{'router': {'distributed': False}})
# Assert that the DB value has changed
self.assertFalse(updated_router['distributed'])
self.assertEqual(1,
self.mixin._migrate_router_ports.call_count)
self.assertEqual(
1,
self.mixin._core_plugin.
delete_distributed_port_bindings_by_router_id.call_count)
def _test_get_device_owner(self, is_distributed=False,
expected=const.DEVICE_OWNER_ROUTER_INTF,
pass_router_id=True):