]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Auto allocate gateway_ip even for SLAAC subnets
authorsridhargaddam <sridhar.gaddam@enovance.com>
Thu, 20 Nov 2014 07:39:54 +0000 (07:39 +0000)
committersridhargaddam <sridhar.gaddam@enovance.com>
Tue, 9 Dec 2014 15:47:05 +0000 (15:47 +0000)
For a SLAAC subnet that is created without specifying the gateway_ip,
Neutron currently allocates (If0c48a7287a828eef4a0f0b0859d4f898d2937bd)
the gateway_ip at a later stage (i.e., neutron router_interface_add).
In order to keep the API consistent between IPv4 and IPv6, it is
recommended to allocate the gateway_ip during subnet_create stage itself.

Closes-Bug: #1394112
Change-Id: I965232930502c21b605fe360bb138bb6ea73d2b0

neutron/db/db_base_plugin_v2.py
neutron/db/l3_db.py
neutron/tests/unit/oneconvergence/test_nvsd_plugin.py
neutron/tests/unit/test_db_plugin.py
neutron/tests/unit/test_l3_plugin.py

index 6f062fcafb11c3e152627a7f3fe120c38af37517..0aafa8265b250d418b3fac647d4ea0b039e49cdf 100644 (file)
@@ -1086,10 +1086,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
         s = subnet['subnet']
 
         if s['gateway_ip'] is attributes.ATTR_NOT_SPECIFIED:
-            if s['ip_version'] == 6 and ipv6_utils.is_slaac_subnet(s):
-                s['gateway_ip'] = None
-            else:
-                s['gateway_ip'] = str(netaddr.IPAddress(net.first + 1))
+            s['gateway_ip'] = str(netaddr.IPAddress(net.first + 1))
 
         if s['allocation_pools'] == attributes.ATTR_NOT_SPECIFIED:
             s['allocation_pools'] = self._allocate_pools_for_subnet(context, s)
index 014ffe3401aa3c5d1eb76d75cabda3a7bc74a14d..bdef81933285c6e4c5948ce771823d857d8affe5 100644 (file)
@@ -21,7 +21,6 @@ from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
 from neutron.api.v2 import attributes
 from neutron.common import constants as l3_constants
 from neutron.common import exceptions as n_exc
-from neutron.common import ipv6_utils
 from neutron.common import rpc as n_rpc
 from neutron.common import utils
 from neutron.db import model_base
@@ -467,19 +466,15 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
 
     def _add_interface_by_subnet(self, context, router, subnet_id, owner):
         subnet = self._core_plugin._get_subnet(context, subnet_id)
-        if (not subnet['gateway_ip']
-            and not ipv6_utils.is_slaac_subnet(subnet)):
+        if not subnet['gateway_ip']:
             msg = _('Subnet for router interface must have a gateway IP')
             raise n_exc.BadRequest(resource='router', msg=msg)
         self._check_for_dup_router_subnet(context, router,
                                           subnet['network_id'],
                                           subnet_id,
                                           subnet['cidr'])
-        if subnet['gateway_ip']:
-            fixed_ip = {'ip_address': subnet['gateway_ip'],
-                        'subnet_id': subnet['id']}
-        else:
-            fixed_ip = {'subnet_id': subnet['id']}
+        fixed_ip = {'ip_address': subnet['gateway_ip'],
+                    'subnet_id': subnet['id']}
 
         return self._core_plugin.create_port(context, {
             'port':
index 67f5bd9507d2cad64ebc60df2617eb3613e9ffd1..decc7d1867a5826b88d157c36d469bc623349b6a 100644 (file)
@@ -102,6 +102,9 @@ class TestOneConvergenceL3NatTestCase(test_l3_plugin.L3NatDBIntTestCase):
     _plugin_name = PLUGIN_NAME
 
     def setUp(self):
+        if 'v6' in self._testMethodName:
+            self.skipTest("NVSD Plugin does not support IPV6.")
+
         def mocked_oneconvergence_init(self):
             def side_effect(*args, **kwargs):
                 return {'id': str(uuid.uuid4())}
index f1f54c3a146fda8733b9bffb42fc7294910a0732..56868fcfd6c48d00ca2f4fee70e28e56d3cafb14 100644 (file)
@@ -2904,8 +2904,8 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
                                  cidr=cidr, ip_version=6,
                                  ipv6_ra_mode=constants.DHCPV6_STATEFUL,
                                  ipv6_address_mode=constants.DHCPV6_STATEFUL)
-        # Gateway not specified for IPv6 SLAAC subnet
-        expected = {'gateway_ip': None,
+        # If gateway_ip is not specified, allocate first IP from the subnet
+        expected = {'gateway_ip': gateway,
                     'cidr': cidr}
         self._test_create_subnet(expected=expected,
                                  cidr=cidr, ip_version=6,
index daf5052c45eeacb3b1d9fca23bea2f7d8fa85598..f97111d245c9e151d96893dad91f6e4bdc63fa6f 100644 (file)
@@ -765,6 +765,17 @@ class L3NatTestCaseBase(L3NatTestCaseMixin):
                         # nsx metadata access case
                         self.assertIn(payload['tenant_id'], [stid, ''])
 
+    def test_router_add_interface_ipv6_subnet_without_gateway_ip(self):
+        with self.router() as r:
+            with self.subnet(ip_version=6, cidr='fe80::/64',
+                             gateway_ip=None) as s:
+                error_code = exc.HTTPBadRequest.code
+                self._router_interface_action('add',
+                                              r['router']['id'],
+                                              s['subnet']['id'],
+                                              None,
+                                              expected_code=error_code)
+
     def test_router_add_interface_subnet_with_bad_tenant_returns_404(self):
         with mock.patch('neutron.context.Context.to_dict') as tdict:
             tenant_id = _uuid()