From abe9938367f3f7cf21e5c0e42ee7b9b81b4960b0 Mon Sep 17 00:00:00 2001 From: Swaminathan Vasudevan Date: Thu, 1 Jun 2017 15:49:38 -0700 Subject: [PATCH] DVR: Fix DVR Router snat ports and gateway ports host binding issue DVR snat ports and gateway ports are not bound to any host and so we don't see the snat namespace getting created. The issue is the _build_routers_list in l3_dvr_db.py is not called due to the inheritance order. Change-Id: I56f9de31524aeef262cf2a78be3abf8487c21a12 Closes-Bug: #1695101 --- neutron/db/l3_dvr_db.py | 10 ++++-- .../l3_router/test_l3_dvr_router_plugin.py | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py index 6ae63ebad46..3189e6667fc 100644 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@ -963,10 +963,14 @@ class _DVRAgentInterfaceMixin(object): return update_port -class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, - l3_attrs_db.ExtraAttributesMixin, +# NOTE: The order in which the parent classes are inherited sometimes +# determines the functions defined in those classes to be executed. +# So any new classes that overrides a function in the parent class should +# be added before the parent class. +class L3_NAT_with_dvr_db_mixin(_DVRAgentInterfaceMixin, DVRResourceOperationHandler, - _DVRAgentInterfaceMixin): + l3_attrs_db.ExtraAttributesMixin, + l3_db.L3_NAT_db_mixin): """Mixin class to enable DVR support.""" router_device_owners = ( l3_db.L3_NAT_db_mixin.router_device_owners + diff --git a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py index 4799c370c09..ea00b8e1247 100644 --- a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py +++ b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py @@ -37,6 +37,7 @@ class L3DvrTestCaseBase(ml2_test_base.ML2TestFramework): def setUp(self): super(L3DvrTestCaseBase, self).setUp() self.l3_agent = helpers.register_l3_agent( + host="host0", agent_mode=constants.L3_AGENT_MODE_DVR_SNAT) # register OVS agents to avoid time wasted on committing # port binding failures on every port update @@ -715,6 +716,40 @@ class L3DvrTestCase(L3DvrTestCaseBase): l3_notifier.add_arp_entry.assert_has_calls( expected_calls) + def test_dvr_gateway_host_binding_is_set(self): + router = self._create_router() + private_net1 = self._make_network(self.fmt, 'net1', True) + kwargs = {'arg_list': (external_net.EXTERNAL,), + external_net.EXTERNAL: True} + ext_net = self._make_network(self.fmt, '', True, **kwargs) + self._make_subnet( + self.fmt, ext_net, '10.20.0.1', '10.20.0.0/24', + ip_version=4, enable_dhcp=True) + # Set gateway to router + self.l3_plugin._update_router_gw_info( + self.context, router['id'], + {'network_id': ext_net['network']['id']}) + private_subnet1 = self._make_subnet( + self.fmt, + private_net1, + '10.1.0.1', + cidr='10.1.0.0/24', + ip_version=4, + enable_dhcp=True) + self.l3_plugin.add_router_interface( + self.context, router['id'], + {'subnet_id': private_subnet1['subnet']['id']}) + self.l3_plugin.schedule_router(self.context, + router['id'], + candidates=[self.l3_agent]) + # Check for the gw_port_host in the router dict to make + # sure that the _build_routers_list in l3_dvr_db is called. + router_handle = ( + self.l3_plugin.list_active_sync_routers_on_active_l3_agent( + self.context, self.l3_agent['host'], [router['id']])) + self.assertEqual(self.l3_agent['host'], + router_handle[0]['gw_port_host']) + def test_allowed_address_pairs_update_arp_entry(self): HOST1 = 'host1' helpers.register_l3_agent(