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

View File

@ -13,6 +13,7 @@
from oslo_serialization import jsonutils
from aodhclient.v2.alarm_cli import ALARM_TYPES
from aodhclient.v2 import base
@ -33,12 +34,19 @@ class AlarmManager(base.Manager):
"""
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):
"""Create an alarm
:param alarm: the alarm
:type alarm: dict
"""
self._clean_rules(alarm['type'], alarm)
return self._post(
self.url, headers={'Content-Type': "application/json"},
data=jsonutils.dumps(alarm)).json()
@ -52,9 +60,15 @@ class AlarmManager(base.Manager):
:type attributes: dict
"""
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_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)
return self._put(
self.url + '/' + alarm_id,

View File

@ -17,7 +17,7 @@ from oslo_utils import strutils
from aodhclient import utils
ALARM_TYPES = ['threshold']
ALARM_TYPES = ['threshold', 'event']
ALARM_STATES = ['ok', 'alarm', 'insufficient data']
ALARM_SEVERITY = ['low', 'moderate', 'critical']
ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt']
@ -33,6 +33,8 @@ class CliAlarmList(lister.Lister):
'repeat_actions', 'time_constraints']
if alarm_type == 'threshold':
cols.append('threshold_rule')
elif alarm_type == 'event':
cols.append('event_rule')
return cols
def get_parser(self, prog_name):
@ -65,7 +67,9 @@ class CliAlarmSearch(CliAlarmList):
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
@ -146,6 +150,13 @@ class CliAlarmCreate(show.ShowOne):
'notified while alarm remains in target '
'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.add_argument(
'-m', '--meter-name', metavar='<METRIC>',
@ -168,10 +179,11 @@ class CliAlarmCreate(show.ShowOne):
'--comparison-operator', metavar='<OPERATOR>',
dest='comparison_operator', choices=ALARM_OPERATORS,
help='Operator to compare with, one of: ' + str(ALARM_OPERATORS))
threshold_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.')
event_group = parser.add_argument_group('event alarm')
event_group.add_argument(
'--event-type', metavar='<EVENT_TYPE>',
dest='event_type', help='Event type to evaluate against')
self.parser = parser
return parser
@ -192,6 +204,8 @@ class CliAlarmCreate(show.ShowOne):
parsed_args, ['meter_name', 'period', 'evaluation_periods',
'statistic', 'comparison_operator', 'threshold',
'query'])
alarm['event_rule'] = utils.dict_from_parsed_args(
parsed_args, ['event_type', 'query'])
if self.create:
alarm['type'] = parsed_args.type
self._validate_args(parsed_args)