DVR: Fix centralized floatingip with DVR and HA
When HA is enabled with DVR routers the centralized floating IPs are not configured properly in the DVR snat namespace for the master router namespace. The reason is we were not calling the add_centralized_floatingip and the remove_centralized_floatingip in the DvrEdgeHaRouter class. This patch overrides the add_centralized_floatingip and remove_centralized_floatingip in dvr_edge_ha_router.py file to add the cidr to the vips. Closes-Bug: #1716829 Change-Id: Icc8c5d4e22313448e2066a29dbe509e4345b364c
This commit is contained in:
parent
99babf1a5e
commit
b9ecb3804c
|
@ -57,6 +57,20 @@ class DvrEdgeHaRouter(dvr_edge_router.DvrEdgeRouter,
|
|||
self._get_snat_int_device_name,
|
||||
constants.SNAT_INT_DEV_PREFIX)
|
||||
|
||||
def add_centralized_floatingip(self, fip, fip_cidr):
|
||||
if self.is_router_master():
|
||||
interface_name = self.get_snat_external_device_interface_name(
|
||||
self.get_ex_gw_port())
|
||||
self._add_vip(fip_cidr, interface_name)
|
||||
return super(DvrEdgeHaRouter, self).add_centralized_floatingip(
|
||||
fip, fip_cidr)
|
||||
|
||||
def remove_centralized_floatingip(self, fip_cidr):
|
||||
if self.is_router_master():
|
||||
self._remove_vip(fip_cidr)
|
||||
super(DvrEdgeHaRouter, self).remove_centralized_floatingip(
|
||||
fip_cidr)
|
||||
|
||||
def external_gateway_added(self, ex_gw_port, interface_name):
|
||||
super(DvrEdgeHaRouter, self).external_gateway_added(
|
||||
ex_gw_port, interface_name)
|
||||
|
|
|
@ -618,6 +618,12 @@ class L3AgentTestFramework(base.BaseSudoTestCase):
|
|||
self.assertEqual(
|
||||
[], self._get_addresses_on_device(namespace, interface))
|
||||
|
||||
def _assert_ip_addresses_on_interface(self,
|
||||
namespace, interface, ip_addresses):
|
||||
for ip_address in ip_addresses:
|
||||
self._assert_ip_address_on_interface(namespace, interface,
|
||||
ip_address)
|
||||
|
||||
def _assert_ip_address_on_interface(self,
|
||||
namespace, interface, ip_address):
|
||||
self.assertIn(
|
||||
|
|
|
@ -1089,11 +1089,16 @@ class TestDvrRouter(framework.L3AgentTestFramework):
|
|||
self.assertFalse(sg_device)
|
||||
self.assertTrue(qg_device)
|
||||
|
||||
def _mocked_dvr_ha_router(self, agent, enable_gw=True):
|
||||
r_info = self.generate_dvr_router_info(enable_ha=True,
|
||||
enable_snat=True,
|
||||
agent=agent,
|
||||
enable_gw=enable_gw)
|
||||
def _mocked_dvr_ha_router(self, agent, enable_gw=True,
|
||||
enable_centralized_fip=False,
|
||||
snat_bound_fip=False):
|
||||
r_info = self.generate_dvr_router_info(
|
||||
enable_ha=True,
|
||||
enable_snat=True,
|
||||
agent=agent,
|
||||
enable_gw=enable_gw,
|
||||
enable_centralized_fip=enable_centralized_fip,
|
||||
snat_bound_fip=snat_bound_fip)
|
||||
|
||||
r_snat_ns_name = namespaces.build_ns_name(dvr_snat_ns.SNAT_NS_PREFIX,
|
||||
r_info['id'])
|
||||
|
@ -1122,19 +1127,71 @@ class TestDvrRouter(framework.L3AgentTestFramework):
|
|||
br_int_1.add_port(veth1.name)
|
||||
br_int_2.add_port(veth2.name)
|
||||
|
||||
def _create_dvr_ha_router(self, agent, enable_gw=True):
|
||||
def _create_dvr_ha_router(self, agent, enable_gw=True,
|
||||
enable_centralized_fip=False,
|
||||
snat_bound_fip=False):
|
||||
get_ns_name = mock.patch.object(namespaces.RouterNamespace,
|
||||
'_get_ns_name').start()
|
||||
get_snat_ns_name = mock.patch.object(dvr_snat_ns.SnatNamespace,
|
||||
'get_snat_ns_name').start()
|
||||
(r_info,
|
||||
mocked_r_ns_name,
|
||||
mocked_r_snat_ns_name) = self._mocked_dvr_ha_router(agent, enable_gw)
|
||||
mocked_r_snat_ns_name) = self._mocked_dvr_ha_router(
|
||||
agent, enable_gw, enable_centralized_fip, snat_bound_fip)
|
||||
|
||||
get_ns_name.return_value = mocked_r_ns_name
|
||||
get_snat_ns_name.return_value = mocked_r_snat_ns_name
|
||||
router = self.manage_router(agent, r_info)
|
||||
return router
|
||||
|
||||
def _assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(self, router):
|
||||
namespace = router.ha_namespace
|
||||
ex_gw_port = router.get_ex_gw_port()
|
||||
snat_ports = router.get_snat_interfaces()
|
||||
if not snat_ports:
|
||||
return
|
||||
if router.is_router_master():
|
||||
centralized_floatingips = (
|
||||
router.router[lib_constants.FLOATINGIP_KEY])
|
||||
for fip in centralized_floatingips:
|
||||
expected_rules = router.floating_forward_rules(fip)
|
||||
self.assertFalse(self._assert_iptables_rules_exist(
|
||||
router.snat_iptables_manager, 'nat', expected_rules))
|
||||
|
||||
snat_port = snat_ports[0]
|
||||
ex_gw_port_name = router.get_external_device_name(
|
||||
ex_gw_port['id'])
|
||||
snat_port_name = router._get_snat_int_device_name(
|
||||
snat_port['id'])
|
||||
|
||||
ex_gw_port_cidrs = utils.fixed_ip_cidrs(ex_gw_port["fixed_ips"])
|
||||
snat_port_cidrs = utils.fixed_ip_cidrs(snat_port["fixed_ips"])
|
||||
|
||||
self._assert_ip_addresses_on_interface(namespace,
|
||||
ex_gw_port_name,
|
||||
ex_gw_port_cidrs)
|
||||
self._assert_ip_addresses_on_interface(namespace,
|
||||
snat_port_name,
|
||||
snat_port_cidrs)
|
||||
|
||||
def _assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(self,
|
||||
router):
|
||||
namespace = router.ha_namespace
|
||||
ex_gw_port = router.get_ex_gw_port()
|
||||
snat_ports = router.get_snat_interfaces()
|
||||
if not snat_ports:
|
||||
return
|
||||
snat_port = snat_ports[0]
|
||||
ex_gw_port_name = router.get_external_device_name(
|
||||
ex_gw_port['id'])
|
||||
snat_port_name = router._get_snat_int_device_name(
|
||||
snat_port['id'])
|
||||
|
||||
self._assert_no_ip_addresses_on_interface(namespace,
|
||||
snat_port_name)
|
||||
self._assert_no_ip_addresses_on_interface(namespace,
|
||||
ex_gw_port_name)
|
||||
|
||||
def _assert_ip_addresses_in_dvr_ha_snat_namespace(self, router):
|
||||
namespace = router.ha_namespace
|
||||
ex_gw_port = router.get_ex_gw_port()
|
||||
|
@ -1180,6 +1237,33 @@ class TestDvrRouter(framework.L3AgentTestFramework):
|
|||
self._assert_no_ip_addresses_on_interface(namespace,
|
||||
ex_gw_port_name)
|
||||
|
||||
def _test_dvr_ha_router_failover_with_gw_and_fip(self, enable_gw,
|
||||
enable_centralized_fip,
|
||||
snat_bound_fip):
|
||||
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)
|
||||
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)
|
||||
utils.wait_until_true(lambda: router1.ha_state == 'master')
|
||||
utils.wait_until_true(lambda: router2.ha_state == 'backup')
|
||||
|
||||
self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router1)
|
||||
self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router2)
|
||||
self.fail_ha_router(router1)
|
||||
|
||||
utils.wait_until_true(lambda: router2.ha_state == 'master')
|
||||
utils.wait_until_true(lambda: router1.ha_state == 'backup')
|
||||
|
||||
self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router2)
|
||||
self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router1)
|
||||
|
||||
def _test_dvr_ha_router_failover(self, enable_gw):
|
||||
self._setup_dvr_ha_agents()
|
||||
self._setup_dvr_ha_bridges()
|
||||
|
@ -1204,6 +1288,10 @@ class TestDvrRouter(framework.L3AgentTestFramework):
|
|||
def test_dvr_ha_router_failover_with_gw(self):
|
||||
self._test_dvr_ha_router_failover(enable_gw=True)
|
||||
|
||||
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)
|
||||
|
||||
def test_dvr_ha_router_failover_without_gw(self):
|
||||
self._test_dvr_ha_router_failover(enable_gw=False)
|
||||
|
||||
|
|
Loading…
Reference in New Issue