add event alarm support

Change-Id: I305fbed1584d2aa842b4590fdfff180c933b56c7
This commit is contained in:
gordon chung 2016-01-11 11:59:53 -05:00
parent 86134761cd
commit 699b229a1d
3 changed files with 124 additions and 8 deletions

View File

@ -27,7 +27,95 @@ class AodhClientTest(base.ClientTestBase):
self.aodh("help", params="alarm show") self.aodh("help", params="alarm show")
self.aodh("help", params="alarm update") self.aodh("help", params="alarm update")
def test_alarm_scenario(self): def test_event_scenario(self):
PROJECT_ID = str(uuid.uuid4())
# CREATE
result = self.aodh(u'alarm',
params=(u"create --type event --name ev_alarm1 "
"--project-id %s" % PROJECT_ID))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('ev_alarm1', alarm['name'])
self.assertEqual('*', alarm['event_type'])
# CREATE FAIL
result = self.aodh(u'alarm',
params=(u"create --type event --name ev_alarm1 "
"--project-id %s" % PROJECT_ID),
fail_ok=True, merge_stderr=True)
self.assertEqual(result.strip(), 'Conflict (HTTP 409)')
# UPDATE IGNORE INVALID
result = self.aodh(
'alarm', params=("update %s --severity critical --threshold 10"
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('critical', alarm_updated['severity'])
# UPDATE IGNORE INVALID
result = self.aodh(
'alarm', params=("update %s --event-type dummy" % ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('dummy', alarm_updated['event_type'])
# GET
result = self.aodh(
'alarm', params="show %s" % ALARM_ID)
alarm_show = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_show["alarm_id"])
self.assertEqual(PROJECT_ID, alarm_show["project_id"])
self.assertEqual('ev_alarm1', alarm_show['name'])
self.assertEqual('dummy', alarm_show['event_type'])
# LIST
result = self.aodh('alarm', params="list --type event")
self.assertIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
for alarm_list in self.parser.listing(result):
if alarm_list["alarm_id"] == ALARM_ID:
self.assertEqual('ev_alarm1', alarm_list['name'])
# SEARCH ALL
result = self.aodh('alarm', params=("search --type event"))
self.assertIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
for alarm_list in self.parser.listing(result):
if alarm_list["alarm_id"] == ALARM_ID:
self.assertEqual('ev_alarm1', alarm_list['name'])
# SEARCH SOME
result = self.aodh('alarm',
params=("search --type event --query "
"'{\"=\": {\"project_id\": \"%s\"}}'"
% PROJECT_ID))
alarm_list = self.parser.listing(result)[0]
self.assertEqual(ALARM_ID, alarm_list["alarm_id"])
self.assertEqual('ev_alarm1', alarm_list['name'])
# DELETE
result = self.aodh('alarm', params="delete %s" % ALARM_ID)
self.assertEqual("", result)
# GET FAIL
result = self.aodh('alarm', params="show %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertEqual(result.strip(), "Not found (HTTP 404)")
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertEqual(result.strip(), "Not found (HTTP 404)")
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list --type event")
self.assertNotIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
def test_threshold_scenario(self):
PROJECT_ID = str(uuid.uuid4()) PROJECT_ID = str(uuid.uuid4())

View File

@ -13,6 +13,7 @@
from oslo_serialization import jsonutils from oslo_serialization import jsonutils
from aodhclient.v2.alarm_cli import ALARM_TYPES
from aodhclient.v2 import base from aodhclient.v2 import base
@ -33,12 +34,19 @@ class AlarmManager(base.Manager):
""" """
return self._get(self.url + '/' + alarm_id).json() return self._get(self.url + '/' + alarm_id).json()
@staticmethod
def _clean_rules(alarm_type, alarm):
for rule in ALARM_TYPES:
if rule != alarm_type:
alarm.pop('%s_rule' % rule, None)
def create(self, alarm): def create(self, alarm):
"""Create an alarm """Create an alarm
:param alarm: the alarm :param alarm: the alarm
:type alarm: dict :type alarm: dict
""" """
self._clean_rules(alarm['type'], alarm)
return self._post( return self._post(
self.url, headers={'Content-Type': "application/json"}, self.url, headers={'Content-Type': "application/json"},
data=jsonutils.dumps(alarm)).json() data=jsonutils.dumps(alarm)).json()
@ -52,9 +60,15 @@ class AlarmManager(base.Manager):
:type attributes: dict :type attributes: dict
""" """
alarm = self._get(self.url + '/' + alarm_id).json() alarm = self._get(self.url + '/' + alarm_id).json()
if alarm_update.get('threshold_rule'): self._clean_rules(alarm['type'], alarm_update)
if 'threshold_rule' in alarm_update:
alarm['threshold_rule'].update(alarm_update.get('threshold_rule')) alarm['threshold_rule'].update(alarm_update.get('threshold_rule'))
alarm_update.pop('threshold_rule') alarm_update.pop('threshold_rule')
elif 'event_rule' in alarm_update:
alarm['event_rule'].update(alarm_update.get('event_rule'))
alarm_update.pop('event_rule')
alarm.update(alarm_update) alarm.update(alarm_update)
return self._put( return self._put(
self.url + '/' + alarm_id, self.url + '/' + alarm_id,

View File

@ -17,7 +17,7 @@ from oslo_utils import strutils
from aodhclient import utils from aodhclient import utils
ALARM_TYPES = ['threshold'] ALARM_TYPES = ['threshold', 'event']
ALARM_STATES = ['ok', 'alarm', 'insufficient data'] ALARM_STATES = ['ok', 'alarm', 'insufficient data']
ALARM_SEVERITY = ['low', 'moderate', 'critical'] ALARM_SEVERITY = ['low', 'moderate', 'critical']
ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt'] ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt']
@ -33,6 +33,8 @@ class CliAlarmList(lister.Lister):
'repeat_actions', 'time_constraints'] 'repeat_actions', 'time_constraints']
if alarm_type == 'threshold': if alarm_type == 'threshold':
cols.append('threshold_rule') cols.append('threshold_rule')
elif alarm_type == 'event':
cols.append('event_rule')
return cols return cols
def get_parser(self, prog_name): def get_parser(self, prog_name):
@ -65,7 +67,9 @@ class CliAlarmSearch(CliAlarmList):
def _format_alarm(alarm): def _format_alarm(alarm):
alarm.update(alarm.pop('threshold_rule')) for alarm_type in ALARM_TYPES:
if alarm.get('%s_rule' % alarm_type):
alarm.update(alarm.pop('%s_rule' % alarm_type))
return alarm return alarm
@ -146,6 +150,13 @@ class CliAlarmCreate(show.ShowOne):
'notified while alarm remains in target ' 'notified while alarm remains in target '
'state')) 'state'))
common_group = parser.add_argument_group('common alarm rules')
common_group.add_argument(
'-q', '--query', metavar='<QUERY>', dest='query',
help='key[op]data_type::value; list. data_type is optional, '
'but if supplied must be string, integer, float, or boolean. '
'Used by threshold and event alarms')
threshold_group = parser.add_argument_group('threshold alarm') threshold_group = parser.add_argument_group('threshold alarm')
threshold_group.add_argument( threshold_group.add_argument(
'-m', '--meter-name', metavar='<METRIC>', '-m', '--meter-name', metavar='<METRIC>',
@ -168,10 +179,11 @@ class CliAlarmCreate(show.ShowOne):
'--comparison-operator', metavar='<OPERATOR>', '--comparison-operator', metavar='<OPERATOR>',
dest='comparison_operator', choices=ALARM_OPERATORS, dest='comparison_operator', choices=ALARM_OPERATORS,
help='Operator to compare with, one of: ' + str(ALARM_OPERATORS)) help='Operator to compare with, one of: ' + str(ALARM_OPERATORS))
threshold_group.add_argument(
'-q', '--query', metavar='<QUERY>', dest='query', event_group = parser.add_argument_group('event alarm')
help='key[op]data_type::value; list. data_type is optional, ' event_group.add_argument(
'but if supplied must be string, integer, float, or boolean.') '--event-type', metavar='<EVENT_TYPE>',
dest='event_type', help='Event type to evaluate against')
self.parser = parser self.parser = parser
return parser return parser
@ -192,6 +204,8 @@ class CliAlarmCreate(show.ShowOne):
parsed_args, ['meter_name', 'period', 'evaluation_periods', parsed_args, ['meter_name', 'period', 'evaluation_periods',
'statistic', 'comparison_operator', 'threshold', 'statistic', 'comparison_operator', 'threshold',
'query']) 'query'])
alarm['event_rule'] = utils.dict_from_parsed_args(
parsed_args, ['event_type', 'query'])
if self.create: if self.create:
alarm['type'] = parsed_args.type alarm['type'] = parsed_args.type
self._validate_args(parsed_args) self._validate_args(parsed_args)