From 6cc186f16cb673eca1115e5ce5ee10c0de75d2f3 Mon Sep 17 00:00:00 2001 From: Nate Johnston Date: Thu, 20 Oct 2016 23:07:38 +0000 Subject: [PATCH] Migrate neutron-fwaas API definitions to neutron-lib As part of the Neutron Stadium, neutron-fwaas must migrate it's API definition to neutron-lib. Needed-By: I57504f97ac39b5b7d301fd5cc88228a121f0677e Change-Id: I7b4108772e8370e8f51971caf40ecd23e9f977e9 --- neutron_lib/api/definitions/base.py | 2 + neutron_lib/api/definitions/constants.py | 23 +++ neutron_lib/api/definitions/firewall.py | 174 ++++++++++++++++ neutron_lib/api/definitions/firewall_v2.py | 190 ++++++++++++++++++ .../definitions/firewallrouterinsertion.py | 69 +++++++ .../unit/api/definitions/test_firewall.py | 24 +++ .../unit/api/definitions/test_firewall_v2.py | 27 +++ .../test_firewallrouterinsertion.py | 20 ++ .../notes/fwaas-api-def-a6f03db369177b4a.yaml | 3 + 9 files changed, 532 insertions(+) create mode 100644 neutron_lib/api/definitions/constants.py create mode 100644 neutron_lib/api/definitions/firewall.py create mode 100644 neutron_lib/api/definitions/firewall_v2.py create mode 100644 neutron_lib/api/definitions/firewallrouterinsertion.py create mode 100644 neutron_lib/tests/unit/api/definitions/test_firewall.py create mode 100644 neutron_lib/tests/unit/api/definitions/test_firewall_v2.py create mode 100644 neutron_lib/tests/unit/api/definitions/test_firewallrouterinsertion.py create mode 100644 releasenotes/notes/fwaas-api-def-a6f03db369177b4a.yaml diff --git a/neutron_lib/api/definitions/base.py b/neutron_lib/api/definitions/base.py index 509c74655..e19aab7c1 100644 --- a/neutron_lib/api/definitions/base.py +++ b/neutron_lib/api/definitions/base.py @@ -81,6 +81,8 @@ KNOWN_EXTENSIONS = ( 'trunk-details', # Add here list of extensions with pointers to the project repo, e.g. # 'bgp', # http://git.openstack.org/cgit/openstack/neutron-dynamic-routing + 'fw', # http://git.openstack.org/cgit/openstack/neutron-fwaas + 'fwaas', # http://git.openstack.org/cgit/openstack/neutron-fwaas ) # The following is a short reference for understanding attribute info: diff --git a/neutron_lib/api/definitions/constants.py b/neutron_lib/api/definitions/constants.py new file mode 100644 index 000000000..6e97f0889 --- /dev/null +++ b/neutron_lib/api/definitions/constants.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. + +# neutron-fwaas constants +FIREWALL_GROUPS = 'firewall_groups' +FIREWALL_POLICIES = 'firewall_policies' +FIREWALL_RULES = 'firewall_rules' +FIREWALLS = 'firewalls' + +FWAAS_ALLOW = "allow" +FWAAS_DENY = "deny" +FWAAS_REJECT = "reject" +FW_VALID_ACTION_VALUES = [FWAAS_ALLOW, FWAAS_DENY, FWAAS_REJECT] diff --git a/neutron_lib/api/definitions/firewall.py b/neutron_lib/api/definitions/firewall.py new file mode 100644 index 000000000..9b59b1dd3 --- /dev/null +++ b/neutron_lib/api/definitions/firewall.py @@ -0,0 +1,174 @@ +# 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 constants as api_const +from neutron_lib import constants +from neutron_lib.db import constants as db_const + +# The alias of the extension. +ALIAS = 'firewall' + +# 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 = 'FWaaS v1' + +# The description of the extension. +DESCRIPTION = "Provides support for firewall-as-a-service version 1" + +# A timestamp of when the extension was introduced. +UPDATED_TIMESTAMP = "2016-01-01T10:00:00-00:00" + +# Base for the API calls +API_PREFIX = '/fw' + +RESOURCE_ATTRIBUTE_MAP = { + api_const.FIREWALL_RULES: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, 'primary_key': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'is_visible': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'firewall_policy_id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid_or_none': None}, + 'is_visible': True}, + 'shared': {'allow_post': True, 'allow_put': True, + 'default': False, + 'convert_to': converters.convert_to_boolean, + 'is_visible': True, 'required_by_policy': True, + 'enforce_policy': True}, + 'protocol': {'allow_post': True, 'allow_put': True, + 'is_visible': True, 'default': None, + 'convert_to': converters.convert_to_protocol, + 'validate': {'type:values': + constants.IPTABLES_PROTOCOL_MAP}}, + 'ip_version': {'allow_post': True, 'allow_put': True, + 'default': 4, 'convert_to': converters.convert_to_int, + 'validate': {'type:values': [4, 6]}, + 'is_visible': True}, + 'source_ip_address': {'allow_post': True, 'allow_put': True, + 'validate': {'type:ip_or_subnet_or_none': + None}, + 'is_visible': True, 'default': None}, + 'destination_ip_address': {'allow_post': True, 'allow_put': True, + 'validate': {'type:ip_or_subnet_or_none': + None}, + 'is_visible': True, 'default': None}, + 'source_port': {'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'default': None, 'is_visible': True}, + 'destination_port': {'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'default': None, 'is_visible': True}, + 'position': {'allow_post': False, 'allow_put': False, + 'default': None, 'is_visible': True}, + 'action': {'allow_post': True, 'allow_put': True, + 'convert_to': converters.convert_string_to_case_insensitive, + 'validate': {'type:values': + api_const.FW_VALID_ACTION_VALUES}, + 'is_visible': True, 'default': 'deny'}, + 'enabled': {'allow_post': True, 'allow_put': True, + 'default': True, 'is_visible': True, + 'convert_to': converters.convert_to_boolean}, + }, + api_const.FIREWALL_POLICIES: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'primary_key': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'is_visible': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'shared': {'allow_post': True, 'allow_put': True, + 'default': False, 'enforce_policy': True, + 'convert_to': converters.convert_to_boolean, + 'is_visible': True, 'required_by_policy': True}, + 'firewall_rules': {'allow_post': True, 'allow_put': True, + 'validate': {'type:uuid_list': None}, + 'convert_to': converters.convert_none_to_empty_list, + 'default': None, 'is_visible': True}, + 'audited': {'allow_post': True, 'allow_put': True, + 'default': False, 'is_visible': True, + 'convert_to': converters.convert_to_boolean}, + }, + api_const.FIREWALLS: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'primary_key': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'is_visible': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'admin_state_up': {'allow_post': True, 'allow_put': True, + 'default': True, 'is_visible': True, + 'convert_to': converters.convert_to_boolean}, + 'status': {'allow_post': False, 'allow_put': False, + 'is_visible': True}, + 'shared': {'allow_post': True, 'allow_put': True, + 'default': False, 'enforce_policy': True, + 'convert_to': converters.convert_to_boolean, + 'is_visible': False, 'required_by_policy': True}, + 'firewall_policy_id': {'allow_post': True, 'allow_put': True, + 'validate': {'type:uuid_or_none': None}, + 'is_visible': True}, + }, +} + +# The subresource attribute map for the extension. This extension has only +# top level resources, not child resources, so this is set to an empty dict. +SUB_RESOURCE_ATTRIBUTE_MAP = { +} + +# The action map. +ACTION_MAP = { +} + +# The list of required extensions. +REQUIRED_EXTENSIONS = [ +] + +# The list of optional extensions. +OPTIONAL_EXTENSIONS = [ +] diff --git a/neutron_lib/api/definitions/firewall_v2.py b/neutron_lib/api/definitions/firewall_v2.py new file mode 100644 index 000000000..8ffeb32d2 --- /dev/null +++ b/neutron_lib/api/definitions/firewall_v2.py @@ -0,0 +1,190 @@ +# 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 constants as api_const +from neutron_lib import constants +from neutron_lib.db import constants as db_const + +# The alias of the extension. +ALIAS = 'firewall_v2' + +# 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 = 'FWaaS v2' + +# The description of the extension. +DESCRIPTION = "Provides support for firewall-as-a-service version 2" + +# A timestamp of when the extension was introduced. +UPDATED_TIMESTAMP = "2016-10-06T10:00:00-00:00" + +# Base for the API calls +API_PREFIX = '/fwaas' + +RESOURCE_ATTRIBUTE_MAP = { + api_const.FIREWALL_RULES: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, 'primary_key': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'validate': {'type:string': + db_const.UUID_FIELD_SIZE}, + 'is_visible': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'firewall_policy_id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid_or_none': None}, + 'is_visible': True}, + 'public': {'allow_post': True, 'allow_put': True, + 'default': False, 'is_visible': True, + 'convert_to': converters.convert_to_boolean, + 'required_by_policy': True, 'enforce_policy': True}, + 'protocol': {'allow_post': True, 'allow_put': True, + 'is_visible': True, 'default': None, + 'convert_to': converters.convert_to_protocol, + 'validate': {'type:values': + constants.IPTABLES_PROTOCOL_MAP}}, + 'ip_version': {'allow_post': True, 'allow_put': True, + 'default': 4, 'convert_to': converters.convert_to_int, + 'validate': {'type:values': [4, 6]}, + 'is_visible': True}, + 'source_ip_address': {'allow_post': True, 'allow_put': True, + 'validate': {'type:ip_or_subnet_or_none': None}, + 'is_visible': True, 'default': None}, + 'destination_ip_address': {'allow_post': True, 'allow_put': True, + 'validate': {'type:ip_or_subnet_or_none': + None}, + 'is_visible': True, 'default': None}, + 'source_port': {'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'default': None, 'is_visible': True}, + 'destination_port': {'allow_post': True, 'allow_put': True, + 'validate': {'type:port_range': None}, + 'default': None, 'is_visible': True}, + 'position': {'allow_post': False, 'allow_put': False, + 'default': None, 'is_visible': True}, + 'action': {'allow_post': True, 'allow_put': True, + 'convert_to': converters.convert_string_to_case_insensitive, + 'validate': {'type:values': + api_const.FW_VALID_ACTION_VALUES}, + 'is_visible': True, 'default': 'deny'}, + 'enabled': {'allow_post': True, 'allow_put': True, + 'convert_to': converters.convert_to_boolean, + 'default': True, 'is_visible': True}, + }, + api_const.FIREWALL_GROUPS: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'primary_key': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'admin_state_up': {'allow_post': True, 'allow_put': True, + 'default': True, 'is_visible': True, + 'convert_to': converters.convert_to_boolean}, + 'status': {'allow_post': False, 'allow_put': False, + 'is_visible': True}, + 'public': {'allow_post': True, 'allow_put': True, 'default': False, + 'convert_to': converters.convert_to_boolean, + 'is_visible': True, 'required_by_policy': True, + 'enforce_policy': True}, + 'ports': {'allow_post': True, 'allow_put': True, + 'validate': {'type:uuid_list': None}, + 'convert_to': converters.convert_none_to_empty_list, + 'default': None, 'is_visible': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'validate': {'type:string': + db_const.UUID_FIELD_SIZE}, + 'is_visible': True}, + 'ingress_firewall_policy_id': {'allow_post': True, + 'allow_put': True, + 'validate': {'type:uuid_or_none': + None}, + 'default': None, 'is_visible': True}, + 'egress_firewall_policy_id': {'allow_post': True, + 'allow_put': True, + 'validate': {'type:uuid_or_none': + None}, + 'default': None, 'is_visible': True}, + }, + api_const.FIREWALL_POLICIES: { + 'id': {'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'primary_key': True}, + 'tenant_id': {'allow_post': True, 'allow_put': False, + 'required_by_policy': True, + 'validate': {'type:string': + db_const.UUID_FIELD_SIZE}, + 'is_visible': True}, + 'name': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'description': {'allow_post': True, 'allow_put': True, + 'validate': {'type:string': + db_const.DESCRIPTION_FIELD_SIZE}, + 'is_visible': True, 'default': ''}, + 'public': {'allow_post': True, 'allow_put': True, 'default': False, + 'convert_to': converters.convert_to_boolean, + 'is_visible': True, 'required_by_policy': True, + 'enforce_policy': True}, + 'firewall_rules': {'allow_post': True, 'allow_put': True, + 'validate': {'type:uuid_list': None}, + 'convert_to': converters.convert_none_to_empty_list, + 'default': None, 'is_visible': True}, + 'audited': {'allow_post': True, 'allow_put': True, 'default': False, + 'convert_to': converters.convert_to_boolean, + 'is_visible': True}, + + }, +} + +# The subresource attribute map for the extension. This extension has only +# top level resources, not child resources, so this is set to an empty dict. +SUB_RESOURCE_ATTRIBUTE_MAP = { +} + +# The action map. +ACTION_MAP = { +} + +# The list of required extensions. +REQUIRED_EXTENSIONS = [ +] + +# The list of optional extensions. +OPTIONAL_EXTENSIONS = [ +] diff --git a/neutron_lib/api/definitions/firewallrouterinsertion.py b/neutron_lib/api/definitions/firewallrouterinsertion.py new file mode 100644 index 000000000..e10af24c6 --- /dev/null +++ b/neutron_lib/api/definitions/firewallrouterinsertion.py @@ -0,0 +1,69 @@ +# 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 import constants + +# The alias of the extension. +ALIAS = 'firewallrouterinsertion' + +# 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 = 'FWaaS Router Insertion' + +# The description of the extension. +DESCRIPTION = "Provides router insertion support for FWaaS version 1" + +# A timestamp of when the extension was introduced. +UPDATED_TIMESTAMP = "2016-01-01T10:00:00-00:00" + +# The name of the resource +RESOURCE_NAME = "firewall" + +# The plural for the resource +COLLECTION_NAME = "firewalls" + +RESOURCE_ATTRIBUTE_MAP = { + COLLECTION_NAME: { + 'router_ids': {'allow_post': True, 'allow_put': True, + 'validate': {'type:uuid_list': None}, + 'is_visible': True, + 'default': constants.ATTR_NOT_SPECIFIED}, + } +} + +# The subresource attribute map for the extension. This extension has only +# top level resources, not child resources, so this is set to an empty dict. +SUB_RESOURCE_ATTRIBUTE_MAP = { +} + +# The action map. +ACTION_MAP = { +} + +# The list of required extensions. +REQUIRED_EXTENSIONS = [ +] + +# The list of optional extensions. +OPTIONAL_EXTENSIONS = [ +] diff --git a/neutron_lib/tests/unit/api/definitions/test_firewall.py b/neutron_lib/tests/unit/api/definitions/test_firewall.py new file mode 100644 index 000000000..7156d1852 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_firewall.py @@ -0,0 +1,24 @@ +# 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 firewall +from neutron_lib.tests.unit.api.definitions import base + + +class FirewallDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = firewall + extension_resources = ('firewalls', 'firewall_policies', 'firewall_rules') + extension_attributes = ('action', 'admin_state_up', 'audited', + 'destination_ip_address', 'destination_port', + 'enabled', 'firewall_policy_id', 'firewall_rules', + 'ip_version', 'position', 'protocol', + 'source_ip_address', 'source_port') diff --git a/neutron_lib/tests/unit/api/definitions/test_firewall_v2.py b/neutron_lib/tests/unit/api/definitions/test_firewall_v2.py new file mode 100644 index 000000000..3835a9f73 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_firewall_v2.py @@ -0,0 +1,27 @@ +# 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 firewall_v2 +from neutron_lib.tests.unit.api.definitions import base + + +class FirewallDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = firewall_v2 + extension_resources = ('firewall_groups', 'firewall_policies', + 'firewall_rules') + extension_attributes = ('action', 'admin_state_up', 'audited', + 'destination_ip_address', 'destination_port', + 'egress_firewall_policy_id', 'enabled', + 'firewall_policy_id', 'firewall_rules', + 'ingress_firewall_policy_id', 'ip_version', + 'ports', 'position', 'protocol', 'public', + 'source_ip_address', 'source_port') diff --git a/neutron_lib/tests/unit/api/definitions/test_firewallrouterinsertion.py b/neutron_lib/tests/unit/api/definitions/test_firewallrouterinsertion.py new file mode 100644 index 000000000..8d243a4e9 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_firewallrouterinsertion.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 firewallrouterinsertion +from neutron_lib.tests.unit.api.definitions import base + + +class FirewallDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = firewallrouterinsertion + extension_resources = ('firewalls',) + extension_attributes = ('router_ids',) diff --git a/releasenotes/notes/fwaas-api-def-a6f03db369177b4a.yaml b/releasenotes/notes/fwaas-api-def-a6f03db369177b4a.yaml new file mode 100644 index 000000000..d50724dcb --- /dev/null +++ b/releasenotes/notes/fwaas-api-def-a6f03db369177b4a.yaml @@ -0,0 +1,3 @@ +--- +features: + - Adds neutron-fwaas API definitions to neutron-lib.