diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py index 3e269ef458f..375043bfa1a 100644 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@ -371,6 +371,11 @@ class DVRResourceOperationHandler(object): # to clean up the fip namespace as it is no longer required. self.l3plugin.l3_rpc_notifier.delete_fipnamespace_for_ext_net( payload.context, network_id) + # Delete the Floating IP agent gateway port + # bindings on all hosts + l3_obj.DvrFipGatewayPortAgentBinding.delete_objects( + payload.context, + network_id=network_id) def _delete_fip_agent_port(self, context, network_id, host_id): try: diff --git a/neutron/tests/unit/db/test_l3_dvr_db.py b/neutron/tests/unit/db/test_l3_dvr_db.py index 78d713a7a9e..063bbd64a36 100644 --- a/neutron/tests/unit/db/test_l3_dvr_db.py +++ b/neutron/tests/unit/db/test_l3_dvr_db.py @@ -1344,3 +1344,27 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): self.assertRaises( exceptions.BadRequest, self.mixin._get_assoc_data, self.ctx, mock.ANY, mock.Mock()) + + def test__delete_dvr_internal_ports(self): + payload = mock.Mock() + payload.context = mock.Mock() + payload.latest_state = {'distributed': True} + payload.metadata = {'new_network_id': 'fake-net-1', + 'network_id': 'fake-net-2'} + plugin = mock.Mock() + directory.add_plugin(plugin_constants.CORE, plugin) + plugin.get_ports.return_value = [] + with mock.patch.object(self.mixin, + 'delete_floatingip_agent_gateway_port') as \ + del_port, \ + mock.patch.object( + self.mixin.l3_rpc_notifier, + 'delete_fipnamespace_for_ext_net') as \ + del_fip_ns, \ + mock.patch.object(router_obj.DvrFipGatewayPortAgentBinding, + "delete_objects") as del_binding: + self.mixin._delete_dvr_internal_ports( + None, None, resources.ROUTER_GATEWAY, payload) + del_port.assert_called_once() + del_fip_ns.assert_called_once() + del_binding.assert_called_once()