~ubuntu-branches/ubuntu/wily/heat/wily

« back to all changes in this revision

Viewing changes to contrib/heat_gnocchi/heat_gnocchi/tests/test_gnocchi_alarm.py

  • Committer: Package Import Robot
  • Author(s): Corey Bryant, Corey Bryant, James Page
  • Date: 2015-07-07 17:06:19 UTC
  • mfrom: (1.1.26) (45.1.1 vivid-proposed)
  • Revision ID: package-import@ubuntu.com-20150707170619-hra2dbjpfofpou4s
Tags: 1:5.0.0~b1-0ubuntu1
[ Corey Bryant ]
* New upstream milestone for OpenStack Liberty:
  - d/control: Align (build-)depends with upstream.
  - d/p/fix-requirements.patch: Rebased.
  - d/p/sudoers_patch.patch: Rebased.

[ James Page ]
* d/s/options: Ignore any removal of egg-info data during package clean.
* d/control: Drop MySQL and PostgreSQL related BD's, not required for unit
  testing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
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
5
 
#
6
 
#         http://www.apache.org/licenses/LICENSE-2.0
7
 
#
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
12
 
#    under the License.
13
 
 
14
 
import copy
15
 
 
16
 
from ceilometerclient import exc as ceilometerclient_exc
17
 
import mock
18
 
import mox
19
 
import six
20
 
 
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
28
 
 
29
 
from ..resources import gnocchi_alarm as gnocchi  # noqa
30
 
 
31
 
gnocchi_resources_alarm_template = '''
32
 
heat_template_version: 2013-05-23
33
 
description: Gnocchi Resources Alarm Test
34
 
resources:
35
 
  GnoResAlarm:
36
 
    type: OS::Ceilometer::GnocchiResourcesAlarm
37
 
    properties:
38
 
      description: Do stuff with gnocchi
39
 
      metric: cpu_util
40
 
      aggregation_method: mean
41
 
      granularity: 60
42
 
      evaluation_periods: 1
43
 
      threshold: 50
44
 
      alarm_actions: []
45
 
      resource_type: instance
46
 
      resource_id: 5a517ceb-b068-4aca-9eb9-3e4eb9b90d9a
47
 
      comparison_operator: gt
48
 
'''
49
 
 
50
 
 
51
 
gnocchi_aggregation_by_metrics_alarm_template = '''
52
 
heat_template_version: 2013-05-23
53
 
description: Gnocchi Aggregation by Metrics Alarm Test
54
 
resources:
55
 
  GnoAggregationByMetricsAlarm:
56
 
    type: OS::Ceilometer::GnocchiAggregationByMetricsAlarm
57
 
    properties:
58
 
      description: Do stuff with gnocchi metrics
59
 
      metrics: ["911fce07-e0d7-4210-8c8c-4a9d811fcabc",
60
 
                "2543d435-fe93-4443-9351-fb0156930f94"]
61
 
      aggregation_method: mean
62
 
      granularity: 60
63
 
      evaluation_periods: 1
64
 
      threshold: 50
65
 
      alarm_actions: []
66
 
      comparison_operator: gt
67
 
'''
68
 
 
69
 
gnocchi_aggregation_by_resources_alarm_template = '''
70
 
heat_template_version: 2013-05-23
71
 
description: Gnocchi Aggregation by Resources Alarm Test
72
 
resources:
73
 
  GnoAggregationByResourcesAlarm:
74
 
    type: OS::Ceilometer::GnocchiAggregationByResourcesAlarm
75
 
    properties:
76
 
      description: Do stuff with gnocchi aggregation by resource
77
 
      aggregation_method: mean
78
 
      granularity: 60
79
 
      evaluation_periods: 1
80
 
      threshold: 50
81
 
      metric: cpu_util
82
 
      alarm_actions: []
83
 
      resource_type: instance
84
 
      query: '{"=": {"server_group": "my_autoscaling_group"}}'
85
 
      comparison_operator: gt
86
 
'''
87
 
 
88
 
 
89
 
class FakeCeilometerAlarm(object):
90
 
    alarm_id = 'foo'
91
 
 
92
 
 
93
 
