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
This commit is contained in:
Swaminathan Vasudevan 2017-06-01 15:49:38 -07:00
parent 36926a4192
commit abe9938367
2 changed files with 42 additions and 3 deletions

View File

@ -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 +

View File

@ -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(