add event alarm support
Change-Id: I305fbed1584d2aa842b4590fdfff180c933b56c7
This commit is contained in:
parent
86134761cd
commit
699b229a1d
@ -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())
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user