Add/rm centralized fips for DVR+HA from standby node

For DVR+HA:
When adding/removing a centralized fip, just add/remove it to/from
keepalived instance and do not check if it is a master router.

When adding a centralized fip, it is still needed to invoke method
of supperclass to configure nat rules on master node.

When removing a centralized fip, it is still needed to invoke method
of supperclass to clean contrack on master node.

Change-Id: I202db59acb7fb0b7924748cf7def2879a748e56a
Closes-Bug: #1736068
(cherry picked from commit 2200b1c369)
This commit is contained in:
zhsun 2017-12-06 08:53:55 +08:00 committed by Slawek Kaplonski
parent 34dbb5fb66
commit 5e967131ee
2 changed files with 65 additions and 4 deletions

View File

@ -58,16 +58,18 @@ class DvrEdgeHaRouter(dvr_edge_router.DvrEdgeRouter,
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(
interface_name = self.get_snat_external_device_interface_name(
self.get_ex_gw_port())
self._add_vip(fip_cidr, interface_name)
self._add_vip(fip_cidr, interface_name)
if self.is_router_master():
return super(DvrEdgeHaRouter, self).add_centralized_floatingip(
fip, fip_cidr)
else:
return constants.FLOATINGIP_STATUS_ACTIVE
def remove_centralized_floatingip(self, fip_cidr):
self._remove_vip(fip_cidr)
if self.is_router_master():
self._remove_vip(fip_cidr)
super(DvrEdgeHaRouter, self).remove_centralized_floatingip(
fip_cidr)

View File

@ -20,6 +20,7 @@ from oslo_log import log
from oslo_utils import uuidutils
from neutron.agent.l3 import agent as l3_agent
from neutron.agent.l3 import dvr_edge_ha_router as dvr_edge_ha_rtr
from neutron.agent.l3 import dvr_edge_router as dvr_edge_rtr
from neutron.agent.l3 import dvr_local_router as dvr_router
from neutron.agent.l3 import link_local_allocator as lla
@ -848,3 +849,61 @@ class TestDvrRouterOperations(base.BaseTestCase):
ri)
ri._handle_router_snat_rules(ex_gw_port, interface_name)
ipv4_nat.add_rule.assert_called_once_with('snat', '-j $float-snat')
@mock.patch.object(dvr_edge_rtr.DvrEdgeRouter,
'add_centralized_floatingip')
def test_add_centralized_floatingip(self,
super_add_centralized_floatingip):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent.conf.agent_mode = lib_constants.L3_AGENT_MODE_DVR_SNAT
router = l3_test_common.prepare_router_data(num_internal_ports=2)
router['gw_port_host'] = HOSTNAME
self.mock_driver.unplug.reset_mock()
self._set_ri_kwargs(agent, router['id'], router)
fip = {'id': _uuid()}
fip_cidr = '11.22.33.44/24'
ri = dvr_edge_ha_rtr.DvrEdgeHaRouter(HOSTNAME, [], **self.ri_kwargs)
ri.is_router_master = mock.Mock(return_value=False)
ri._add_vip = mock.Mock()
interface_name = ri.get_snat_external_device_interface_name(
ri.get_ex_gw_port())
ri.add_centralized_floatingip(fip, fip_cidr)
ri._add_vip.assert_called_once_with(fip_cidr, interface_name)
super_add_centralized_floatingip.assert_not_called()
ri1 = dvr_edge_ha_rtr.DvrEdgeHaRouter(HOSTNAME, [], **self.ri_kwargs)
ri1.is_router_master = mock.Mock(return_value=True)
ri1._add_vip = mock.Mock()
interface_name = ri1.get_snat_external_device_interface_name(
ri1.get_ex_gw_port())
ri1.add_centralized_floatingip(fip, fip_cidr)
ri1._add_vip.assert_called_once_with(fip_cidr, interface_name)
super_add_centralized_floatingip.assert_called_once_with(fip,
fip_cidr)
@mock.patch.object(dvr_edge_rtr.DvrEdgeRouter,
'remove_centralized_floatingip')
def test_remove_centralized_floatingip(self,
super_remove_centralized_floatingip):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent.conf.agent_mode = lib_constants.L3_AGENT_MODE_DVR_SNAT
router = l3_test_common.prepare_router_data(num_internal_ports=2)
router['gw_port_host'] = HOSTNAME
self.mock_driver.unplug.reset_mock()
self._set_ri_kwargs(agent, router['id'], router)
fip_cidr = '11.22.33.44/24'
ri = dvr_edge_ha_rtr.DvrEdgeHaRouter(HOSTNAME, [], **self.ri_kwargs)
ri.is_router_master = mock.Mock(return_value=False)
ri._remove_vip = mock.Mock()
ri.remove_centralized_floatingip(fip_cidr)
ri._remove_vip.assert_called_once_with(fip_cidr)
super_remove_centralized_floatingip.assert_not_called()
ri1 = dvr_edge_ha_rtr.DvrEdgeHaRouter(HOSTNAME, [], **self.ri_kwargs)
ri1.is_router_master = mock.Mock(return_value=True)
ri1._remove_vip = mock.Mock()
ri1.remove_centralized_floatingip(fip_cidr)
ri1._remove_vip.assert_called_once_with(fip_cidr)
super_remove_centralized_floatingip.assert_called_once_with(fip_cidr)