From 0de474f396d5bba9aeb37e774f56e30d72334837 Mon Sep 17 00:00:00 2001 From: reedip Date: Mon, 23 Apr 2018 16:39:50 +0800 Subject: [PATCH] Introduce API definition of Floating IP Port Forwarding This patch introduces the port forwarding API definition which extends the current Floating IP API. This patch partially implements the following spec: https://specs.openstack.org/openstack/neutron-specs/specs/rocky/port-forwarding.html Change-Id: I86adb014c5c9b55b00085849c3ebdd38adfed85b Co-Authored-By: zhaobo Partial-Bug: #1491317 --- neutron_lib/api/definitions/__init__.py | 2 + neutron_lib/api/definitions/base.py | 1 + .../floating_ip_port_forwarding.py | 129 ++++++++++++++++++ neutron_lib/plugins/constants.py | 1 + .../test_floating_ip_port_forwarding.py | 23 ++++ ...ingip-portforwarding-17c284080541bc78.yaml | 6 + 6 files changed, 162 insertions(+) create mode 100644 neutron_lib/api/definitions/floating_ip_port_forwarding.py create mode 100644 neutron_lib/tests/unit/api/definitions/test_floating_ip_port_forwarding.py create mode 100644 releasenotes/notes/floatingip-portforwarding-17c284080541bc78.yaml diff --git a/neutron_lib/api/definitions/__init__.py b/neutron_lib/api/definitions/__init__.py index af5e23243..9a25a6dc4 100644 --- a/neutron_lib/api/definitions/__init__.py +++ b/neutron_lib/api/definitions/__init__.py @@ -33,6 +33,7 @@ from neutron_lib.api.definitions import firewall from neutron_lib.api.definitions import firewall_v2 from neutron_lib.api.definitions import firewallrouterinsertion from neutron_lib.api.definitions import flavors +from neutron_lib.api.definitions import floating_ip_port_forwarding from neutron_lib.api.definitions import flowclassifier from neutron_lib.api.definitions import ip_allocation from neutron_lib.api.definitions import ip_substring_port_filtering @@ -105,6 +106,7 @@ _ALL_API_DEFINITIONS = { firewallrouterinsertion, fip_port_details, flavors, + floating_ip_port_forwarding, ip_allocation, ip_substring_port_filtering, l2_adjacency, diff --git a/neutron_lib/api/definitions/base.py b/neutron_lib/api/definitions/base.py index f0cb08b3e..c8f4de9f3 100644 --- a/neutron_lib/api/definitions/base.py +++ b/neutron_lib/api/definitions/base.py @@ -92,6 +92,7 @@ KNOWN_EXTENSIONS = ( 'extraroute', 'fip-port-details', 'flavors', + 'floating-ip-port-forwarding', 'ip-substring-filtering', 'l3-ha', 'l3_agent_scheduler', diff --git a/neutron_lib/api/definitions/floating_ip_port_forwarding.py b/neutron_lib/api/definitions/floating_ip_port_forwarding.py new file mode 100644 index 000000000..461fa615f --- /dev/null +++ b/neutron_lib/api/definitions/floating_ip_port_forwarding.py @@ -0,0 +1,129 @@ +# Copyright (c) 2012 OpenStack Foundation. +# 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 import constants +from neutron_lib.db import constants as db_const + + +PROTOCOLS = constants.IPTABLES_PROTOCOL_MAP.keys() +# The alias of the extension. +ALIAS = 'floating-ip-port-forwarding' + +# 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 = 'Floating IP Port Forwarding' + +# 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 = '/' + l3.FLOATINGIPS + +# The description of the extension. +DESCRIPTION = "Allow port forwarding from floating IP port to an internal port" + +# A timestamp of when the extension was introduced. +UPDATED_TIMESTAMP = "2018-01-19T10:00:00-00:00" + +# The name of the resource. +RESOURCE_NAME = 'port_forwarding' + +# The plural for the resource. +COLLECTION_NAME = 'port_forwardings' + +# parent +PARENT_RESOURCE_NAME = l3.FLOATINGIP +PARENT_COLLECTION_NAME = l3.FLOATINGIPS + +ID = 'id' +PROJECT_ID = 'project_id' +EXTERNAL_PORT = 'external_port' +INTERNAL_PORT = 'internal_port' +INTERNAL_IP_ADDRESS = 'internal_ip_address' +PROTOCOL = 'protocol' +INTERNAL_PORT_ID = 'internal_port_id' +RESOURCE_ATTRIBUTE_MAP = {} + +# 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 = { + COLLECTION_NAME: { + 'parent': {'collection_name': PARENT_COLLECTION_NAME, + 'member_name': PARENT_RESOURCE_NAME}, + 'parameters': { + ID: {'allow_post': False, + 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'primary_key': True}, + PROJECT_ID: {'allow_post': True, + 'allow_put': False, + 'validate': { + 'type:string': db_const.PROJECT_ID_FIELD_SIZE}, + 'required_by_policy': True, + 'is_visible': False}, + EXTERNAL_PORT: { + 'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'is_visible': True}, + INTERNAL_PORT: { + 'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'is_visible': True}, + INTERNAL_IP_ADDRESS: {'allow_post': True, + 'allow_put': True, + 'validate': { + 'type:ip_address': None}, + 'is_visible': True}, + PROTOCOL: {'allow_post': True, 'allow_put': True, + 'validate': {'type:values': PROTOCOLS}, + 'is_visible': True, + 'convert_to': converters.convert_to_protocol}, + INTERNAL_PORT_ID: {'allow_post': True, + 'allow_put': True, + 'validate': {'type:uuid': None}, + 'is_visible': True}, + } + } + } + +# 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 e31fb9b35..62c89937d 100644 --- a/neutron_lib/plugins/constants.py +++ b/neutron_lib/plugins/constants.py @@ -23,3 +23,4 @@ QOS = "QOS" CORE = 'CORE' L3 = 'L3_ROUTER_NAT' LOG_API = "LOGGING" +PORTFORWARDING = "PORTFORWARDING" diff --git a/neutron_lib/tests/unit/api/definitions/test_floating_ip_port_forwarding.py b/neutron_lib/tests/unit/api/definitions/test_floating_ip_port_forwarding.py new file mode 100644 index 000000000..a21c1fe04 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_floating_ip_port_forwarding.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 floating_ip_port_forwarding as fip_pf +from neutron_lib.tests.unit.api.definitions import base + + +class FipPortForwardingDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = fip_pf + extension_resources = (fip_pf.PARENT_COLLECTION_NAME,) + extension_attributes = (fip_pf.ID, fip_pf.PROJECT_ID, fip_pf.EXTERNAL_PORT, + fip_pf.INTERNAL_PORT, fip_pf.INTERNAL_IP_ADDRESS, + fip_pf.PROTOCOL, fip_pf.INTERNAL_PORT_ID,) + extension_subresources = (fip_pf.COLLECTION_NAME,) diff --git a/releasenotes/notes/floatingip-portforwarding-17c284080541bc78.yaml b/releasenotes/notes/floatingip-portforwarding-17c284080541bc78.yaml new file mode 100644 index 000000000..0571fa093 --- /dev/null +++ b/releasenotes/notes/floatingip-portforwarding-17c284080541bc78.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The ``portforwarding`` API definition for ``FloatingIP``is introduced, + which allows a ``FloatingIP:Port`` to forward packets back to a VM's + ``Internal IP:Port`` .