diff options
author | Earle F. Philhower, III <earle.philhower.iii@hgst.com> | 2015-07-29 13:58:00 -0700 |
---|---|---|
committer | Earle F. Philhower, III <earle.philhower.iii@hgst.com> | 2015-08-06 08:40:06 +0000 |
commit | 6bf4ddede145668961a506ae230b58445baf7b4e (patch) | |
tree | 642dff47246f6d4f0856979559f26b8b031b42ea | |
parent | 70165ed7dc0b1e1fa49f55861093938375942992 (diff) | |
download | nova-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.filters | 1 | ||||
-rw-r--r-- | nova/tests/unit/virt/libvirt/volume/test_hgst.py | 63 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 1 | ||||
-rw-r--r-- | nova/virt/libvirt/volume/hgst.py | 53 |
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) |