diff --git a/ceilometer/compute/instance.py b/ceilometer/compute/instance.py new file mode 100644 index 000000000..ad8862dfd --- /dev/null +++ b/ceilometer/compute/instance.py @@ -0,0 +1,71 @@ +# -*- encoding: utf-8 -*- +# +# Copyright © 2012 New Dream Network, LLC (DreamHost) +# +# Author: Doug Hellmann +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Common code for working with instances +""" + +INSTANCE_PROPERTIES = [ + # Identity properties + 'display_name', + 'reservation_id', + # Type properties + 'architecture' + # Location properties + 'availability_zone', + # Image properties + 'image_ref', + 'image_ref_url', + 'kernel_id', + 'os_type', + 'ramdisk_id', + # Capacity properties + 'disk_gb', + 'ephemeral_gb', + 'memory_mb', + 'root_gb', + 'vcpus', + ] + + +def get_metadata_from_event(body): + """Return a metadata dictionary for the instance mentioned in the + notification event. + """ + instance = body['payload'] + metadata = { + 'event_type': body['event_type'], + 'instance_type': instance['instance_type_id'], + 'host': body['publisher_id'], + } + for name in INSTANCE_PROPERTIES: + metadata[name] = instance.get(name, u'') + return metadata + + +def get_metadata_from_dbobject(instance): + """Return a metadata dictionary for the instance. + """ + metadata = { + 'display_name': instance.display_name, + 'instance_type': (instance.instance_type.flavorid + if instance.instance_type + else None), + 'host': instance.host, + } + for name in INSTANCE_PROPERTIES: + metadata[name] = instance.get(name, u'') + return metadata diff --git a/ceilometer/compute/libvirt.py b/ceilometer/compute/libvirt.py index f29717bc7..25bdb9b22 100644 --- a/ceilometer/compute/libvirt.py +++ b/ceilometer/compute/libvirt.py @@ -26,7 +26,7 @@ import nova.virt.connection from ceilometer import log from ceilometer import counter from ceilometer import plugin - +from ceilometer.compute import instance as compute_instance FLAGS = flags.FLAGS @@ -44,11 +44,8 @@ def make_counter_from_instance(instance, name, type, volume): resource_id=instance.uuid, timestamp=datetime.datetime.utcnow().isoformat(), duration=None, - resource_metadata={ - 'display_name': instance.display_name, - 'instance_type': instance.instance_type.flavorid, - 'host': instance.host, - }, + resource_metadata=compute_instance.get_metadata_from_dbobject( + instance), ) diff --git a/ceilometer/compute/notifications.py b/ceilometer/compute/notifications.py index bf7e9a055..9819b9032 100644 --- a/ceilometer/compute/notifications.py +++ b/ceilometer/compute/notifications.py @@ -20,43 +20,7 @@ from ceilometer import counter from ceilometer import plugin - -INSTANCE_PROPERTIES = [ - # Identity properties - 'display_name', - 'reservation_id', - # Type properties - 'architecture' - # Location properties - 'availability_zone', - # Image properties - 'image_ref', - 'image_ref_url', - 'kernel_id', - 'os_type', - 'ramdisk_id', - # Capacity properties - 'disk_gb', - 'ephemeral_gb', - 'memory_mb', - 'root_gb', - 'vcpus', - ] - - -def get_instance_metadata_from_event(body): - """Return a metadata dictionary for the instance mentioned in the - notification event. - """ - instance = body['payload'] - metadata = { - 'event_type': body['event_type'], - 'instance_type': instance['instance_type_id'], - 'host': body['publisher_id'], - } - for name in INSTANCE_PROPERTIES: - metadata[name] = instance.get(name, u'') - return metadata +from ceilometer.compute import instance def c1(body): @@ -71,7 +35,7 @@ def c1(body): resource_id=body['payload']['instance_id'], timestamp=body['timestamp'], duration=0, - resource_metadata=get_instance_metadata_from_event(body), + resource_metadata=instance.get_metadata_from_event(body), ) diff --git a/tests/compute/test_instance.py b/tests/compute/test_instance.py new file mode 100644 index 000000000..a9a11f2ca --- /dev/null +++ b/tests/compute/test_instance.py @@ -0,0 +1,41 @@ +# -*- encoding: utf-8 -*- +# +# Copyright © 2012 New Dream Network, LLC (DreamHost) +# +# Author: Doug Hellmann +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Tests for ceilometer.compute.instance +""" + +from nova import context +from nova import flags +from nova import test +from nova import db + +from ceilometer.compute import instance +from ceilometer.agent import manager + + +class TestLocationMetadata(test.TestCase): + + def setUp(self): + self.context = context.RequestContext('admin', 'admin', is_admin=True) + self.manager = manager.AgentManager() + super(TestLocationMetadata, self).setUp() + self.instance = db.instance_create(self.context, {}) + + def test_metadata(self): + md = instance.get_metadata_from_dbobject(self.instance) + for name in instance.INSTANCE_PROPERTIES: + assert name in md