diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py index 2105f83cdc6..7333aa591eb 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -649,16 +649,19 @@ class RouterInfo(object): if not self.use_ipv6: return - if not enabled: + disable_ra = not enabled + if enabled: + gateway_ips = self._get_external_gw_ips(ex_gw_port) + 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_DISABLED) - else: - 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. - self.driver.configure_ipv6_ra(ns_name, interface_name, - n_const.ACCEPT_RA_WITH_FORWARDING) 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 9cb90972e1f..413aea88f7c 100644 --- a/neutron/tests/functional/agent/l3/test_ha_router.py +++ b/neutron/tests/functional/agent/l3/test_ha_router.py @@ -98,9 +98,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_and_bind_by_default(), - "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,30 +108,44 @@ 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._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_and_bind_by_default(), + "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_and_bind_by_default(), "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._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)