]> 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, 26 May 2015 15:39:16 +0000 (15:39 +0000)
Cherry picked from 615102520c0df3952347c3e176b60c0ddc97040b

Change-Id: Ic0a3baf0e956505999d2473ae85ebac90e0970cd
Closes-Bug: 1444146

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

index 24c251340b7df0ca2819a39b436c4f1ae5b7b5aa..2d9aaf31ab9db6ec2762a482c8bc749efd2bf206 100644 (file)
@@ -1267,6 +1267,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 0804e9047d9da12a1e3dc9dc3bb8d87cbf7c132f..a99099d3e1064b2ff0f04eeaa742c82a1a930006 100644 (file)
@@ -5297,6 +5297,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."""