From 1ff6a5129fd9a2636870a01f2dd107d6599f81bb Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Tue, 7 Feb 2017 14:56:33 -0500 Subject: [PATCH] Use ipam AllocationOnAutoAddressSubnet class This class was defined a while ago, but never used in the code for some reason. Let's use it so we don't have two nearly-identical strings in different places. Change-Id: Ib0e1ae51c8ef579de30ba26d30bda4bdeee5cbb8 --- neutron/db/ipam_pluggable_backend.py | 10 +++------- neutron/ipam/exceptions.py | 2 +- neutron/tests/unit/db/test_db_base_plugin_v2.py | 16 ++++++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/neutron/db/ipam_pluggable_backend.py b/neutron/db/ipam_pluggable_backend.py index dc0dcb15a5a..9bfc3949718 100644 --- a/neutron/db/ipam_pluggable_backend.py +++ b/neutron/db/ipam_pluggable_backend.py @@ -23,7 +23,7 @@ from oslo_log import log as logging from oslo_utils import excutils from sqlalchemy import and_ -from neutron._i18n import _, _LE, _LW +from neutron._i18n import _LE, _LW from neutron.common import constants as n_const from neutron.common import ipv6_utils from neutron.db import ipam_backend_mixin @@ -254,12 +254,8 @@ class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin): subnet['cidr'] != n_const.PROVISIONAL_IPV6_PD_PREFIX): if (is_auto_addr_subnet and device_owner not in constants.ROUTER_INTERFACE_OWNERS): - msg = (_("IPv6 address %(address)s can not be directly " - "assigned to a port on subnet %(id)s since the " - "subnet is configured for automatic addresses") % - {'address': fixed['ip_address'], - 'id': subnet['id']}) - raise n_exc.InvalidInput(error_message=msg) + raise ipam_exc.AllocationOnAutoAddressSubnet( + ip=fixed['ip_address'], subnet_id=subnet['id']) fixed_ip_list.append({'subnet_id': subnet['id'], 'ip_address': fixed['ip_address']}) else: diff --git a/neutron/ipam/exceptions.py b/neutron/ipam/exceptions.py index feb93a7f803..1b4ad070f6c 100644 --- a/neutron/ipam/exceptions.py +++ b/neutron/ipam/exceptions.py @@ -54,7 +54,7 @@ class InvalidSubnetRequest(exceptions.BadRequest): "%(reason)s") -class AllocationOnAutoAddressSubnet(exceptions.NeutronException): +class AllocationOnAutoAddressSubnet(exceptions.InvalidInput): message = _("IPv6 address %(ip)s cannot be directly " "assigned to a port on subnet %(subnet_id)s as the " "subnet is configured for automatic addresses") diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index 255b0246f7c..4429eb508b6 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -1666,25 +1666,29 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s gateway_ip=constants.ATTR_NOT_SPECIFIED) as subnet: with self.port(subnet=subnet) as port: ips = port['port']['fixed_ips'] + ip_address = '2607:f0d0:1002:51::5' self.assertEqual(1, len(ips)) port_mac = port['port']['mac_address'] + subnet_id = subnet['subnet']['id'] subnet_cidr = subnet['subnet']['cidr'] eui_addr = str(netutils.get_ipv6_addr_by_EUI64(subnet_cidr, port_mac)) self.assertEqual(ips[0]['ip_address'], eui_addr) - self.assertEqual(ips[0]['subnet_id'], subnet['subnet']['id']) + self.assertEqual(ips[0]['subnet_id'], subnet_id) - data = {'port': {'fixed_ips': [{'subnet_id': - subnet['subnet']['id'], - 'ip_address': - '2607:f0d0:1002:51::5'}]}} + data = {'port': {'fixed_ips': [{'subnet_id': subnet_id, + 'ip_address': ip_address}]}} req = self.new_update_request('ports', data, port['port']['id']) res = req.get_response(self.api) err = self.deserialize(self.fmt, res) self.assertEqual(webob.exc.HTTPClientError.code, res.status_int) - self.assertEqual('InvalidInput', err['NeutronError']['type']) + self.assertEqual('AllocationOnAutoAddressSubnet', + err['NeutronError']['type']) + msg = str(ipam_exc.AllocationOnAutoAddressSubnet( + ip=ip_address, subnet_id=subnet_id)) + self.assertEqual(err['NeutronError']['message'], msg) def test_requested_duplicate_mac(self): with self.port() as port: