python-aodhclient/aodhclient/tests/functional/test_alarm.py

899 lines
39 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
from oslo_utils import uuidutils
import requests
import requests.auth
import six
from tempest.lib import exceptions
from aodhclient.tests.functional import base
class AodhClientTest(base.ClientTestBase):
def test_help(self):
self.aodh("help", params="alarm create")
self.aodh("help", params="alarm delete")
self.aodh("help", params="alarm list")
self.aodh("help", params="alarm show")
self.aodh("help", params="alarm update")
def test_alarm_id_or_name_scenario(self):
def _test(name):
params = "create --type event --name %s" % name
result = self.aodh('alarm', params=params)
alarm_id = self.details_multiple(result)[0]['alarm_id']
params = 'show %s' % name
result = self.aodh('alarm', params=params)
self.assertEqual(alarm_id,
self.details_multiple(result)[0]['alarm_id'])
params = 'show %s' % alarm_id
result = self.aodh('alarm', params=params)
self.assertEqual(alarm_id,
self.details_multiple(result)[0]['alarm_id'])
params = "update --state ok %s" % name
result = self.aodh('alarm', params=params)
self.assertEqual("ok", self.details_multiple(result)[0]['state'])
params = "update --state alarm %s" % alarm_id
result = self.aodh('alarm', params=params)
self.assertEqual("alarm",
self.details_multiple(result)[0]['state'])
params = "update --name another-name %s" % name
result = self.aodh('alarm', params=params)
self.assertEqual("another-name",
self.details_multiple(result)[0]['name'])
params = "update --name %s %s" % (name, alarm_id)
result = self.aodh('alarm', params=params)
self.assertEqual(name,
self.details_multiple(result)[0]['name'])
# Check update with no change is allowed
params = "update --name %s %s" % (name, name)
result = self.aodh('alarm', params=params)
self.assertEqual(name,
self.details_multiple(result)[0]['name'])
params = "update --state ok"
result = self.aodh('alarm', params=params,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(
result.splitlines(),
'You need to specify one of alarm ID and alarm name(--name) '
'to update an alarm.')
params = "delete %s" % name
result = self.aodh('alarm', params=params)
self.assertEqual("", result)
params = "create --type event --name %s" % name
result = self.aodh('alarm', params=params)
alarm_id = self.details_multiple(result)[0]['alarm_id']
params = "delete %s" % alarm_id
result = self.aodh('alarm', params=params)
self.assertEqual("", result)
_test(uuidutils.generate_uuid())
_test('normal-alarm-name')
def test_event_scenario(self):
PROJECT_ID = uuidutils.generate_uuid()
# 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'])
# 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'])
# GET BY NAME
result = self.aodh(
'alarm', params="show --name ev_alarm1")
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'])
# GET BY NAME AND ID ERROR
self.assertRaises(exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"show %s --name ev_alarm1" %
ALARM_ID))
# LIST
result = self.aodh('alarm', params="list --filter all_projects=true")
self.assertIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
output_colums = ['alarm_id', 'type', 'name', 'state', 'severity',
'enabled']
for alarm_list in self.parser.listing(result):
self.assertEqual(sorted(output_colums), sorted(alarm_list.keys()))
if alarm_list["alarm_id"] == ALARM_ID:
self.assertEqual('ev_alarm1', alarm_list['name'])
# LIST WITH QUERY
result = self.aodh('alarm',
params=("list --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)
expected = "Alarm %s not found (HTTP 404)" % ALARM_ID
self.assertFirstLineStartsWith(result.splitlines(), expected)
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.splitlines(), expected)
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list")
self.assertNotIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
def test_composite_scenario(self):
project_id = uuidutils.generate_uuid()
res_id = uuidutils.generate_uuid()
# CREATE
result = self.aodh(
u'alarm',
params=(u'create --type composite --name calarm1 --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"}]}]}\' --project-id %s' %
(res_id, res_id, res_id, project_id)))
alarm = self.details_multiple(result)[0]
alarm_id = alarm['alarm_id']
self.assertEqual('calarm1', alarm['name'])
self.assertEqual('composite', alarm['type'])
self.assertIn('composite_rule', alarm)
# CREATE FAIL MISSING PARAM
self.assertRaises(exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"create --type composite --name calarm1 "
"--project-id %s" % project_id))
# UPDATE
result = self.aodh(
'alarm', params=("update %s --severity critical" % alarm_id))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(alarm_id, alarm_updated["alarm_id"])
self.assertEqual('critical', alarm_updated['severity'])
# 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('calarm1', alarm_show['name'])
# GET BY NAME
result = self.aodh(
'alarm', params="show --name calarm1")
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('calarm1', alarm_show['name'])
# GET BY NAME AND ID ERROR
self.assertRaises(exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"show %s --name calarm1" %
alarm_id))
# LIST
result = self.aodh('alarm', params="list --filter all_projects=true")
self.assertIn(alarm_id,
[r['alarm_id'] for r in self.parser.listing(result)])
output_colums = ['alarm_id', 'type', 'name', 'state', 'severity',
'enabled']
for alarm_list in self.parser.listing(result):
self.assertEqual(sorted(output_colums), sorted(alarm_list.keys()))
if alarm_list["alarm_id"] == alarm_id:
self.assertEqual('calarm1', alarm_list['name'])
# LIST WITH QUERY
result = self.aodh('alarm',
params=("list --query project_id=%s" % project_id))
alarm_list = self.parser.listing(result)[0]
self.assertEqual(alarm_id, alarm_list["alarm_id"])
self.assertEqual('calarm1', 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)
expected = "Alarm %s not found (HTTP 404)" % alarm_id
self.assertFirstLineStartsWith(result.splitlines(), expected)
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % alarm_id,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.splitlines(), expected)
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list")
self.assertNotIn(alarm_id,
[r['alarm_id'] for r in self.parser.listing(result)])
def _test_alarm_create_show_query(self, create_params, expected_lines):
def test(params):
result = self.aodh('alarm', params=params)
alarm = self.details_multiple(result)[0]
for key, value in six.iteritems(expected_lines):
self.assertEqual(value, alarm[key])
return alarm
alarm = test(create_params)
params = 'show %s' % alarm['alarm_id']
test(params)
self.aodh('alarm', params='delete %s' % alarm['alarm_id'])
def test_event_alarm_create_show_query(self):
params = ('create --type event --name alarm-multiple-query '
'--query "traits.project_id=789;traits.resource_id=012"')
expected_lines = {
'query': 'traits.project_id = 789 AND',
'': 'traits.resource_id = 012',
}
self._test_alarm_create_show_query(params, expected_lines)
params = ('create --type event --name alarm-single-query '
'--query "traits.project_id=789"')
expected_lines = {'query': 'traits.project_id = 789'}
self._test_alarm_create_show_query(params, expected_lines)
params = 'create --type event --name alarm-no-query'
self._test_alarm_create_show_query(params, {'query': ''})
def test_set_get_alarm_state(self):
result = self.aodh(
'alarm',
params=('create --type event --name alarm_state_test '
'--query "traits.project_id=789;traits.resource_id=012"'))
alarm = self.details_multiple(result)[0]
alarm_id = alarm['alarm_id']
result = self.aodh(
'alarm', params="show %s" % alarm_id)
alarm_show = self.details_multiple(result)[0]
self.assertEqual('insufficient data', alarm_show['state'])
result = self.aodh('alarm', params="state get %s" % alarm_id)
state_get = self.details_multiple(result)[0]
self.assertEqual('insufficient data', state_get['state'])
self.aodh('alarm',
params="state set --state ok %s" % alarm_id)
result = self.aodh('alarm', params="state get %s" % alarm_id)
state_get = self.details_multiple(result)[0]
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):
def test_gnocchi_resources_threshold_scenario(self):
PROJECT_ID = uuidutils.generate_uuid()
RESOURCE_ID = uuidutils.generate_uuid()
req = requests.post(
os.environ.get("GNOCCHI_ENDPOINT") + "/v1/resource/generic",
auth=requests.auth.HTTPBasicAuth('admin', ''),
json={
"id": RESOURCE_ID,
})
self.assertEqual(201, req.status_code)
# CREATE
result = self.aodh(u'alarm',
params=(u"create "
"--type gnocchi_resources_threshold "
"--name alarm_gn1 --metric cpu_util "
"--threshold 80 "
"--resource-id %s --resource-type generic "
"--aggregation-method last "
"--project-id %s"
% (RESOURCE_ID, PROJECT_ID)))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('alarm_gn1', alarm['name'])
self.assertEqual('cpu_util', alarm['metric'])
self.assertEqual('80.0', alarm['threshold'])
self.assertEqual('last', alarm['aggregation_method'])
self.assertEqual(RESOURCE_ID,
alarm['resource_id'])
self.assertEqual('generic', alarm['resource_type'])
# CREATE WITH --TIME-CONSTRAINT
result = self.aodh(
u'alarm',
params=(u"create --type gnocchi_resources_threshold "
"--name alarm_tc --metric cpu_util --threshold 80 "
"--resource-id %s --resource-type generic "
"--aggregation-method last --project-id %s "
"--time-constraint "
"name=cons1;start='0 11 * * *';duration=300 "
"--time-constraint "
"name=cons2;start='0 23 * * *';duration=600 "
% (RESOURCE_ID, PROJECT_ID)))
alarm = self.details_multiple(result)[0]
self.assertEqual('alarm_tc', alarm['name'])
self.assertEqual('80.0', alarm['threshold'])
self.assertIsNotNone(alarm['time_constraints'])
# CREATE FAIL MISSING PARAM
self.assertRaises(exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"create "
"--type gnocchi_resources_threshold "
"--name alarm1 --metric cpu_util "
"--resource-id %s --resource-type generic "
"--aggregation-method last "
"--project-id %s"
% (RESOURCE_ID, PROJECT_ID)))
# UPDATE
result = self.aodh(
'alarm', params=("update %s --severity critical --threshold 90"
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('critical', alarm_updated['severity'])
self.assertEqual('90.0', alarm_updated["threshold"])
# 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('alarm_gn1', alarm_show['name'])
self.assertEqual('cpu_util', alarm_show['metric'])
self.assertEqual('90.0', alarm_show['threshold'])
self.assertEqual('critical', alarm_show['severity'])
self.assertEqual('last', alarm_show['aggregation_method'])
self.assertEqual('generic', alarm_show['resource_type'])
# GET BY NAME
result = self.aodh(
'alarm', params="show --name alarm_gn1")
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('alarm_gn1', alarm_show['name'])
self.assertEqual('cpu_util', alarm_show['metric'])
self.assertEqual('90.0', alarm_show['threshold'])
self.assertEqual('critical', alarm_show['severity'])
self.assertEqual('last', alarm_show['aggregation_method'])
self.assertEqual('generic', alarm_show['resource_type'])
# GET BY NAME AND ID ERROR
self.assertRaises(exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"show %s --name alarm_gn1" %
ALARM_ID))
# LIST
result = self.aodh('alarm', params="list --filter all_projects=true")
self.assertIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
output_colums = ['alarm_id', 'type', 'name', 'state', 'severity',
'enabled']
for alarm_list in self.parser.listing(result):
self.assertEqual(sorted(output_colums), sorted(alarm_list.keys()))
if alarm_list["alarm_id"] == ALARM_ID:
self.assertEqual('alarm_gn1', alarm_list['name'])
# LIST WITH PAGINATION
# list with limit
result = self.aodh('alarm',
params="list --filter all_projects=true --limit 1")
alarm_list = self.parser.listing(result)
self.assertEqual(1, len(alarm_list))
# list with sort with key=name dir=asc
result = self.aodh(
'alarm',
params="list --filter all_projects=true --sort name:asc")
names = [r['name'] for r in self.parser.listing(result)]
sorted_name = sorted(names)
self.assertEqual(sorted_name, names)
# list with sort with key=name dir=asc and key=alarm_id dir=asc
result = self.aodh(
u'alarm',
params=(u"create --type gnocchi_resources_threshold "
"--name alarm_th --metric cpu_util --threshold 80 "
"--resource-id %s --resource-type generic "
"--aggregation-method last --project-id %s "
% (RESOURCE_ID, PROJECT_ID)))
created_alarm_id = self.details_multiple(result)[0]['alarm_id']
result = self.aodh(
'alarm',
params="list --filter all_projects=true --sort name:asc "
"--sort alarm_id:asc")
alarm_list = self.parser.listing(result)
ids_with_same_name = []
names = []
for alarm in alarm_list:
names.append(['alarm_name'])
if alarm['name'] == 'alarm_th':
ids_with_same_name.append(alarm['alarm_id'])
sorted_ids = sorted(ids_with_same_name)
sorted_names = sorted(names)
self.assertEqual(sorted_names, names)
self.assertEqual(sorted_ids, ids_with_same_name)
# list with sort with key=name dir=desc and with the marker equal to
# the alarm_id of the alarm_th we created for this test.
result = self.aodh(
'alarm',
params="list --filter all_projects=true --sort name:desc "
"--marker %s" % created_alarm_id)
self.assertIn('alarm_tc',
[r['name'] for r in self.parser.listing(result)])
self.aodh('alarm', params="delete %s" % created_alarm_id)
# LIST WITH QUERY
result = self.aodh('alarm',
params=("list --query project_id=%s" % PROJECT_ID))
alarm_list = self.parser.listing(result)[0]
self.assertEqual(ALARM_ID, alarm_list["alarm_id"])
self.assertEqual('alarm_gn1', 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)
expected = "Alarm %s not found (HTTP 404)" % ALARM_ID
self.assertFirstLineStartsWith(result.splitlines(), expected)
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.splitlines(), expected)
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list")
self.assertNotIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
def test_gnocchi_aggr_by_resources_scenario(self):
PROJECT_ID = uuidutils.generate_uuid()
# CREATE
result = self.aodh(
u'alarm',
params=(u"create "
"--type "
"gnocchi_aggregation_by_resources_threshold "
"--name alarm1 --metric cpu --threshold 80 "
"--query "
'\'{"=": {"creator": "cr3at0r"}}\' '
"--resource-type generic "
"--aggregation-method last "
"--project-id %s" % PROJECT_ID))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('alarm1', 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'])
# CREATE FAIL MISSING PARAM
self.assertRaises(
exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"create "
"--type "
"gnocchi_aggregation_by_resources_threshold "
"--name alarm1 --metric cpu "
"--query "
'\'{"=": {"creator": "cr3at0r"}}\' '
"--resource-type generic "
"--aggregation-method last "
"--project-id %s" % PROJECT_ID))
# UPDATE
result = self.aodh(
'alarm', params=("update %s --severity critical --threshold 90"
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('critical', alarm_updated['severity'])
self.assertEqual('90.0', alarm_updated["threshold"])
# 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('alarm1', alarm_show['name'])
self.assertEqual('cpu', alarm_show['metric'])
self.assertEqual('90.0', alarm_show['threshold'])
self.assertEqual('critical', alarm_show['severity'])
self.assertEqual('last', alarm_show['aggregation_method'])
self.assertEqual('generic', alarm_show['resource_type'])
# LIST
result = self.aodh('alarm', params="list --filter all_projects=true")
self.assertIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
output_colums = ['alarm_id', 'type', 'name', 'state', 'severity',
'enabled']
for alarm_list in self.parser.listing(result):
self.assertEqual(sorted(output_colums), sorted(alarm_list.keys()))
if alarm_list["alarm_id"] == ALARM_ID:
self.assertEqual('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)
expected = "Alarm %s not found (HTTP 404)" % ALARM_ID
self.assertFirstLineStartsWith(result.splitlines(), expected)
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.splitlines(), expected)
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list")
self.assertNotIn(ALARM_ID,
[r['alarm_id'] for r in self.parser.listing(result)])
def test_gnocchi_aggr_by_metrics_scenario(self):
PROJECT_ID = uuidutils.generate_uuid()
METRIC1 = 'cpu'
METRIC2 = 'cpu_util'
# CREATE
result = self.aodh(
u'alarm',
params=(u"create "
"--type gnocchi_aggregation_by_metrics_threshold "
"--name alarm1 "
"--metrics %s "
"--metric %s "
"--threshold 80 "
"--aggregation-method last "
"--project-id %s"
% (METRIC1, METRIC2, PROJECT_ID)))
alarm = self.details_multiple(result)[0]
ALARM_ID = alarm['alarm_id']
self.assertEqual('alarm1', alarm['name'])
metrics = "[u'cpu', u'cpu_util']" if six.PY2 else "['cpu', 'cpu_util']"
self.assertEqual(metrics, alarm['metrics'])
self.assertEqual('80.0', alarm['threshold'])
self.assertEqual('last', alarm['aggregation_method'])
# CREATE FAIL MISSING PARAM
self.assertRaises(
exceptions.CommandFailed,
self.aodh, u'alarm',
params=(u"create "
"--type gnocchi_aggregation_by_metrics_threshold "
"--name alarm1 "
"--metrics %s "
"--metrics %s "
"--aggregation-method last "
"--project-id %s"
% (METRIC1, METRIC2, PROJECT_ID)))
# UPDATE
result = self.aodh(
'alarm', params=("update %s --severity critical --threshold 90"
% ALARM_ID))
alarm_updated = self.details_multiple(result)[0]
self.assertEqual(ALARM_ID, alarm_updated["alarm_id"])
self.assertEqual('critical', alarm_updated['severity'])
self.assertEqual('90.0', alarm_updated["threshold"])
# 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('alarm1', alarm_show['name'])
self.assertEqual(metrics, alarm_show['metrics'])
self.assertEqual('90.0', alarm_show['threshold'])
self.assertEqual('critical', alarm_show['severity'])
self.assertEqual('last', alarm_show['aggregation_method'])
# LIST
result = self.aodh('alarm', params="list --filter all_projects=true")
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('alarm1', alarm_list['name'])
# LIST WITH QUERY
result = self.aodh('alarm',
params=("list --query project_id=%s" % PROJECT_ID))
alarm_list = self.parser.listing(result)[0]
self.assertEqual(ALARM_ID, alarm_list["alarm_id"])
self.assertEqual('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)
expected = "Alarm %s not found (HTTP 404)" % ALARM_ID
self.assertFirstLineStartsWith(result.splitlines(), expected)
# DELETE FAIL
result = self.aodh('alarm', params="delete %s" % ALARM_ID,
fail_ok=True, merge_stderr=True)
self.assertFirstLineStartsWith(result.splitlines(), expected)
# LIST DOES NOT HAVE ALARM
result = self.aodh('alarm', params="list")
output_colums = ['alarm_id', 'type', 'name', 'state', 'severity',
'enabled']
for alarm_list in self.parser.listing(result):
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)