diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 25fefe84ef7..07cb83509cd 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -21,6 +21,7 @@ import shutil import time import netaddr +from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext from neutron_lib import constants from neutron_lib import exceptions from neutron_lib.utils import file as file_utils @@ -39,7 +40,6 @@ from neutron.agent.linux import iptables_manager from neutron.cmd import runtime_checks as checks from neutron.common import constants as n_const from neutron.common import utils as common_utils -from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.ipam import utils as ipam_utils LOG = logging.getLogger(__name__) @@ -717,7 +717,7 @@ class Dnsmasq(DhcpLocalProcess): def _get_client_id(self, port): if self._get_port_extra_dhcp_opts(port): for opt in port.extra_dhcp_opts: - if opt.opt_name == edo_ext.CLIENT_ID: + if opt.opt_name == edo_ext.DHCP_OPT_CLIENT_ID: return opt.opt_value def _read_hosts_file_leases(self, filename): @@ -953,7 +953,7 @@ class Dnsmasq(DhcpLocalProcess): [netaddr.IPAddress(ip.ip_address).version for ip in port.fixed_ips]) for opt in port.extra_dhcp_opts: - if opt.opt_name == edo_ext.CLIENT_ID: + if opt.opt_name == edo_ext.DHCP_OPT_CLIENT_ID: continue opt_ip_version = opt.ip_version if opt_ip_version in port_ip_versions: diff --git a/neutron/db/extradhcpopt_db.py b/neutron/db/extradhcpopt_db.py index beceb54d793..1982db5fa53 100644 --- a/neutron/db/extradhcpopt_db.py +++ b/neutron/db/extradhcpopt_db.py @@ -13,10 +13,12 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext + + from neutron.api.v2 import attributes from neutron.db import _resource_extend as resource_extend from neutron.db import api as db_api -from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.objects.port.extensions import extra_dhcp_opt as obj_extra_dhcp diff --git a/neutron/extensions/extra_dhcp_opt.py b/neutron/extensions/extra_dhcp_opt.py index 900a1a685c9..ab58f92162b 100644 --- a/neutron/extensions/extra_dhcp_opt.py +++ b/neutron/extensions/extra_dhcp_opt.py @@ -13,100 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from neutron_lib.api import converters +from neutron_lib.api.definitions import extra_dhcp_opt from neutron_lib.api import extensions -from neutron_lib.api import validators -from neutron_lib import exceptions - -from neutron._i18n import _ -# ExtraDHcpOpts Exceptions -class ExtraDhcpOptNotFound(exceptions.NotFound): - message = _("ExtraDhcpOpt %(id)s could not be found") - - -class ExtraDhcpOptBadData(exceptions.InvalidInput): - message = _("Invalid data format for extra-dhcp-opt: %(data)s") - - -# Valid blank extra dhcp opts -VALID_BLANK_EXTRA_DHCP_OPTS = ('router', 'classless-static-route') - -# Common definitions for maximum string field length -DHCP_OPT_NAME_MAX_LEN = 64 -DHCP_OPT_VALUE_MAX_LEN = 255 - -EXTRA_DHCP_OPT_KEY_SPECS = { - 'id': {'type:uuid': None, 'required': False}, - 'opt_name': {'type:not_empty_string': DHCP_OPT_NAME_MAX_LEN, - 'required': True}, - 'opt_value': {'type:not_empty_string_or_none': DHCP_OPT_VALUE_MAX_LEN, - 'required': True}, - 'ip_version': {'convert_to': converters.convert_to_int, - 'type:values': [4, 6], - 'required': False} -} - - -def _validate_extra_dhcp_opt(data, key_specs=None): - if data is not None: - if not isinstance(data, list): - raise ExtraDhcpOptBadData(data=data) - for d in data: - if d['opt_name'] in VALID_BLANK_EXTRA_DHCP_OPTS: - msg = validators.validate_string_or_none( - d['opt_value'], DHCP_OPT_VALUE_MAX_LEN) - else: - msg = validators.validate_dict(d, key_specs) - if msg: - raise ExtraDhcpOptBadData(data=msg) - -validators.add_validator('list_of_extra_dhcp_opts', - _validate_extra_dhcp_opt) - -# Attribute Map -EXTRADHCPOPTS = 'extra_dhcp_opts' - -CLIENT_ID = "client-id" - -EXTENDED_ATTRIBUTES_2_0 = { - 'ports': { - EXTRADHCPOPTS: { - 'allow_post': True, - 'allow_put': True, - 'is_visible': True, - 'default': None, - 'validate': { - 'type:list_of_extra_dhcp_opts': EXTRA_DHCP_OPT_KEY_SPECS - } - } - } -} - - -class Extra_dhcp_opt(extensions.ExtensionDescriptor): - @classmethod - def get_name(cls): - return "Neutron Extra DHCP opts" - - @classmethod - def get_alias(cls): - return "extra_dhcp_opt" - - @classmethod - def get_description(cls): - return ("Extra options configuration for DHCP. " - "For example PXE boot options to DHCP clients can " - "be specified (e.g. tftp-server, server-ip-address, " - "bootfile-name)") - - @classmethod - def get_updated(cls): - return "2013-03-17T12:00:00-00:00" - - def get_extended_resources(self, version): - if version == "2.0": - return EXTENDED_ATTRIBUTES_2_0 - else: - return {} +class Extra_dhcp_opt(extensions.APIExtensionDescriptor): + api_definition = extra_dhcp_opt diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 21eae77d061..b2018dab2b7 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -16,6 +16,7 @@ import copy from eventlet import greenthread +from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext from neutron_lib.api.definitions import port_security as psec from neutron_lib.api.definitions import portbindings from neutron_lib.api.definitions import provider_net @@ -74,7 +75,6 @@ from neutron.db import subnet_service_type_db_models as service_type_db from neutron.db import vlantransparent_db from neutron.extensions import allowedaddresspairs as addr_pair from neutron.extensions import availability_zone as az_ext -from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.extensions import multiprovidernet as mpnet from neutron.extensions import providernet as provider from neutron.extensions import vlantransparent diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 952f69365d0..1de836a071e 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -17,6 +17,7 @@ import os import mock import netaddr +from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext from neutron_lib import constants from oslo_config import cfg import oslo_messaging @@ -29,7 +30,6 @@ from neutron.common import constants as n_const from neutron.conf.agent import common as config from neutron.conf.agent import dhcp as dhcp_config from neutron.conf import common as base_config -from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.tests import base from neutron.tests import tools @@ -172,7 +172,7 @@ class FakePort5(object): self.mac_address = '00:00:0f:aa:bb:55' self.device_id = 'fake_port5' self.extra_dhcp_opts = [ - DhcpOpt(opt_name=edo_ext.CLIENT_ID, + DhcpOpt(opt_name=edo_ext.DHCP_OPT_CLIENT_ID, opt_value='test5')] @@ -188,7 +188,7 @@ class FakePort6(object): self.mac_address = '00:00:0f:aa:bb:66' self.device_id = 'fake_port6' self.extra_dhcp_opts = [ - DhcpOpt(opt_name=edo_ext.CLIENT_ID, + DhcpOpt(opt_name=edo_ext.DHCP_OPT_CLIENT_ID, opt_value='test6', ip_version=4), DhcpOpt(opt_name='dns-server', diff --git a/neutron/tests/unit/extensions/test_extra_dhcp_opt.py b/neutron/tests/unit/extensions/test_extra_dhcp_opt.py index ebd3a631938..60a28dbc67a 100644 --- a/neutron/tests/unit/extensions/test_extra_dhcp_opt.py +++ b/neutron/tests/unit/extensions/test_extra_dhcp_opt.py @@ -15,11 +15,11 @@ import copy +from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext import webob.exc from neutron.db import db_base_plugin_v2 from neutron.db import extradhcpopt_db as edo_db -from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.tests.unit.db import test_db_base_plugin_v2