From 7b2a8f795fa3986e00cb5178e9e95a90951c2be4 Mon Sep 17 00:00:00 2001 From: LIU Yulong Date: Sat, 9 Mar 2019 11:59:54 +0800 Subject: [PATCH] Give some HA router case specific resources 1. give each HA failover case an independent vrrp_id 2. give each HA port an independent IP address, so the interface IPs for router HA ports will be: 169.254.192.100 and 169.254.192.101 169.254.192.102 and 169.254.192.103 169.254.192.104 and 169.254.192.105 169.254.192.106 and 169.254.192.107 VIP of each case will be: 169.254.0.10/24 169.254.0.11/24 169.254.0.12/24 169.254.0.13/24 169.254.0.14/24 Conflicts: neutron/tests/common/l3_test_common.py Closes-Bug: #1819160 Change-Id: I1216d96af40449ec16a852cc1f6c4f15c85f4546 (cherry picked from commit c69a87405af6b632a3edd9c6fe5ee63a5bc07eb1) (cherry picked from commit 2c5957f56d46d99b8eb1e7651afcbf8fa9f426a0) (cherry picked from commit c50bdf232992f0431f15cbe7cfb9f7eaa3a9ff0c) --- neutron/agent/linux/keepalived.py | 2 + neutron/tests/common/l3_test_common.py | 9 ++- .../functional/agent/l3/test_dvr_router.py | 74 ++++++++++++++----- 3 files changed, 65 insertions(+), 20 deletions(-) diff --git a/neutron/agent/linux/keepalived.py b/neutron/agent/linux/keepalived.py index a0230eb76bf..5619cd76903 100644 --- a/neutron/agent/linux/keepalived.py +++ b/neutron/agent/linux/keepalived.py @@ -395,6 +395,8 @@ class KeepalivedManager(object): def _output_config_file(self): config_str = self.config.get_config_str() + LOG.debug("Router %s keepalived config: %s", + self.resource_id, config_str) config_path = self.get_full_config_file_path('keepalived.conf') file_utils.replace_file(config_path, config_str) diff --git a/neutron/tests/common/l3_test_common.py b/neutron/tests/common/l3_test_common.py index d67caa889f0..b23f58c5676 100644 --- a/neutron/tests/common/l3_test_common.py +++ b/neutron/tests/common/l3_test_common.py @@ -58,6 +58,7 @@ def prepare_router_data(ip_version=4, enable_snat=None, num_internal_ports=1, extra_routes=False, dual_stack=False, enable_gw=True, v6_ext_gw_with_sub=True, snat_bound_fip=False, + vrrp_id=None, **kwargs): fixed_ips = [] subnets = [] @@ -139,9 +140,13 @@ def prepare_router_data(ip_version=4, enable_snat=None, num_internal_ports=1, router_append_interface(router, count=num_internal_ports, ip_version=ip_version, dual_stack=dual_stack) if enable_ha: + ha_port_ip = kwargs.get('ha_port_ip', '169.254.192.1') + ha_port_mac = kwargs.get('ha_port_mac', '12:34:56:78:2b:aa') router['ha'] = True - router['ha_vr_id'] = 1 - router[lib_constants.HA_INTERFACE_KEY] = (get_ha_interface()) + router['ha_vr_id'] = vrrp_id or 1 + router[lib_constants.HA_INTERFACE_KEY] = ( + get_ha_interface(ip=ha_port_ip, + mac=ha_port_mac)) if enable_snat is not None: router['enable_snat'] = enable_snat diff --git a/neutron/tests/functional/agent/l3/test_dvr_router.py b/neutron/tests/functional/agent/l3/test_dvr_router.py index 568aee554a8..83b695dfda7 100644 --- a/neutron/tests/functional/agent/l3/test_dvr_router.py +++ b/neutron/tests/functional/agent/l3/test_dvr_router.py @@ -523,6 +523,7 @@ class TestDvrRouter(framework.L3AgentTestFramework): extra_routes=False, enable_floating_ip=True, enable_centralized_fip=False, + vrrp_id=None, **kwargs): if not agent: agent = self.agent @@ -534,6 +535,7 @@ class TestDvrRouter(framework.L3AgentTestFramework): num_internal_ports=2, enable_gw=enable_gw, snat_bound_fip=snat_bound_fip, + vrrp_id=vrrp_id, **kwargs) internal_ports = router.get(lib_constants.INTERFACE_KEY, []) router['distributed'] = True @@ -1285,14 +1287,18 @@ class TestDvrRouter(framework.L3AgentTestFramework): def _mocked_dvr_ha_router(self, agent, enable_ha=True, enable_gw=True, enable_centralized_fip=False, - snat_bound_fip=False): + snat_bound_fip=False, + vrrp_id=None, + **kwargs): r_info = self.generate_dvr_router_info( enable_ha=enable_ha, enable_snat=True, agent=agent, enable_gw=enable_gw, enable_centralized_fip=enable_centralized_fip, - snat_bound_fip=snat_bound_fip) + snat_bound_fip=snat_bound_fip, + vrrp_id=vrrp_id, + **kwargs) r_snat_ns_name = namespaces.build_ns_name(dvr_snat_ns.SNAT_NS_PREFIX, r_info['id']) @@ -1325,7 +1331,8 @@ class TestDvrRouter(framework.L3AgentTestFramework): def _create_dvr_ha_router(self, agent, enable_gw=True, enable_centralized_fip=False, - snat_bound_fip=False, ha_interface=True): + snat_bound_fip=False, ha_interface=True, + vrrp_id=None, **kwargs): get_ns_name = mock.patch.object(namespaces.RouterNamespace, '_get_ns_name').start() get_snat_ns_name = mock.patch.object(dvr_snat_ns.SnatNamespace, @@ -1334,7 +1341,9 @@ class TestDvrRouter(framework.L3AgentTestFramework): mocked_r_ns_name, mocked_r_snat_ns_name) = self._mocked_dvr_ha_router( agent, ha_interface, enable_gw, enable_centralized_fip, - snat_bound_fip) + snat_bound_fip, + vrrp_id=vrrp_id, + **kwargs) if not ha_interface: r_info['ha'] = True @@ -1476,9 +1485,15 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._setup_dvr_ha_bridges() router1 = self._create_dvr_ha_router( - self.agent, enable_gw=True) + self.agent, enable_gw=True, + vrrp_id=14, + ha_port_ip="169.254.192.106", + ha_port_mac="12:34:56:78:3a:aa") router2 = self._create_dvr_ha_router( - self.failover_agent, enable_gw=True) + self.failover_agent, enable_gw=True, + vrrp_id=14, + ha_port_ip="169.254.192.107", + ha_port_mac="12:34:56:78:3a:bb") master, backup = self._get_master_and_slave_routers( router1, router2, check_external_device=False) @@ -1511,18 +1526,26 @@ class TestDvrRouter(framework.L3AgentTestFramework): def _test_dvr_ha_router_failover_with_gw_and_fip(self, enable_gw, enable_centralized_fip, - snat_bound_fip): + snat_bound_fip, + vrrp_id=None): self._setup_dvr_ha_agents() self._setup_dvr_ha_bridges() router1 = self._create_dvr_ha_router( self.agent, enable_gw=enable_gw, enable_centralized_fip=enable_centralized_fip, - snat_bound_fip=snat_bound_fip) + snat_bound_fip=snat_bound_fip, + vrrp_id=vrrp_id, + ha_port_ip="169.254.192.100", + ha_port_mac="12:34:56:78:2b:aa") router2 = self._create_dvr_ha_router( self.failover_agent, enable_gw=enable_gw, enable_centralized_fip=enable_centralized_fip, - snat_bound_fip=snat_bound_fip) + snat_bound_fip=snat_bound_fip, + vrrp_id=vrrp_id, + ha_port_ip="169.254.192.101", + ha_port_mac="12:34:56:78:2b:bb") + master, backup = self._get_master_and_slave_routers( router1, router2, check_external_device=False) @@ -1536,12 +1559,18 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(backup) self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(master) - def _test_dvr_ha_router_failover(self, enable_gw): + def _test_dvr_ha_router_failover(self, enable_gw, vrrp_id=None): self._setup_dvr_ha_agents() self._setup_dvr_ha_bridges() - router1 = self._create_dvr_ha_router(self.agent, enable_gw=enable_gw) - router2 = self._create_dvr_ha_router(self.failover_agent, enable_gw) + router1 = self._create_dvr_ha_router( + self.agent, enable_gw=enable_gw, vrrp_id=vrrp_id, + ha_port_ip="169.254.192.102", + ha_port_mac="12:34:56:78:2b:cc") + router2 = self._create_dvr_ha_router( + self.failover_agent, enable_gw, vrrp_id=vrrp_id, + ha_port_ip="169.254.192.103", + ha_port_mac="12:34:56:78:2b:dd") master, backup = self._get_master_and_slave_routers( router1, router2, check_external_device=False) @@ -1558,22 +1587,31 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(master) def test_dvr_ha_router_failover_with_gw(self): - self._test_dvr_ha_router_failover(enable_gw=True) + self._test_dvr_ha_router_failover(enable_gw=True, vrrp_id=10) def test_dvr_ha_router_failover_with_gw_and_floatingip(self): self._test_dvr_ha_router_failover_with_gw_and_fip( - enable_gw=True, enable_centralized_fip=True, snat_bound_fip=True) + enable_gw=True, enable_centralized_fip=True, snat_bound_fip=True, + vrrp_id=11) def test_dvr_ha_router_failover_without_gw(self): - self._test_dvr_ha_router_failover(enable_gw=False) + self._test_dvr_ha_router_failover(enable_gw=False, vrrp_id=12) def test_dvr_non_ha_router_update(self): self._setup_dvr_ha_agents() self._setup_dvr_ha_bridges() - router1 = self._create_dvr_ha_router(self.agent) - router2 = self._create_dvr_ha_router(self.failover_agent, - ha_interface=False) + router1 = self._create_dvr_ha_router( + self.agent, + vrrp_id=13, + ha_port_ip="169.254.192.104", + ha_port_mac="12:34:56:78:2b:ee") + router2 = self._create_dvr_ha_router( + self.failover_agent, + ha_interface=False, + vrrp_id=13, + ha_port_ip="169.254.192.105", + ha_port_mac="12:34:56:78:2b:ff") r1_chsfr = mock.patch.object(self.agent, 'check_ha_state_for_router').start()