Update xiv_ds8k driver name and description

The xiv_ds8k driver now supports IBM XIV, Spectrum Accelerate,
FlashSystem A9000, FlashSystem A9000R and DS8000 storage systems.
Therefore it should be renamed to IBM Storage driver.

The actual change includes:
- text changes in comments and documentation
- changes in fields in cinder.conf
- change in variable names
- change in file names

Implements: blueprint rename-xiv-ds8k-driver
Change-Id: Ia53a60e865ddac21029ca8518b6a506cb1682c51
DocImpact
This commit is contained in:
Alon Marx 2016-08-01 15:50:03 +03:00
parent 42f416462d
commit 66bcfb29b4
6 changed files with 138 additions and 115 deletions

View File

@ -124,14 +124,14 @@ from cinder.volume.drivers.ibm import flashsystem_fc as \
from cinder.volume.drivers.ibm import flashsystem_iscsi as \
cinder_volume_drivers_ibm_flashsystemiscsi
from cinder.volume.drivers.ibm import gpfs as cinder_volume_drivers_ibm_gpfs
from cinder.volume.drivers.ibm import ibm_storage as \
cinder_volume_drivers_ibm_ibmstorage
from cinder.volume.drivers.ibm.storwize_svc import storwize_svc_common as \
cinder_volume_drivers_ibm_storwize_svc_storwizesvccommon
from cinder.volume.drivers.ibm.storwize_svc import storwize_svc_fc as \
cinder_volume_drivers_ibm_storwize_svc_storwizesvcfc
from cinder.volume.drivers.ibm.storwize_svc import storwize_svc_iscsi as \
cinder_volume_drivers_ibm_storwize_svc_storwizesvciscsi
from cinder.volume.drivers.ibm import xiv_ds8k as \
cinder_volume_drivers_ibm_xivds8k
from cinder.volume.drivers.infortrend.eonstor_ds_cli import common_cli as \
cinder_volume_drivers_infortrend_eonstor_ds_cli_commoncli
from cinder.volume.drivers.kaminario import kaminario_common as \
@ -268,7 +268,7 @@ def list_opts():
cinder_volume_drivers_pure.PURE_OPTS,
cinder_context.context_opts,
cinder_scheduler_driver.scheduler_driver_opts,
cinder_volume_drivers_scality.volume_opts,
cinder_volume_drivers_ibm_ibmstorage.driver_opts,
cinder_volume_drivers_vmware_vmdk.vmdk_opts,
cinder_volume_drivers_lenovo_lenovocommon.common_opts,
cinder_volume_drivers_lenovo_lenovocommon.iscsi_opts,
@ -281,6 +281,7 @@ def list_opts():
cinder_scheduler_weights_volumenumber.
volume_number_weight_opts,
cinder_volume_drivers_coho.coho_opts,
cinder_volume_drivers_scality.volume_opts,
cinder_volume_drivers_xio.XIO_OPTS,
cinder_volume_drivers_ibm_storwize_svc_storwizesvcfc.
storwize_svc_fc_opts,
@ -353,7 +354,6 @@ def list_opts():
[cinder_volume_api.volume_host_opt],
[cinder_volume_api.volume_same_az_opt],
[cinder_volume_api.az_cache_time_opt],
cinder_volume_drivers_ibm_xivds8k.xiv_ds8k_opts,
cinder_volume_drivers_hpe_hpe3parcommon.hpe3par_opts,
cinder_volume_drivers_datera.d_opts,
cinder_volume_drivers_zadara.zadara_opts,

View File

