diff --git a/neutron/api/api_common.py b/neutron/api/api_common.py index b31cde75eb3..743c690eb4a 100644 --- a/neutron/api/api_common.py +++ b/neutron/api/api_common.py @@ -17,7 +17,6 @@ import functools from oslo_config import cfg from oslo_log import log as logging -import six from six.moves.urllib import parse from webob import exc @@ -30,7 +29,13 @@ LOG = logging.getLogger(__name__) def get_filters(request, attr_info, skips=None): - """Extracts the filters from the request string. + return get_filters_from_dict(request.GET.dict_of_lists(), + attr_info, + skips) + + +def get_filters_from_dict(data, attr_info, skips=None): + """Extracts the filters from a dict of query parameters. Returns a dict of lists for the filters: check=a&check=b&name=Bob& @@ -39,7 +44,7 @@ def get_filters(request, attr_info, skips=None): """ skips = skips or [] res = {} - for key, values in six.iteritems(request.GET.dict_of_lists()): + for key, values in data.items(): if key in skips: continue values = [v for v in values if v] diff --git a/neutron/pecan_wsgi/controllers/resource.py b/neutron/pecan_wsgi/controllers/resource.py index 725bafc79e8..388934582eb 100644 --- a/neutron/pecan_wsgi/controllers/resource.py +++ b/neutron/pecan_wsgi/controllers/resource.py @@ -15,6 +15,7 @@ import pecan from pecan import request +from neutron.api import api_common from neutron.pecan_wsgi.controllers import utils @@ -79,8 +80,11 @@ class CollectionsController(utils.NeutronPecanController): # after making sure policy enforced fields remain kwargs.pop('fields', None) _listify = lambda x: x if isinstance(x, list) else [x] - filters = {k: _listify(v) for k, v in kwargs.items()} - # TODO(kevinbenton): convert these using api_common.get_filters + filters = api_common.get_filters_from_dict( + {k: _listify(v) for k, v in kwargs.items()}, + self._resource_info, + skips=['fields', 'sort_key', 'sort_dir', + 'limit', 'marker', 'page_reverse']) lister = getattr(self.plugin, 'get_%s' % self.collection) neutron_context = request.context['neutron_context'] return {self.collection: lister(neutron_context, filters=filters)} diff --git a/neutron/pecan_wsgi/controllers/utils.py b/neutron/pecan_wsgi/controllers/utils.py index 9a902db376e..ae01fff4ef0 100644 --- a/neutron/pecan_wsgi/controllers/utils.py +++ b/neutron/pecan_wsgi/controllers/utils.py @@ -15,6 +15,7 @@ import pecan +from neutron.api.v2 import attributes as api_attributes from neutron import manager # Utility functions for Pecan controllers. @@ -40,6 +41,7 @@ class NeutronPecanController(object): # Ensure dashes are always replaced with underscores self.collection = collection and collection.replace('-', '_') self.resource = resource and resource.replace('-', '_') + self._resource_info = api_attributes.get_collection_info(collection) self._plugin = None @property