From 6eee64502f0a4eb155b1f323137c12ececb49e2c Mon Sep 17 00:00:00 2001 From: David TARDIVEL Date: Fri, 27 May 2016 11:20:55 +0200 Subject: [PATCH] Add goal name as filter for strategy list cmd This changeset add the possibility to use the goal name as a stragegy list filter. Change-Id: Ibaf45e694f115308f19e9bcd3023fe2e6d1750cd --- watcher/api/controllers/v1/strategy.py | 27 ++++++++++++++++----- watcher/db/sqlalchemy/api.py | 5 +++- watcher/tests/api/v1/test_strategies.py | 32 ++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/watcher/api/controllers/v1/strategy.py b/watcher/api/controllers/v1/strategy.py index d0889a119..adc861ba9 100644 --- a/watcher/api/controllers/v1/strategy.py +++ b/watcher/api/controllers/v1/strategy.py @@ -189,6 +189,9 @@ class StrategiesController(rest.RestController): def _get_strategies_collection(self, filters, marker, limit, sort_key, sort_dir, expand=False, resource_url=None): + api_utils.validate_search_filters( + filters, list(objects.strategy.Strategy.fields.keys()) + + ["goal_uuid", "goal_name"]) limit = api_utils.validate_limit(limit) api_utils.validate_sort_dir(sort_dir) @@ -210,27 +213,33 @@ class StrategiesController(rest.RestController): @wsme_pecan.wsexpose(StrategyCollection, wtypes.text, wtypes.text, int, wtypes.text, wtypes.text) - def get_all(self, goal_uuid=None, marker=None, limit=None, + def get_all(self, goal=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of strategies. - :param goal_uuid: goal UUID to filter by. + :param goal: goal UUID or name to filter by. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ - filters = api_utils.as_filters_dict(goal_uuid=goal_uuid) + filters = {} + if goal: + if common_utils.is_uuid_like(goal): + filters['goal_uuid'] = goal + else: + filters['goal_name'] = goal + return self._get_strategies_collection( filters, marker, limit, sort_key, sort_dir) @wsme_pecan.wsexpose(StrategyCollection, wtypes.text, wtypes.text, int, wtypes.text, wtypes.text) - def detail(self, goal_uuid=None, marker=None, limit=None, + def detail(self, goal=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of strategies with detail. - :param goal_uuid: goal UUID to filter by. + :param goal: goal UUID or name to filter by. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. @@ -243,7 +252,13 @@ class StrategiesController(rest.RestController): expand = True resource_url = '/'.join(['strategies', 'detail']) - filters = api_utils.as_filters_dict(goal_uuid=goal_uuid) + filters = {} + if goal: + if common_utils.is_uuid_like(goal): + filters['goal_uuid'] = goal + else: + filters['goal_name'] = goal + return self._get_strategies_collection( filters, marker, limit, sort_key, sort_dir, expand, resource_url) diff --git a/watcher/db/sqlalchemy/api.py b/watcher/db/sqlalchemy/api.py index 7524aa786..39be50390 100644 --- a/watcher/db/sqlalchemy/api.py +++ b/watcher/db/sqlalchemy/api.py @@ -281,7 +281,10 @@ class Connection(api.BaseConnection): def _add_strategies_filters(self, query, filters): plain_fields = ['uuid', 'name', 'display_name', 'goal_id'] - join_fieldmap = {'goal_uuid': ("uuid", models.Goal)} + join_fieldmap = { + 'goal_uuid': ("uuid", models.Goal), + 'goal_name': ("name", models.Goal) + } return self._add_filters( query=query, model=models.Strategy, filters=filters, diff --git a/watcher/tests/api/v1/test_strategies.py b/watcher/tests/api/v1/test_strategies.py index b1c1a1358..4a7a8c4ed 100644 --- a/watcher/tests/api/v1/test_strategies.py +++ b/watcher/tests/api/v1/test_strategies.py @@ -151,7 +151,37 @@ class TestListStrategy(api_base.FunctionalTest): uuid=utils.generate_uuid(), goal_id=goal2['id']) - response = self.get_json('/strategies/?goal_uuid=%s' % goal1['uuid']) + response = self.get_json('/strategies/?goal=%s' % goal1['uuid']) + + strategies = response['strategies'] + self.assertEqual(2, len(strategies)) + for strategy in strategies: + self.assertEqual(goal1['uuid'], strategy['goal_uuid']) + + def test_filter_by_goal_name(self): + goal1 = obj_utils.create_test_goal( + self.context, + id=1, + uuid=utils.generate_uuid(), + name='My_Goal 1') + goal2 = obj_utils.create_test_goal( + self.context, + id=2, + uuid=utils.generate_uuid(), + name='My Goal 2') + + for id_ in range(1, 3): + obj_utils.create_test_strategy( + self.context, id=id_, + uuid=utils.generate_uuid(), + goal_id=goal1['id']) + for id_ in range(3, 5): + obj_utils.create_test_strategy( + self.context, id=id_, + uuid=utils.generate_uuid(), + goal_id=goal2['id']) + + response = self.get_json('/strategies/?goal=%s' % goal1['name']) strategies = response['strategies'] self.assertEqual(2, len(strategies))