]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
ml2: gre, vxlan type driver can leak segment_id
authorIsaku Yamahata <isaku.yamahata@intel.com>
Thu, 12 Dec 2013 09:47:37 +0000 (18:47 +0900)
committerIsaku Yamahata <isaku.yamahata@intel.com>
Tue, 17 Dec 2013 01:10:43 +0000 (10:10 +0900)
When multiple region of segment_id is specified, segment_id can leak
(will be never reused) on deletion of network.

Change-Id: Ia27b7e2c0ff4ab58be304e54123a679a5e35ab00
Closes-Bug: #1260262

neutron/plugins/ml2/drivers/type_gre.py
neutron/plugins/ml2/drivers/type_vxlan.py
neutron/tests/unit/ml2/test_type_gre.py
neutron/tests/unit/ml2/test_type_vxlan.py

index d0a9e53073bce80c511bbfbc321e483befc14738..6c4c7eb81ec101e28910a577b70a49579565bc42 100644 (file)
@@ -120,10 +120,10 @@ class GreTypeDriver(type_tunnel.TunnelTypeDriver):
                         LOG.debug(_("Releasing gre tunnel %s to pool"),
                                   gre_id)
                         break
-                    else:
-                        session.delete(alloc)
-                        LOG.debug(_("Releasing gre tunnel %s outside pool"),
-                                  gre_id)
+                else:
+                    session.delete(alloc)
+                    LOG.debug(_("Releasing gre tunnel %s outside pool"),
+                              gre_id)
             except sa_exc.NoResultFound:
                 LOG.warning(_("gre_id %s not found"), gre_id)
 
index a5c7f1206f6d29a43da32425b656062a17d5cce5..5366215f5323ecf65687e5792ac8f3798a292ebd 100644 (file)
@@ -128,10 +128,10 @@ class VxlanTypeDriver(type_tunnel.TunnelTypeDriver):
                         LOG.debug(_("Releasing vxlan tunnel %s to pool"),
                                   vxlan_vni)
                         break
-                    else:
-                        session.delete(alloc)
-                        LOG.debug(_("Releasing vxlan tunnel %s outside pool"),
-                                  vxlan_vni)
+                else:
+                    session.delete(alloc)
+                    LOG.debug(_("Releasing vxlan tunnel %s outside pool"),
+                              vxlan_vni)
             except sa_exc.NoResultFound:
                 LOG.warning(_("vxlan_vni %s not found"), vxlan_vni)
 
index e17f337eab0e65059a57a539a055d0b2b5e1ad43..ae7056a9933e805c2f89fc579e0b2ffafff2f3e6 100644 (file)
@@ -174,3 +174,34 @@ class GreTypeTest(base.BaseTestCase):
         for endpoint in endpoints:
             self.assertIn(endpoint['ip_address'],
                           [TUNNEL_IP_ONE, TUNNEL_IP_TWO])
+
+
+class GreTypeMultiRangeTest(base.BaseTestCase):
+
+    TUN_MIN0 = 100
+    TUN_MAX0 = 101
+    TUN_MIN1 = 200
+    TUN_MAX1 = 201
+    TUNNEL_MULTI_RANGES = [(TUN_MIN0, TUN_MAX0), (TUN_MIN1, TUN_MAX1)]
+
+    def setUp(self):
+        super(GreTypeMultiRangeTest, self).setUp()
+        ml2_db.initialize()
+        self.driver = type_gre.GreTypeDriver()
+        self.driver.gre_id_ranges = self.TUNNEL_MULTI_RANGES
+        self.driver._sync_gre_allocations()
+        self.session = db.get_session()
+        self.addCleanup(db.clear_db)
+
+    def test_release_segment(self):
+        segments = [self.driver.allocate_tenant_segment(self.session)
+                    for i in range(4)]
+
+        # Release them in random order. No special meaning.
+        for i in (0, 2, 1, 3):
+            self.driver.release_segment(self.session, segments[i])
+
+        for key in (self.TUN_MIN0, self.TUN_MAX0,
+                    self.TUN_MIN1, self.TUN_MAX1):
+            alloc = self.driver.get_gre_allocation(self.session, key)
+            self.assertFalse(alloc.allocated)
index e3b8ffa551212e09f392e7aa4aa605c2ca4a1770..5380de421e2805f3fb423675b7d6843971333fb7 100644 (file)
@@ -194,3 +194,35 @@ class VxlanTypeTest(base.BaseTestCase):
                 self.assertEqual(VXLAN_UDP_PORT_ONE, endpoint['udp_port'])
             elif endpoint['ip_address'] == TUNNEL_IP_TWO:
                 self.assertEqual(VXLAN_UDP_PORT_TWO, endpoint['udp_port'])
+
+
+class VxlanTypeMultiRangeTest(base.BaseTestCase):
+
+    TUN_MIN0 = 100
+    TUN_MAX0 = 101
+    TUN_MIN1 = 200
+    TUN_MAX1 = 201
+    TUNNEL_MULTI_RANGES = [(TUN_MIN0, TUN_MAX0), (TUN_MIN1, TUN_MAX1)]
+
+    def setUp(self):
+        super(VxlanTypeMultiRangeTest, self).setUp()
+        ml2_db.initialize()
+        self.driver = type_vxlan.VxlanTypeDriver()
+        self.driver.vxlan_vni_ranges = self.TUNNEL_MULTI_RANGES
+        self.driver._sync_vxlan_allocations()
+        self.session = db.get_session()
+        self.addCleanup(cfg.CONF.reset)
+        self.addCleanup(db.clear_db)
+
+    def test_release_segment(self):
+        segments = [self.driver.allocate_tenant_segment(self.session)
+                    for i in range(4)]
+
+        # Release them in random order. No special meaning.
+        for i in (0, 2, 1, 3):
+            self.driver.release_segment(self.session, segments[i])
+
+        for key in (self.TUN_MIN0, self.TUN_MAX0,
+                    self.TUN_MIN1, self.TUN_MAX1):
+            alloc = self.driver.get_vxlan_allocation(self.session, key)
+            self.assertFalse(alloc.allocated)