From 5447278fc6558b0c26f834305a228d6aec273d40 Mon Sep 17 00:00:00 2001 From: Kanagaraj Manickam Date: Fri, 28 Aug 2015 16:32:10 +0530 Subject: [PATCH] Enable filters for heat resource-type-list Adds filtering support for resource-type-list based on resource type's name, version and support_status Depends-On: I7500d5c56ce252bf8c0a9ae7a188a8cb25e643ce implements blueprint heat-resource-type-search DocImpact Change-Id: I0029b90dcdce69fc27a6f511db795faad237dc94 --- heatclient/tests/unit/test_resource_types.py | 22 ++++++++++++++++++++ heatclient/v1/resource_types.py | 19 +++++++++++++---- heatclient/v1/shell.py | 9 +++++++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/heatclient/tests/unit/test_resource_types.py b/heatclient/tests/unit/test_resource_types.py index d3153038..7bbb591d 100644 --- a/heatclient/tests/unit/test_resource_types.py +++ b/heatclient/tests/unit/test_resource_types.py @@ -70,6 +70,28 @@ class ResourceTypeManagerTest(testtools.TestCase): manager = resource_types.ResourceTypeManager(FakeClient()) manager.list() + def test_list_types_with_filters(self): + filters = {'name': 'OS::Keystone::*', + 'version': '5.0.0', + 'support_status': 'SUPPORTED'} + + manager = resource_types.ResourceTypeManager(None) + with mock.patch.object(manager, '_list') as mock_list: + mock_list.return_value = None + manager.list(filters=filters) + self.assertEqual(1, mock_list.call_count) + url, param = mock_list.call_args[0] + self.assertEqual("resource_types", param) + base_url, query_params = utils.parse_query_url(url) + self.assertEqual('/%s' % manager.KEY, base_url) + # parameters in query_params is in list format, so filter params + # are made to be inline with it + filters_params = {} + for item in filters: + filters_params[item] = [filters[item]] + + self.assertEqual(filters_params, query_params) + @mock.patch.object(utils, 'get_response_body') def test_get(self, mock_utils): key = 'resource_types' diff --git a/heatclient/v1/resource_types.py b/heatclient/v1/resource_types.py index 34397b93..952cc3c5 100644 --- a/heatclient/v1/resource_types.py +++ b/heatclient/v1/resource_types.py @@ -31,26 +31,37 @@ class ResourceType(base.Resource): class ResourceTypeManager(base.BaseManager): resource_class = ResourceType + KEY = 'resource_types' - def list(self): + def list(self, **kwargs): """Get a list of resource types. :rtype: list of :class:`ResourceType` """ - return self._list('/resource_types', 'resource_types') + + url = '/%s' % self.KEY + params = {} + if 'filters' in kwargs: + filters = kwargs.pop('filters') + params.update(filters) + url += '?%s' % parse.urlencode(params, True) + + return self._list(url, self.KEY) def get(self, resource_type): """Get the details for a specific resource_type. :param resource_type: name of the resource type to get the details for """ - url_str = '/resource_types/%s' % ( + url_str = '/%s/%s' % ( + self.KEY, parse.quote(encodeutils.safe_encode(resource_type), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body def generate_template(self, resource_type, template_type='cfn'): - url_str = '/resource_types/%s/template' % ( + url_str = '/%s/%s/template' % ( + self.KEY, parse.quote(encodeutils.safe_encode(resource_type), '')) if template_type: url_str += '?%s' % parse.urlencode( diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py index f9189f2b..1094bde1 100644 --- a/heatclient/v1/shell.py +++ b/heatclient/v1/shell.py @@ -641,9 +641,16 @@ def do_output_show(hc, args): print(value) +@utils.arg('-f', '--filters', metavar='', + help=_('Filter parameters to apply on returned resource types. ' + 'This can be specified multiple times, or once with parameters ' + 'separated by a semicolon. It can be any of name, version and ' + 'support_status'), + action='append') def do_resource_type_list(hc, args): '''List the available resource types.''' - types = hc.resource_types.list() + types = hc.resource_types.list( + filters=utils.format_parameters(args.filters)) utils.print_list(types, ['resource_type'], sortby_index=0)