]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Block subnet create with mismatched IP versions
authorRyan Tidwell <ryan.tidwell@hp.com>
Tue, 14 Apr 2015 22:53:02 +0000 (15:53 -0700)
committerCarl Baldwin <carl.baldwin@hp.com>
Tue, 21 Apr 2015 14:58:24 +0000 (14:58 +0000)
Change-Id: Ic0a3baf0e956505999d2473ae85ebac90e0970cd
Closes-Bug: 1444146

neutron/db/db_base_plugin_v2.py
neutron/tests/unit/db/test_db_base_plugin_v2.py

index 714d189e81fb84966f248c6fec5c5ca46caf1253..b2a630a31ba68c69e61d609ca8dfaf7e081d6175 100644 (file)
@@ -1243,6 +1243,15 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
 
         with context.session.begin(subtransactions=True):
             subnetpool = self._get_subnetpool(context, subnetpool_id)
+            ip_version = s.get('ip_version')
+            has_ip_version = attributes.is_attr_set(ip_version)
+            if has_ip_version and ip_version != subnetpool.ip_version:
+                args = {'req_ver': str(s['ip_version']),
+                        'pool_ver': str(subnetpool.ip_version)}
+                reason = _("Cannot allocate IPv%(req_ver)s subnet from "
+                           "IPv%(pool_ver)s subnet pool") % args
+                raise n_exc.BadRequest(resource='subnets', msg=reason)
+
             network = self._get_network(context, s["network_id"])
             allocator = subnet_alloc.SubnetAllocator(subnetpool)
             req = self._make_subnet_request(tenant_id, s, subnetpool)
index e8ef97e8fdb353e6dc107a49f152ed9e2462c57e..ad5fbaf07099bbe57f372cf0e79d46a4424308a8 100644 (file)
@@ -5249,6 +5249,21 @@ class TestSubnetPoolsV2(NeutronDbPluginV2TestCase):
             # Assert error
             self.assertEqual(res.status_int, 409)
 
+    def test_allocate_any_ipv4_subnet_ipv6_pool(self):
+        with self.network() as network:
+            sp = self._test_create_subnetpool(['2001:db8:1:2::/63'],
+                                              tenant_id=self._tenant_id,
+                                              name=self._POOL_NAME)
+
+            # Request a specific subnet allocation
+            data = {'subnet': {'network_id': network['network']['id'],
+                               'subnetpool_id': sp['subnetpool']['id'],
+                               'ip_version': 4,
+                               'tenant_id': network['network']['tenant_id']}}
+            req = self.new_create_request('subnets', data)
+            res = req.get_response(self.api)
+            self.assertEqual(res.status_int, 400)
+
 
 class DbModelTestCase(base.BaseTestCase):
     """DB model tests."""