class GnocchiResourcesAlarmTest(common.HeatTestCase):
94
 
    def setUp(self):
95
 
        super(GnocchiResourcesAlarmTest, self).setUp()
96
 
        self.fc = mock.Mock()
97
 
        self._register_resources()
98
 
 
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)
102
 
 
103
 
    def create_alarm(self):
104
 
        self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
105
 
        ceilometer.CeilometerClientPlugin._create().AndReturn(
106
 
            self.fc)
107
 
        self.m.StubOutWithMock(self.fc.alarms, 'create')
108
 
        self.fc.alarms.create(
109
 
            alarm_actions=[],
110
 
            description=u'Do stuff with gnocchi',
111
 
            enabled=True,
112
 
            insufficient_data_actions=None,
113
 
            ok_actions=None,
114
 
            name=mox.IgnoreArg(), type='gnocchi_resources_threshold',
115
 
            repeat_actions=True,
116
 
            gnocchi_resources_threshold_rule={
117
 
                "metric": "cpu_util",
118
 
                "aggregation_method": "mean",
119
 
                "granularity": 60,
120
 
                "evaluation_periods": 1,
121
 
                "threshold": 50,
122
 
                "resource_type": "instance",
123
 
                "resource_id": "5a517ceb-b068-4aca-9eb9-3e4eb9b90d9a",
124
 
                "comparison_operator": "gt",
125
 
            }
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)
132
 
 
133
 
    def test_update(self):
134
 
        rsrc = self.create_alarm()
135
 
        self.m.StubOutWithMock(self.fc.alarms, 'update')
136
 
        self.fc.alarms.update(
137
 
            alarm_id='foo',
138
 
            gnocchi_resources_threshold_rule={
139
 
                'resource_id': 'd3d6c642-921e-4fc2-9c5f-15d9a5afb598'})
140
 
 
141
 
        self.m.ReplayAll()
142
 
        scheduler.TaskRunner(rsrc.create)()
143
 
 
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)
149
 
 
150
 
        self.m.VerifyAll()
151
 
 
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
159
 
        return res
160
 
 
161
 
    def test_create(self):
162
 
        rsrc = self.create_alarm()
163
 
 
164
 
        self.m.ReplayAll()
165
 
        scheduler.TaskRunner(rsrc.create)()
166
 
        self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
167
 
        self.assertEqual('foo', rsrc.resource_id)
168
 
        self.m.VerifyAll()
169
 
 
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)
174
 
 
175
 
        self.m.ReplayAll()
176
 
        scheduler.TaskRunner(rsrc.create)()
177
 
 
178
 
        scheduler.TaskRunner(rsrc.suspend)()
179
 
        self.assertEqual((rsrc.SUSPEND, rsrc.COMPLETE), rsrc.state)
180
 
 
181
 
        self.m.VerifyAll()
182
 
 
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)
187
 
 
188
 
        self.m.ReplayAll()
189
 
        scheduler.TaskRunner(rsrc.create)()
190
 
        rsrc.state_set(rsrc.SUSPEND, rsrc.COMPLETE)
191
 
 
192
 
        scheduler.TaskRunner(rsrc.resume)()
193
 
        self.assertEqual((rsrc.RESUME, rsrc.COMPLETE), rsrc.state)
194
 
 
195
 
        self.m.VerifyAll()
196
 
 
197
 
    def test_delete(self):
198
 
        rsrc = self.create_alarm()
199
 
        self.m.StubOutWithMock(self.fc.alarms, 'delete')
200
 
        self.fc.alarms.delete('foo')
201
 
        self.m.ReplayAll()
202
 
        scheduler.TaskRunner(rsrc.create)()
203
 
        scheduler.TaskRunner(rsrc.delete)()
204
 
        self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
205
 
 
206
 
        self.m.VerifyAll()
207
 
 
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())
213
 
        self.m.ReplayAll()
214
 
        scheduler.TaskRunner(rsrc.create)()
215
 
        scheduler.TaskRunner(rsrc.delete)()
216
 
        self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
217
 
 
218
 
        self.m.VerifyAll()
219
 
 
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)
224
 
 
225
 
    def test_check_failure(self):
226
 
        res = self._prepare_check_resource()
