]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add bandwidth_limit rules as sub-collection of qos policy
authorIrena Berezovsky <irenab.dev@gmail.com>
Tue, 30 Jun 2015 12:04:39 +0000 (12:04 +0000)
committerIrena Berezovsky <irenab.dev@gmail.com>
Wed, 1 Jul 2015 12:45:34 +0000 (12:45 +0000)
This patch add support for qos extension according to the
spec modification [1].

[1] https://review.openstack.org/#/c/197004/

Change-Id: I9226932191464face6e20625e35ad4b7529db4ca

neutron/extensions/qos.py
neutron/services/qos/qos_plugin.py

index 4f164bafee358bf90b8f011ff315387ffd2819f8..cda11511579f6a018561b073b4f6acac8cfa6d15 100644 (file)
 #    under the License.
 
 import abc
+import itertools
 
 import six
 
 from neutron.api import extensions
 from neutron.api.v2 import attributes as attr
+from neutron.api.v2 import base
 from neutron.api.v2 import resource_helper
+from neutron import manager
 from neutron.plugins.common import constants
 from neutron.services import service_base
 
@@ -31,17 +34,13 @@ QOS_RULE_COMMON_FIELDS = {
            'validate': {'type:uuid': None},
            'is_visible': True,
            'primary_key': True},
-    'qos_policy_id': {'allow_post': True, 'allow_put': False,
-                      'is_visible': True, 'required_by_policy': True},
     'type': {'allow_post': True, 'allow_put': True, 'is_visible': True,
              'default': '',
              'validate': {'type:values': VALID_RULE_TYPES}},
-    'tenant_id': {'allow_post': True, 'allow_put': False,
-                  'required_by_policy': True,
-                  'is_visible': True}}
+             }
 
 RESOURCE_ATTRIBUTE_MAP = {
-    'qos_policies': {
+    'policies': {
         'id': {'allow_post': False, 'allow_put': False,
                'validate': {'type:uuid': None},
         'is_visible': True, 'primary_key': True},
@@ -56,18 +55,25 @@ RESOURCE_ATTRIBUTE_MAP = {
                    'convert_to': attr.convert_to_boolean},
         'tenant_id': {'allow_post': True, 'allow_put': False,
                       'required_by_policy': True,
-                      'is_visible': True}},
-    #TODO(QoS): Here instead of using the resource helper we may
-    #           need to set a subcontroller for qos-rules, so we
-    #           can meet the spec definition.
-    'qos_bandwidthlimit_rules':
-        dict(QOS_RULE_COMMON_FIELDS,
-            **{'max_kbps': {'allow_post': True, 'allow_put': True,
-                            'is_visible': True, 'default': None,
-                            'validate': {'type:non_negative', None}},
-               'max_burst_kbps': {'allow_post': True, 'allow_put': True,
+                      'is_visible': True}
+    }
+}
+
+SUB_RESOURCE_ATTRIBUTE_MAP = {
+    'bandwidth_limit_rules': {
+        'parent': {'collection_name': 'policies',
+                   'member_name': 'policy'},
+        'parameters': dict(QOS_RULE_COMMON_FIELDS,
+                           **{'max_kbps': {
+                                  'allow_post': True, 'allow_put': True,
+                                  'is_visible': True, 'default': None,
+                                  'validate': {'type:non_negative': None}},
+                              'max_burst_kbps': {
+                                  'allow_post': True, 'allow_put': True,
                                   'is_visible': True, 'default': 0,
-                                  'validate': {'type:non_negative', None}}})}
+                                  'validate': {'type:non_negative': None}}})
+    }
+}
 
 QOS_POLICY_ID = "qos_policy_id"
 
@@ -116,16 +122,46 @@ class Qos(extensions.ExtensionDescriptor):
     @classmethod
     def get_resources(cls):
         """Returns Ext Resources."""
+        special_mappings = {'policies': 'policy'}
         plural_mappings = resource_helper.build_plural_mappings(
-            {'policies': 'policy'}, RESOURCE_ATTRIBUTE_MAP)
+            special_mappings, itertools.chain(RESOURCE_ATTRIBUTE_MAP,
+                                           SUB_RESOURCE_ATTRIBUTE_MAP))
         attr.PLURALS.update(plural_mappings)
-        #TODO(QoS): manually register some resources to make sure
-        #           we match what's defined in the spec.
-        return resource_helper.build_resource_info(plural_mappings,
-                                                   RESOURCE_ATTRIBUTE_MAP,
-                                                   constants.QOS,
-                                                   translate_name=True,
-                                                   allow_bulk=True)
+
+        resources = resource_helper.build_resource_info(
+                plural_mappings,
+                RESOURCE_ATTRIBUTE_MAP,
+                constants.QOS,
+                translate_name=True,
+                allow_bulk=True)
+
+        plugin = manager.NeutronManager.get_service_plugins()[constants.QOS]
+        for collection_name in SUB_RESOURCE_ATTRIBUTE_MAP:
+            resource_name = collection_name[:-1]
+            parent = SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get('parent')
+            params = SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(
+                'parameters')
+
+            controller = base.create_resource(collection_name, resource_name,
+                                              plugin, params,
+                                              allow_bulk=True,
+                                              parent=parent,
+                                              allow_pagination=True,
+                                              allow_sorting=True)
+
+            resource = extensions.ResourceExtension(
+                collection_name,
+                controller, parent,
+                path_prefix=constants.COMMON_PREFIXES[
+                    constants.QOS],
+                attr_map=params)
+            resources.append(resource)
+
+        return resources
+
+    def update_attributes_map(self, attributes, extension_attrs_map=None):
+        super(Qos, self).update_attributes_map(
+            attributes, extension_attrs_map=RESOURCE_ATTRIBUTE_MAP)
 
     def get_extended_resources(self, version):
         if version == "2.0":
