diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py index 701789669e9..478d7f3669a 100644 --- a/neutron/db/l3_hamode_db.py +++ b/neutron/db/l3_hamode_db.py @@ -36,6 +36,7 @@ from neutron.common import utils as n_utils from neutron.db import agents_db from neutron.db.availability_zone import router as router_az_db from neutron.db import common_db_mixin +from neutron.db import l3_db from neutron.db import l3_dvr_db from neutron.db.l3_dvr_db import is_distributed_router from neutron.db import model_base @@ -340,6 +341,10 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin, def _create_ha_port_binding(self, context, router_id, port_id): try: with context.session.begin(): + routerportbinding = l3_db.RouterPort( + port_id=port_id, router_id=router_id, + port_type=constants.DEVICE_OWNER_ROUTER_HA_INTF) + context.session.add(routerportbinding) portbinding = L3HARouterAgentPortBinding(port_id=port_id, router_id=router_id) context.session.add(portbinding) @@ -584,6 +589,12 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin, if ha_network: self._delete_vr_id_allocation( context, ha_network, router_db.extra_attributes.ha_vr_id) + # NOTE(kevinbenton): normally the ha interfaces should have + # been automatically removed by the super delete_router call. + # However, that only applies to interfaces created after fix + # Ifd3e007aaf2a2ed8123275aa3a9f540838e3c003 which added the + # RouterPort relationship to ha interfaces. Legacy interfaces + # will be cleaned up by this. self._delete_ha_interfaces(context, router_db.id) # always attempt to cleanup the network as the router is diff --git a/neutron/tests/unit/db/test_l3_hamode_db.py b/neutron/tests/unit/db/test_l3_hamode_db.py index 60106b349c7..676d4d41080 100644 --- a/neutron/tests/unit/db/test_l3_hamode_db.py +++ b/neutron/tests/unit/db/test_l3_hamode_db.py @@ -807,6 +807,15 @@ class L3HATestCase(L3HATestFramework): self.plugin.get_number_of_agents_for_scheduling, self.admin_ctx) + def test_ha_ports_deleted_in_parent_router_removal(self): + router1 = self._create_router() + # router cleanup should no longer depend on this function for + # newly created routers. + self.plugin._delete_ha_interfaces = mock.Mock() + self.plugin.delete_router(self.admin_ctx, router1['id']) + self.assertEqual([], self.core_plugin.get_ports( + self.admin_ctx, filters={'device_id': [router1['id']]})) + def test_ha_network_deleted_if_no_ha_router_present_two_tenants(self): # Create two routers in different tenants. router1 = self._create_router()