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
This commit is contained in:
Earle F. Philhower, III 2015-07-29 13:58:00 -07:00
parent 70165ed7dc
commit 6bf4ddede1
4 changed files with 118 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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',
]

View File

@ -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)