@ -23,8 +23,6 @@ CONF = cfg.CONF
CONF.import_opt('policy_file', 'cinder.policy', group='oslo_policy')
CONF.import_opt('volume_driver', 'cinder.volume.manager')
CONF.import_opt('xiv_ds8k_proxy',
'cinder.volume.drivers.ibm.xiv_ds8k')
CONF.import_opt('backup_driver', 'cinder.backup.manager')
CONF.import_opt('fixed_key', 'cinder.keymgr.conf_key_mgr', group='keymgr')
CONF.import_opt('scheduler_driver', 'cinder.scheduler.manager')
@ -42,9 +40,6 @@ def set_defaults(conf):
conf.set_default('sqlite_synchronous', False, group='database')
conf.set_default('policy_file', 'cinder.tests.unit/policy.json',
group='oslo_policy')
conf.set_default(
'xiv_ds8k_proxy',
'cinder.tests.unit.test_ibm_xiv_ds8k.XIVDS8KFakeProxyDriver')
conf.set_default('backup_driver', 'cinder.tests.unit.backup.fake_service')
conf.set_default('fixed_key', default='0' * 64, group='keymgr')
conf.set_default('scheduler_driver',

View File

@ -29,7 +29,7 @@ from cinder.i18n import _
from cinder.objects import fields
from cinder import test
from cinder.volume import configuration as conf
from cinder.volume.drivers.ibm import xiv_ds8k
from cinder.volume.drivers.ibm import ibm_storage
from cinder.volume import volume_types
FAKE = "fake"
@ -81,30 +81,37 @@ CG_SNAPSHOT = {'id': CG_SNAPSHOT_ID,
CONNECTOR = {'initiator': "iqn.2012-07.org.fake:01:948f189c4695", }
FAKE_PROXY = 'cinder.tests.unit.volume.drivers.ibm.test_ibm_storage' \
'.IBMStorageFakeProxyDriver'
class XIVDS8KFakeProxyDriver(object):
"""Fake IBM XIV and DS8K Proxy Driver."""
def __init__(self, xiv_ds8k_info, logger, expt,
class IBMStorageFakeProxyDriver(object):
"""Fake IBM Storage driver
Fake IBM Storage driver for IBM XIV, Spectrum Accelerate,
FlashSystem A9000, FlashSystem A9000R and DS8000 storage systems.
"""
def __init__(self, ibm_storage_info, logger, expt,
driver=None, active_backend_id=None):
"""Initialize Proxy."""
self.xiv_ds8k_info = xiv_ds8k_info
self.ibm_storage_info = ibm_storage_info
self.logger = logger
self.exception = expt
self.xiv_ds8k_portal = \
self.xiv_ds8k_iqn = FAKE
self.storage_portal = \
self.storage_iqn = FAKE
self.volumes = {}
self.snapshots = {}
self.driver = driver
def setup(self, context):
if self.xiv_ds8k_info['xiv_ds8k_user'] != self.driver\
if self.ibm_storage_info['user'] != self.driver\
.configuration.san_login:
raise self.exception.NotAuthorized()
if self.xiv_ds8k_info['xiv_ds8k_address'] != self.driver\
if self.ibm_storage_info['address'] != self.driver\
.configuration.san_ip:
raise self.exception.HostNotFound(host='fake')
@ -143,14 +150,14 @@ class XIVDS8KFakeProxyDriver(object):
return {'driver_volume_type': 'iscsi',
'data': {'target_discovered': True,
'target_portal': self.xiv_ds8k_portal,
'target_iqn': self.xiv_ds8k_iqn,
'target_portal': self.storage_portal,
'target_iqn': self.storage_iqn,
'target_lun': lun_id,
'volume_id': volume['id'],
'multipath': True,
'provider_location': "%s,1 %s %s" % (
self.xiv_ds8k_portal,
self.xiv_ds8k_iqn,
self.storage_portal,
self.storage_iqn,
lun_id), },
}
@ -284,20 +291,22 @@ class XIVDS8KFakeProxyDriver(object):
return target_id, volume_update_list
class XIVDS8KVolumeDriverTest(test.TestCase):
"""Test IBM XIV and DS8K volume driver."""
class IBMStorageVolumeDriverTest(test.TestCase):
"""Test IBM Storage driver
Test IBM Storage driver for IBM XIV, Spectrum Accelerate,
FlashSystem A9000, FlashSystem A9000R and DS8000 storage Systems.
"""
def setUp(self):
"""Initialize IBM XIV and DS8K Driver."""
super(XIVDS8KVolumeDriverTest, self).setUp()
"""Initialize IBM Storage Driver."""
super(IBMStorageVolumeDriverTest, self).setUp()
configuration = mock.Mock(conf.Configuration)
configuration.san_is_local = False
configuration.xiv_ds8k_proxy = (
'cinder.tests.unit.volume.drivers.ibm.' +
'test_ibm_xiv_ds8k.XIVDS8KFakeProxyDriver')
configuration.xiv_ds8k_connection_type = 'iscsi'
configuration.xiv_chap = 'disabled'
configuration.proxy = FAKE_PROXY
configuration.connection_type = 'iscsi'
configuration.chap = 'disabled'
configuration.san_ip = FAKE
configuration.management_ips = FAKE
configuration.san_login = FAKE
@ -305,35 +314,35 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
configuration.san_password = FAKE
configuration.append_config_values(mock.ANY)
self.driver = xiv_ds8k.XIVDS8KDriver(
self.driver = ibm_storage.IBMStorageDriver(
configuration=configuration)
def test_initialized_should_set_xiv_ds8k_info(self):
def test_initialized_should_set_ibm_storage_info(self):
"""Test that the san flags are passed to the IBM proxy."""
self.assertEqual(
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_user'],
self.driver.proxy.ibm_storage_info['user'],
self.driver.configuration.san_login)
self.assertEqual(
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_pass'],
self.driver.proxy.ibm_storage_info['password'],
self.driver.configuration.san_password)
self.assertEqual(
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_address'],
self.driver.proxy.ibm_storage_info['address'],
self.driver.configuration.san_ip)
self.assertEqual(
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_vol_pool'],
self.driver.proxy.ibm_storage_info['vol_pool'],
self.driver.configuration.san_clustername)
def test_setup_should_fail_if_credentials_are_invalid(self):
"""Test that the xiv_ds8k_proxy validates credentials."""
"""Test that the proxy validates credentials."""
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_user'] = 'invalid'
self.driver.proxy.ibm_storage_info['user'] = 'invalid'
self.assertRaises(exception.NotAuthorized, self.driver.do_setup, None)
def test_setup_should_fail_if_connection_is_invalid(self):
"""Test that the xiv_ds8k_proxy validates connection."""
"""Test that the proxy validates connection."""
self.driver.xiv_ds8k_proxy.xiv_ds8k_info['xiv_ds8k_address'] = \
self.driver.proxy.ibm_storage_info['address'] = \
'invalid'
self.assertRaises(exception.HostNotFound, self.driver.do_setup, None)
@ -342,7 +351,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.do_setup(None)
self.driver.create_volume(VOLUME)
has_volume = self.driver.xiv_ds8k_proxy.volume_exists(VOLUME)
has_volume = self.driver.proxy.volume_exists(VOLUME)
self.assertTrue(has_volume)
self.driver.delete_volume(VOLUME)
@ -352,7 +361,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.do_setup(None)
self.assertFalse(
self.driver.xiv_ds8k_proxy.volume_exists({'name': FAKE})
self.driver.proxy.volume_exists({'name': FAKE})
)
def test_delete_volume(self):
@ -361,7 +370,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.do_setup(None)
self.driver.create_volume(VOLUME)
self.driver.delete_volume(VOLUME)
has_volume = self.driver.xiv_ds8k_proxy.volume_exists(VOLUME)
has_volume = self.driver.proxy.volume_exists(VOLUME)
self.assertFalse(has_volume)
def test_delete_volume_should_fail_for_not_existing_volume(self):
@ -371,7 +380,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.delete_volume(VOLUME)
def test_create_volume_should_fail_if_no_pool_space_left(self):
"""Verify that the xiv_ds8k_proxy validates volume pool space."""
"""Verify that the proxy validates volume pool space."""
self.driver.do_setup(None)
self.assertRaises(exception.VolumeBackendAPIException,
@ -388,7 +397,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.initialize_connection(VOLUME, CONNECTOR)
self.assertTrue(
self.driver.xiv_ds8k_proxy.is_volume_attached(VOLUME, CONNECTOR))
self.driver.proxy.is_volume_attached(VOLUME, CONNECTOR))
self.driver.terminate_connection(VOLUME, CONNECTOR)
self.driver.delete_volume(VOLUME)
@ -410,7 +419,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
self.driver.initialize_connection(VOLUME, CONNECTOR)
self.driver.terminate_connection(VOLUME, CONNECTOR)
self.assertFalse(self.driver.xiv_ds8k_proxy.is_volume_attached(
self.assertFalse(self.driver.proxy.is_volume_attached(
VOLUME,
CONNECTOR))
@ -519,7 +528,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
host = {
'host': 'foo',
'capabilities': {
'location_info': 'xiv_ds8k_fake_1',
'location_info': 'ibm_storage_fake_1',
'extent_size': '1024'
}
}
@ -557,7 +566,7 @@ class XIVDS8KVolumeDriverTest(test.TestCase):
host = {
'host': 'foo',
'capabilities': {
'location_info': 'xiv_ds8k_fake_1',
'location_info': 'ibm_storage_fake_1',
'extent_size': '1024'
}
}

View File

@ -19,7 +19,8 @@
# Avishay Traeger <avishay@il.ibm.com>
"""
Unified Volume driver for IBM XIV and DS8K Storage Systems.
IBM Storage driver is a unified Volume driver for IBM XIV, Spectrum Accelerate,
FlashSystem A9000, FlashSystem A9000R and DS8000 storage systems.
"""
from oslo_config import cfg
@ -27,22 +28,21 @@ from oslo_log import log as logging
from oslo_utils import importutils
from cinder import exception
from cinder import interface
from cinder.volume import driver
from cinder.volume.drivers.san import san
xiv_ds8k_opts = [
driver_opts = [
cfg.StrOpt(
'xiv_ds8k_proxy',
default='xiv_ds8k_openstack.nova_proxy.XIVDS8KNovaProxy',
'proxy',
default='storage.proxy.IBMStorageProxy',
help='Proxy driver that connects to the IBM Storage Array'),
cfg.StrOpt(
'xiv_ds8k_connection_type',
'connection_type',
default='iscsi',
choices=['fibre_channel', 'iscsi'],
help='Connection type to the IBM Storage Array'),
cfg.StrOpt(
'xiv_chap',
'chap',
default='disabled',
choices=['disabled', 'enabled'],
help='CHAP authentication mode, effective only for iscsi'
@ -54,47 +54,48 @@ xiv_ds8k_opts = [
]
CONF = cfg.CONF
CONF.register_opts(xiv_ds8k_opts)
CONF.register_opts(driver_opts)
LOG = logging.getLogger(__name__)
@interface.volumedriver
class XIVDS8KDriver(san.SanDriver,
driver.ManageableVD,
driver.ExtendVD,
driver.SnapshotVD,
driver.MigrateVD,
driver.ConsistencyGroupVD,
driver.CloneableImageVD,
driver.TransferVD):
"""Unified IBM XIV and DS8K volume driver."""
class IBMStorageDriver(san.SanDriver,
driver.ManageableVD,
driver.ExtendVD,
driver.SnapshotVD,
driver.MigrateVD,
driver.ConsistencyGroupVD,
driver.CloneableImageVD,
driver.TransferVD):
"""IBM Storage driver
IBM Storage driver is a unified Volume driver for IBM XIV, Spectrum
Accelerate, FlashSystem A9000, FlashSystem A9000R and DS8000 storage
systems.
"""
def __init__(self, *args, **kwargs):
"""Initialize the driver."""
super(XIVDS8KDriver, self).__init__(*args, **kwargs)
super(IBMStorageDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(xiv_ds8k_opts)
self.configuration.append_config_values(driver_opts)
proxy = importutils.import_class(self.configuration.xiv_ds8k_proxy)
proxy = importutils.import_class(self.configuration.proxy)
active_backend_id = kwargs.get('active_backend_id', None)
# NOTE: All Array specific configurations are prefixed with:
# "xiv_ds8k_array_"
# These additional flags should be specified in the cinder.conf
# Driver additional flags should be specified in the cinder.conf
# preferably in each backend configuration.
self.xiv_ds8k_proxy = proxy(
self.proxy = proxy(
{
"xiv_ds8k_user": self.configuration.san_login,
"xiv_ds8k_pass": self.configuration.san_password,
"xiv_ds8k_address": self.configuration.san_ip,
"xiv_ds8k_vol_pool": self.configuration.san_clustername,
"xiv_ds8k_connection_type":
self.configuration.xiv_ds8k_connection_type,
"xiv_chap": self.configuration.xiv_chap,
"user": self.configuration.san_login,
"password": self.configuration.san_password,
"address": self.configuration.san_ip,
"vol_pool": self.configuration.san_clustername,
"connection_type": self.configuration.connection_type,
"chap": self.configuration.chap,
"management_ips": self.configuration.management_ips
},
LOG,
@ -103,81 +104,81 @@ class XIVDS8KDriver(san.SanDriver,
active_backend_id=active_backend_id)
def do_setup(self, context):
"""Setup and verify IBM XIV and DS8K Storage connection."""
"""Setup and verify connection to IBM Storage."""
self.xiv_ds8k_proxy.setup(context)
self.proxy.setup(context)
def ensure_export(self, context, volume):
"""Ensure an export."""
return self.xiv_ds8k_proxy.ensure_export(context, volume)
return self.proxy.ensure_export(context, volume)
def create_export(self, context, volume, connector):
"""Create an export."""
return self.xiv_ds8k_proxy.create_export(context, volume)
return self.proxy.create_export(context, volume)
def create_volume(self, volume):
"""Create a volume on the IBM XIV and DS8K Storage system."""
"""Create a volume on the IBM Storage system."""
return self.xiv_ds8k_proxy.create_volume(volume)
return self.proxy.create_volume(volume)
def delete_volume(self, volume):
"""Delete a volume on the IBM XIV and DS8K Storage system."""
"""Delete a volume on the IBM Storage system."""
self.xiv_ds8k_proxy.delete_volume(volume)
self.proxy.delete_volume(volume)
def remove_export(self, context, volume):
"""Disconnect a volume from an attached instance."""
return self.xiv_ds8k_proxy.remove_export(context, volume)
return self.proxy.remove_export(context, volume)
def initialize_connection(self, volume, connector):
"""Map the created volume."""
return self.xiv_ds8k_proxy.initialize_connection(volume, connector)
return self.proxy.initialize_connection(volume, connector)
def terminate_connection(self, volume, connector, **kwargs):
"""Terminate a connection to a volume."""
return self.xiv_ds8k_proxy.terminate_connection(volume, connector)
return self.proxy.terminate_connection(volume, connector)
def create_volume_from_snapshot(self, volume, snapshot):
"""Create a volume from a snapshot."""
return self.xiv_ds8k_proxy.create_volume_from_snapshot(
return self.proxy.create_volume_from_snapshot(
volume,
snapshot)
def create_snapshot(self, snapshot):
"""Create a snapshot."""
return self.xiv_ds8k_proxy.create_snapshot(snapshot)
return self.proxy.create_snapshot(snapshot)
def delete_snapshot(self, snapshot):
"""Delete a snapshot."""
return self.xiv_ds8k_proxy.delete_snapshot(snapshot)
return self.proxy.delete_snapshot(snapshot)
def get_volume_stats(self, refresh=False):
"""Get volume stats."""
return self.xiv_ds8k_proxy.get_volume_stats(refresh)
return self.proxy.get_volume_stats(refresh)
def create_cloned_volume(self, tgt_volume, src_volume):
"""Create Cloned Volume."""
return self.xiv_ds8k_proxy.create_cloned_volume(tgt_volume, src_volume)
return self.proxy.create_cloned_volume(tgt_volume, src_volume)
def extend_volume(self, volume, new_size):
"""Extend Created Volume."""
self.xiv_ds8k_proxy.extend_volume(volume, new_size)
self.proxy.extend_volume(volume, new_size)
def migrate_volume(self, context, volume, host):
"""Migrate the volume to the specified host."""
return self.xiv_ds8k_proxy.migrate_volume(context, volume, host)
return self.proxy.migrate_volume(context, volume, host)
def manage_existing(self, volume, existing_ref):
"""Brings an existing backend storage object under Cinder management.
@ -187,8 +188,9 @@ class XIVDS8KDriver(san.SanDriver,
be interpreted. It should be sufficient to identify a storage object
that the driver should somehow associate with the newly-created cinder
volume structure.
In the case of XIV, the existing_ref consists of a single field named
'existing_ref' representing the name of the volume on the storage.
In the case of XIV family and FlashSystem A9000 family, the
existing_ref consists of a single field named 'existing_ref'
representing the name of the volume on the storage.
There are two ways to do this:
@ -209,72 +211,72 @@ class XIVDS8KDriver(san.SanDriver,
object. If they are incompatible, raise a
ManageExistingVolumeTypeMismatch, specifying a reason for the failure.
"""
return self.xiv_ds8k_proxy.manage_volume(volume, existing_ref)
return self.proxy.manage_volume(volume, existing_ref)
def manage_existing_get_size(self, volume, existing_ref):
"""Return size of volume to be managed by manage_existing."""
return self.xiv_ds8k_proxy.manage_volume_get_size(volume, existing_ref)
return self.proxy.manage_volume_get_size(volume, existing_ref)
def unmanage(self, volume):
"""Removes the specified volume from Cinder management."""
return self.xiv_ds8k_proxy.unmanage_volume(volume)
return self.proxy.unmanage_volume(volume)
def freeze_backend(self, context):
"""Notify the backend that it's frozen. """
return self.xiv_ds8k_proxy.freeze_backend(context)
return self.proxy.freeze_backend(context)
def thaw_backend(self, context):
"""Notify the backend that it's unfrozen/thawed. """
return self.xiv_ds8k_proxy.thaw_backend(context)
return self.proxy.thaw_backend(context)
def failover_host(self, context, volumes, secondary_id=None):
"""Failover a backend to a secondary replication target. """
return self.xiv_ds8k_proxy.failover_host(
return self.proxy.failover_host(
context, volumes, secondary_id)
def get_replication_status(self, context, volume):
"""Return replication status."""
return self.xiv_ds8k_proxy.get_replication_status(context, volume)
return self.proxy.get_replication_status(context, volume)
def retype(self, ctxt, volume, new_type, diff, host):
"""Convert the volume to be of the new type."""
return self.xiv_ds8k_proxy.retype(ctxt, volume, new_type, diff, host)
return self.proxy.retype(ctxt, volume, new_type, diff, host)
def create_consistencygroup(self, context, group):
"""Creates a consistency group."""
return self.xiv_ds8k_proxy.create_consistencygroup(context, group)
return self.proxy.create_consistencygroup(context, group)
def delete_consistencygroup(self, context, group, volumes):
"""Deletes a consistency group."""
return self.xiv_ds8k_proxy.delete_consistencygroup(
return self.proxy.delete_consistencygroup(
context, group, volumes)
def create_cgsnapshot(self, context, cgsnapshot, snapshots):
"""Creates a consistency group snapshot."""
return self.xiv_ds8k_proxy.create_cgsnapshot(
return self.proxy.create_cgsnapshot(
context, cgsnapshot, snapshots)
def delete_cgsnapshot(self, context, cgsnapshot, snapshots):
"""Deletes a consistency group snapshot."""
return self.xiv_ds8k_proxy.delete_cgsnapshot(
return self.proxy.delete_cgsnapshot(
context, cgsnapshot, snapshots)
def update_consistencygroup(self, context, group,
add_volumes, remove_volumes):
"""Adds or removes volume(s) to/from an existing consistency group."""
return self.xiv_ds8k_proxy.update_consistencygroup(
return self.proxy.update_consistencygroup(
context, group, add_volumes, remove_volumes)
def create_consistencygroup_from_src(
@ -282,6 +284,6 @@ class XIVDS8KDriver(san.SanDriver,
source_cg=None, source_vols=None):
"""Creates a consistencygroup from source."""
return self.xiv_ds8k_proxy.create_consistencygroup_from_src(
return self.proxy.create_consistencygroup_from_src(
context, group, volumes, cgsnapshot, snapshots,
source_cg, source_vols)

View File

@ -151,6 +151,8 @@ MAPPING = {
'cinder.volume.drivers.hpe.hpe_lefthand_iscsi.HPELeftHandISCSIDriver',
'cinder.volume.drivers.san.hp.hp_xp_fc.HPXPFCDriver':
'cinder.volume.drivers.hpe.hpe_xp_fc.HPEXPFCDriver',
'cinder.volume.drivers.ibm.xiv_ds8k':
'cinder.volume.drivers.ibm.ibm_storage',
}

View File

@ -0,0 +1,15 @@
---
features:
- The xiv_ds8k driver now supports IBM XIV, Spectrum
Accelerate, FlashSystem A9000, FlashSystem A9000R
and DS8000 storage systems, and was renamed to IBM
Storage Driver for OpenStack. The changes include text
changes, file names, names of cinder.conf flags, and
names of the proxy classes.
upgrade:
- Users of the IBM Storage Driver, previously known as
the IBM XIV/DS8K driver, upgrading from Mitaka or
previous releases, need to reconfigure the relevant
cinder.conf entries. In most cases the change is just
removal of the xiv-ds8k field prefix, but for details
use the driver documentation.