diff --git a/neutron_lib/api/definitions/__init__.py b/neutron_lib/api/definitions/__init__.py index 9dcfe9550..347d4fb2e 100644 --- a/neutron_lib/api/definitions/__init__.py +++ b/neutron_lib/api/definitions/__init__.py @@ -62,7 +62,9 @@ from neutron_lib.api.definitions import l3 from neutron_lib.api.definitions import l3_conntrack_helper from neutron_lib.api.definitions import l3_ext_gw_mode from neutron_lib.api.definitions import l3_ext_ha_mode +from neutron_lib.api.definitions import l3_ext_ndp_proxy from neutron_lib.api.definitions import l3_flavors +from neutron_lib.api.definitions import l3_ndp_proxy from neutron_lib.api.definitions import l3_port_ip_change_not_allowed from neutron_lib.api.definitions import logging from neutron_lib.api.definitions import logging_resource @@ -188,7 +190,9 @@ _ALL_API_DEFINITIONS = { l3_conntrack_helper, l3_ext_gw_mode, l3_ext_ha_mode, + l3_ext_ndp_proxy, l3_flavors, + l3_ndp_proxy, l3_port_ip_change_not_allowed, logging, logging_resource, diff --git a/neutron_lib/api/definitions/base.py b/neutron_lib/api/definitions/base.py index 2838e8517..53f1dee89 100644 --- a/neutron_lib/api/definitions/base.py +++ b/neutron_lib/api/definitions/base.py @@ -24,6 +24,7 @@ KNOWN_ATTRIBUTES = ( 'device_owner', 'dns_nameservers', 'enable_dhcp', + 'enable_ndp_proxy', 'fixed_ips', 'gateway_ip', 'host_routes', @@ -110,6 +111,8 @@ KNOWN_EXTENSIONS = ( 'l3-conntrack-helper', 'l3-ha', 'l3_agent_scheduler', + 'l3-ext-ndp-proxy', + 'l3-ndp-proxy', 'l3-port-ip-change-not-allowed', 'logging', 'metering', diff --git a/neutron_lib/api/definitions/l3_ext_ndp_proxy.py b/neutron_lib/api/definitions/l3_ext_ndp_proxy.py new file mode 100644 index 000000000..ceacb9c53 --- /dev/null +++ b/neutron_lib/api/definitions/l3_ext_ndp_proxy.py @@ -0,0 +1,48 @@ +# Copyright (c) 2020 Troila. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 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 l3 +from neutron_lib.api.definitions import l3_ext_gw_mode +from neutron_lib import constants + + +ALIAS = 'l3-ext-ndp-proxy' +IS_SHIM_EXTENSION = False +IS_STANDARD_ATTR_EXTENSION = False +NAME = 'Router support to enable NDP proxy' +API_PREFIX = '' +DESCRIPTION = 'Router extension to enable ndp proxy' +UPDATED_TIMESTAMP = '2020-08-25T00:00:00-00:00' +RESOURCE_NAME = l3.ROUTER +COLLECTION_NAME = l3.ROUTERS +ENABLE_NDP_PROXY = 'enable_ndp_proxy' +RESOURCE_ATTRIBUTE_MAP = { + COLLECTION_NAME: { + ENABLE_NDP_PROXY: { + 'allow_post': True, + 'allow_put': True, + 'convert_to': converters.convert_to_boolean_if_not_none, + 'default': constants.ATTR_NOT_SPECIFIED, + 'is_visible': True, + 'is_filter': True + } + } +} +SUB_RESOURCE_ATTRIBUTE_MAP = {} +ACTION_MAP = {} +REQUIRED_EXTENSIONS = [l3.ALIAS, l3_ext_gw_mode.ALIAS] +OPTIONAL_EXTENSIONS = [] +ACTION_STATUS = {} diff --git a/neutron_lib/api/definitions/l3_ndp_proxy.py b/neutron_lib/api/definitions/l3_ndp_proxy.py new file mode 100644 index 000000000..c1cce9e29 --- /dev/null +++ b/neutron_lib/api/definitions/l3_ndp_proxy.py @@ -0,0 +1,128 @@ +# Copyright (c) 2020 Troila. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from neutron_lib.api.definitions import l3 +from neutron_lib.db import constants as db_const + +# The alias of the extension. +ALIAS = 'l3-ndp-proxy' + +# Whether or not this extension is simply signaling behavior to the user +# or it actively modifies the attribute map. +IS_SHIM_EXTENSION = False + +# Whether the extension is marking the adoption of standardattr model for +# legacy resources, or introducing new standardattr attributes. False or +# None if the standardattr model is adopted since the introduction of +# resource extension. +# If this is True, the alias for the extension should be prefixed with +# 'standard-attr-'. +IS_STANDARD_ATTR_EXTENSION = False + +# The name of the extension. +NAME = 'L3 NDP Proxy' + +# A prefix for API resources. An empty prefix means that the API is going +# to be exposed at the v2/ level as any other core resource. +API_PREFIX = '' + +# The description of the extension. +DESCRIPTION = "Router support for L3 NDP proxy." + +# A timestamp of when the extension was introduced. +UPDATED_TIMESTAMP = "2021-06-29T10:00:00-00:00" + +# The name of the resource. +RESOURCE_NAME = 'ndp_proxy' + +# The plural for the resource. +COLLECTION_NAME = 'ndp_proxies' + +ID = 'id' +NAME = 'name' +PROJECT_ID = 'project_id' +ROUTER_ID = 'router_id' +PORT_ID = 'port_id' +IP_ADDRESS = 'ip_address' +DESCRIPTION = 'description' + +# The resource attribute map for the extension. +RESOURCE_ATTRIBUTE_MAP = { + COLLECTION_NAME: { + ID: {'allow_post': False, + 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'is_sort_key': True, + 'primary_key': True}, + NAME: {'allow_post': True, + 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_filter': True, + 'is_sort_key': True, + 'is_visible': True, 'default': ''}, + PROJECT_ID: {'allow_post': True, + 'allow_put': False, + 'required_by_policy': True, + 'validate': { + 'type:string': db_const.PROJECT_ID_FIELD_SIZE}, + 'is_sort_key': True, + 'is_visible': True}, + ROUTER_ID: {'allow_post': True, + 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_sort_key': True, + 'is_visible': True}, + PORT_ID: {'allow_post': True, + 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_sort_key': True, + 'is_visible': True}, + IP_ADDRESS: {'allow_post': True, + 'allow_put': False, + 'default': None, + 'validate': { + 'type:ip_address_or_none': None}, + 'is_sort_key': True, + 'is_visible': True}, + DESCRIPTION: {'allow_post': True, + 'allow_put': True, + 'default': '', + 'validate': {'type:string': + db_const.LONG_DESCRIPTION_FIELD_SIZE}, + 'is_visible': True} + } +} + +# The subresource attribute map for the extension. It adds child resources +# to main extension's resource. The subresource map must have a parent and +# a parameters entry. If an extension does not need such a map, None can +# be specified (mandatory). +SUB_RESOURCE_ATTRIBUTE_MAP = {} + +# The action map: it associates verbs with methods to be performed on +# the API resource. +ACTION_MAP = { +} + +# The action status. +ACTION_STATUS = { +} + +# The list of required extensions. +REQUIRED_EXTENSIONS = [l3.ALIAS] + +# The list of optional extensions. +OPTIONAL_EXTENSIONS = [] diff --git a/neutron_lib/plugins/constants.py b/neutron_lib/plugins/constants.py index 4f65fabff..aa8a4001d 100644 --- a/neutron_lib/plugins/constants.py +++ b/neutron_lib/plugins/constants.py @@ -31,3 +31,5 @@ PLACEMENT_REPORT = "placement_report" # retired (train) and these should no longer be necessary. LOADBALANCER = "LOADBALANCER" LOADBALANCERV2 = "LOADBALANCERV2" + +NDPPROXY = 'NDPPROXY' diff --git a/neutron_lib/tests/unit/api/definitions/test_l3_ext_ndp_proxy.py b/neutron_lib/tests/unit/api/definitions/test_l3_ext_ndp_proxy.py new file mode 100644 index 000000000..6d3c374ca --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_l3_ext_ndp_proxy.py @@ -0,0 +1,20 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from neutron_lib.api.definitions import l3_ext_ndp_proxy +from neutron_lib.tests.unit.api.definitions import base + + +class RouterNDPProxyDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = l3_ext_ndp_proxy + extension_attributes = ('enable_ndp_proxy',) diff --git a/neutron_lib/tests/unit/api/definitions/test_l3_ndp_proxy.py b/neutron_lib/tests/unit/api/definitions/test_l3_ndp_proxy.py new file mode 100644 index 000000000..e10fcf812 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_l3_ndp_proxy.py @@ -0,0 +1,23 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from neutron_lib.api.definitions import l3_ndp_proxy +from neutron_lib.tests.unit.api.definitions import base + + +class L3NDPProxyDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = l3_ndp_proxy + extension_resources = (l3_ndp_proxy.COLLECTION_NAME,) + extension_attributes = (l3_ndp_proxy.ID, l3_ndp_proxy.NAME, + l3_ndp_proxy.PROJECT_ID, l3_ndp_proxy.ROUTER_ID, + l3_ndp_proxy.PORT_ID, l3_ndp_proxy.IP_ADDRESS, + l3_ndp_proxy.DESCRIPTION,) diff --git a/releasenotes/notes/l3-ndp-proxy-71eee0cba8565dad.yaml b/releasenotes/notes/l3-ndp-proxy-71eee0cba8565dad.yaml new file mode 100644 index 000000000..6a255d20d --- /dev/null +++ b/releasenotes/notes/l3-ndp-proxy-71eee0cba8565dad.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The ``l3-ndp-proxy`` and ``l3-ext-ndp-proxy`` API definitions are + introduced, which allow a router to support proxy NDP for IPv6 + addresses of internal ports.