@@ -146,45 +182,48 @@ class QoSPluginBase(service_base.ServicePluginBase):
         return constants.QOS
 
     @abc.abstractmethod
-    def get_qos_policy(self, context, qos_policy_id, fields=None):
+    def get_policy(self, context, policy_id, fields=None):
         pass
 
     @abc.abstractmethod
-    def get_qos_policies(self, context, filters=None, fields=None,
-                         sorts=None, limit=None, marker=None,
-                         page_reverse=False):
+    def get_policies(self, context, filters=None, fields=None,
+                     sorts=None, limit=None, marker=None,
+                     page_reverse=False):
         pass
 
     @abc.abstractmethod
-    def create_qos_policy(self, context, qos_policy):
+    def create_policy(self, context, qos_policy):
         pass
 
     @abc.abstractmethod
-    def update_qos_policy(self, context, qos_policy_id, qos_policy):
+    def update_policy(self, context, policy_id, qos_policy):
         pass
 
     @abc.abstractmethod
-    def delete_qos_policy(self, context, qos_policy_id):
+    def delete_policy(self, context, policy_id):
         pass
 
     @abc.abstractmethod
-    def get_qos_bandwidth_limit_rule(self, context, rule_id, fields=None):
+    def get_policy_bandwidth_limit_rule(self, context, rule_id,
+                                        policy_id, fields=None):
         pass
 
     @abc.abstractmethod
-    def get_qos_bandwith_limit_rules(self, context, filters=None, fields=None,
-                                     sorts=None, limit=None, marker=None,
-                                     page_reverse=False):
+    def get_policy_bandwidth_limit_rules(self, context, policy_id,
+                                         filters=None, fields=None,
+                                         sorts=None, limit=None,
+                                         marker=None, page_reverse=False):
         pass
 
     @abc.abstractmethod
-    def create_qos_bandwidth_limit_rule(self, context, rule):
+    def create_policy_bandwidth_limit_rule(self, context, policy_id, rule):
         pass
 
     @abc.abstractmethod
-    def update_qos_bandwidth_limit_rule(self, context, rule_id, rule):
+    def update_policy_bandwidth_limit_rule(self, context, rule_id,
+                                           policy_id, rule):
         pass
 
     @abc.abstractmethod
-    def delete_qos_bandwith_limit_rule(self, context, rule_id):
+    def delete_policy_bandwidth_limit_rule(self, context, rule_id, policy_id):
         pass
index 072c8f6356ae3278578f7c39d4b1878a79c975e1..bc866ae01b157dd3e739df43856914cbe4ce0eb0 100644 (file)
@@ -49,37 +49,39 @@ class QoSPlugin(qos.QoSPluginBase):
         #            extension of resources
         pass
 
-    def create_qos_policy(self, context, qos_policy):
+    def create_policy(self, context, qos_policy):
         pass
 
-    def update_qos_policy(self, context, qos_policy_id, qos_policy):
+    def update_policy(self, context, policy_id, qos_policy):
         pass
 
-    def delete_qos_policy(self, context, qos_policy_id):
+    def delete_policy(self, context, policy_id):
         pass
 
-    def get_qos_policy(self, context, qos_policy_id, fields=None):
+    def get_policy(self, context, policy_id, fields=None):
         pass
 
-    def get_qos_policies(self, context, filters=None, fields=None,
-                         sorts=None, limit=None, marker=None,
-                         page_reverse=False):
+    def get_policies(self, context, filters=None, fields=None,
+                     sorts=None, limit=None, marker=None,
+                     page_reverse=False):
         pass
 
-    def create_qos_bandwidth_limit_rule(self, context,
-                                        qos_bandwidthlimit_rule):
+    def create_policy_bandwidth_limit_rule(self, context, policy_id, rule):
         pass
 
-    def update_qos_bandwidth_limit_rule(self, context, rule_id, rule):
+    def update_policy_bandwidth_limit_rule(self, context, rule_id,
+                                           policy_id, rule):
         pass
 
-    def get_qos_bandwidth_limit_rule(self, context, rule_id, fields=None):
+    def get_policy_bandwidth_limit_rule(self, context, rule_id,
+                                        policy_id, fields=None):
         pass
 
-    def delete_qos_bandwith_limit_rule(self, context, rule_id):
+    def delete_policy_bandwidth_limit_rule(self, context, rule_id, policy_id):
         pass
 
-    def get_qos_bandwith_limit_rules(self, context, filters=None, fields=None,
-                                    sorts=None, limit=None, marker=None,
-                                    page_reverse=False):
+    def get_policy_bandwidth_limit_rules(self, context, policy_id,
+                                         filters=None, fields=None,
+                                         sorts=None, limit=None,
+                                         marker=None, page_reverse=False):
         pass