From 7df3624c5860b735d5a8e1cd67236907f429b563 Mon Sep 17 00:00:00 2001 From: Shubham Chitranshi Date: Thu, 13 Aug 2015 14:54:02 +0530 Subject: [PATCH] Adding Ceilometer Alarm API - Adding basic alarm-api function wrappers - Adding Alarm class wrapper - Added Test Cases for the wrapper DocImpact Implements: blueprint ceilometer-alarm-api Change-Id: I569b461e86197b77d13e7cbef27b0ac4bea03b82 Co-Authored-By: Sanjana Pai --- openstack_dashboard/api/ceilometer.py | 64 +++++++++++ .../test/api_tests/ceilometer_tests.py | 49 ++++++++ .../test/test_data/ceilometer_data.py | 107 ++++++++++++++++++ 3 files changed, 220 insertions(+) diff --git a/openstack_dashboard/api/ceilometer.py b/openstack_dashboard/api/ceilometer.py index 163c24e862..1222f981f6 100644 --- a/openstack_dashboard/api/ceilometer.py +++ b/openstack_dashboard/api/ceilometer.py @@ -267,6 +267,41 @@ class Statistic(base.APIResourceWrapper): 'duration', 'duration_start', 'duration_end'] +class Alarm(base.APIResourceWrapper): + """Represents one Ceilometer alarm.""" + _attrs = ['alarm_actions', 'ok_actions', 'name', + 'timestamp', 'description', 'time_constraints', + 'enabled', 'state_timestamp', 'alarm_id', + 'state', 'insufficient_data_actions', + 'repeat_actions', 'user_id', 'project_id', + 'type', 'severity', 'threshold_rule', 'period', 'query', + 'evaluation_periods', 'statistic', 'meter_name', + 'threshold', 'comparison_operator', 'exclude_outliers'] + + def __init__(self, apiresource, ceilometer_usage=None): + super(Alarm, self).__init__(apiresource) + self._tenant = None + self._user = None + + if ceilometer_usage and self.project_id: + self._tenant = ceilometer_usage.get_tenant(self.project_id) + + if ceilometer_usage and self.user_id: + self._user = ceilometer_usage.get_user(self.user_id) + + @property + def id(self): + return self.alarm_id + + @property + def tenant(self): + return self._tenant + + @property + def user(self): + return self._user + + @memoized def ceilometerclient(request): """Initialization of Ceilometer client.""" @@ -280,6 +315,35 @@ def ceilometerclient(request): cacert=cacert) +def alarm_list(request, query=None, ceilometer_usage=None): + """List alarms.""" + alarms = ceilometerclient(request).alarms.list(q=query) + return [Alarm(alarm, ceilometer_usage) for alarm in alarms] + + +def alarm_get(request, alarm_id, ceilometer_usage=None): + """Get an alarm.""" + alarm = ceilometerclient(request).alarms.get(alarm_id) + return Alarm(alarm, ceilometer_usage) + + +def alarm_update(request, alarm_id, ceilometer_usage=None, **kwargs): + """Update an alarm.""" + alarm = ceilometerclient(request).alarms.update(alarm_id, **kwargs) + return Alarm(alarm, ceilometer_usage) + + +def alarm_delete(request, alarm_id): + """Delete an alarm.""" + ceilometerclient(request).alarms.delete(alarm_id) + + +def alarm_create(request, ceilometer_usage=None, **kwargs): + """Create an alarm.""" + alarm = ceilometerclient(request).alarms.create(**kwargs) + return Alarm(alarm, ceilometer_usage) + + def resource_list(request, query=None, ceilometer_usage_object=None): """List the resources.""" resources = ceilometerclient(request).resources.list(q=query) diff --git a/openstack_dashboard/test/api_tests/ceilometer_tests.py b/openstack_dashboard/test/api_tests/ceilometer_tests.py index 55caa83d06..3b1c9906db 100644 --- a/openstack_dashboard/test/api_tests/ceilometer_tests.py +++ b/openstack_dashboard/test/api_tests/ceilometer_tests.py @@ -37,6 +37,55 @@ class CeilometerApiTests(test.APITestCase): for c in ret_list: self.assertIsInstance(c, api.ceilometer.Sample) + def test_alarm_list(self): + alarms = self.alarms.list() + ceilometerclient = self.stub_ceilometerclient() + ceilometerclient.alarms = self.mox.CreateMockAnything() + ceilometerclient.alarms.list(q=[]).AndReturn(alarms) + self.mox.ReplayAll() + + ret_list = api.ceilometer.alarm_list(self.request, query=[]) + self.assertIsNotNone(ret_list) + for c in ret_list: + self.assertIsInstance(c, api.ceilometer.Alarm) + + def test_alarm_get(self): + alarm = self.alarms.first() + ceilometerclient = self.stub_ceilometerclient() + ceilometerclient.alarms = self.mox.CreateMockAnything() + ceilometerclient.alarms.get(alarm.id).AndReturn(alarm) + self.mox.ReplayAll() + + ret_alarm = api.ceilometer.alarm_get(self.request, + alarm_id='fake_alarm_id') + self.assertEqual(alarm.alarm_id, ret_alarm.alarm_id) + + def test_alarm_create(self): + alarm = self.alarms.first() + new_alarm = {'alarm': alarm} + ceilometerclient = self.stub_ceilometerclient() + ceilometerclient.alarms = self.mox.CreateMockAnything() + ceilometerclient.alarms.create(**new_alarm).AndReturn(alarm) + self.mox.ReplayAll() + test_alarm = api.ceilometer.alarm_create(self.request, + **new_alarm) + self.assertEqual(alarm.alarm_id, test_alarm.alarm_id) + + def test_alarm_update(self): + """test update parameters""" + alarm1 = self.alarms.first() + alarm2 = self.alarms.list()[1] + ceilometerclient = self.stub_ceilometerclient() + ceilometerclient.alarms = self.mox.CreateMockAnything() + # Return the mock object that has "New" as description + ceilometerclient.alarms.update(alarm1.id, + description='New').AndReturn(alarm2) + self.mox.ReplayAll() + test_alarm = api.ceilometer.alarm_update(self.request, + alarm1.id, + description='New') + self.assertEqual(alarm2.description, test_alarm.description) + def test_meter_list(self): meters = self.meters.list() ceilometerclient = self.stub_ceilometerclient() diff --git a/openstack_dashboard/test/test_data/ceilometer_data.py b/openstack_dashboard/test/test_data/ceilometer_data.py index e2937bcc58..1666b95d50 100644 --- a/openstack_dashboard/test/test_data/ceilometer_data.py +++ b/openstack_dashboard/test/test_data/ceilometer_data.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from ceilometerclient.v2 import alarms from ceilometerclient.v2 import meters from ceilometerclient.v2 import resources from ceilometerclient.v2 import samples @@ -31,6 +32,7 @@ def data(TEST): TEST.api_resources = utils.TestDataContainer() TEST.samples = utils.TestDataContainer() TEST.meters = utils.TestDataContainer() + TEST.alarms = utils.TestDataContainer() TEST.statistics = utils.TestDataContainer() TEST.global_disk_usages = utils.TestDataContainer() TEST.global_network_usages = utils.TestDataContainer() @@ -174,6 +176,111 @@ def data(TEST): TEST.samples.add(sample_1) TEST.samples.add(sample_2) + # alarms + alarm_dict_1 = {'alarm_actions': ['alarm_action1', 'alarm_action2'], + 'ok_actions': ['ok_action_1', 'ok_action_2'], + 'name': 'fake_alarm_name', + 'timestamp': '2015-08-07T05:32:20.970341', + 'description': 'fake_random_description', + 'time_constraints': [], + 'enabled': True, + 'state_timestamp': '2015-08-07T17:59:11.351033', + 'threshold_rule': {'meter_name': 'fake_meter_name', + 'evaluation_periods': 1, 'period': 300, + 'statistic': 'avg', 'threshold': 2.0, + 'query': [], + 'comparison_operator': 'ge', + 'exclude_outliers': False}, + 'alarm_id': 'fake_alarm_id', + 'state': 'ok', + 'insufficient_data_actions': ['fake_action_1', + 'fake_action_2'], + 'repeat_actions': True, + 'user_id': 'fake_user_id', + 'project_id': 'fake_project_id', + 'type': 'threshold', + 'severity': 'low'} + alarm_dict_2 = {'alarm_actions': ['alarm_action1', 'alarm_action2'], + 'ok_actions': ['ok_action_1', 'ok_action_2'], + 'name': 'fake_alarm_name', + 'timestamp': '2015-08-07T05:32:20.970341', + 'description': 'New', + 'time_constraints': [], + 'enabled': True, + 'state_timestamp': '2015-08-07T17:59:11.351033', + 'threshold_rule': {'meter_name': 'fake_meter_name', + 'evaluation_periods': 1, 'period': 300, + 'statistic': 'avg', 'threshold': 2.0, + 'query': [], + 'comparison_operator': 'ge', + 'exclude_outliers': False}, + 'alarm_id': 'fake_alarm_id2', + 'state': 'ok', + 'insufficient_data_actions': ['fake_action_1', + 'fake_action_2'], + 'repeat_actions': True, + 'user_id': 'fake_user_id', + 'project_id': 'fake_project_id', + 'type': 'threshold', + 'severity': 'low'} + alarm_dict_3 = {'alarm_actions': ['alarm_action1', 'alarm_action2'], + 'ok_actions': ['ok_action_1', 'ok_action_2'], + 'name': 'fake_alarm_name', + 'timestamp': '2015-08-07T05:32:20.970341', + 'description': 'fake_random_description', + 'time_constraints': [], + 'enabled': True, + 'state_timestamp': '2015-08-07T17:59:11.351033', + 'threshold_rule': {'meter_name': 'fake_meter_name', + 'evaluation_periods': 2, 'period': 300, + 'statistic': 'avg', 'threshold': 2.0, + 'query': [{'field': 'resource_id', + 'value': ''}], + 'comparison_operator': 'ge', + 'exclude_outliers': False}, + 'alarm_id': 'fake_alarm_id3', + 'state': 'ok', + 'insufficient_data_actions': ['fake_action_1', + 'fake_action_2'], + 'repeat_actions': True, + 'user_id': '', + 'project_id': '', + 'type': 'threshold', + 'severity': 'low'} + alarm_dict_4 = {'alarm_actions': ['alarm_action1', 'alarm_action2'], + 'ok_actions': ['ok_action_1', 'ok_action_2'], + 'name': 'fake_alarm_name4', + 'timestamp': '2015-08-07T05:32:20.970341', + 'description': 'fake_random_description', + 'time_constraints': [], + 'enabled': True, + 'state_timestamp': '2015-08-07T17:59:11.351033', + 'threshold_rule': {'meter_name': '', + 'evaluation_periods': -10, 'period': -1, + 'statistic': 'avg', 'threshold': '', + 'query': [{'field': 'resource_id', + 'value': ''}], + 'comparison_operator': 'ge', + 'exclude_outliers': False}, + 'alarm_id': 'fake_alarm_id4', + 'state': 'ok', + 'insufficient_data_actions': ['fake_action_1', + 'fake_action_2'], + 'repeat_actions': True, + 'user_id': 'fake_user_id', + 'project_id': 'fake_project_id', + 'type': 'threshold', + 'severity': 'low'} + + alarm_1 = alarms.Alarm(alarms.AlarmManager(None), alarm_dict_1) + alarm_2 = alarms.Alarm(alarms.AlarmManager(None), alarm_dict_2) + alarm_3 = alarms.Alarm(alarms.AlarmManager(None), alarm_dict_3) + alarm_4 = alarms.Alarm(alarms.AlarmManager(None), alarm_dict_4) + TEST.alarms.add(alarm_1) + TEST.alarms.add(alarm_2) + TEST.alarms.add(alarm_3) + TEST.alarms.add(alarm_4) + # meters meter_dict_1 = {'name': 'instance', 'type': 'gauge',