Merge "Updating alarm for different alarm types"

This commit is contained in:
Zuul 2019-05-14 14:58:50 +00:00 committed by Gerrit Code Review
commit e71167e04e
3 changed files with 226 additions and 15 deletions

View File

@ -336,6 +336,52 @@ class AodhClientTest(base.ClientTestBase):
self.assertEqual('ok', state_get['state'])
self.aodh('alarm', params='delete %s' % alarm_id)
def test_update_type_event_composite(self):
res_id = uuidutils.generate_uuid()
# CREATE
result = self.aodh(u'alarm',
params=(u"create --type event --name ev_alarm123"))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('ev_alarm123', alarm['name'])
self.assertEqual('*', alarm['event_type'])
# UPDATE TYPE TO COMPOSITE
result = self.aodh(
'alarm',
params=('update %s --type composite --composite-rule '
'\'{"or":[{"threshold": 0.8, "metric": "cpu_util", '
'"type": "gnocchi_resources_threshold", "resource_type": '
'"generic", "resource_id": "%s", '
'"aggregation_method": "mean"},'
'{"and": [{"threshold": 200, "metric": "disk.iops", '
'"type": "gnocchi_resources_threshold", "resource_type": '
'"generic", "resource_id": "%s", '
'"aggregation_method": "mean"},'
'{"threshold": 1000, "metric": "memory",'
'"type": "gnocchi_resources_threshold", "resource_type": '
'"generic", "resource_id": "%s", '
'"aggregation_method": "mean"}]}]}\'' %
(ALARM_ID, res_id, res_id, res_id)))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('composite', alarm_updated['type'])
self.assertIn('composite_rule', alarm_updated)
# UPDATE TYPE TO EVENT
result = self.aodh(
'alarm', params=("update %s --type event"
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('event', alarm_updated['type'])
self.assertEqual('*', alarm_updated['event_type'])
# DELETE
result = self.aodh('alarm', params="delete %s" % ALARM_ID)
self.assertEqual("", result)
class AodhClientGnocchiRulesTest(base.ClientTestBase):
@ -714,3 +760,135 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
self.assertEqual(sorted(output_colums), sorted(alarm_list.keys()))
self.assertNotIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
def test_update_gnresthr_gnaggrresthr(self):
RESOURCE_ID = uuidutils.generate_uuid()
# CREATE
result = self.aodh(u'alarm',
params=(u"create "
"--type gnocchi_resources_threshold "
"--name alarm_gn123 --metric cpu_util "
"--resource-id %s --threshold 80 "
"--resource-type generic "
"--aggregation-method last "
% RESOURCE_ID))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('alarm_gn123', alarm['name'])
self.assertEqual('cpu_util', alarm['metric'])
self.assertEqual('80.0', alarm['threshold'])
self.assertEqual('last', alarm['aggregation_method'])
self.assertEqual('generic', alarm['resource_type'])
# UPDATE TYPE TO GNOCCHI_AGGREGATION_BY_RESOURCES_THRESHOLD
result = self.aodh(
'alarm', params=("update %s --type "
"gnocchi_aggregation_by_resources_threshold "
"--metric cpu --threshold 90 "
"--query "
'\'{"=": {"creator": "cr3at0r"}}\' '
"--resource-type generic "
"--aggregation-method last "
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('cpu', alarm_updated['metric'])
self.assertEqual('90.0', alarm_updated['threshold'])
self.assertEqual('last', alarm_updated['aggregation_method'])
self.assertEqual('generic', alarm_updated['resource_type'])
self.assertEqual('{"=": {"creator": "cr3at0r"}}',
alarm_updated['query'])
self.assertEqual('gnocchi_aggregation_by_resources_threshold',
alarm_updated['type'])
# UPDATE TYPE TO GNOCCHI_RESOURCES_THRESHOLD
result = self.aodh(
'alarm', params=("update %s "
"--type gnocchi_resources_threshold "
"--metric cpu_util "
"--resource-id %s --threshold 80 "
"--resource-type generic "
"--aggregation-method last "
% (ALARM_ID, RESOURCE_ID)))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('cpu_util', alarm_updated['metric'])
self.assertEqual('80.0', alarm_updated['threshold'])
self.assertEqual('last', alarm_updated['aggregation_method'])
self.assertEqual('generic', alarm_updated['resource_type'])
self.assertEqual('gnocchi_resources_threshold',
alarm_updated['type'])
# DELETE
result = self.aodh('alarm', params="delete %s" % ALARM_ID)
self.assertEqual("", result)
def test_update_gnaggrresthr_gnaggrmetricthr(self):
METRIC1 = 'cpu'
METRIC2 = 'cpu_util'
# CREATE
result = self.aodh(
u'alarm',
params=(u"create "
"--type "
"gnocchi_aggregation_by_resources_threshold "
"--name alarm123 --metric cpu --threshold 80 "
"--query "
'\'{"=": {"creator": "cr3at0r"}}\' '
"--resource-type generic "
"--aggregation-method last "))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('alarm123', alarm['name'])
self.assertEqual('cpu', alarm['metric'])
self.assertEqual('80.0', alarm['threshold'])
self.assertEqual('last', alarm['aggregation_method'])
self.assertEqual('generic', alarm['resource_type'])
self.assertEqual('{"=": {"creator": "cr3at0r"}}',
alarm['query'])
# UPDATE TYPE TO GNOCCHI_AGGREGATION_BY_METRICS_THRESHOLD
result = self.aodh(
'alarm', params=("update %s --type "
"gnocchi_aggregation_by_metrics_threshold "
"--metrics %s "
"--metrics %s "
"--threshold 80 "
"--aggregation-method last"
% (ALARM_ID, METRIC1, METRIC2)))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
metrics = "[u'cpu', u'cpu_util']" if six.PY2 else "['cpu', 'cpu_util']"
self.assertEqual(metrics, alarm_updated['metrics'])
self.assertEqual('80.0', alarm_updated['threshold'])
self.assertEqual('last', alarm_updated['aggregation_method'])
self.assertEqual('gnocchi_aggregation_by_metrics_threshold',
alarm_updated['type'])
# UPDATE TYPE TO GNOCCHI_AGGREGATION_BY_RESOURCES_THRESHOLD
result = self.aodh(
'alarm', params=("update %s --type "
"gnocchi_aggregation_by_resources_threshold "
"--metric cpu --threshold 80 "
"--query "
'\'{"=": {"creator": "cr3at0r"}}\' '
"--resource-type generic "
"--aggregation-method last "
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('cpu', alarm_updated['metric'])
self.assertEqual('80.0', alarm_updated['threshold'])
self.assertEqual('last', alarm_updated['aggregation_method'])
self.assertEqual('generic', alarm_updated['resource_type'])
self.assertEqual('{"=": {"creator": "cr3at0r"}}',
alarm_updated['query'])
self.assertEqual('gnocchi_aggregation_by_resources_threshold',
alarm_updated['type'])
# DELETE
result = self.aodh('alarm', params="delete %s" % ALARM_ID)
self.assertEqual("", result)

View File

@ -110,29 +110,61 @@ class AlarmManager(base.Manager):
:type attributes: dict
"""
alarm = self._get(self.url + '/' + alarm_id).json()
self._clean_rules(alarm['type'], alarm_update)
if 'type' not in alarm_update:
self._clean_rules(alarm['type'], alarm_update)
else:
self._clean_rules(alarm_update['type'], alarm_update)
if 'event_rule' in alarm_update:
alarm['event_rule'].update(alarm_update.get('event_rule'))
if ('type' in alarm_update and
alarm_update['type'] != alarm['type']):
alarm.pop('%s_rule' % alarm['type'], None)
alarm['event_rule'] = alarm_update['event_rule']
else:
alarm['event_rule'].update(alarm_update.get('event_rule'))
alarm_update.pop('event_rule')
elif 'gnocchi_resources_threshold_rule' in alarm_update:
alarm['gnocchi_resources_threshold_rule'].update(
alarm_update.get('gnocchi_resources_threshold_rule'))
if ('type' in alarm_update and
alarm_update['type'] != alarm['type']):
alarm.pop('%s_rule' % alarm['type'], None)
alarm['gnocchi_resources_threshold_rule'] = alarm_update[
'gnocchi_resources_threshold_rule']
else:
alarm['gnocchi_resources_threshold_rule'].update(
alarm_update.get('gnocchi_resources_threshold_rule'))
alarm_update.pop('gnocchi_resources_threshold_rule')
elif 'gnocchi_aggregation_by_metrics_threshold_rule' in alarm_update:
alarm['gnocchi_aggregation_by_metrics_threshold_rule'].update(
alarm_update.get(
'gnocchi_aggregation_by_metrics_threshold_rule'))
if ('type' in alarm_update and
alarm_update['type'] != alarm['type']):
alarm.pop('%s_rule' % alarm['type'], None)
alarm['gnocchi_aggregation_by_metrics_threshold_rule'] = \
alarm_update[
'gnocchi_aggregation_by_metrics_threshold_rule']
else:
alarm['gnocchi_aggregation_by_metrics_threshold_rule'].update(
alarm_update.get(
'gnocchi_aggregation_by_metrics_threshold_rule'))
alarm_update.pop('gnocchi_aggregation_by_metrics_threshold_rule')
elif 'gnocchi_aggregation_by_resources_threshold_rule' in alarm_update:
alarm['gnocchi_aggregation_by_resources_threshold_rule'].update(
alarm_update.get(
'gnocchi_aggregation_by_resources_threshold_rule'))
if ('type' in alarm_update and
alarm_update['type'] != alarm['type']):
alarm.pop('%s_rule' % alarm['type'], None)
alarm['gnocchi_aggregation_by_resources_threshold_rule'] = \
alarm_update[
'gnocchi_aggregation_by_resources_threshold_rule']
else:
alarm['gnocchi_aggregation_by_resources_threshold_rule'].\
update(alarm_update.get(
'gnocchi_aggregation_by_resources_threshold_rule'))
alarm_update.pop(
'gnocchi_aggregation_by_resources_threshold_rule')
elif 'composite_rule' in alarm_update:
if alarm_update['composite_rule']:
alarm['composite_rule'] = alarm_update['composite_rule']
if ('type' in alarm_update and
alarm_update['type'] != alarm['type']):
alarm.pop('%s_rule' % alarm['type'], None)
if alarm_update['composite_rule'] is not None:
alarm['composite_rule'] = alarm_update[
'composite_rule']
alarm_update.pop('composite_rule')
alarm.update(alarm_update)

View File

@ -369,9 +369,10 @@ class CliAlarmCreate(show.ShowOne):
def _alarm_from_args(self, parsed_args):
alarm = utils.dict_from_parsed_args(
parsed_args, ['name', 'project_id', 'user_id', 'description',
'state', 'severity', 'enabled', 'alarm_actions',
'ok_actions', 'insufficient_data_actions',
parsed_args, ['name', 'type', 'project_id', 'user_id',
'description', 'state', 'severity', 'enabled',
'alarm_actions', 'ok_actions',
'insufficient_data_actions',
'time_constraints', 'repeat_actions'])
if parsed_args.type == 'event' and parsed_args.query:
parsed_args.query = utils.cli_to_array(parsed_args.query)