227
 
        res.ceilometer().alarms.get.side_effect = Exception('Boom')
228
 
 
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)
233
 
 
234
 
 
235
 
class GnocchiAggregationByMetricsAlarmTest(GnocchiResourcesAlarmTest):
236
 
 
237
 
    def create_alarm(self):
238
 
        self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
239
 
        ceilometer.CeilometerClientPlugin._create().AndReturn(
240
 
            self.fc)
241
 
        self.m.StubOutWithMock(self.fc.alarms, 'create')
242
 
        self.fc.alarms.create(
243
 
            alarm_actions=[],
244
 
            description=u'Do stuff with gnocchi metrics',
245
 
            enabled=True,
246
 
            insufficient_data_actions=None,
247
 
            ok_actions=None,
248
 
            name=mox.IgnoreArg(),
249
 
            type='gnocchi_aggregation_by_metrics_threshold',
250
 
            repeat_actions=True,
251
 
            gnocchi_aggregation_by_metrics_threshold_rule={
252
 
                "aggregation_method": "mean",
253
 
                "granularity": 60,
254
 
                "evaluation_periods": 1,
255
 
                "threshold": 50,
256
 
                "comparison_operator": "gt",
257
 
                "metrics": ["911fce07-e0d7-4210-8c8c-4a9d811fcabc",
258
 
                            "2543d435-fe93-4443-9351-fb0156930f94"],
259
 
            }
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)
268
 
 
269
 
    def test_update(self):
270
 
        rsrc = self.create_alarm()
271
 
        self.m.StubOutWithMock(self.fc.alarms, 'update')
272
 
        self.fc.alarms.update(
273
 
            alarm_id='foo',
274
 
            gnocchi_aggregation_by_metrics_threshold_rule={
275
 
                'metrics': ['d3d6c642-921e-4fc2-9c5f-15d9a5afb598',
276
 
                            'bc60f822-18a0-4a0c-94e7-94c554b00901']})
277
 
 
278
 
        self.m.ReplayAll()
279
 
        scheduler.TaskRunner(rsrc.create)()
280
 
 
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)
287
 
 
288
 
        self.m.VerifyAll()
289
 
 
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
298
 
        return res
299
 
 
300
 
 
301
 
class GnocchiAggregationByResourcesAlarmTest(GnocchiResourcesAlarmTest):
302
 
 
303
 
    def create_alarm(self):
304
 
        self.m.StubOutWithMock(ceilometer.CeilometerClientPlugin, '_create')
305
 
        ceilometer.CeilometerClientPlugin._create().AndReturn(
306
 
            self.fc)
307
 
        self.m.StubOutWithMock(self.fc.alarms, 'create')
308
 
        self.fc.alarms.create(
309
 
            alarm_actions=[],
310
 
            description=u'Do stuff with gnocchi aggregation by resource',
311
 
            enabled=True,
312
 
            insufficient_data_actions=None,
313
 
            ok_actions=None,
314
 
            name=mox.IgnoreArg(),
315
 
            type='gnocchi_aggregation_by_resources_threshold',
316
 
            repeat_actions=True,
317
 
            gnocchi_aggregation_by_resources_threshold_rule={
318
 
                "aggregation_method": "mean",
319
 
                "granularity": 60,
320
 
                "evaluation_periods": 1,
321
 
                "threshold": 50,
322
 
                "comparison_operator": "gt",
323
 
                "metric": "cpu_util",
324
 
                "resource_type": "instance",
325
 
                "query": '{"=": {"server_group": "my_autoscaling_group"}}',
326
 
            }
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)
335
 
 
336
 
    def test_update(self):
337
 
        rsrc = self.create_alarm()
338
 
        self.m.StubOutWithMock(self.fc.alarms, 'update')
339
 
        self.fc.alarms.update(
340
 
            alarm_id='foo',
341
 
            gnocchi_aggregation_by_resources_threshold_rule={
342
 
                'query': '{"=": {"server_group": "my_new_group"}}'})
343
 
 
344
 
        self.m.ReplayAll()
345
 
        scheduler.TaskRunner(rsrc.create)()
346
 
 
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)
352
 
 
353
 
        self.m.VerifyAll()
354
 
 
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
363
 
        return res