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 <sanjana@hitachi.co.in>
This commit is contained in:
Shubham Chitranshi
2015-08-13 14:54:02 +05:30
committed by sanjana
parent 09a37991f7
commit 7df3624c58
3 changed files with 220 additions and 0 deletions

View File

@@ -267,6 +267,41 @@ class Statistic(base.APIResourceWrapper):
'duration', 'duration_start', 'duration_end'] '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 @memoized
def ceilometerclient(request): def ceilometerclient(request):
"""Initialization of Ceilometer client.""" """Initialization of Ceilometer client."""
@@ -280,6 +315,35 @@ def ceilometerclient(request):
cacert=cacert) 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): def resource_list(request, query=None, ceilometer_usage_object=None):
"""List the resources.""" """List the resources."""
resources = ceilometerclient(request).resources.list(q=query) resources = ceilometerclient(request).resources.list(q=query)

View File

@@ -37,6 +37,55 @@ class CeilometerApiTests(test.APITestCase):
for c in ret_list: for c in ret_list:
self.assertIsInstance(c, api.ceilometer.Sample) 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): def test_meter_list(self):
meters = self.meters.list() meters = self.meters.list()
ceilometerclient = self.stub_ceilometerclient() ceilometerclient = self.stub_ceilometerclient()

View File

@@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from ceilometerclient.v2 import alarms
from ceilometerclient.v2 import meters from ceilometerclient.v2 import meters
from ceilometerclient.v2 import resources from ceilometerclient.v2 import resources
from ceilometerclient.v2 import samples from ceilometerclient.v2 import samples
@@ -31,6 +32,7 @@ def data(TEST):
TEST.api_resources = utils.TestDataContainer() TEST.api_resources = utils.TestDataContainer()
TEST.samples = utils.TestDataContainer() TEST.samples = utils.TestDataContainer()
TEST.meters = utils.TestDataContainer() TEST.meters = utils.TestDataContainer()
TEST.alarms = utils.TestDataContainer()
TEST.statistics = utils.TestDataContainer() TEST.statistics = utils.TestDataContainer()
TEST.global_disk_usages = utils.TestDataContainer() TEST.global_disk_usages = utils.TestDataContainer()
TEST.global_network_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_1)
TEST.samples.add(sample_2) 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 # meters
meter_dict_1 = {'name': 'instance', meter_dict_1 = {'name': 'instance',
'type': 'gauge', 'type': 'gauge',