Add os-brick based LibvirtVolumeDriver for ScaleIO

This patch adds a shim LibvirtScaleIOVolumeDriver calling the os-brick
library.

Both ScaleIO Cinder driver and ScaleIO connector driver in os-brick
were merged. The connector driver is available in os-brick 0.3.0
and later.

implements blueprint emc-sdc-libvirt-volume-driver

Change-Id: If2bba1f9d4c2ddfad7a26ca74bb61fe9ed6684ba
This commit is contained in:
Xing Yang 2015-06-22 18:42:40 -04:00
parent 30e7dca710
commit 96bb7f9a20
4 changed files with 128 additions and 0 deletions

View File

@ -208,6 +208,8 @@ multipathd: CommandFilter, multipathd, root
systool: CommandFilter, systool, root
sginfo: CommandFilter, sginfo, root
vgc-cluster: CommandFilter, vgc-cluster, root
# os_brick/initiator/connector.py
drv_cfg: CommandFilter, /opt/emc/scaleio/sdc/bin/drv_cfg, --query_guid, root
# nova/storage/linuxscsi.py: sg_scan device
sg_scan: CommandFilter, sg_scan, root

View File

@ -0,0 +1,62 @@
# Copyright (c) 2015 EMC Corporation
# 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 scaleio
class LibvirtScaleIOVolumeDriverTestCase(
test_volume.LibvirtVolumeBaseTestCase):
def test_libvirt_scaleio_driver(self):
libvirt_driver = scaleio.LibvirtScaleIOVolumeDriver(
self.fake_conn)
self.assertIsInstance(libvirt_driver.connector,
connector.ScaleIOConnector)
def test_libvirt_scaleio_driver_connect(self):
def brick_conn_vol(data):
return {'path': '/dev/vol01'}
sio = scaleio.LibvirtScaleIOVolumeDriver(self.fake_conn)
sio.connector.connect_volume = brick_conn_vol
disk_info = {'path': '/dev/vol01', 'name': 'vol01'}
conn = {'data': disk_info}
sio.connect_volume(conn, None)
self.assertEqual('/dev/vol01',
conn['data']['device_path'])
def test_libvirt_scaleio_driver_get_config(self):
sio = scaleio.LibvirtScaleIOVolumeDriver(self.fake_conn)
disk_info = {'path': '/dev/vol01', 'name': 'vol01', 'type': 'raw',
'dev': 'vda1', 'bus': 'pci0', 'device_path': '/dev/vol01'}
conn = {'data': disk_info}
conf = sio.get_config(conn, disk_info)
self.assertEqual('block', conf.source_type)
self.assertEqual('/dev/vol01', conf.source_path)
def test_libvirt_scaleio_driver_disconnect(self):
sio = scaleio.LibvirtScaleIOVolumeDriver(self.fake_conn)
sio.connector.disconnect_volume = mock.MagicMock()
disk_info = {'path': '/dev/vol01', 'name': 'vol01', 'type': 'raw',
'dev': 'vda1', 'bus': 'pci0', 'device_path': '/dev/vol01'}
conn = {'data': disk_info}
sio.disconnect_volume(conn, disk_info)
sio.connector.disconnect_volume.assert_called_once_with(
disk_info, None)

View File

@ -292,6 +292,7 @@ libvirt_volume_drivers = [
'gpfs=nova.virt.libvirt.volume.gpfs.LibvirtGPFSVolumeDriver',
'quobyte=nova.virt.libvirt.volume.quobyte.LibvirtQuobyteVolumeDriver',
'hgst=nova.virt.libvirt.volume.hgst.LibvirtHGSTVolumeDriver',
'scaleio=nova.virt.libvirt.volume.scaleio.LibvirtScaleIOVolumeDriver',
]

View File

@ -0,0 +1,63 @@
# Copyright (c) 2015 EMC Corporation
# 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.
"""Libvirt volume driver for ScaleIO."""
from os_brick.initiator import connector
from oslo_config import cfg
from oslo_log import log as logging
from nova import utils
from nova.virt.libvirt.volume import volume as libvirt_volume
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
CONF.import_opt('num_iscsi_scan_tries', 'nova.virt.libvirt.volume.iscsi',
group='libvirt')
class LibvirtScaleIOVolumeDriver(libvirt_volume.LibvirtBaseVolumeDriver):
"""Class ScaleIO Libvirt volume Driver
Implements Libvirt part of volume driver for ScaleIO cinder driver.
Uses the ScaleIO connector from the os-brick projects
"""
def __init__(self, connection):
super(LibvirtScaleIOVolumeDriver, self).__init__(connection,
is_block_dev=False)
self.connector = connector.InitiatorConnector.factory(
'SCALEIO', utils._get_root_helper(),
device_scan_attempts=CONF.libvirt.num_iscsi_scan_tries)
def get_config(self, connection_info, disk_info):
conf = super(LibvirtScaleIOVolumeDriver, 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, disk_info):
device_info = self.connector.connect_volume(connection_info['data'])
LOG.debug("Attached ScaleIO volume %s.", device_info)
connection_info['data']['device_path'] = device_info['path']
def disconnect_volume(self, connection_info, disk_dev):
self.connector.disconnect_volume(connection_info['data'], None)
LOG.debug("Disconnected volume %s.", disk_dev)
super(LibvirtScaleIOVolumeDriver, self).disconnect_volume(
connection_info, disk_dev)