summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEarle F. Philhower, III <earle.philhower.iii@hgst.com>2015-07-29 13:58:00 -0700
committerEarle F. Philhower, III <earle.philhower.iii@hgst.com>2015-08-06 08:40:06 +0000
commit6bf4ddede145668961a506ae230b58445baf7b4e (patch)
tree642dff47246f6d4f0856979559f26b8b031b42ea
parent70165ed7dc0b1e1fa49f55861093938375942992 (diff)
downloadnova-6bf4ddede145668961a506ae230b58445baf7b4e.tar.gz
Add os_brick-based VolumeDriver for HGST connector
Even with OS-Brick being used to support different volume types in Nova, there still needs to be a small shim layer to actually connect to the different volume types. This patch includes three very minor patches to enable this: 1) Because os-brick is a library and not an application, the rootwrap for Nova needs to include the required CLI commands to attach/detach volumes as it can't live in os-brick's repository. 2) libvirt_volume_types needs to include the new HGST=>LibvirtHGSTVolumeDriver mapping, because os-brick doesn't support discovery of supported types. 3) A small shim LibvirtHGSTVolumeDriver calling the os-brick library needs to be added, again because there is no generic way presently for os-brick to map to specific volume types in libvirtvolumetype. Change-Id: Ie5b5e7dc6e3a1265dd139fbde240349fc10f86bf Depends-On: I64901b1456a3989c3ee700f1da6d47f47f2734bb Implements: blueprint add-os-brick-volume-driver-hgst-solutions
-rw-r--r--etc/nova/rootwrap.d/compute.filters1
-rw-r--r--nova/tests/unit/virt/libvirt/volume/test_hgst.py63
-rw-r--r--nova/virt/libvirt/driver.py1
-rw-r--r--nova/virt/libvirt/volume/hgst.py53
4 files changed, 118 insertions, 0 deletions
diff --git a/etc/nova/rootwrap.d/compute.filters b/etc/nova/rootwrap.d/compute.filters
index 64b86a7401..a1d3a1d1bb 100644
--- a/etc/nova/rootwrap.d/compute.filters
+++ b/etc/nova/rootwrap.d/compute.filters
@@ -207,6 +207,7 @@ multipath: CommandFilter, multipath, root
multipathd: CommandFilter, multipathd, root
systool: CommandFilter, systool, root
sginfo: CommandFilter, sginfo, root
+vgc-cluster: CommandFilter, vgc-cluster, root
# nova/storage/linuxscsi.py: sg_scan device
sg_scan: CommandFilter, sg_scan, root
diff --git a/nova/tests/unit/virt/libvirt/volume/test_hgst.py b/nova/tests/unit/virt/libvirt/volume/test_hgst.py
new file mode 100644
index 0000000000..38879b1d09
--- /dev/null
+++ b/nova/tests/unit/virt/libvirt/volume/test_hgst.py
@@ -0,0 +1,63 @@
+# Copyright 2015 HGST
+# All Rights Reserved.
+#
+# 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.
+
+import mock
+
+from os_brick.initiator import connector
+
+from nova.tests.unit.virt.libvirt.volume import test_volume
+from nova.virt.libvirt.volume import hgst
+
+
+# Actual testing of the os_brick HGST driver done in the os_brick testcases
+# Here we're concerned only with the small API shim that connects Nova
+# so these will be pretty simple cases.
+
+
+class LibvirtHGSTVolumeDriverTestCase(test_volume.LibvirtVolumeBaseTestCase):
+ def test_libvirt_hgst_driver_type(self):
+ drvr = hgst.LibvirtHGSTVolumeDriver(self.fake_conn)
+ self.assertIsInstance(drvr.connector, connector.HGSTConnector)
+
+ def test_libvirt_hgst_driver_connect(self):
+ def brick_conn_vol(data):
+ return {'path': '/dev/space01'}
+
+ drvr = hgst.LibvirtHGSTVolumeDriver(self.fake_conn)
+ drvr.connector.connect_volume = brick_conn_vol
+ di = {'path': '/dev/space01', 'name': 'space01'}
+ ci = {'data': di}
+ drvr.connect_volume(ci, None)
+ self.assertEqual('/dev/space01',
+ ci['data']['device_path'])
+
+ def test_libvirt_hgst_driver_get_config(self):
+ drvr = hgst.LibvirtHGSTVolumeDriver(self.fake_conn)
+ di = {'path': '/dev/space01', 'name': 'space01', 'type': 'raw',
+ 'dev': 'vda1', 'bus': 'pci0', 'device_path': '/dev/space01'}
+ ci = {'data': di}
+ conf = drvr.get_config(ci, di)
+ self.assertEqual('block', conf.source_type)
+ self.assertEqual('/dev/space01', conf.source_path)
+
+ def test_libvirt_hgst_driver_disconnect(self):
+ drvr = hgst.LibvirtHGSTVolumeDriver(self.fake_conn)
+ drvr.connector.disconnect_volume = mock.MagicMock()
+ di = {'path': '/dev/space01', 'name': 'space01', 'type': 'raw',
+ 'dev': 'vda1', 'bus': 'pci0', 'device_path': '/dev/space01'}
+ ci = {'data': di}
+ drvr.disconnect_volume(ci, di)
+ drvr.connector.disconnect_volume.assert_called_once_with(
+ di, None)
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index ba12be2aea..55635f4383 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -290,6 +290,7 @@ libvirt_volume_drivers = [
'scality=nova.virt.libvirt.volume.scality.LibvirtScalityVolumeDriver',
'gpfs=nova.virt.libvirt.volume.gpfs.LibvirtGPFSVolumeDriver',
'quobyte=nova.virt.libvirt.volume.quobyte.LibvirtQuobyteVolumeDriver',
+ 'hgst=nova.virt.libvirt.volume.hgst.LibvirtHGSTVolumeDriver',
]
diff --git a/nova/virt/libvirt/volume/hgst.py b/nova/virt/libvirt/volume/hgst.py
new file mode 100644
index 0000000000..088a52c130
--- /dev/null
+++ b/nova/virt/libvirt/volume/hgst.py
@@ -0,0 +1,53 @@
+# Copyright 2015 HGST
+# All Rights Reserved.
+#
+# 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.
+
+from os_brick.initiator import connector
+from oslo_config import cfg
+
+from nova import utils
+from nova.virt.libvirt.volume import volume as libvirt_volume
+
+
+CONF = cfg.CONF
+CONF.import_opt('num_iscsi_scan_tries', 'nova.virt.libvirt.volume.iscsi',
+ group='libvirt')
+
+
+class LibvirtHGSTVolumeDriver(libvirt_volume.LibvirtBaseVolumeDriver):
+ """Driver to attach HGST volumes to libvirt."""
+ def __init__(self, connection):
+ super(LibvirtHGSTVolumeDriver,
+ self).__init__(connection, is_block_dev=True)
+ self.connector = connector.InitiatorConnector.factory(
+ 'HGST', utils._get_root_helper(),
+ device_scan_attempts=CONF.libvirt.num_iscsi_scan_tries)
+
+ def get_config(self, connection_info, disk_info):
+ """Returns xml for libvirt."""
+ conf = super(LibvirtHGSTVolumeDriver,
+ self).get_config(connection_info, disk_info)
+
+ conf.source_type = "block"
+ conf.source_path = connection_info['data']['device_path']
+ return conf
+
+ def connect_volume(self, connection_info, mount_device):
+ device_info = self.connector.connect_volume(connection_info['data'])
+ connection_info['data']['device_path'] = device_info['path']
+
+ def disconnect_volume(self, connection_info, disk_dev):
+ self.connector.disconnect_volume(connection_info['data'], None)
+ super(LibvirtHGSTVolumeDriver,
+ self).disconnect_volume(connection_info, disk_dev)