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
This commit is contained in:
Kanagaraj Manickam
2015-08-28 16:32:10 +05:30
committed by Kanagaraj Manickam
parent 4804dce0b4
commit 5447278fc6
3 changed files with 45 additions and 5 deletions

View File

@@ -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'

View File

@@ -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(

View File

@@ -641,9 +641,16 @@ def do_output_show(hc, args):
print(value)
@utils.arg('-f', '--filters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
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)