]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
IP subnet validation fixes
authorJeremy Hanmer <jeremy@dreamhost.com>
Thu, 18 Oct 2012 23:26:41 +0000 (16:26 -0700)
committerJeremy Hanmer <jeremy@dreamhost.com>
Fri, 19 Oct 2012 21:24:57 +0000 (14:24 -0700)
Fixes bug #1067959

Assure prefix length is included in CIDR definition.

Change-Id: I32bb3dd1e5bffb409b3adee03015e21cce71caea

quantum/api/v2/attributes.py
quantum/tests/unit/test_attributes.py
quantum/tests/unit/test_db_plugin.py

index ff834169644259e1139d395259612e474f80ba4d..205e7cc47e2d3941b42281e751ec20b28efe5682 100644 (file)
@@ -92,11 +92,14 @@ def _validate_ip_address_or_none(data, valid_values=None):
 def _validate_subnet(data, valid_values=None):
     try:
         netaddr.IPNetwork(data)
-        return
+        if len(data.split('/')) == 2:
+            return
     except Exception:
-        msg = _("%s is not a valid IP subnet") % data
-        LOG.debug("validate_subnet: %s", msg)
-        return msg
+        pass
+
+    msg = _("%s is not a valid IP subnet") % data
+    LOG.debug("validate_subnet: %s", msg)
+    return msg
 
 
 def _validate_regex(data, valid_values=None):
index b4704a6b51c8c1ac6ce7b6063421495b32c3007b..a140e53985cfb8362aa631a84511385fab245da7 100644 (file)
@@ -85,6 +85,46 @@ class TestAttributes(unittest2.TestCase):
         error = '%s is not valid' % base_mac
         self.assertEquals(msg, error)
 
+    def test_cidr(self):
+        # Valid - IPv4
+        cidr = "10.0.2.0/24"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        self.assertEquals(msg, None)
+
+        # Valid - IPv6 without final octets
+        cidr = "fe80::/24"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        self.assertEquals(msg, None)
+
+        # Valid - IPv6 with final octets
+        cidr = "fe80::0/24"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        self.assertEquals(msg, None)
+
+        # Invalid - IPv4 missing mask
+        cidr = "10.0.2.0"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        error = "%s is not a valid IP subnet" % cidr
+        self.assertEquals(msg, error)
+
+        # Invalid - IPv6 without final octets, missing mask
+        cidr = "fe80::"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        error = "%s is not a valid IP subnet" % cidr
+        self.assertEquals(msg, error)
+
+        # Invalid - IPv6 with final octets, missing mask
+        cidr = "fe80::0"
+        msg = attributes._validate_subnet(cidr,
+                                          None)
+        error = "%s is not a valid IP subnet" % cidr
+        self.assertEquals(msg, error)
+
 
 class TestConvertKvp(unittest2.TestCase):
 
index 8c9377387eb3252788c7c9f8216fd81c0600887d..38a21f664737da4422d54c350844042b2585432f 100644 (file)
@@ -1771,6 +1771,28 @@ class TestSubnetsV2(QuantumDbPluginV2TestCase):
                         pass
                 self.assertEquals(ctx_manager.exception.code, 400)
 
+    def test_create_subnet_bad_V4_cidr(self):
+        with self.network() as network:
+            data = {'subnet': {'network_id': network['network']['id'],
+                    'cidr': '10.0.2.0',
+                    'ip_version': '4',
+                    'tenant_id': network['network']['tenant_id'],
+                    'gateway_ip': '10.0.2.1'}}
+            subnet_req = self.new_create_request('subnets', data)
+            res = subnet_req.get_response(self.api)
+            self.assertEquals(res.status_int, 400)
+
+    def test_create_subnet_bad_V6_cidr(self):
+        with self.network() as network:
+            data = {'subnet': {'network_id': network['network']['id'],
+                    'cidr': 'fe80::',
+                    'ip_version': '6',
+                    'tenant_id': network['network']['tenant_id'],
+                    'gateway_ip': 'fe80::1'}}
+            subnet_req = self.new_create_request('subnets', data)
+            res = subnet_req.get_response(self.api)
+            self.assertEquals(res.status_int, 400)
+
     def test_create_2_subnets_overlapping_cidr_allowed_returns_200(self):
         cidr_1 = '10.0.0.0/23'
         cidr_2 = '10.0.0.0/24'