diff --git a/neutron_lib/api/definitions/__init__.py b/neutron_lib/api/definitions/__init__.py index f80543581..8b5d9e55d 100644 --- a/neutron_lib/api/definitions/__init__.py +++ b/neutron_lib/api/definitions/__init__.py @@ -76,6 +76,7 @@ from neutron_lib.api.definitions import qos_bw_minimum_ingress from neutron_lib.api.definitions import qos_default from neutron_lib.api.definitions import qos_gateway_ip from neutron_lib.api.definitions import qos_rule_type_details +from neutron_lib.api.definitions import qos_rules_alias from neutron_lib.api.definitions import revisionifmatch from neutron_lib.api.definitions import router_availability_zone from neutron_lib.api.definitions import router_interface_fip @@ -169,6 +170,7 @@ _ALL_API_DEFINITIONS = { qos_default, qos_gateway_ip, qos_rule_type_details, + qos_rules_alias, revisionifmatch, router_availability_zone, router_interface_fip, diff --git a/neutron_lib/api/definitions/base.py b/neutron_lib/api/definitions/base.py index ca3895e57..d04775b92 100644 --- a/neutron_lib/api/definitions/base.py +++ b/neutron_lib/api/definitions/base.py @@ -114,7 +114,9 @@ KNOWN_EXTENSIONS = ( 'project-id', 'provider', 'qos', + 'qos-bw-limit-direction', 'qos-gateway-ip', + 'qos-rules-alias', 'quotas', 'rbac-policies', 'router', diff --git a/neutron_lib/api/definitions/qos_rules_alias.py b/neutron_lib/api/definitions/qos_rules_alias.py new file mode 100644 index 000000000..2a868a6c4 --- /dev/null +++ b/neutron_lib/api/definitions/qos_rules_alias.py @@ -0,0 +1,117 @@ +# 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 qos +from neutron_lib.api.definitions import qos_bw_limit_direction +from neutron_lib import constants +from neutron_lib.db import constants as db_const +from neutron_lib.services.qos import constants as q_const + + +_QOS_RULE_COMMON_FIELDS = { + 'id': { + 'allow_post': False, 'allow_put': False, + 'validate': {'type:uuid': None}, + 'is_visible': True, + 'is_filter': True, + 'is_sort_key': True, + 'primary_key': True + }, + 'tenant_id': { + 'allow_post': False, 'allow_put': False, + 'required_by_policy': True, + 'is_visible': True + } +} + +ALIAS = 'qos-rules-alias' +IS_SHIM_EXTENSION = False +IS_STANDARD_ATTR_EXTENSION = False +NAME = 'Quality of Service rules alias API' +API_PREFIX = '/' + qos.ALIAS +DESCRIPTION = ('API to enable GET, PUT and DELETE operations on QoS policy ' + 'rules without specifying policy ID') +UPDATED_TIMESTAMP = '2018-10-07T10:00:00-00:00' +RESOURCE_ATTRIBUTE_MAP = { + qos.BANDWIDTH_LIMIT_RULES: dict( + _QOS_RULE_COMMON_FIELDS, + **{q_const.MAX_KBPS: { + 'allow_post': False, 'allow_put': True, + 'convert_to': converters.convert_to_int, + 'is_visible': True, + 'is_filter': True, + 'is_sort_key': True, + 'validate': { + 'type:range': [0, db_const.DB_INTEGER_MAX_VALUE] + } + }, + qos_bw_limit_direction.DIRECTION: { + 'allow_post': False, + 'allow_put': True, + 'is_visible': True, + 'is_filter': True, + 'is_sort_key': True, + 'default': constants.EGRESS_DIRECTION, + 'validate': { + 'type:values': constants.VALID_DIRECTIONS + } + }, + q_const.MAX_BURST: { + 'allow_post': False, 'allow_put': True, + 'is_visible': True, 'default': 0, + 'is_filter': True, + 'is_sort_key': True, + 'convert_to': converters.convert_to_int, + 'validate': { + 'type:range': [0, db_const.DB_INTEGER_MAX_VALUE] + } + }}), + qos.DSCP_MARKING_RULES: dict( + _QOS_RULE_COMMON_FIELDS, + **{q_const.DSCP_MARK: { + 'allow_post': False, 'allow_put': True, + 'convert_to': converters.convert_to_int, + 'is_visible': True, + 'is_filter': True, + 'is_sort_key': True, + 'validate': { + 'type:values': constants.VALID_DSCP_MARKS + } + }}), + qos.MIN_BANDWIDTH_RULES: dict( + _QOS_RULE_COMMON_FIELDS, + **{q_const.MIN_KBPS: { + 'allow_post': False, 'allow_put': True, + 'is_visible': True, + 'is_filter': True, + 'is_sort_key': True, + 'convert_to': converters.convert_to_int, + 'validate': { + 'type:range': [0, db_const.DB_INTEGER_MAX_VALUE] + } + }, + qos_bw_limit_direction.DIRECTION: { + 'allow_post': False, 'allow_put': True, + 'is_visible': True, 'default': constants.EGRESS_DIRECTION, + 'is_filter': True, + 'is_sort_key': True, + 'validate': { + 'type:values': constants.VALID_DIRECTIONS + } + }}) +} +SUB_RESOURCE_ATTRIBUTE_MAP = {} +ACTION_MAP = {} +REQUIRED_EXTENSIONS = [qos.ALIAS, qos_bw_limit_direction.ALIAS] +OPTIONAL_EXTENSIONS = [] +ACTION_STATUS = {} diff --git a/neutron_lib/tests/unit/api/definitions/test_qos_rules_alias.py b/neutron_lib/tests/unit/api/definitions/test_qos_rules_alias.py new file mode 100644 index 000000000..f7fcb3145 --- /dev/null +++ b/neutron_lib/tests/unit/api/definitions/test_qos_rules_alias.py @@ -0,0 +1,29 @@ +# 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 qos +from neutron_lib.api.definitions import qos_bw_limit_direction +from neutron_lib.api.definitions import qos_rules_alias +from neutron_lib.services.qos import constants as q_const +from neutron_lib.tests.unit.api.definitions import base + + +class QoSRulesAliasDefinitionTestCase(base.DefinitionBaseTestCase): + extension_module = qos_rules_alias + extension_resources = (qos.BANDWIDTH_LIMIT_RULES, + qos.DSCP_MARKING_RULES, + qos.MIN_BANDWIDTH_RULES) + extension_attributes = (qos_bw_limit_direction.DIRECTION, + q_const.MAX_BURST, + q_const.DSCP_MARK, + q_const.MIN_KBPS, + q_const.MAX_KBPS) diff --git a/releasenotes/notes/qos-rules-alias-ext-c13417dcb3d81130.yaml b/releasenotes/notes/qos-rules-alias-ext-c13417dcb3d81130.yaml new file mode 100644 index 000000000..6f7eb3aef --- /dev/null +++ b/releasenotes/notes/qos-rules-alias-ext-c13417dcb3d81130.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + The ``qos-rules-alias`` API extension is introduced to enable users to + perform ``GET``, ``PUT`` and ``DELETE`` operations on + ``bandwidth_limit_rules``, ``dscp_marking_rules`` and + ``minimum_bandwidth_rules`` as though they are first level resources. In + other words, the user will not have to specify the QoS policy ID.