From be22389c47596495ca8440815c393234a3e40aa4 Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Mon, 11 Dec 2017 11:12:20 +0100 Subject: [PATCH] cinder: link volume to image and instance This change tracks the image_id and the instance_id of volume. Change-Id: I5e15080fad6cabece132d4609ed473494a64495e --- ceilometer/data/meters.d/meters.yaml | 2 ++ ceilometer/gnocchi_client.py | 9 ++++++ .../pipeline/data/event_definitions.yaml | 4 +++ .../publisher/data/gnocchi_resources.yaml | 2 ++ ceilometer/tests/unit/volume/test_cinder.py | 32 +++++++++++++++++++ ceilometer/volume/cinder.py | 11 ++++++- 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/ceilometer/data/meters.d/meters.yaml b/ceilometer/data/meters.d/meters.yaml index 4d0d081b92..d368734c44 100644 --- a/ceilometer/data/meters.d/meters.yaml +++ b/ceilometer/data/meters.d/meters.yaml @@ -128,6 +128,8 @@ metric: metadata: display_name: $.payload.display_name volume_type: $.payload.volume_type + image_id: $.payload.glance_metadata[?key=image_id][0].value + instance_id: $.payload.volume_attachment[0].server_id - name: 'snapshot.size' event_type: diff --git a/ceilometer/gnocchi_client.py b/ceilometer/gnocchi_client.py index 953aebd6dd..e147fd8065 100644 --- a/ceilometer/gnocchi_client.py +++ b/ceilometer/gnocchi_client.py @@ -215,6 +215,15 @@ resources_update_operations = [ {"op": "add", "path": "/attributes/deleted_at", "value": {"type": "datetime", "required": False}}, ]}, + {"desc": "add instance_id/image_id to volume", + "type": "update_attribute_type", + "resource_type": "volume", + "data": [ + {"op": "add", "path": "/attributes/image_id", + "value": {"type": "uuid", "required": False}}, + {"op": "add", "path": "/attributes/instance_id", + "value": {"type": "uuid", "required": False}}, + ]}, ] # NOTE(sileht): We use LooseVersion because pbr can generate invalid diff --git a/ceilometer/pipeline/data/event_definitions.yaml b/ceilometer/pipeline/data/event_definitions.yaml index 1748360afc..eaac600f54 100644 --- a/ceilometer/pipeline/data/event_definitions.yaml +++ b/ceilometer/pipeline/data/event_definitions.yaml @@ -81,6 +81,10 @@ fields: payload.status created_at: fields: payload.created_at + image_id: + fields: payload.glance_metadata[?key=image_id][0].value + instance_id: + fields: payload.volume_attachment[0].server_id - event_type: ['volume.exists', 'volume.create.*', 'volume.delete.*', 'volume.resize.*', 'volume.attach.*', 'volume.detach.*', 'volume.update.*'] traits: <<: *cinder_traits diff --git a/ceilometer/publisher/data/gnocchi_resources.yaml b/ceilometer/publisher/data/gnocchi_resources.yaml index cb102af72b..d0eb0687dc 100644 --- a/ceilometer/publisher/data/gnocchi_resources.yaml +++ b/ceilometer/publisher/data/gnocchi_resources.yaml @@ -196,6 +196,8 @@ resources: attributes: display_name: resource_metadata.(display_name|name) volume_type: resource_metadata.volume_type + image_id: resource_metadata.image_id + instance_id: resource_metadata.instance_id event_delete: volume.delete.start event_attributes: id: resource_id diff --git a/ceilometer/tests/unit/volume/test_cinder.py b/ceilometer/tests/unit/volume/test_cinder.py index a7071a69d6..44e661195b 100644 --- a/ceilometer/tests/unit/volume/test_cinder.py +++ b/ceilometer/tests/unit/volume/test_cinder.py @@ -50,6 +50,18 @@ VOLUME_LIST = [ u'multiattach': False, u'source_volid': None, u'consistencygroup_id': None, + u"volume_image_metadata": { + u"checksum": u"17d9daa4fb8e20b0f6b7dec0d46fdddf", + u"container_format": u"bare", + u"disk_format": u"raw", + u"hw_disk_bus": u"scsi", + u"hw_scsi_model": u"virtio-scsi", + u"image_id": u"f0019ee3-523c-45ab-b0b6-3adc529673e7", + u"image_name": u"debian-jessie-scsi", + u"min_disk": u"0", + u"min_ram": u"0", + u"size": u"1572864000" + }, u'os-vol-mig-status-attr:name_id': None, u'name': None, u'bootable': u'false', @@ -71,6 +83,18 @@ SNAPSHOT_LIST = [ u'volume_id': u'6f27bc42-c834-49ea-ae75-8d1073b37806', u'metadata': {}, u'created_at': u'2016-10-19T07:56:55.000000', + u"volume_image_metadata": { + u"checksum": u"17d9daa4fb8e20b0f6b7dec0d46fdddf", + u"container_format": u"bare", + u"disk_format": u"raw", + u"hw_disk_bus": u"scsi", + u"hw_scsi_model": u"virtio-scsi", + u"image_id": u"f0019ee3-523c-45ab-b0b6-3adc529673e7", + u"image_name": u"debian-jessie-scsi", + u"min_disk": u"0", + u"min_ram": u"0", + u"size": u"1572864000" + }, u'name': None}) ] @@ -119,6 +143,11 @@ class TestVolumeSizePollster(base.BaseTestCase): volume_size_samples[0].project_id) self.assertEqual('d94c18fb-b680-4912-9741-da69ee83c94f', volume_size_samples[0].resource_id) + self.assertEqual('f0019ee3-523c-45ab-b0b6-3adc529673e7', + volume_size_samples[0].resource_metadata["image_id"]) + self.assertEqual('1ae69721-d071-4156-a2bd-b11bb43ec2e3', + volume_size_samples[0].resource_metadata + ["instance_id"]) class TestVolumeSnapshotSizePollster(base.BaseTestCase): @@ -142,6 +171,9 @@ class TestVolumeSnapshotSizePollster(base.BaseTestCase): volume_snapshot_size_samples[0].project_id) self.assertEqual('b1ea6783-f952-491e-a4ed-23a6a562e1cf', volume_snapshot_size_samples[0].resource_id) + self.assertEqual('f0019ee3-523c-45ab-b0b6-3adc529673e7', + volume_snapshot_size_samples[0].resource_metadata + ["image_id"]) class TestVolumeBackupSizePollster(base.BaseTestCase): diff --git a/ceilometer/volume/cinder.py b/ceilometer/volume/cinder.py index f95db0e251..9fdec0bdb8 100644 --- a/ceilometer/volume/cinder.py +++ b/ceilometer/volume/cinder.py @@ -21,7 +21,16 @@ from ceilometer import sample class _Base(plugin_base.PollsterBase): def extract_metadata(self, obj): - return dict((k, getattr(obj, k)) for k in self.FIELDS) + metadata = dict((k, getattr(obj, k)) for k in self.FIELDS) + if getattr(obj, "volume_image_metadata", None): + metadata["image_id"] = obj.volume_image_metadata.get("image_id") + else: + metadata["image_id"] = None + if getattr(obj, "attachments", None): + metadata["instance_id"] = obj.attachments[0]["server_id"] + else: + metadata["instance_id"] = None + return metadata class VolumeSizePollster(_Base):