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:
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user