]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Check supported subnet CIDR
authorshihanzhang <shihanzhang@huawei.com>
Mon, 21 Sep 2015 07:38:28 +0000 (15:38 +0800)
committershihanzhang <shihanzhang@huawei.com>
Tue, 29 Sep 2015 02:51:12 +0000 (10:51 +0800)
For IP CIDR, D class is for multicast, but neutron does not
check this, if user create a subnet like '224.0.0.1/16', DHCP
agent will fail to spawn Dnsmasq service.
This patch adds a check, if subnet CIDR is D class or loopback,
neutron-server will raise a error.

APIImpact
DocImpact

Closes-bug: #1497522
Change-Id: I36aa8b8e6decaff1cc27aaa61f4aaa8f247826c6

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

index b93e89a27f7bc298ad01f7617c87699fe60dc2d9..5ea921c348977d72ee069cb1d70aa14df4e31c81 100644 (file)
@@ -461,6 +461,15 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
                     if not ip_range:
                         raise n_exc.IpAddressGenerationFailure(
                             net_id=cur_subnet.network_id)
+            net = netaddr.IPNetwork(s['cidr'])
+            if net.is_multicast():
+                error_message = _("Multicast IP subnet is not supported "
+                                  "if enable_dhcp is True.")
+                raise n_exc.InvalidInput(error_message=error_message)
+            elif net.is_loopback():
+                error_message = _("Loopback IP subnet is not supported "
+                                  "if enable_dhcp is True.")
+                raise n_exc.InvalidInput(error_message=error_message)
 
         if attributes.is_attr_set(s.get('gateway_ip')):
             self._validate_ip_version(ip_ver, s['gateway_ip'], 'gateway_ip')
index dea0296ac20042a9613b598ccf60651f287f44d1..4e197940d8e8d2bfae1f082983b1068bcb3cfd08 100644 (file)
@@ -4494,6 +4494,26 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
             res = subnet_req.get_response(self.api)
             self.assertEqual(res.status_int, webob.exc.HTTPClientError.code)
 
+    def _test_unsupported_subnet_cidr(self, subnet_cidr):
+        with self.network() as network:
+            subnet = {'network_id': network['network']['id'],
+                      'cidr': subnet_cidr,
+                      'ip_version': 4,
+                      'enable_dhcp': True,
+                      'tenant_id': network['network']['tenant_id']}
+            plugin = manager.NeutronManager.get_plugin()
+            if hasattr(plugin, '_validate_subnet'):
+                self.assertRaises(n_exc.InvalidInput,
+                                  plugin._validate_subnet,
+                                  context.get_admin_context(),
+                                  subnet)
+
+    def test_unsupported_subnet_cidr_multicast(self):
+        self._test_unsupported_subnet_cidr("224.0.0.1/16")
+
+    def test_unsupported_subnet_cidr_loopback(self):
+        self._test_unsupported_subnet_cidr("127.0.0.1/8")
+
     def test_invalid_ip_address(self):
         with self.network() as network:
             data = {'subnet': {'network_id': network['network']['id'],