1
# -*- encoding: utf-8 -*-
3
# Copyright © 2012 New Dream Network, LLC (DreamHost)
4
# Copyright © 2013 eNovance
6
# Author: Doug Hellmann <doug.hellmann@dreamhost.com>
7
# Julien Danjou <julien@danjou.info>
9
# Licensed under the Apache License, Version 2.0 (the "License"); you may
10
# not use this file except in compliance with the License. You may obtain
11
# a copy of the License at
13
# http://www.apache.org/licenses/LICENSE-2.0
15
# Unless required by applicable law or agreed to in writing, software
16
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18
# License for the specific language governing permissions and limitations
20
"""Tests for converters for producing compute counter messages from
24
from ceilometer.compute.notifications import instance
25
from ceilometer.openstack.common import test
26
from ceilometer import sample
29
INSTANCE_CREATE_END = {
30
u'_context_auth_token': u'3d8b13de1b7d499587dfc69b77dc09c2',
31
u'_context_is_admin': True,
32
u'_context_project_id': u'7c150a59fe714e6f9263774af9688f0e',
33
u'_context_quota_class': None,
34
u'_context_read_deleted': u'no',
35
u'_context_remote_address': u'10.0.2.15',
36
u'_context_request_id': u'req-d68b36e0-9233-467f-9afb-d81435d64d66',
37
u'_context_roles': [u'admin'],
38
u'_context_timestamp': u'2012-05-08T20:23:41.425105',
39
u'_context_user_id': u'1e3ce043029547f1a61c1996d1a531a2',
40
u'event_type': u'compute.instance.create.end',
41
u'message_id': u'dae6f69c-00e0-41c0-b371-41ec3b7f4451',
42
u'payload': {u'created_at': u'2012-05-08 20:23:41',
45
u'display_name': u'testme',
46
u'fixed_ips': [{u'address': u'10.0.0.2',
51
u'image_ref_url': u'http://10.0.2.15:9292/images/UUID',
52
u'instance_id': u'9f9d01b9-4a58-4271-9e27-398b21ab20d1',
53
u'instance_type': u'm1.tiny',
54
u'instance_type_id': 2,
55
u'launched_at': u'2012-05-08 20:23:47.985999',
58
u'state_description': u'',
59
u'tenant_id': u'7c150a59fe714e6f9263774af9688f0e',
60
u'user_id': u'1e3ce043029547f1a61c1996d1a531a2',
61
u'reservation_id': u'1e3ce043029547f1a61c1996d1a531a3',
65
u'host': u'compute-host-name',
66
u'availability_zone': u'1e3ce043029547f1a61c1996d1a531a4',
67
u'os_type': u'linux?',
68
u'architecture': u'x86',
69
u'image_ref': u'UUID',
70
u'kernel_id': u'1e3ce043029547f1a61c1996d1a531a5',
71
u'ramdisk_id': u'1e3ce043029547f1a61c1996d1a531a6',
74
u'publisher_id': u'compute.vagrant-precise',
75
u'timestamp': u'2012-05-08 20:23:48.028195',
78
INSTANCE_DELETE_START = {
79
u'_context_auth_token': u'3d8b13de1b7d499587dfc69b77dc09c2',
80
u'_context_is_admin': True,
81
u'_context_project_id': u'7c150a59fe714e6f9263774af9688f0e',
82
u'_context_quota_class': None,
83
u'_context_read_deleted': u'no',
84
u'_context_remote_address': u'10.0.2.15',
85
u'_context_request_id': u'req-fb3c4546-a2e5-49b7-9fd2-a63bd658bc39',
86
u'_context_roles': [u'admin'],
87
u'_context_timestamp': u'2012-05-08T20:24:14.547374',
88
u'_context_user_id': u'1e3ce043029547f1a61c1996d1a531a2',
89
u'event_type': u'compute.instance.delete.start',
90
u'message_id': u'a15b94ee-cb8e-4c71-9abe-14aa80055fb4',
91
u'payload': {u'created_at': u'2012-05-08 20:23:41',
94
u'display_name': u'testme',
95
u'image_ref_url': u'http://10.0.2.15:9292/images/UUID',
96
u'instance_id': u'9f9d01b9-4a58-4271-9e27-398b21ab20d1',
97
u'instance_type': u'm1.tiny',
98
u'instance_type_id': 2,
99
u'launched_at': u'2012-05-08 20:23:47',
102
u'state_description': u'deleting',
103
u'tenant_id': u'7c150a59fe714e6f9263774af9688f0e',
104
u'user_id': u'1e3ce043029547f1a61c1996d1a531a2',
105
u'reservation_id': u'1e3ce043029547f1a61c1996d1a531a3',
109
u'host': u'compute-host-name',
110
u'availability_zone': u'1e3ce043029547f1a61c1996d1a531a4',
111
u'os_type': u'linux?',
112
u'architecture': u'x86',
113
u'image_ref': u'UUID',
114
u'kernel_id': u'1e3ce043029547f1a61c1996d1a531a5',
115
u'ramdisk_id': u'1e3ce043029547f1a61c1996d1a531a6',
117
u'priority': u'INFO',
118
u'publisher_id': u'compute.vagrant-precise',
119
u'timestamp': u'2012-05-08 20:24:14.824743',
123
u'_context_auth_token': None,
124
u'_context_is_admin': True,
125
u'_context_project_id': None,
126
u'_context_quota_class': None,
127
u'_context_read_deleted': u'no',
128
u'_context_remote_address': None,
129
u'_context_request_id': u'req-659a8eb2-4372-4c01-9028-ad6e40b0ed22',
130
u'_context_roles': [u'admin'],
131
u'_context_timestamp': u'2012-05-08T16:03:43.760204',
132
u'_context_user_id': None,
133
u'event_type': u'compute.instance.exists',
134
u'message_id': u'4b884c03-756d-4c06-8b42-80b6def9d302',
135
u'payload': {u'audit_period_beginning': u'2012-05-08 15:00:00',
136
u'audit_period_ending': u'2012-05-08 16:00:00',
138
u'created_at': u'2012-05-07 22:16:18',
141
u'display_name': u'testme',
142
u'image_ref_url': u'http://10.0.2.15:9292/images/UUID',
143
u'instance_id': u'3a513875-95c9-4012-a3e7-f90c678854e5',
144
u'instance_type': u'm1.tiny',
145
u'instance_type_id': 2,
146
u'launched_at': u'2012-05-07 23:01:27',
149
u'state_description': u'',
150
u'tenant_id': u'7c150a59fe714e6f9263774af9688f0e',
151
u'user_id': u'1e3ce043029547f1a61c1996d1a531a2',
152
u'reservation_id': u'1e3ce043029547f1a61c1996d1a531a3',
156
u'host': u'compute-host-name',
157
u'availability_zone': u'1e3ce043029547f1a61c1996d1a531a4',
158
u'os_type': u'linux?',
159
u'architecture': u'x86',
160
u'image_ref': u'UUID',
161
u'kernel_id': u'1e3ce043029547f1a61c1996d1a531a5',
162
u'ramdisk_id': u'1e3ce043029547f1a61c1996d1a531a6',
164
u'priority': u'INFO',
165
u'publisher_id': u'compute.vagrant-precise',
166
u'timestamp': u'2012-05-08 16:03:44.122481',
169
INSTANCE_FINISH_RESIZE_END = {
170
u'_context_roles': [u'admin'],
171
u'_context_request_id': u'req-e3f71bb9-e9b9-418b-a9db-a5950c851b25',
172
u'_context_quota_class': None,
173
u'event_type': u'compute.instance.finish_resize.end',
174
u'_context_user_name': u'admin',
175
u'_context_project_name': u'admin',
176
u'timestamp': u'2013-01-04 15:10:17.436974',
177
u'_context_is_admin': True,
178
u'message_id': u'a2f7770d-b85d-4797-ab10-41407a44368e',
179
u'_context_auth_token': None,
180
u'_context_instance_lock_checked': False,
181
u'_context_project_id': u'cea4b25edb484e5392727181b7721d29',
182
u'_context_timestamp': u'2013-01-04T15:08:39.162612',
183
u'_context_read_deleted': u'no',
184
u'_context_user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
185
u'_context_remote_address': u'10.147.132.184',
186
u'publisher_id': u'compute.ip-10-147-132-184.ec2.internal',
187
u'payload': {u'state_description': u'',
188
u'availability_zone': None,
190
u'instance_type_id': 5,
192
u'fixed_ips': [{u'floating_ips': [],
193
u'label': u'private',
196
u'address': u'10.0.0.3',
199
u'user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
200
u'reservation_id': u'r-u3fvim06',
202
u'state': u'resized',
203
u'launched_at': u'2013-01-04T15:10:14.923939',
205
u'ramdisk_id': u'5f23128e-5525-46d8-bc66-9c30cd87141a',
206
u'access_ip_v6': None,
208
u'access_ip_v4': None,
209
u'kernel_id': u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
210
u'host': u'ip-10-147-132-184.ec2.internal',
211
u'display_name': u's1',
212
u'image_ref_url': u'http://10.147.132.184:9292/images/'
213
'a130b9d9-e00e-436e-9782-836ccef06e8a',
215
u'tenant_id': u'cea4b25edb484e5392727181b7721d29',
216
u'created_at': u'2013-01-04T11:21:48.000000',
217
u'instance_id': u'648e8963-6886-4c3c-98f9-4511c292f86b',
218
u'instance_type': u'm1.small',
220
u'image_meta': {u'kernel_id':
221
u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
223
u'5f23128e-5525-46d8-bc66-9c30cd87141a',
225
u'a130b9d9-e00e-436e-9782-836ccef06e8a'},
226
u'architecture': None,
232
INSTANCE_RESIZE_REVERT_END = {
233
u'_context_roles': [u'admin'],
234
u'_context_request_id': u'req-9da1d714-dabe-42fd-8baa-583e57cd4f1a',
235
u'_context_quota_class': None,
236
u'event_type': u'compute.instance.resize.revert.end',
237
u'_context_user_name': u'admin',
238
u'_context_project_name': u'admin',
239
u'timestamp': u'2013-01-04 15:20:32.009532',
240
u'_context_is_admin': True,
241
u'message_id': u'c48deeba-d0c3-4154-b3db-47480b52267a',
242
u'_context_auth_token': None,
243
u'_context_instance_lock_checked': False,
244
u'_context_project_id': u'cea4b25edb484e5392727181b7721d29',
245
u'_context_timestamp': u'2013-01-04T15:19:51.018218',
246
u'_context_read_deleted': u'no',
247
u'_context_user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
248
u'_context_remote_address': u'10.147.132.184',
249
u'publisher_id': u'compute.ip-10-147-132-184.ec2.internal',
250
u'payload': {u'state_description': u'resize_reverting',
251
u'availability_zone': None,
253
u'instance_type_id': 2,
255
u'reservation_id': u'r-u3fvim06',
257
u'user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
259
u'state': u'resized',
260
u'launched_at': u'2013-01-04T15:10:14.000000',
262
u'ramdisk_id': u'5f23128e-5525-46d8-bc66-9c30cd87141a',
263
u'access_ip_v6': None,
265
u'access_ip_v4': None,
266
u'kernel_id': u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
267
u'host': u'ip-10-147-132-184.ec2.internal',
268
u'display_name': u's1',
269
u'image_ref_url': u'http://10.147.132.184:9292/images/'
270
'a130b9d9-e00e-436e-9782-836ccef06e8a',
272
u'tenant_id': u'cea4b25edb484e5392727181b7721d29',
273
u'created_at': u'2013-01-04T11:21:48.000000',
274
u'instance_id': u'648e8963-6886-4c3c-98f9-4511c292f86b',
275
u'instance_type': u'm1.tiny',
277
u'image_meta': {u'kernel_id':
278
u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
280
u'5f23128e-5525-46d8-bc66-9c30cd87141a',
282
u'a130b9d9-e00e-436e-9782-836ccef06e8a'},
283
u'architecture': None,
289
INSTANCE_DELETE_SAMPLES = {
290
u'_context_roles': [u'admin'],
291
u'_context_request_id': u'req-9da1d714-dabe-42fd-8baa-583e57cd4f1a',
292
u'_context_quota_class': None,
293
u'event_type': u'compute.instance.delete.samples',
294
u'_context_user_name': u'admin',
295
u'_context_project_name': u'admin',
296
u'timestamp': u'2013-01-04 15:20:32.009532',
297
u'_context_is_admin': True,
298
u'message_id': u'c48deeba-d0c3-4154-b3db-47480b52267a',
299
u'_context_auth_token': None,
300
u'_context_instance_lock_checked': False,
301
u'_context_project_id': u'cea4b25edb484e5392727181b7721d29',
302
u'_context_timestamp': u'2013-01-04T15:19:51.018218',
303
u'_context_read_deleted': u'no',
304
u'_context_user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
305
u'_context_remote_address': u'10.147.132.184',
306
u'publisher_id': u'compute.ip-10-147-132-184.ec2.internal',
307
u'payload': {u'state_description': u'resize_reverting',
308
u'availability_zone': None,
310
u'instance_type_id': 2,
312
u'reservation_id': u'r-u3fvim06',
314
u'user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
316
u'state': u'resized',
317
u'launched_at': u'2013-01-04T15:10:14.000000',
319
u'ramdisk_id': u'5f23128e-5525-46d8-bc66-9c30cd87141a',
320
u'access_ip_v6': None,
322
u'access_ip_v4': None,
323
u'kernel_id': u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
324
u'host': u'ip-10-147-132-184.ec2.internal',
325
u'display_name': u's1',
326
u'image_ref_url': u'http://10.147.132.184:9292/images/'
327
'a130b9d9-e00e-436e-9782-836ccef06e8a',
329
u'tenant_id': u'cea4b25edb484e5392727181b7721d29',
330
u'created_at': u'2013-01-04T11:21:48.000000',
331
u'instance_id': u'648e8963-6886-4c3c-98f9-4511c292f86b',
332
u'instance_type': u'm1.tiny',
334
u'image_meta': {u'kernel_id':
335
u'571478e0-d5e7-4c2e-95a5-2bc79443c28a',
337
u'5f23128e-5525-46d8-bc66-9c30cd87141a',
339
u'a130b9d9-e00e-436e-9782-836ccef06e8a'},
340
u'architecture': None,
342
u'samples': [{u'name': u'sample-name1',
343
u'type': u'sample-type1',
344
u'unit': u'sample-units1',
346
{u'name': u'sample-name2',
347
u'type': u'sample-type2',
348
u'unit': u'sample-units2',
356
INSTANCE_SCHEDULED = {
357
u'_context_roles': [u'admin'],
358
u'_context_request_id': u'req-9da1d714-dabe-42fd-8baa-583e57cd4f1a',
359
u'_context_quota_class': None,
360
u'event_type': u'scheduler.run_instance.scheduled',
361
u'_context_user_name': u'admin',
362
u'_context_project_name': u'admin',
363
u'timestamp': u'2013-01-04 15:20:32.009532',
364
u'_context_is_admin': True,
365
u'message_id': u'c48deeba-d0c3-4154-b3db-47480b52267a',
366
u'_context_auth_token': None,
367
u'_context_instance_lock_checked': False,
368
u'_context_project_id': u'cea4b25edb484e5392727181b7721d29',
369
u'_context_timestamp': u'2013-01-04T15:19:51.018218',
370
u'_context_read_deleted': u'no',
371
u'_context_user_id': u'01b83a5e23f24a6fb6cd073c0aee6eed',
372
u'_context_remote_address': u'10.147.132.184',
373
u'publisher_id': u'compute.ip-10-147-132-184.ec2.internal',
375
'instance_id': 'fake-uuid1-1',
381
'instance_properties': {
389
'system_metadata': {'system': 'metadata'}},
390
'instance_type': {'memory_mb': 512,
394
'instance_uuids': ['fake-uuid1-1'],
401
class TestNotifications(test.BaseTestCase):
403
def test_process_notification(self):
404
info = list(instance.Instance().process_notification(
407
for name, actual, expected in [
408
('counter_name', info.name, 'instance'),
409
('counter_type', info.type, sample.TYPE_GAUGE),
410
('counter_volume', info.volume, 1),
411
('timestamp', info.timestamp,
412
INSTANCE_CREATE_END['timestamp']),
413
('resource_id', info.resource_id,
414
INSTANCE_CREATE_END['payload']['instance_id']),
416
info.resource_metadata['instance_type_id'],
417
INSTANCE_CREATE_END['payload']['instance_type_id']),
418
('host', info.resource_metadata['host'],
419
INSTANCE_CREATE_END['publisher_id']),
421
self.assertEqual(actual, expected, name)
424
def _find_counter(counters, name):
425
return filter(lambda counter: counter.name == name, counters)[0]
427
def test_instance_create_instance(self):
428
ic = instance.Instance()
429
counters = list(ic.process_notification(INSTANCE_CREATE_END))
430
self.assertEqual(len(counters), 1)
432
self.assertEqual(c.volume, 1)
434
def test_instance_create_flavor(self):
435
ic = instance.InstanceFlavor()
436
counters = list(ic.process_notification(INSTANCE_CREATE_END))
437
self.assertEqual(len(counters), 1)
439
self.assertEqual(c.volume, 1)
441
def test_instance_create_memory(self):
442
ic = instance.Memory()
443
counters = list(ic.process_notification(INSTANCE_CREATE_END))
444
self.assertEqual(len(counters), 1)
446
self.assertEqual(c.volume, INSTANCE_CREATE_END['payload']['memory_mb'])
448
def test_instance_create_vcpus(self):
449
ic = instance.VCpus()
450
counters = list(ic.process_notification(INSTANCE_CREATE_END))
451
self.assertEqual(len(counters), 1)
453
self.assertEqual(c.volume, INSTANCE_CREATE_END['payload']['vcpus'])
455
def test_instance_create_root_disk_size(self):
456
ic = instance.RootDiskSize()
457
counters = list(ic.process_notification(INSTANCE_CREATE_END))
458
self.assertEqual(len(counters), 1)
460
self.assertEqual(c.volume, INSTANCE_CREATE_END['payload']['root_gb'])
462
def test_instance_create_ephemeral_disk_size(self):
463
ic = instance.EphemeralDiskSize()
464
counters = list(ic.process_notification(INSTANCE_CREATE_END))
465
self.assertEqual(len(counters), 1)
467
self.assertEqual(c.volume,
468
INSTANCE_CREATE_END['payload']['ephemeral_gb'])
470
def test_instance_exists_instance(self):
471
ic = instance.Instance()
472
counters = list(ic.process_notification(INSTANCE_EXISTS))
473
self.assertEqual(len(counters), 1)
475
def test_instance_exists_flavor(self):
476
ic = instance.Instance()
477
counters = list(ic.process_notification(INSTANCE_EXISTS))
478
self.assertEqual(len(counters), 1)
480
def test_instance_delete_instance(self):
481
ic = instance.Instance()
482
counters = list(ic.process_notification(INSTANCE_DELETE_START))
483
self.assertEqual(len(counters), 1)
485
def test_instance_delete_flavor(self):
486
ic = instance.Instance()
487
counters = list(ic.process_notification(INSTANCE_DELETE_START))
488
self.assertEqual(len(counters), 1)
490
def test_instance_finish_resize_instance(self):
491
ic = instance.Instance()
492
counters = list(ic.process_notification(INSTANCE_FINISH_RESIZE_END))
493
self.assertEqual(len(counters), 1)
495
self.assertEqual(c.volume, 1)
497
def test_instance_finish_resize_flavor(self):
498
ic = instance.InstanceFlavor()
499
counters = list(ic.process_notification(INSTANCE_FINISH_RESIZE_END))
500
self.assertEqual(len(counters), 1)
502
self.assertEqual(c.volume, 1)
503
self.assertEqual(c.name, 'instance:m1.small')
505
def test_instance_finish_resize_memory(self):
506
ic = instance.Memory()
507
counters = list(ic.process_notification(INSTANCE_FINISH_RESIZE_END))
508
self.assertEqual(len(counters), 1)
510
self.assertEqual(c.volume,
511
INSTANCE_FINISH_RESIZE_END['payload']['memory_mb'])
513
def test_instance_finish_resize_vcpus(self):
514
ic = instance.VCpus()
515
counters = list(ic.process_notification(INSTANCE_FINISH_RESIZE_END))
516
self.assertEqual(len(counters), 1)
518
self.assertEqual(c.volume,
519
INSTANCE_FINISH_RESIZE_END['payload']['vcpus'])
521
def test_instance_resize_finish_instance(self):
522
ic = instance.Instance()
523
counters = list(ic.process_notification(INSTANCE_FINISH_RESIZE_END))
524
self.assertEqual(len(counters), 1)
526
self.assertEqual(c.volume, 1)
528
def test_instance_resize_finish_flavor(self):
529
ic = instance.InstanceFlavor()
530
counters = list(ic.process_notification(INSTANCE_RESIZE_REVERT_END))
531
self.assertEqual(len(counters), 1)
533
self.assertEqual(c.volume, 1)
534
self.assertEqual(c.name, 'instance:m1.tiny')
536
def test_instance_resize_finish_memory(self):
537
ic = instance.Memory()
538
counters = list(ic.process_notification(INSTANCE_RESIZE_REVERT_END))
539
self.assertEqual(len(counters), 1)
541
self.assertEqual(c.volume,
542
INSTANCE_RESIZE_REVERT_END['payload']['memory_mb'])
544
def test_instance_resize_finish_vcpus(self):
545
ic = instance.VCpus()
546
counters = list(ic.process_notification(INSTANCE_RESIZE_REVERT_END))
547
self.assertEqual(len(counters), 1)
549
self.assertEqual(c.volume,
550
INSTANCE_RESIZE_REVERT_END['payload']['vcpus'])
552
def test_instance_delete_samples(self):
553
ic = instance.InstanceDelete()
554
counters = list(ic.process_notification(INSTANCE_DELETE_SAMPLES))
555
self.assertEqual(len(counters), 2)
556
names = [c.name for c in counters]
557
self.assertEqual(names, ['sample-name1', 'sample-name2'])
559
def test_instance_scheduled(self):
560
ic = instance.InstanceScheduled()
562
self.assertIn(INSTANCE_SCHEDULED['event_type'],
565
counters = list(ic.process_notification(INSTANCE_SCHEDULED))
566
self.assertEqual(len(counters), 1)
567
names = [c.name for c in counters]
568
self.assertEqual(names, ['instance.scheduled'])
569
rid = [c.resource_id for c in counters]
570
self.assertEqual(rid, ['fake-uuid1-1'])