]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Delete gateway conntrack state when remove external gateway
authorYi Zhao <zhaoyi@cmss.chinamobile.com>
Thu, 27 Aug 2015 07:24:21 +0000 (15:24 +0800)
committerZhao Yi <zhaoyi@cmss.chinamobile.com>
Wed, 9 Sep 2015 01:24:40 +0000 (09:24 +0800)
This fixed the problem that a gateway ip conntrack state not cleared
when user clears a router external gateway.

Change-Id: I77f22d9504430259b01366e6296a99ba1cd6a046
Closes-Bug: #1488730

neutron/agent/l3/ha_router.py
neutron/agent/l3/router_info.py
neutron/agent/linux/ip_lib.py
neutron/tests/unit/agent/l3/test_legacy_router.py

index 33d750d300d8db6aabf8f705014aa43dda4ab27e..7b94a8718f97aea06488022473851f8c0b3b4685 100644 (file)
@@ -362,10 +362,10 @@ class HaRouter(router.RouterInfo):
                                                        interface_name)
 
     def delete(self, agent):
+        super(HaRouter, self).delete(agent)
         self.destroy_state_change_monitor(self.process_monitor)
         self.ha_network_removed()
         self.disable_keepalived()
-        super(HaRouter, self).delete(agent)
 
     def process(self, agent):
         super(HaRouter, self).process(agent)
index 4c2db3655a4fdd58e89a98ff25b5f3d625850c5d..b4f917ce57823889c37f55bf4408e51a6c8bffca 100644 (file)
@@ -202,6 +202,9 @@ class RouterInfo(object):
     def remove_floating_ip(self, device, ip_cidr):
         device.delete_addr_and_conntrack_state(ip_cidr)
 
+    def remove_external_gateway_ip(self, device, ip_cidr):
+        device.delete_addr_and_conntrack_state(ip_cidr)
+
     def get_router_cidrs(self, device):
         return set([addr['cidr'] for addr in device.addr.list()])
 
@@ -538,6 +541,12 @@ class RouterInfo(object):
     def external_gateway_removed(self, ex_gw_port, interface_name):
         LOG.debug("External gateway removed: port(%s), interface(%s)",
                   ex_gw_port, interface_name)
+        device = ip_lib.IPDevice(interface_name, namespace=self.ns_name)
+        for ip_addr in ex_gw_port['fixed_ips']:
+            self.remove_external_gateway_ip(device,
+                                            common_utils.ip_to_cidr(
+                                                ip_addr['ip_address'],
+                                                ip_addr['prefixlen']))
         self.driver.unplug(interface_name,
                            bridge=self.agent_conf.external_network_bridge,
                            namespace=self.ns_name,
index dedf8d5b6e380b6c1a8798cb075272eedf497d71..bdf4e0a083ed721f78863308e9f9cc601a546823 100644 (file)
@@ -231,9 +231,10 @@ class IPDevice(SubProcessBase):
 
         This terminates any active connections through an IP.
 
-        cidr: the IP address for which state should be removed.  This can be
-            passed as a string with or without /NN.  A netaddr.IPAddress or
-            netaddr.Network representing the IP address can also be passed.
+        :param cidr: the IP address for which state should be removed.
+            This can be passed as a string with or without /NN.
+            A netaddr.IPAddress or netaddr.Network representing the IP address
+            can also be passed.
         """
         self.addr.delete(cidr)
 
index b900d9a5e5e7ef7adc087082e06888c4359e84d2..95f6bccc999a73a2a6585cae3c869d089a7ca0e0 100644 (file)
@@ -48,6 +48,15 @@ class TestBasicRouterOperations(BasicRouterTestCaseFramework):
 
         device.delete_addr_and_conntrack_state.assert_called_once_with(cidr)
 
+    def test_remove_external_gateway_ip(self):
+        ri = self._create_router(mock.MagicMock())
+        device = mock.Mock()
+        cidr = '172.16.0.0/24'
+
+        ri.remove_external_gateway_ip(device, cidr)
+
+        device.delete_addr_and_conntrack_state.assert_called_once_with(cidr)
+
 
 @mock.patch.object(ip_lib, 'send_ip_addr_adv_notif')
 class TestAddFloatingIpWithMockGarp(BasicRouterTestCaseFramework):