From 0f696d1c604ae734091b51a7ca60f2f290a2640c Mon Sep 17 00:00:00 2001 From: liusheng Date: Mon, 14 Mar 2016 15:21:42 +0800 Subject: [PATCH] Add --filter to "alarm list" As we disscussed in mailing list and agreed finally, we should add --filter and --query to "alarm list" and drop "alarm search". This change add --filter to "alarm list". Change-Id: I4689c03aca84633da063cef7c1ef1816780da4fe --- aodhclient/tests/unit/test_alarm_manager.py | 9 +++++++ aodhclient/v2/alarm.py | 27 ++++++++++++++++++--- aodhclient/v2/alarm_cli.py | 26 ++++++++++++++++---- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/aodhclient/tests/unit/test_alarm_manager.py b/aodhclient/tests/unit/test_alarm_manager.py index 3a8ce7c..ae384dc 100644 --- a/aodhclient/tests/unit/test_alarm_manager.py +++ b/aodhclient/tests/unit/test_alarm_manager.py @@ -60,6 +60,15 @@ class AlarmManagerTest(testtools.TestCase): data=expected_value, headers=headers_value) + @mock.patch.object(alarm.AlarmManager, '_get') + def test_list_with_filters(self, mock_am): + am = alarm.AlarmManager(self.client) + filters = dict(type='threshold', severity='low') + am.list(filters=filters) + expected_url = ("v2/alarms?q.field=severity&q.op=eq&q.value=low&" + "q.field=type&q.op=eq&q.value=threshold") + mock_am.assert_called_with(expected_url) + @mock.patch.object(alarm.AlarmManager, '_get') def test_get(self, mock_am): am = alarm.AlarmManager(self.client) diff --git a/aodhclient/v2/alarm.py b/aodhclient/v2/alarm.py index 60ce900..d00a269 100644 --- a/aodhclient/v2/alarm.py +++ b/aodhclient/v2/alarm.py @@ -21,8 +21,27 @@ class AlarmManager(base.Manager): url = "v2/alarms" - def list(self, query=None): - """List alarms""" + @staticmethod + def _filtersdict_to_url(filters): + urls = [] + for k, v in sorted(filters.items()): + url = "q.field=%s&q.op=eq&q.value=%s" % (k, v) + urls.append(url) + return '&'.join(urls) + + def list(self, query=None, filters=None): + """List alarms. + + :param query: A json format complex query expression, like this: + '{"=":{"type":"threshold"}}', this expression is used to + query all the threshold type alarms. + :type query: json + :param filters: A dict includes filters parameters, for example, + {'type': 'threshold', 'severity': 'low'} represent + filters to query alarms with type='threshold' and + severity='low'. + :type filters: dict + """ if query: query = {'filter': query} url = "v2/query/alarms" @@ -30,7 +49,9 @@ class AlarmManager(base.Manager): headers={'Content-Type': "application/json"}, data=jsonutils.dumps(query)).json() else: - return self._get(self.url).json() + url = (self.url + '?' + self._filtersdict_to_url(filters) if + filters else self.url) + return self._get(url).json() def get(self, alarm_id): """Get an alarm diff --git a/aodhclient/v2/alarm_cli.py b/aodhclient/v2/alarm_cli.py index 6c0b209..67b6dfc 100644 --- a/aodhclient/v2/alarm_cli.py +++ b/aodhclient/v2/alarm_cli.py @@ -38,12 +38,27 @@ ALARM_LIST_COLS = ['alarm_id', 'type', 'name', 'state', 'severity', 'enabled'] class CliAlarmList(lister.Lister): """List alarms""" + @staticmethod + def split_filter_param(param): + key, eq_op, value = param.partition('=') + if not eq_op: + msg = 'Malformed parameter(%s). Use the key=value format.' % param + raise ValueError(msg) + return key, value + def get_parser(self, prog_name): parser = super(CliAlarmList, self).get_parser(prog_name) - parser.add_argument("--query", - help="Rich query supported by aodh, " - "e.g. project_id!=my-id " - "user_id=foo or user_id=bar"), + exclusive_group = parser.add_mutually_exclusive_group() + exclusive_group.add_argument("--query", + help="Rich query supported by aodh, " + "e.g. project_id!=my-id " + "user_id=foo or user_id=bar") + exclusive_group.add_argument('--filter', dest='filter', + metavar='', + type=self.split_filter_param, + action='append', + help='Filter parameters to apply on' + ' returned alarms.') return parser def take_action(self, parsed_args): @@ -52,7 +67,8 @@ class CliAlarmList(lister.Lister): utils.search_query_builder(parsed_args.query)) else: query = None - alarms = self.app.client.alarm.list(query) + filters = dict(parsed_args.filter) if parsed_args.filter else None + alarms = self.app.client.alarm.list(query=query, filters=filters) return utils.list2cols(ALARM_LIST_COLS, alarms)