2
# Licensed under the Apache License, Version 2.0 (the "License"); you may
3
# not use this file except in compliance with the License. You may obtain
4
# a copy of the License at
6
# http://www.apache.org/licenses/LICENSE-2.0
8
# Unless required by applicable law or agreed to in writing, software
9
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11
# License for the specific language governing permissions and limitations
16
from ceilometerclient import exc as ceilometerclient_exc
21
from heat.common import exception
22
from heat.common import template_format
23
from heat.engine.clients.os import ceilometer
24
from heat.engine import resource
25
from heat.engine import scheduler
26
from heat.tests import common
27
from heat.tests import utils
29
from ..resources import gnocchi_alarm as gnocchi # noqa
31
gnocchi_resources_alarm_template = '''
32
heat_template_version: 2013-05-23
33
description: Gnocchi Resources Alarm Test
36
type: OS::Ceilometer::GnocchiResourcesAlarm
38
description: Do stuff with gnocchi
40
aggregation_method: mean
45
resource_type: instance
46
resource_id: 5a517ceb-b068-4aca-9eb9-3e4eb9b90d9a
47
comparison_operator: gt
51
gnocchi_aggregation_by_metrics_alarm_template = '''
52
heat_template_version: 2013-05-23
53
description: Gnocchi Aggregation by Metrics Alarm Test
55
GnoAggregationByMetricsAlarm:
56
type: OS::Ceilometer::GnocchiAggregationByMetricsAlarm
58
description: Do stuff with gnocchi metrics
59
metrics: ["911fce07-e0d7-4210-8c8c-4a9d811fcabc",
60
"2543d435-fe93-4443-9351-fb0156930f94"]
61
aggregation_method: mean
66
comparison_operator: gt
69
gnocchi_aggregation_by_resources_alarm_template = '''
70
heat_template_version: 2013-05-23
71
description: Gnocchi Aggregation by Resources Alarm Test
73
GnoAggregationByResourcesAlarm:
74
type: OS::Ceilometer::GnocchiAggregationByResourcesAlarm
76
description: Do stuff with gnocchi aggregation by resource
77
aggregation_method: mean
83
resource_type: instance
84
query: '{"=": {"server_group": "my_autoscaling_group"}}'
85
comparison_operator: gt
89
class FakeCeilometerAlarm(object):
93
class GnocchiResourcesAlarmTest(common.HeatTestCase):
95
super(GnocchiResourcesAlarmTest, self).setUp()
97
self._register_resources()
99
def _register_resources(self):
100
for res_name, res_class in six.iteritems(gnocchi.resource_mapping()):
101
resource._register_class(res_name, res_class)
103
def create_alarm(self):
104
self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
105
ceilometer.CeilometerClientPlugin._create().AndReturn(
107
self.m.StubOutWithMock(self.fc.alarms, 'create')
108
self.fc.alarms.create(
110
description=u'Do stuff with gnocchi',
112
insufficient_data_actions=None,
114
name=mox.IgnoreArg(), type='gnocchi_resources_threshold',
116
gnocchi_resources_threshold_rule={
117
"metric": "cpu_util",
118
"aggregation_method": "mean",
120
"evaluation_periods": 1,
122
"resource_type": "instance",
123
"resource_id": "5a517ceb-b068-4aca-9eb9-3e4eb9b90d9a",
124
"comparison_operator": "gt",
126
).AndReturn(FakeCeilometerAlarm())
127
snippet = template_format.parse(gnocchi_resources_alarm_template)
128
stack = utils.parse_stack(snippet)
129
resource_defns = stack.t.resource_definitions(stack)
130
return gnocchi.CeilometerGnocchiResourcesAlarm(
131
'GnoResAlarm', resource_defns['GnoResAlarm'], stack)
133
def test_update(self):
134
rsrc = self.create_alarm()
135
self.m.StubOutWithMock(self.fc.alarms, 'update')
136
self.fc.alarms.update(
138
gnocchi_resources_threshold_rule={
139
'resource_id': 'd3d6c642-921e-4fc2-9c5f-15d9a5afb598'})
142
scheduler.TaskRunner(rsrc.create)()
144
update_template = copy.deepcopy(rsrc.t)
145
update_template['Properties']['resource_id'] = (
146
'd3d6c642-921e-4fc2-9c5f-15d9a5afb598')
147
scheduler.TaskRunner(rsrc.update, update_template)()
148
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
152
def _prepare_check_resource(self):
153
snippet = template_format.parse(gnocchi_resources_alarm_template)
154
stack = utils.parse_stack(snippet)
155
res = stack['GnoResAlarm']
156
res.ceilometer = mock.Mock()
157
mock_alarm = mock.Mock(enabled=True, state='ok')
158
res.ceilometer().alarms.get.return_value = mock_alarm
161
def test_create(self):
162
rsrc = self.create_alarm()
165
scheduler.TaskRunner(rsrc.create)()
166
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
167
self.assertEqual('foo', rsrc.resource_id)
170
def test_suspend(self):
171
rsrc = self.create_alarm()
172
self.m.StubOutWithMock(self.fc.alarms, 'update')
173
self.fc.alarms.update(alarm_id='foo', enabled=False)
176
scheduler.TaskRunner(rsrc.create)()
178
scheduler.TaskRunner(rsrc.suspend)()
179
self.assertEqual((rsrc.SUSPEND, rsrc.COMPLETE), rsrc.state)
183
def test_resume(self):
184
rsrc = self.create_alarm()
185
self.m.StubOutWithMock(self.fc.alarms, 'update')
186
self.fc.alarms.update(alarm_id='foo', enabled=True)
189
scheduler.TaskRunner(rsrc.create)()
190
rsrc.state_set(rsrc.SUSPEND, rsrc.COMPLETE)
192
scheduler.TaskRunner(rsrc.resume)()
193
self.assertEqual((rsrc.RESUME, rsrc.COMPLETE), rsrc.state)
197
def test_delete(self):
198
rsrc = self.create_alarm()
199
self.m.StubOutWithMock(self.fc.alarms, 'delete')
200
self.fc.alarms.delete('foo')
202
scheduler.TaskRunner(rsrc.create)()
203
scheduler.TaskRunner(rsrc.delete)()
204
self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
208
def test_delete_not_found(self):
209
rsrc = self.create_alarm()
210
self.m.StubOutWithMock(self.fc.alarms, 'delete')
211
self.fc.alarms.delete('foo').AndRaise(
212
ceilometerclient_exc.HTTPNotFound())
214
scheduler.TaskRunner(rsrc.create)()
215
scheduler.TaskRunner(rsrc.delete)()
216
self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
220
def test_check(self):
221
res = self._prepare_check_resource()
222
scheduler.TaskRunner(res.check)()
223
self.assertEqual((res.CHECK, res.COMPLETE), res.state)
225
def test_check_failure(self):
226
res = self._prepare_check_resource()
227
res.ceilometer().alarms.get.side_effect = Exception('Boom')
229
self.assertRaises(exception.ResourceFailure,
230
scheduler.TaskRunner(res.check))
231
self.assertEqual((res.CHECK, res.FAILED), res.state)
232
self.assertIn('Boom', res.status_reason)
235
class GnocchiAggregationByMetricsAlarmTest(GnocchiResourcesAlarmTest):
237
def create_alarm(self):
238
self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
239
ceilometer.CeilometerClientPlugin._create().AndReturn(
241
self.m.StubOutWithMock(self.fc.alarms, 'create')
242
self.fc.alarms.create(
244
description=u'Do stuff with gnocchi metrics',
246
insufficient_data_actions=None,
248
name=mox.IgnoreArg(),
249
type='gnocchi_aggregation_by_metrics_threshold',
251
gnocchi_aggregation_by_metrics_threshold_rule={
252
"aggregation_method": "mean",
254
"evaluation_periods": 1,
256
"comparison_operator": "gt",
257
"metrics": ["911fce07-e0d7-4210-8c8c-4a9d811fcabc",
258
"2543d435-fe93-4443-9351-fb0156930f94"],
260
).AndReturn(FakeCeilometerAlarm())
261
snippet = template_format.parse(
262
gnocchi_aggregation_by_metrics_alarm_template)
263
stack = utils.parse_stack(snippet)
264
resource_defns = stack.t.resource_definitions(stack)
265
return gnocchi.CeilometerGnocchiAggregationByMetricsAlarm(
266
'GnoAggregationByMetricsAlarm',
267
resource_defns['GnoAggregationByMetricsAlarm'], stack)
269
def test_update(self):
270
rsrc = self.create_alarm()
271
self.m.StubOutWithMock(self.fc.alarms, 'update')
272
self.fc.alarms.update(
274
gnocchi_aggregation_by_metrics_threshold_rule={
275
'metrics': ['d3d6c642-921e-4fc2-9c5f-15d9a5afb598',
276
'bc60f822-18a0-4a0c-94e7-94c554b00901']})
279
scheduler.TaskRunner(rsrc.create)()
281
update_template = copy.deepcopy(rsrc.t)
282
update_template['Properties']['metrics'] = [
283
'd3d6c642-921e-4fc2-9c5f-15d9a5afb598',
284
'bc60f822-18a0-4a0c-94e7-94c554b00901']
285
scheduler.TaskRunner(rsrc.update, update_template)()
286
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
290
def _prepare_check_resource(self):
291
snippet = template_format.parse(
292
gnocchi_aggregation_by_metrics_alarm_template)
293
stack = utils.parse_stack(snippet)
294
res = stack['GnoAggregationByMetricsAlarm']
295
res.ceilometer = mock.Mock()
296
mock_alarm = mock.Mock(enabled=True, state='ok')
297
res.ceilometer().alarms.get.return_value = mock_alarm
301
class GnocchiAggregationByResourcesAlarmTest(GnocchiResourcesAlarmTest):
303
def create_alarm(self):
304
self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
305
ceilometer.CeilometerClientPlugin._create().AndReturn(
307
self.m.StubOutWithMock(self.fc.alarms, 'create')
308
self.fc.alarms.create(
310
description=u'Do stuff with gnocchi aggregation by resource',
312
insufficient_data_actions=None,
314
name=mox.IgnoreArg(),
315
type='gnocchi_aggregation_by_resources_threshold',
317
gnocchi_aggregation_by_resources_threshold_rule={
318
"aggregation_method": "mean",
320
"evaluation_periods": 1,
322
"comparison_operator": "gt",
323
"metric": "cpu_util",
324
"resource_type": "instance",
325
"query": '{"=": {"server_group": "my_autoscaling_group"}}',
327
).AndReturn(FakeCeilometerAlarm())
328
snippet = template_format.parse(
329
gnocchi_aggregation_by_resources_alarm_template)
330
stack = utils.parse_stack(snippet)
331
resource_defns = stack.t.resource_definitions(stack)
332
return gnocchi.CeilometerGnocchiAggregationByResourcesAlarm(
333
'GnoAggregationByResourcesAlarm',
334
resource_defns['GnoAggregationByResourcesAlarm'], stack)
336
def test_update(self):
337
rsrc = self.create_alarm()
338
self.m.StubOutWithMock(self.fc.alarms, 'update')
339
self.fc.alarms.update(
341
gnocchi_aggregation_by_resources_threshold_rule={
342
'query': '{"=": {"server_group": "my_new_group"}}'})
345
scheduler.TaskRunner(rsrc.create)()
347
update_template = copy.deepcopy(rsrc.t)
348
update_template['Properties']['query'] = (
349
'{"=": {"server_group": "my_new_group"}}')
350
scheduler.TaskRunner(rsrc.update, update_template)()
351
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
355
def _prepare_check_resource(self):
356
snippet = template_format.parse(
357
gnocchi_aggregation_by_resources_alarm_template)
358
stack = utils.parse_stack(snippet)
359
res = stack['GnoAggregationByResourcesAlarm']
360
res.ceilometer = mock.Mock()
361
mock_alarm = mock.Mock(enabled=True, state='ok')
362
res.ceilometer().alarms.get.return_value = mock_alarm