From 32d61739ecf66e1ae56ffc588b15e57ef1335027 Mon Sep 17 00:00:00 2001 From: Arnon Yaari Date: Mon, 22 May 2017 15:39:14 +0300 Subject: [PATCH] INFINIDAT: add metadata to InfiniBox objects Objects defined in InfiniBox systems can have metadata associated with them containing information about what they are used for. Change-Id: I710092cf7656ae724c17421813c617cc7362d3c4 --- .../unit/volume/drivers/test_infinidat.py | 20 +++++++++++ cinder/volume/drivers/infinidat.py | 36 +++++++++++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/cinder/tests/unit/volume/drivers/test_infinidat.py b/cinder/tests/unit/volume/drivers/test_infinidat.py index f8acaf7c85c..9b11164218f 100644 --- a/cinder/tests/unit/volume/drivers/test_infinidat.py +++ b/cinder/tests/unit/volume/drivers/test_infinidat.py @@ -141,6 +141,11 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase): self.driver.initialize_connection, test_volume, test_connector) + def test_initialize_connection_metadata(self): + self._system.hosts.safe_get.return_value = None + self.driver.initialize_connection(test_volume, test_connector) + self._mock_host.set_metadata_from_dict.assert_called_once() + def test_terminate_connection(self): self.driver.terminate_connection(test_volume, test_connector) @@ -194,6 +199,10 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase): self.assertRaises(exception.VolumeBackendAPIException, self.driver.create_volume, test_volume) + def test_create_volume_metadata(self): + self.driver.create_volume(test_volume) + self._mock_volume.set_metadata_from_dict.assert_called_once() + def test_delete_volume(self): self.driver.delete_volume(test_volume) @@ -218,6 +227,11 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase): def test_create_snapshot(self): self.driver.create_snapshot(test_snapshot) + def test_create_snapshot_metadata(self): + self._mock_volume.create_snapshot.return_value = self._mock_volume + self.driver.create_snapshot(test_snapshot) + self._mock_volume.set_metadata_from_dict.assert_called_once() + def test_create_snapshot_volume_doesnt_exist(self): self._system.volumes.safe_get.return_value = None self.assertRaises(exception.InvalidVolume, @@ -312,6 +326,12 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase): def test_create_group(self, *mocks): self.driver.create_group(None, test_group) + @mock.patch('cinder.volume.utils.is_group_a_cg_snapshot_type', + return_value=True) + def test_create_group_metadata(self, *mocks): + self.driver.create_group(None, test_group) + self._mock_group.set_metadata_from_dict.assert_called_once() + @mock.patch('cinder.volume.utils.is_group_a_cg_snapshot_type', return_value=True) def test_create_group_twice(self, *mocks): diff --git a/cinder/volume/drivers/infinidat.py b/cinder/volume/drivers/infinidat.py index 999e0c578d6..772be96bec4 100644 --- a/cinder/volume/drivers/infinidat.py +++ b/cinder/volume/drivers/infinidat.py @@ -18,6 +18,8 @@ INFINIDAT InfiniBox Volume Driver from contextlib import contextmanager import functools +import platform +import socket import mock from oslo_config import cfg @@ -30,6 +32,7 @@ from cinder.i18n import _ from cinder import interface from cinder.objects import fields from cinder import utils +from cinder import version from cinder.volume.drivers.san import san from cinder.volume import utils as vol_utils from cinder.zonemanager import utils as fczm_utils @@ -137,6 +140,20 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver): def _make_group_snapshot_name(self, cinder_group_snap): return 'openstack-group-snap-%s' % cinder_group_snap.id + def _set_cinder_object_metadata(self, infinidat_object, cinder_object): + data = dict(system="openstack", + openstack_version=version.version_info.release_string(), + cinder_id=cinder_object.id, + cinder_name=cinder_object.name) + infinidat_object.set_metadata_from_dict(data) + + def _set_host_metadata(self, infinidat_object): + data = dict(system="openstack", + openstack_version=version.version_info.release_string(), + hostname=socket.gethostname(), + platform=platform.platform()) + infinidat_object.set_metadata_from_dict(data) + def _get_infinidat_volume_by_name(self, name): volume = self._system.volumes.safe_get(name=name) if volume is None: @@ -185,6 +202,7 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver): if infinidat_host is None: infinidat_host = self._system.hosts.create(name=host_name) infinidat_host.add_port(port) + self._set_host_metadata(infinidat_host) return infinidat_host def _get_mapping(self, host, volume): @@ -361,10 +379,12 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver): volume_name = self._make_volume_name(volume) provtype = "THIN" if self.configuration.san_thin_provision else "THICK" size = volume.size * capacity.GiB - return self._system.volumes.create(name=volume_name, - pool=pool, - provtype=provtype, - size=size) + infinidat_volume = self._system.volumes.create(name=volume_name, + pool=pool, + provtype=provtype, + size=size) + self._set_cinder_object_metadata(infinidat_volume, volume) + return infinidat_volume @infinisdk_to_cinder_exceptions def create_volume(self, volume): @@ -396,7 +416,8 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver): """Creates a snapshot.""" volume = self._get_infinidat_volume(snapshot.volume) name = self._make_snapshot_name(snapshot) - volume.create_snapshot(name=name) + infinidat_snapshot = volume.create_snapshot(name=name) + self._set_cinder_object_metadata(infinidat_snapshot, snapshot) @contextmanager def _connection_context(self, volume): @@ -562,8 +583,9 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver): # let generic volume group support handle non-cgsnapshots if not vol_utils.is_group_a_cg_snapshot_type(group): raise NotImplementedError() - self._system.cons_groups.create(name=self._make_cg_name(group), - pool=self._get_infinidat_pool()) + obj = self._system.cons_groups.create(name=self._make_cg_name(group), + pool=self._get_infinidat_pool()) + self._set_cinder_object_metadata(obj, group) return {'status': fields.GroupStatus.AVAILABLE} @infinisdk_to_cinder_exceptions