summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Alvarez <dalvarez@redhat.com>2017-04-28 16:35:57 +0200
committerIhar Hrachyshka <ihrachys@redhat.com>2017-07-31 17:03:57 +0000
commit8f866dea74774801175d739dc9c2d1a7c245b18e (patch)
tree77455e58d79b8b0d08ac21e3e9d1c1f123053473
parent8339a78eee7104c413f6918d4ba1a76290ab5e24 (diff)
downloadneutron-8f866dea74774801175d739dc9c2d1a7c245b18e.tar.gz
Fix: set IPv6 forwarding when there's an IPv6 gw
Currently when there is an IPv6 gateway set, IPv6 forwarding configuration is skipped. This patch fixes it and also adds test coverage to check the values of `accept_ra` and `forwarding` with and without an IPv6 gateway. Related-bug: #1667756 Conflicts: neutron/tests/functional/agent/l3/test_ha_router.py Change-Id: I0297aa6d0afeb56a8c69be41424d4b70509377d2 (cherry picked from commit a0cf9c285970cc7e419db4dda1e070cb2d23ab36)
-rw-r--r--neutron/agent/l3/router_info.py19
-rw-r--r--neutron/tests/functional/agent/l3/test_ha_router.py52
2 files changed, 44 insertions, 27 deletions
diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py
index 73578124be..8004df8a4d 100644
--- a/neutron/agent/l3/router_info.py
+++ b/neutron/agent/l3/router_info.py
@@ -646,16 +646,19 @@ class RouterInfo(object):
if not self.use_ipv6:
return
- if not enabled:
- self.driver.configure_ipv6_ra(ns_name, interface_name,
- n_const.ACCEPT_RA_DISABLED)
- else:
+ disable_ra = not enabled
+ if enabled:
gateway_ips = self._get_external_gw_ips(ex_gw_port)
- if self.is_v6_gateway_set(gateway_ips):
- return
- # There is no IPv6 gw_ip, use RouterAdvt for default route.
+ if not self.is_v6_gateway_set(gateway_ips):
+ # There is no IPv6 gw_ip, use RouterAdvt for default route.
+ self.driver.configure_ipv6_ra(
+ ns_name, interface_name, n_const.ACCEPT_RA_WITH_FORWARDING)
+ else:
+ # Otherwise, disable it
+ disable_ra = True
+ if disable_ra:
self.driver.configure_ipv6_ra(ns_name, interface_name,
- n_const.ACCEPT_RA_WITH_FORWARDING)
+ n_const.ACCEPT_RA_DISABLED)
self.driver.configure_ipv6_forwarding(ns_name, interface_name, enabled)
def _external_gateway_added(self, ex_gw_port, interface_name,
diff --git a/neutron/tests/functional/agent/l3/test_ha_router.py b/neutron/tests/functional/agent/l3/test_ha_router.py
index 7008c3ab6b..54d64bac39 100644
--- a/neutron/tests/functional/agent/l3/test_ha_router.py
+++ b/neutron/tests/functional/agent/l3/test_ha_router.py
@@ -99,8 +99,9 @@ class L3HATestCase(framework.L3AgentTestFramework):
self._router_lifecycle(enable_ha=True, dual_stack=True,
v6_ext_gw_with_sub=False)
- @testtools.skipUnless(ipv6_utils.is_enabled(), "IPv6 is not enabled")
- def test_ipv6_router_advts_and_fwd_after_router_state_change_master(self):
+ def _test_ipv6_router_advts_and_fwd_helper(self, state, enable_v6_gw,
+ expected_ra,
+ expected_forwarding):
# Schedule router to l3 agent, and then add router gateway. Verify
# that router gw interface is configured to receive Router Advts and
# IPv6 forwarding is enabled.
@@ -108,29 +109,42 @@ class L3HATestCase(framework.L3AgentTestFramework):
enable_snat=True, enable_ha=True, dual_stack=True, enable_gw=False)
router = self.manage_router(self.agent, router_info)
common_utils.wait_until_true(lambda: router.ha_state == 'master')
+ if state == 'backup':
+ self.fail_ha_router(router)
+ common_utils.wait_until_true(lambda: router.ha_state == 'backup')
_ext_dev_name, ex_port = l3_test_common.prepare_ext_gw_test(
- mock.Mock(), router)
+ mock.Mock(), router, dual_stack=enable_v6_gw)
router_info['gw_port'] = ex_port
router.process(self.agent)
- self._assert_ipv6_accept_ra(router)
- self._assert_ipv6_forwarding(router)
+ self._assert_ipv6_accept_ra(router, expected_ra)
+ self._assert_ipv6_forwarding(router, expected_forwarding)
+
+ @testtools.skipUnless(ipv6_utils.is_enabled(), "IPv6 is not enabled")
+ def test_ipv6_router_advts_and_fwd_after_router_state_change_master(self):
+ # Check that RA and forwarding are enabled when there's no IPv6
+ # gateway.
+ self._test_ipv6_router_advts_and_fwd_helper('master',
+ enable_v6_gw=False,
+ expected_ra=True,
+ expected_forwarding=True)
+ # Check that RA is disabled and forwarding is enabled when an IPv6
+ # gateway is configured.
+ self._test_ipv6_router_advts_and_fwd_helper('master',
+ enable_v6_gw=True,
+ expected_ra=False,
+ expected_forwarding=True)
@testtools.skipUnless(ipv6_utils.is_enabled(), "IPv6 is not enabled")
def test_ipv6_router_advts_and_fwd_after_router_state_change_backup(self):
- # Schedule router to l3 agent, and then add router gateway. Verify
- # that router gw interface is configured to discard Router Advts and
- # IPv6 forwarding is disabled.
- router_info = l3_test_common.prepare_router_data(
- enable_snat=True, enable_ha=True, dual_stack=True, enable_gw=False)
- router = self.manage_router(self.agent, router_info)
- self.fail_ha_router(router)
- common_utils.wait_until_true(lambda: router.ha_state == 'backup')
- _ext_dev_name, ex_port = l3_test_common.prepare_ext_gw_test(
- mock.Mock(), router)
- router_info['gw_port'] = ex_port
- router.process(self.agent)
- self._assert_ipv6_accept_ra(router, False)
- self._assert_ipv6_forwarding(router, False)
+ # Check that both RA and forwarding are disabled on backup instances
+ self._test_ipv6_router_advts_and_fwd_helper('backup',
+ enable_v6_gw=False,
+ expected_ra=False,
+ expected_forwarding=False)
+ self._test_ipv6_router_advts_and_fwd_helper('backup',
+ enable_v6_gw=True,
+ expected_ra=False,
+ expected_forwarding=False)
def test_keepalived_configuration(self):
router_info = self.generate_router_info(enable_ha=True)