From: Paul Michali Date: Tue, 24 Dec 2013 21:17:02 +0000 (-0500) Subject: Remove dupl. for get_resources in adv. services X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=18c0f0937534ee763216236728e43383b9abb51c;p=openstack-build%2Fneutron-build.git Remove dupl. for get_resources in adv. services There is duplication of logic related to creating API resources for advanced services extensions. Extracted the common logic out into a new module that can be used by the services. There are already UT cases in the services that exercises the logic, so no new tests were added. Change-Id: Ib52e2de6f215a1755f11a382dc4451a05ce3b147 Closes-Bug: 1258656 --- diff --git a/neutron/api/v2/resource_helper.py b/neutron/api/v2/resource_helper.py new file mode 100644 index 000000000..d908c5ba0 --- /dev/null +++ b/neutron/api/v2/resource_helper.py @@ -0,0 +1,75 @@ +# (c) Copyright 2014 Cisco Systems Inc. +# 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. +# @author: Paul Michali Cisco Systems, Inc. + +from oslo.config import cfg + +from neutron.api import extensions +from neutron.api.v2 import base +from neutron import manager +from neutron.plugins.common import constants +from neutron import quota + + +def build_plural_mappings(special_mappings, resource_map): + """Create plural to singular mapping for all resources. + + Allows for special mappings to be provided, like policies -> policy. + Otherwise, will strip off the last character for normal mappings, like + routers -> router. + """ + plural_mappings = {} + for plural in resource_map: + singular = special_mappings.get(plural, plural[:-1]) + plural_mappings[plural] = singular + return plural_mappings + + +def build_resource_info(plural_mappings, resource_map, which_service, + action_map=None, register_quota=False, + translate_name=False, allow_bulk=False): + """Build resources for advanced services. + + Takes the resource information, and singular/plural mappings, and creates + API resource objects for advanced services extensions. Will optionally + translate underscores to dashes in resource names, register the resource, + and accept action information for resources. + """ + resources = [] + if action_map is None: + action_map = {} + plugin = manager.NeutronManager.get_service_plugins()[which_service] + for collection_name in resource_map: + resource_name = plural_mappings[collection_name] + params = resource_map.get(collection_name, {}) + if translate_name: + collection_name = collection_name.replace('_', '-') + if register_quota: + quota.QUOTAS.register_resource_by_name(resource_name) + member_actions = action_map.get(resource_name, {}) + controller = base.create_resource( + collection_name, resource_name, plugin, params, + member_actions=member_actions, + allow_bulk=allow_bulk, + allow_pagination=cfg.CONF.allow_pagination, + allow_sorting=cfg.CONF.allow_sorting) + resource = extensions.ResourceExtension( + collection_name, + controller, + path_prefix=constants.COMMON_PREFIXES[which_service], + member_actions=member_actions, + attr_map=params) + resources.append(resource) + return resources diff --git a/neutron/extensions/firewall.py b/neutron/extensions/firewall.py index e713e2f7b..847914197 100644 --- a/neutron/extensions/firewall.py +++ b/neutron/extensions/firewall.py @@ -24,9 +24,8 @@ 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.common import exceptions as qexception -from neutron import manager from neutron.openstack.common import log as logging from neutron.plugins.common import constants from neutron.services.service_base import ServicePluginBase @@ -321,46 +320,16 @@ class Firewall(extensions.ExtensionDescriptor): @classmethod def get_resources(cls): - my_plurals = [] - for plural in RESOURCE_ATTRIBUTE_MAP: - if plural == 'firewall_policies': - singular = 'firewall_policy' - else: - singular = plural[:-1] - my_plurals.append((plural, singular)) - attr.PLURALS.update(dict(my_plurals)) - resources = [] - plugin = manager.NeutronManager.get_service_plugins()[ - constants.FIREWALL] - for collection_name in RESOURCE_ATTRIBUTE_MAP: - # Special handling needed for resources with 'y' ending - if collection_name == 'firewall_policies': - resource_name = 'firewall_policy' - else: - resource_name = collection_name[:-1] - - params = RESOURCE_ATTRIBUTE_MAP[collection_name] - - member_actions = {} - if resource_name == 'firewall_policy': - member_actions = {'insert_rule': 'PUT', - 'remove_rule': 'PUT'} - - controller = base.create_resource( - collection_name, resource_name, plugin, params, - member_actions=member_actions, - allow_pagination=cfg.CONF.allow_pagination, - allow_sorting=cfg.CONF.allow_sorting) - - resource = extensions.ResourceExtension( - collection_name, - controller, - path_prefix=constants.COMMON_PREFIXES[constants.FIREWALL], - member_actions=member_actions, - attr_map=params) - resources.append(resource) - - return resources + special_mappings = {'firewall_policies': 'firewall_policy'} + plural_mappings = resource_helper.build_plural_mappings( + special_mappings, RESOURCE_ATTRIBUTE_MAP) + attr.PLURALS.update(plural_mappings) + action_map = {'firewall_policy': {'insert_rule': 'PUT', + 'remove_rule': 'PUT'}} + return resource_helper.build_resource_info(plural_mappings, + RESOURCE_ATTRIBUTE_MAP, + constants.FIREWALL, + action_map=action_map) @classmethod def get_plugin_interface(cls): diff --git a/neutron/extensions/l3.py b/neutron/extensions/l3.py index 4e60222a4..7ab7d66b1 100644 --- a/neutron/extensions/l3.py +++ b/neutron/extensions/l3.py @@ -24,11 +24,9 @@ from oslo.config import cfg 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.common import exceptions as qexception -from neutron import manager from neutron.plugins.common import constants -from neutron import quota # L3 Exceptions @@ -176,35 +174,16 @@ class L3(extensions.ExtensionDescriptor): @classmethod def get_resources(cls): """Returns Ext Resources.""" - my_plurals = [(key, key[:-1]) for key in RESOURCE_ATTRIBUTE_MAP.keys()] - attr.PLURALS.update(dict(my_plurals)) - exts = [] - plugin = manager.NeutronManager.get_service_plugins()[ - constants.L3_ROUTER_NAT] - for resource_name in ['router', 'floatingip']: - collection_name = resource_name + "s" - params = RESOURCE_ATTRIBUTE_MAP.get(collection_name, dict()) - - member_actions = {} - if resource_name == 'router': - member_actions = {'add_router_interface': 'PUT', - 'remove_router_interface': 'PUT'} - - quota.QUOTAS.register_resource_by_name(resource_name) - - controller = base.create_resource( - collection_name, resource_name, plugin, params, - member_actions=member_actions, - allow_pagination=cfg.CONF.allow_pagination, - allow_sorting=cfg.CONF.allow_sorting) - - ex = extensions.ResourceExtension(collection_name, - controller, - member_actions=member_actions, - attr_map=params) - exts.append(ex) - - return exts + plural_mappings = resource_helper.build_plural_mappings( + {}, RESOURCE_ATTRIBUTE_MAP) + attr.PLURALS.update(plural_mappings) + action_map = {'router': {'add_router_interface': 'PUT', + 'remove_router_interface': 'PUT'}} + return resource_helper.build_resource_info(plural_mappings, + RESOURCE_ATTRIBUTE_MAP, + constants.L3_ROUTER_NAT, + action_map=action_map, + register_quota=True) def update_attributes_map(self, attributes): super(L3, self).update_attributes_map( diff --git a/neutron/extensions/loadbalancer.py b/neutron/extensions/loadbalancer.py index e288420c2..eb77473fd 100644 --- a/neutron/extensions/loadbalancer.py +++ b/neutron/extensions/loadbalancer.py @@ -17,12 +17,12 @@ import abc -from oslo.config import cfg 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.common import exceptions as qexception from neutron import manager from neutron.plugins.common import constants @@ -315,36 +315,17 @@ class Loadbalancer(extensions.ExtensionDescriptor): @classmethod def get_resources(cls): - my_plurals = [(key, key[:-1]) for key in RESOURCE_ATTRIBUTE_MAP.keys()] - my_plurals.append(('health_monitors_status', 'health_monitor_status')) - attr.PLURALS.update(dict(my_plurals)) - resources = [] + plural_mappings = resource_helper.build_plural_mappings( + {}, RESOURCE_ATTRIBUTE_MAP) + plural_mappings['health_monitors_status'] = 'health_monitor_status' + attr.PLURALS.update(plural_mappings) + action_map = {'pool': {'stats': 'GET'}} + resources = resource_helper.build_resource_info(plural_mappings, + RESOURCE_ATTRIBUTE_MAP, + constants.LOADBALANCER, + action_map=action_map) plugin = manager.NeutronManager.get_service_plugins()[ constants.LOADBALANCER] - for collection_name in RESOURCE_ATTRIBUTE_MAP: - # Special handling needed for resources with 'y' ending - # (e.g. proxies -> proxy) - resource_name = collection_name[:-1] - params = RESOURCE_ATTRIBUTE_MAP[collection_name] - - member_actions = {} - if resource_name == 'pool': - member_actions = {'stats': 'GET'} - - controller = base.create_resource( - collection_name, resource_name, plugin, params, - member_actions=member_actions, - allow_pagination=cfg.CONF.allow_pagination, - allow_sorting=cfg.CONF.allow_sorting) - - resource = extensions.ResourceExtension( - collection_name, - controller, - path_prefix=constants.COMMON_PREFIXES[constants.LOADBALANCER], - member_actions=member_actions, - attr_map=params) - resources.append(resource) - for collection_name in SUB_RESOURCE_ATTRIBUTE_MAP: # Special handling needed for sub-resources with 'y' ending # (e.g. proxies -> proxy) diff --git a/neutron/extensions/metering.py b/neutron/extensions/metering.py index f9417b53c..02aefc86b 100644 --- a/neutron/extensions/metering.py +++ b/neutron/extensions/metering.py @@ -20,9 +20,8 @@ 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.common import exceptions as qexception -from neutron import manager from neutron.openstack.common import log as logging from neutron.plugins.common import constants from neutron.services import service_base @@ -112,31 +111,16 @@ class Metering(extensions.ExtensionDescriptor): @classmethod def get_resources(cls): """Returns Ext Resources.""" - my_plurals = [(key, key[:-1]) for key in RESOURCE_ATTRIBUTE_MAP.keys()] - attr.PLURALS.update(dict(my_plurals)) - exts = [] - plugin = manager.NeutronManager.get_service_plugins()[ - constants.METERING] - for resource_name in ['metering_label', 'metering_label_rule']: - collection_name = resource_name + "s" - - collection_name = collection_name.replace('_', '-') - params = RESOURCE_ATTRIBUTE_MAP.get(resource_name + "s", dict()) - - controller = base.create_resource(collection_name, - resource_name, - plugin, params, allow_bulk=True, - allow_pagination=True, - allow_sorting=True) - - ex = extensions.ResourceExtension( - collection_name, - controller, - path_prefix=constants.COMMON_PREFIXES[constants.METERING], - attr_map=params) - exts.append(ex) - - return exts + plural_mappings = resource_helper.build_plural_mappings( + {}, RESOURCE_ATTRIBUTE_MAP) + attr.PLURALS.update(plural_mappings) + # PCM: Metering sets pagination and sorting to True. Do we have cfg + # entries for these so can be read? Else, must pass in. + return resource_helper.build_resource_info(plural_mappings, + RESOURCE_ATTRIBUTE_MAP, + constants.METERING, + translate_name=True, + allow_bulk=True) def update_attributes_map(self, attributes): super(Metering, self).update_attributes_map( diff --git a/neutron/extensions/vpnaas.py b/neutron/extensions/vpnaas.py index 1eaf5ae4f..8d1c58b3b 100644 --- a/neutron/extensions/vpnaas.py +++ b/neutron/extensions/vpnaas.py @@ -19,16 +19,13 @@ import abc -from oslo.config import cfg 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.common import exceptions as qexception -from neutron import manager from neutron.plugins.common import constants -from neutron import quota from neutron.services.service_base import ServicePluginBase @@ -359,38 +356,17 @@ class Vpnaas(extensions.ExtensionDescriptor): @classmethod def get_resources(cls): - plural_mapping = { - 'ikepolicies': 'ikepolicy', - 'ipsecpolicies': 'ipsecpolicy' - } - my_plurals = [] - for plural in RESOURCE_ATTRIBUTE_MAP: - singular = plural_mapping.get(plural, plural[:-1]) - my_plurals.append((plural, singular)) - my_plurals.append(('peer_cidrs', 'peer_cidr')) - attr.PLURALS.update(dict(my_plurals)) - resources = [] - plugin = manager.NeutronManager.get_service_plugins()[ - constants.VPN] - for collection_name in RESOURCE_ATTRIBUTE_MAP: - resource_name = plural_mapping.get( - collection_name, collection_name[:-1]) - params = RESOURCE_ATTRIBUTE_MAP[collection_name] - collection_name = collection_name.replace('_', '-') - - quota.QUOTAS.register_resource_by_name(resource_name) - controller = base.create_resource( - collection_name, resource_name, plugin, params, - allow_pagination=cfg.CONF.allow_pagination, - allow_sorting=cfg.CONF.allow_sorting) - - resource = extensions.ResourceExtension( - collection_name, - controller, - path_prefix=constants.COMMON_PREFIXES[constants.VPN], - attr_map=params) - resources.append(resource) - return resources + special_mappings = {'ikepolicies': 'ikepolicy', + 'ipsecpolicies': 'ipsecpolicy'} + plural_mappings = resource_helper.build_plural_mappings( + special_mappings, RESOURCE_ATTRIBUTE_MAP) + plural_mappings['peer_cidrs'] = 'peer_cidr' + attr.PLURALS.update(plural_mappings) + return resource_helper.build_resource_info(plural_mappings, + RESOURCE_ATTRIBUTE_MAP, + constants.VPN, + register_quota=True, + translate_name=True) @classmethod def get_plugin_interface(cls):