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
This commit is contained in:
liusheng
2016-03-14 15:21:42 +08:00
parent e2286bbc1e
commit 0f696d1c60
3 changed files with 54 additions and 8 deletions

View File

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

View File

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

View File

@@ -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='<KEY1=VALUE1;KEY2=VALUE2...>',
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)