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/functional/agent/l3/test_dvr_router.py

Closes-Bug: #1819160
Change-Id: I1216d96af40449ec16a852cc1f6c4f15c85f4546
(cherry picked from commit c69a87405a)
(cherry picked from commit 2c5957f56d)
(cherry picked from commit c50bdf2329)
(cherry picked from commit 7b2a8f795f)
This commit is contained in:
LIU Yulong 2019-03-09 11:59:54 +08:00 committed by Slawek Kaplonski
parent 9e8ea8edbc
commit 26f6d5fd73
3 changed files with 57 additions and 18 deletions

View File

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

View File

@ -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 = []
@ -133,9 +134,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

View File

@ -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
@ -1283,14 +1285,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'])
@ -1323,7 +1329,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,
@ -1332,7 +1339,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
@ -1471,18 +1480,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)
@ -1496,12 +1513,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)
@ -1518,22 +1541,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()