Add get_driver_options method
This patch adds a new static method to drivers to expose their configuration options. This also adds the same call to backup drivers as well as the zone manager drivers. Updated the generate_driver_list to expose the options as well. This patch also orders the driver list alphabetically to make it easier and consistent to find drivers. The driver list is now broken down into supported and unsupported drivers as well. Change-Id: I3e7db26ef3df24a12e3bfa219fe25bfb315335ec
This commit is contained in:
parent
bf7e6dd12c
commit
fb3b843b66
@ -194,6 +194,10 @@ class CephBackupDriver(driver.BackupDriver):
|
|||||||
self._ceph_backup_pool = utils.convert_str(CONF.backup_ceph_pool)
|
self._ceph_backup_pool = utils.convert_str(CONF.backup_ceph_pool)
|
||||||
self._ceph_backup_conf = utils.convert_str(CONF.backup_ceph_conf)
|
self._ceph_backup_conf = utils.convert_str(CONF.backup_ceph_conf)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return service_opts
|
||||||
|
|
||||||
def _validate_string_args(self, *args):
|
def _validate_string_args(self, *args):
|
||||||
"""Ensure all args are non-None and non-empty."""
|
"""Ensure all args are non-None and non-empty."""
|
||||||
return all(args)
|
return all(args)
|
||||||
|
@ -181,6 +181,10 @@ class GoogleBackupDriver(chunkeddriver.ChunkedBackupDriver):
|
|||||||
credentials=creds)
|
credentials=creds)
|
||||||
self.resumable = self.writer_chunk_size != -1
|
self.resumable = self.writer_chunk_size != -1
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return gcsbackup_service_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
required_options = ('backup_gcs_bucket', 'backup_gcs_credential_file',
|
required_options = ('backup_gcs_bucket', 'backup_gcs_credential_file',
|
||||||
'backup_gcs_project_id')
|
'backup_gcs_project_id')
|
||||||
|
@ -55,6 +55,10 @@ class GlusterfsBackupDriver(posix.PosixBackupDriver):
|
|||||||
super(GlusterfsBackupDriver, self).__init__(context,
|
super(GlusterfsBackupDriver, self).__init__(context,
|
||||||
backup_path=backup_path)
|
backup_path=backup_path)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return glusterfsbackup_service_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
"""Raises error if any required configuration flag is missing."""
|
"""Raises error if any required configuration flag is missing."""
|
||||||
required_flags = ['glusterfs_backup_share']
|
required_flags = ['glusterfs_backup_share']
|
||||||
|
@ -87,6 +87,10 @@ class PosixBackupDriver(chunkeddriver.ChunkedBackupDriver):
|
|||||||
raise exception.ConfigNotFound(path='backup_path')
|
raise exception.ConfigNotFound(path='backup_path')
|
||||||
LOG.debug("Using backup repository: %s", self.backup_path)
|
LOG.debug("Using backup repository: %s", self.backup_path)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return posixbackup_service_opts
|
||||||
|
|
||||||
def update_container_name(self, backup, container):
|
def update_container_name(self, backup, container):
|
||||||
if container is not None:
|
if container is not None:
|
||||||
return container
|
return container
|
||||||
|
@ -158,6 +158,10 @@ class SwiftBackupDriver(chunkeddriver.ChunkedBackupDriver):
|
|||||||
if context:
|
if context:
|
||||||
self.initialize()
|
self.initialize()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return swiftbackup_service_opts
|
||||||
|
|
||||||
def initialize(self):
|
def initialize(self):
|
||||||
self.swift_attempts = CONF.backup_swift_retry_attempts
|
self.swift_attempts = CONF.backup_swift_retry_attempts
|
||||||
self.swift_backoff = CONF.backup_swift_retry_backoff
|
self.swift_backoff = CONF.backup_swift_retry_backoff
|
||||||
|
@ -270,6 +270,10 @@ class TSMBackupDriver(driver.BackupDriver):
|
|||||||
self.tsm_password = CONF.backup_tsm_password
|
self.tsm_password = CONF.backup_tsm_password
|
||||||
self.volume_prefix = CONF.backup_tsm_volume_prefix
|
self.volume_prefix = CONF.backup_tsm_volume_prefix
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return tsm_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
required_flags = ['backup_share']
|
required_flags = ['backup_share']
|
||||||
for flag in required_flags:
|
for flag in required_flags:
|
||||||
|
@ -69,6 +69,7 @@ class DriverInfo(object):
|
|||||||
self.version = getattr(cls, 'VERSION', None)
|
self.version = getattr(cls, 'VERSION', None)
|
||||||
self.ci_wiki_name = getattr(cls, 'CI_WIKI_NAME', None)
|
self.ci_wiki_name = getattr(cls, 'CI_WIKI_NAME', None)
|
||||||
self.supported = getattr(cls, 'SUPPORTED', True)
|
self.supported = getattr(cls, 'SUPPORTED', True)
|
||||||
|
self.driver_options = cls.get_driver_options()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.class_name
|
return self.class_name
|
||||||
|
@ -562,6 +562,10 @@ class BaseVD(object):
|
|||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def get_driver_options():
|
||||||
|
"""Return the oslo_config options specific to the driver."""
|
||||||
|
return volume_opts
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Creates a volume.
|
"""Creates a volume.
|
||||||
|
@ -94,6 +94,10 @@ class DataCoreVolumeDriver(driver.BaseVD):
|
|||||||
self._api = None
|
self._api = None
|
||||||
self._default_volume_options = None
|
self._default_volume_options = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return datacore_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
"""Perform validations and establish connection to server.
|
"""Perform validations and establish connection to server.
|
||||||
|
|
||||||
|
@ -126,6 +126,10 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
active_backend_id=self.active_backend_id)
|
active_backend_id=self.active_backend_id)
|
||||||
self.zonemanager_lookup_service = fczm_utils.create_lookup_service()
|
self.zonemanager_lookup_service = fczm_utils.create_lookup_service()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return common.powermax_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -131,6 +131,10 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
|
|||||||
configuration=self.configuration,
|
configuration=self.configuration,
|
||||||
active_backend_id=self.active_backend_id))
|
active_backend_id=self.active_backend_id))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return common.powermax_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -155,6 +155,10 @@ class PSSeriesISCSIDriver(san.SanISCSIDriver):
|
|||||||
self._group_ip = None
|
self._group_ip = None
|
||||||
self.sshpool = None
|
self.sshpool = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return eqlx_opts
|
||||||
|
|
||||||
def _get_output(self, chan):
|
def _get_output(self, chan):
|
||||||
out = ''
|
out = ''
|
||||||
ending = '%s> ' % self.configuration.eqlx_group_name
|
ending = '%s> ' % self.configuration.eqlx_group_name
|
||||||
|
@ -110,6 +110,10 @@ class SCCommonDriver(driver.ManageableVD,
|
|||||||
self.storage_protocol = 'iSCSI'
|
self.storage_protocol = 'iSCSI'
|
||||||
self.failback_timeout = 60
|
self.failback_timeout = 60
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return common_opts
|
||||||
|
|
||||||
def _bytes_to_gb(self, spacestring):
|
def _bytes_to_gb(self, spacestring):
|
||||||
"""Space is returned in a string like ...
|
"""Space is returned in a string like ...
|
||||||
|
|
||||||
|
@ -145,7 +145,9 @@ SIO_MAX_OVERSUBSCRIPTION_RATIO = 10.0
|
|||||||
class ScaleIODriver(driver.VolumeDriver):
|
class ScaleIODriver(driver.VolumeDriver):
|
||||||
"""Cinder ScaleIO Driver
|
"""Cinder ScaleIO Driver
|
||||||
|
|
||||||
ScaleIO Driver version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
ScaleIO Driver version history:
|
||||||
2.0.1: Added support for SIO 1.3x in addition to 2.0.x
|
2.0.1: Added support for SIO 1.3x in addition to 2.0.x
|
||||||
2.0.2: Added consistency group support to generic volume groups
|
2.0.2: Added consistency group support to generic volume groups
|
||||||
2.0.3: Added cache for storage pool and protection domains info
|
2.0.3: Added cache for storage pool and protection domains info
|
||||||
@ -232,6 +234,10 @@ class ScaleIODriver(driver.VolumeDriver):
|
|||||||
'bandwidthLimit': None,
|
'bandwidthLimit': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return scaleio_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
# make sure both domain name and id are not specified
|
# make sure both domain name and id are not specified
|
||||||
if (self.configuration.sio_protection_domain_name
|
if (self.configuration.sio_protection_domain_name
|
||||||
|
@ -52,7 +52,9 @@ class UnityDriver(driver.ManageableVD,
|
|||||||
driver.BaseVD):
|
driver.BaseVD):
|
||||||
"""Unity Driver.
|
"""Unity Driver.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
1.0.0 - Initial version
|
1.0.0 - Initial version
|
||||||
2.0.0 - Add thin clone support
|
2.0.0 - Add thin clone support
|
||||||
3.0.0 - Add IPv6 support
|
3.0.0 - Add IPv6 support
|
||||||
@ -79,6 +81,10 @@ class UnityDriver(driver.ManageableVD,
|
|||||||
self.protocol = adapter.PROTOCOL_ISCSI
|
self.protocol = adapter.PROTOCOL_ISCSI
|
||||||
self.adapter = adapter.ISCSIAdapter(self.VERSION)
|
self.adapter = adapter.ISCSIAdapter(self.VERSION)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return UNITY_OPTS
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self.adapter.do_setup(self, self.configuration)
|
self.adapter.do_setup(self, self.configuration)
|
||||||
|
|
||||||
|
@ -99,6 +99,10 @@ class VNXDriver(driver.ManageableVD,
|
|||||||
self.adapter = None
|
self.adapter = None
|
||||||
self._stats = {}
|
self._stats = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return common.VNX_OPTS
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
if self.protocol == common.PROTOCOL_FC:
|
if self.protocol == common.PROTOCOL_FC:
|
||||||
self.adapter = adapter.FCAdapter(self.configuration,
|
self.adapter = adapter.FCAdapter(self.configuration,
|
||||||
|
@ -434,6 +434,10 @@ class XtremIOVolumeDriver(san.SanDriver):
|
|||||||
self._stats = {}
|
self._stats = {}
|
||||||
self.client = XtremIOClient3(self.configuration, self.cluster_id)
|
self.client = XtremIOClient3(self.configuration, self.cluster_id)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return XTREMIO_OPTS
|
||||||
|
|
||||||
def _obj_from_result(self, res):
|
def _obj_from_result(self, res):
|
||||||
typ, idx = res['links'][0]['href'].split('/')[-2:]
|
typ, idx = res['links'][0]['href'].split('/')[-2:]
|
||||||
return self.client.req(typ, idx=int(idx))['content']
|
return self.client.req(typ, idx=int(idx))['content']
|
||||||
|
@ -185,6 +185,10 @@ class DrbdManageBaseDriver(driver.VolumeDriver):
|
|||||||
CS_DISKLESS = dm_const.CSTATE_PREFIX + dm_const.FLAG_DISKLESS
|
CS_DISKLESS = dm_const.CSTATE_PREFIX + dm_const.FLAG_DISKLESS
|
||||||
CS_UPD_CON = dm_const.CSTATE_PREFIX + dm_const.FLAG_UPD_CON
|
CS_UPD_CON = dm_const.CSTATE_PREFIX + dm_const.FLAG_UPD_CON
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return drbd_opts
|
||||||
|
|
||||||
def dbus_connect(self):
|
def dbus_connect(self):
|
||||||
self.odm = dbus.SystemBus().get_object(self.drbdmanage_dbus_name,
|
self.odm = dbus.SystemBus().get_object(self.drbdmanage_dbus_name,
|
||||||
self.drbdmanage_dbus_interface)
|
self.drbdmanage_dbus_interface)
|
||||||
|
@ -170,6 +170,10 @@ class FJDXCommon(object):
|
|||||||
self.configuration.iscsi_ip_address = (
|
self.configuration.iscsi_ip_address = (
|
||||||
self._get_drvcfg('EternusISCSIIP'))
|
self._get_drvcfg('EternusISCSIIP'))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return FJ_ETERNUS_DX_OPT_opts
|
||||||
|
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Create volume on ETERNUS."""
|
"""Create volume on ETERNUS."""
|
||||||
LOG.debug('create_volume, '
|
LOG.debug('create_volume, '
|
||||||
|
@ -46,6 +46,10 @@ class FJDXFCDriver(driver.FibreChannelDriver):
|
|||||||
configuration=self.configuration)
|
configuration=self.configuration)
|
||||||
self.VERSION = self.common.VERSION
|
self.VERSION = self.common.VERSION
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return eternus_dx_common.FJDXCommon.get_driver_options()
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
if not self.common.pywbemAvailable:
|
if not self.common.pywbemAvailable:
|
||||||
LOG.error('pywbem could not be imported! '
|
LOG.error('pywbem could not be imported! '
|
||||||
|
@ -45,6 +45,10 @@ class FJDXISCSIDriver(driver.ISCSIDriver):
|
|||||||
configuration=self.configuration)
|
configuration=self.configuration)
|
||||||
self.VERSION = self.common.VERSION
|
self.VERSION = self.common.VERSION
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return eternus_dx_common.FJDXCommon.get_driver_options()
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
if not self.common.pywbemAvailable:
|
if not self.common.pywbemAvailable:
|
||||||
LOG.error('pywbem could not be imported! '
|
LOG.error('pywbem could not be imported! '
|
||||||
|
@ -119,6 +119,10 @@ class DSWAREDriver(driver.VolumeDriver):
|
|||||||
self.conf = fs_conf.FusionStorageConf(self.configuration, self.host)
|
self.conf = fs_conf.FusionStorageConf(self.configuration, self.host)
|
||||||
self.client = None
|
self.client = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self.conf.update_config_value()
|
self.conf.update_config_value()
|
||||||
url_str = self.configuration.san_address
|
url_str = self.configuration.san_address
|
||||||
|
@ -40,7 +40,10 @@ LOG = logging.getLogger(__name__)
|
|||||||
class HedvigISCSIDriver(driver.ISCSIDriver, san.SanDriver):
|
class HedvigISCSIDriver(driver.ISCSIDriver, san.SanDriver):
|
||||||
"""OpenStack Cinder driver to enable Hedvig storage.
|
"""OpenStack Cinder driver to enable Hedvig storage.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
|
||||||
1.0 - Initial driver
|
1.0 - Initial driver
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -58,6 +61,10 @@ class HedvigISCSIDriver(driver.ISCSIDriver, san.SanDriver):
|
|||||||
self.group_stats = {}
|
self.group_stats = {}
|
||||||
self.hrs = None
|
self.hrs = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return []
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
self.hrs.connect()
|
self.hrs.connect()
|
||||||
LOG.info("Initialization complete")
|
LOG.info("Initialization complete")
|
||||||
|
@ -71,6 +71,10 @@ class HPE3PARDriverBase(driver.ManageableVD,
|
|||||||
self.configuration.append_config_values(san.san_opts)
|
self.configuration.append_config_values(san.san_opts)
|
||||||
self.protocol = None
|
self.protocol = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return hpecommon.HPE3PARCommon.get_driver_options()
|
||||||
|
|
||||||
def _init_common(self):
|
def _init_common(self):
|
||||||
return hpecommon.HPE3PARCommon(self.configuration,
|
return hpecommon.HPE3PARCommon(self.configuration,
|
||||||
self._active_backend_id)
|
self._active_backend_id)
|
||||||
|
@ -345,6 +345,10 @@ class HPE3PARCommon(object):
|
|||||||
def get_version(self):
|
def get_version(self):
|
||||||
return self.VERSION
|
return self.VERSION
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return hpe3par_opts
|
||||||
|
|
||||||
def check_flags(self, options, required_flags):
|
def check_flags(self, options, required_flags):
|
||||||
for flag in required_flags:
|
for flag in required_flags:
|
||||||
if not getattr(options, flag, None):
|
if not getattr(options, flag, None):
|
||||||
|
@ -207,6 +207,10 @@ class HPELeftHandISCSIDriver(driver.ISCSIDriver):
|
|||||||
self._replication_enabled = False
|
self._replication_enabled = False
|
||||||
self._active_backend_id = kwargs.get('active_backend_id', None)
|
self._active_backend_id = kwargs.get('active_backend_id', None)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return hpelefthand_opts
|
||||||
|
|
||||||
def _login(self, timeout=None):
|
def _login(self, timeout=None):
|
||||||
conf = self._get_lefthand_config()
|
conf = self._get_lefthand_config()
|
||||||
if conf:
|
if conf:
|
||||||
|
@ -97,6 +97,10 @@ class HuaweiBaseDriver(driver.VolumeDriver):
|
|||||||
self.metro_flag = False
|
self.metro_flag = False
|
||||||
self.replica = None
|
self.replica = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return huawei_opts
|
||||||
|
|
||||||
def check_func_support(self, obj_name):
|
def check_func_support(self, obj_name):
|
||||||
try:
|
try:
|
||||||
self.client._get_object_count(obj_name)
|
self.client._get_object_count(obj_name)
|
||||||
|
@ -111,6 +111,10 @@ class FlashSystemDriver(san.SanDriver,
|
|||||||
self._vdisk_copy_in_progress = set()
|
self._vdisk_copy_in_progress = set()
|
||||||
self._vdisk_copy_lock = None
|
self._vdisk_copy_lock = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return flashsystem_opts
|
||||||
|
|
||||||
def _ssh(self, ssh_cmd, check_exit_code=True):
|
def _ssh(self, ssh_cmd, check_exit_code=True):
|
||||||
try:
|
try:
|
||||||
return self._run_ssh(ssh_cmd, check_exit_code)
|
return self._run_ssh(ssh_cmd, check_exit_code)
|
||||||
|
@ -147,12 +147,15 @@ class GPFSDriver(driver.CloneableImageVD,
|
|||||||
driver.BaseVD):
|
driver.BaseVD):
|
||||||
"""Implements volume functions using GPFS primitives.
|
"""Implements volume functions using GPFS primitives.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
1.0.0 - Initial driver
|
|
||||||
1.1.0 - Add volume retype, refactor volume migration
|
Version history:
|
||||||
1.2.0 - Add consistency group support
|
|
||||||
1.3.0 - Add NFS based GPFS storage backend support
|
1.0.0 - Initial driver
|
||||||
1.3.1 - Add GPFS native encryption (encryption of data at rest) support
|
1.1.0 - Add volume retype, refactor volume migration
|
||||||
|
1.2.0 - Add consistency group support
|
||||||
|
1.3.0 - Add NFS based GPFS storage backend support
|
||||||
|
1.3.1 - Add GPFS native encryption (encryption of data at rest) support
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "1.3.1"
|
VERSION = "1.3.1"
|
||||||
@ -167,6 +170,10 @@ class GPFSDriver(driver.CloneableImageVD,
|
|||||||
self._execute = utils.execute
|
self._execute = utils.execute
|
||||||
self.GPFS_PATH = ''
|
self.GPFS_PATH = ''
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return gpfs_opts
|
||||||
|
|
||||||
def _gpfs_local_execute(self, *cmd, **kwargs):
|
def _gpfs_local_execute(self, *cmd, **kwargs):
|
||||||
if 'run_as_root' not in kwargs:
|
if 'run_as_root' not in kwargs:
|
||||||
kwargs.update({'run_as_root': True})
|
kwargs.update({'run_as_root': True})
|
||||||
@ -1409,6 +1416,10 @@ class GPFSRemoteDriver(GPFSDriver, san.SanDriver):
|
|||||||
self.gpfs_execute = self._gpfs_remote_execute
|
self.gpfs_execute = self._gpfs_remote_execute
|
||||||
self.GPFS_PATH = '/usr/lpp/mmfs/bin/'
|
self.GPFS_PATH = '/usr/lpp/mmfs/bin/'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return gpfs_opts + gpfs_remote_ssh_opts
|
||||||
|
|
||||||
def _gpfs_remote_execute(self, *cmd, **kwargs):
|
def _gpfs_remote_execute(self, *cmd, **kwargs):
|
||||||
check_exit_code = kwargs.pop('check_exit_code', None)
|
check_exit_code = kwargs.pop('check_exit_code', None)
|
||||||
return self._run_ssh(cmd, check_exit_code)
|
return self._run_ssh(cmd, check_exit_code)
|
||||||
|
@ -115,6 +115,10 @@ class IBMStorageDriver(san.SanDriver,
|
|||||||
active_backend_id=active_backend_id,
|
active_backend_id=active_backend_id,
|
||||||
host=self.host)
|
host=self.host)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return driver_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
"""Setup and verify connection to IBM Storage."""
|
"""Setup and verify connection to IBM Storage."""
|
||||||
|
|
||||||
|
@ -109,6 +109,10 @@ class StorwizeSVCFCDriver(storwize_common.StorwizeSVCCommonDriver):
|
|||||||
self.configuration.append_config_values(
|
self.configuration.append_config_values(
|
||||||
storwize_svc_fc_opts)
|
storwize_svc_fc_opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return storwize_common.storwize_svc_opts + storwize_svc_fc_opts
|
||||||
|
|
||||||
def validate_connector(self, connector):
|
def validate_connector(self, connector):
|
||||||
"""Check connector for at least one enabled FC protocol."""
|
"""Check connector for at least one enabled FC protocol."""
|
||||||
if 'wwpns' not in connector:
|
if 'wwpns' not in connector:
|
||||||
|
@ -109,6 +109,10 @@ class StorwizeSVCISCSIDriver(storwize_common.StorwizeSVCCommonDriver):
|
|||||||
self.configuration.append_config_values(
|
self.configuration.append_config_values(
|
||||||
storwize_svc_iscsi_opts)
|
storwize_svc_iscsi_opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return storwize_common.storwize_svc_opts + storwize_svc_iscsi_opts
|
||||||
|
|
||||||
def validate_connector(self, connector):
|
def validate_connector(self, connector):
|
||||||
"""Check connector for at least one enabled iSCSI protocol."""
|
"""Check connector for at least one enabled iSCSI protocol."""
|
||||||
if 'initiator' not in connector:
|
if 'initiator' not in connector:
|
||||||
|
@ -132,6 +132,10 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
|
|||||||
self.configuration.append_config_values(infinidat_opts)
|
self.configuration.append_config_values(infinidat_opts)
|
||||||
self._lookup_service = fczm_utils.create_lookup_service()
|
self._lookup_service = fczm_utils.create_lookup_service()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return infinidat_opts
|
||||||
|
|
||||||
def _setup_and_get_system_object(self, management_address, auth):
|
def _setup_and_get_system_object(self, management_address, auth):
|
||||||
system = infinisdk.InfiniBox(management_address, auth=auth)
|
system = infinisdk.InfiniBox(management_address, auth=auth)
|
||||||
system.api.add_auto_retry(
|
system.api.add_auto_retry(
|
||||||
|
@ -201,6 +201,10 @@ class AS13000Driver(san.SanISCSIDriver):
|
|||||||
self.username,
|
self.username,
|
||||||
self.password)
|
self.password)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return inspur_as13000_opts
|
||||||
|
|
||||||
@utils.trace
|
@utils.trace
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
# get tokens for the driver
|
# get tokens for the driver
|
||||||
|
@ -166,6 +166,10 @@ class InStorageMCSCommonDriver(driver.VolumeDriver, san.SanDriver):
|
|||||||
# This is used to save the available pools in failed-over status
|
# This is used to save the available pools in failed-over status
|
||||||
self._secondary_pools = None
|
self._secondary_pools = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return instorage_mcs_opts
|
||||||
|
|
||||||
@cinder_utils.trace
|
@cinder_utils.trace
|
||||||
def do_setup(self, ctxt):
|
def do_setup(self, ctxt):
|
||||||
"""Check that we have all configuration details from the storage."""
|
"""Check that we have all configuration details from the storage."""
|
||||||
|
@ -126,6 +126,10 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver):
|
|||||||
k2_lock_sfx = self.configuration.safe_get('san_ip')
|
k2_lock_sfx = self.configuration.safe_get('san_ip')
|
||||||
self.k2_lock_name = "%s-%s" % (K2_LOCK_PREFIX, k2_lock_sfx)
|
self.k2_lock_name = "%s-%s" % (K2_LOCK_PREFIX, k2_lock_sfx)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return kaminario_opts
|
||||||
|
|
||||||
@utils.trace
|
@utils.trace
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
if krest is None:
|
if krest is None:
|
||||||
|
@ -33,7 +33,10 @@ utils.trace = common.utils.trace
|
|||||||
class KaminarioISCSIDriver(common.KaminarioCinderDriver):
|
class KaminarioISCSIDriver(common.KaminarioCinderDriver):
|
||||||
"""Kaminario K2 iSCSI Volume Driver.
|
"""Kaminario K2 iSCSI Volume Driver.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
|
||||||
1.0 - Initial driver
|
1.0 - Initial driver
|
||||||
1.1 - Added manage/unmanage and extra-specs support for nodedup
|
1.1 - Added manage/unmanage and extra-specs support for nodedup
|
||||||
1.2 - Added replication support
|
1.2 - Added replication support
|
||||||
|
@ -44,5 +44,9 @@ class LenovoFCDriver(dothill_fc.DotHillFCDriver):
|
|||||||
super(LenovoFCDriver, self).__init__(*args, **kwargs)
|
super(LenovoFCDriver, self).__init__(*args, **kwargs)
|
||||||
self.configuration.append_config_values(lenovo_common.common_opts)
|
self.configuration.append_config_values(lenovo_common.common_opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return lenovo_common.common_opts
|
||||||
|
|
||||||
def _init_common(self):
|
def _init_common(self):
|
||||||
return lenovo_common.LenovoCommon(self.configuration)
|
return lenovo_common.LenovoCommon(self.configuration)
|
||||||
|
@ -45,5 +45,9 @@ class LenovoISCSIDriver(dothill_iscsi.DotHillISCSIDriver):
|
|||||||
self.configuration.append_config_values(lenovo_common.iscsi_opts)
|
self.configuration.append_config_values(lenovo_common.iscsi_opts)
|
||||||
self.iscsi_ips = self.configuration.lenovo_iscsi_ips
|
self.iscsi_ips = self.configuration.lenovo_iscsi_ips
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return lenovo_common.common_opts + lenovo_common.iscsi_opts
|
||||||
|
|
||||||
def _init_common(self):
|
def _init_common(self):
|
||||||
return lenovo_common.LenovoCommon(self.configuration)
|
return lenovo_common.LenovoCommon(self.configuration)
|
||||||
|
@ -117,6 +117,10 @@ class LinstorBaseDriver(driver.VolumeDriver):
|
|||||||
'volume_backend_name')
|
'volume_backend_name')
|
||||||
self.host_name = socket.gethostname()
|
self.host_name = socket.gethostname()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return linstor_opts
|
||||||
|
|
||||||
def _ping(self):
|
def _ping(self):
|
||||||
with lin_drv(self.default_uri) as lin:
|
with lin_drv(self.default_uri) as lin:
|
||||||
return lin.ping()
|
return lin.ping()
|
||||||
|
@ -112,6 +112,10 @@ class LVMVolumeDriver(driver.VolumeDriver):
|
|||||||
self.protocol = self.target_driver.protocol
|
self.protocol = self.target_driver.protocol
|
||||||
self._sparse_copy_volume = False
|
self._sparse_copy_volume = False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_opts
|
||||||
|
|
||||||
def _sizestr(self, size_in_g):
|
def _sizestr(self, size_in_g):
|
||||||
return '%sg' % size_in_g
|
return '%sg' % size_in_g
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
from cinder import interface
|
from cinder import interface
|
||||||
from cinder.volume import driver
|
from cinder.volume import driver
|
||||||
|
from cinder.volume.drivers.nec import volume_common
|
||||||
from cinder.volume.drivers.nec import volume_helper
|
from cinder.volume.drivers.nec import volume_helper
|
||||||
from cinder.zonemanager import utils as fczm_utils
|
from cinder.zonemanager import utils as fczm_utils
|
||||||
|
|
||||||
@ -35,6 +36,10 @@ class MStorageISCSIDriver(volume_helper.MStorageDSVDriver,
|
|||||||
self._set_config(self.configuration, self.host,
|
self._set_config(self.configuration, self.host,
|
||||||
self.__class__.__name__)
|
self.__class__.__name__)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_common.mstorage_opts
|
||||||
|
|
||||||
def create_export(self, context, volume, connector):
|
def create_export(self, context, volume, connector):
|
||||||
return self.iscsi_do_export(context, volume, connector)
|
return self.iscsi_do_export(context, volume, connector)
|
||||||
|
|
||||||
@ -77,6 +82,10 @@ class MStorageFCDriver(volume_helper.MStorageDSVDriver,
|
|||||||
self._set_config(self.configuration, self.host,
|
self._set_config(self.configuration, self.host,
|
||||||
self.__class__.__name__)
|
self.__class__.__name__)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_common.mstorage_opts
|
||||||
|
|
||||||
def create_export(self, context, volume, connector):
|
def create_export(self, context, volume, connector):
|
||||||
return self.fc_do_export(context, volume, connector)
|
return self.fc_do_export(context, volume, connector)
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ Volume driver for NetApp Data ONTAP FibreChannel storage systems.
|
|||||||
from cinder import interface
|
from cinder import interface
|
||||||
from cinder.volume import driver
|
from cinder.volume import driver
|
||||||
from cinder.volume.drivers.netapp.dataontap import block_cmode
|
from cinder.volume.drivers.netapp.dataontap import block_cmode
|
||||||
|
from cinder.volume.drivers.netapp import options as na_opts
|
||||||
from cinder.zonemanager import utils as fczm_utils
|
from cinder.zonemanager import utils as fczm_utils
|
||||||
|
|
||||||
|
|
||||||
@ -38,6 +39,10 @@ class NetAppCmodeFibreChannelDriver(driver.BaseVD,
|
|||||||
self.library = block_cmode.NetAppBlockStorageCmodeLibrary(
|
self.library = block_cmode.NetAppBlockStorageCmodeLibrary(
|
||||||
self.DRIVER_NAME, 'FC', **kwargs)
|
self.DRIVER_NAME, 'FC', **kwargs)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return na_opts.netapp_cluster_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self.library.do_setup(context)
|
self.library.do_setup(context)
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ Volume driver for NetApp Data ONTAP (C-mode) iSCSI storage systems.
|
|||||||
from cinder import interface
|
from cinder import interface
|
||||||
from cinder.volume import driver
|
from cinder.volume import driver
|
||||||
from cinder.volume.drivers.netapp.dataontap import block_cmode
|
from cinder.volume.drivers.netapp.dataontap import block_cmode
|
||||||
|
from cinder.volume.drivers.netapp import options as na_opts
|
||||||
|
|
||||||
|
|
||||||
@interface.volumedriver
|
@interface.volumedriver
|
||||||
@ -37,6 +38,10 @@ class NetAppCmodeISCSIDriver(driver.BaseVD,
|
|||||||
self.library = block_cmode.NetAppBlockStorageCmodeLibrary(
|
self.library = block_cmode.NetAppBlockStorageCmodeLibrary(
|
||||||
self.DRIVER_NAME, 'iSCSI', **kwargs)
|
self.DRIVER_NAME, 'iSCSI', **kwargs)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return na_opts.netapp_cluster_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self.library.do_setup(context)
|
self.library.do_setup(context)
|
||||||
|
|
||||||
|
@ -91,6 +91,11 @@ class NexentaISCSIDriver(driver.ISCSIDriver):
|
|||||||
|
|
||||||
self._needless_objects = set()
|
self._needless_objects = set()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return (options.NEXENTA_CONNECTION_OPTS + options.NEXENTA_ISCSI_OPTS +
|
||||||
|
options.NEXENTA_DATASET_OPTS + options.NEXENTA_RRMGR_OPTS)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def backend_name(self):
|
def backend_name(self):
|
||||||
backend_name = None
|
backend_name = None
|
||||||
|
@ -33,7 +33,10 @@ LOG = logging.getLogger(__name__)
|
|||||||
class NexentaEdgeISCSIDriver(driver.ISCSIDriver):
|
class NexentaEdgeISCSIDriver(driver.ISCSIDriver):
|
||||||
"""Executes volume driver commands on NexentaEdge cluster.
|
"""Executes volume driver commands on NexentaEdge cluster.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
|
||||||
1.0.0 - Initial driver version.
|
1.0.0 - Initial driver version.
|
||||||
1.0.1 - Moved opts to options.py.
|
1.0.1 - Moved opts to options.py.
|
||||||
1.0.2 - Added HA support.
|
1.0.2 - Added HA support.
|
||||||
@ -98,6 +101,15 @@ class NexentaEdgeISCSIDriver(driver.ISCSIDriver):
|
|||||||
nexenta_iscsi_target_portal_port)
|
nexenta_iscsi_target_portal_port)
|
||||||
self.ha_vip = None
|
self.ha_vip = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return (
|
||||||
|
options.NEXENTA_CONNECTION_OPTS +
|
||||||
|
options.NEXENTA_ISCSI_OPTS +
|
||||||
|
options.NEXENTA_DATASET_OPTS +
|
||||||
|
options.NEXENTA_EDGE_OPTS
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def backend_name(self):
|
def backend_name(self):
|
||||||
backend_name = None
|
backend_name = None
|
||||||
|
@ -94,6 +94,15 @@ class NexentaNfsDriver(nfs.NfsDriver): # pylint: disable=R0921
|
|||||||
self.nfs_versions = {}
|
self.nfs_versions = {}
|
||||||
self.shares_with_capacities = {}
|
self.shares_with_capacities = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return (
|
||||||
|
options.NEXENTA_CONNECTION_OPTS +
|
||||||
|
options.NEXENTA_NFS_OPTS +
|
||||||
|
options.NEXENTA_DATASET_OPTS +
|
||||||
|
options.NEXENTA_RRMGR_OPTS
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def backend_name(self):
|
def backend_name(self):
|
||||||
backend_name = None
|
backend_name = None
|
||||||
|
@ -82,6 +82,15 @@ class NexentaISCSIDriver(driver.ISCSIDriver):
|
|||||||
self.iscsi_target_portal_port = (
|
self.iscsi_target_portal_port = (
|
||||||
self.configuration.nexenta_iscsi_target_portal_port)
|
self.configuration.nexenta_iscsi_target_portal_port)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return (
|
||||||
|
options.NEXENTA_CONNECTION_OPTS +
|
||||||
|
options.NEXENTA_ISCSI_OPTS +
|
||||||
|
options.NEXENTA_DATASET_OPTS +
|
||||||
|
options.NEXENTA_RRMGR_OPTS
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def backend_name(self):
|
def backend_name(self):
|
||||||
backend_name = None
|
backend_name = None
|
||||||
|
@ -83,6 +83,14 @@ class NexentaNfsDriver(nfs.NfsDriver):
|
|||||||
self.nef_user = self.configuration.nexenta_user
|
self.nef_user = self.configuration.nexenta_user
|
||||||
self.nef_password = self.configuration.nexenta_password
|
self.nef_password = self.configuration.nexenta_password
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return (
|
||||||
|
options.NEXENTA_CONNECTION_OPTS +
|
||||||
|
options.NEXENTA_NFS_OPTS +
|
||||||
|
options.NEXENTA_DATASET_OPTS
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def backend_name(self):
|
def backend_name(self):
|
||||||
backend_name = None
|
backend_name = None
|
||||||
|
@ -122,6 +122,10 @@ class NfsDriver(remotefs.RemoteFSSnapDriverDistributed):
|
|||||||
self.configuration.max_over_subscription_ratio,
|
self.configuration.max_over_subscription_ratio,
|
||||||
supports_auto=supports_auto_mosr))
|
supports_auto=supports_auto_mosr))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return nfs_opts + remotefs.nas_opts
|
||||||
|
|
||||||
def initialize_connection(self, volume, connector):
|
def initialize_connection(self, volume, connector):
|
||||||
|
|
||||||
LOG.debug('Initializing connection to volume %(vol)s. '
|
LOG.debug('Initializing connection to volume %(vol)s. '
|
||||||
|
@ -149,6 +149,10 @@ class NimbleBaseVolumeDriver(san.SanDriver):
|
|||||||
if self.configuration.nimble_verify_certificate is True:
|
if self.configuration.nimble_verify_certificate is True:
|
||||||
self.verify = self.configuration.nimble_verify_cert_path or True
|
self.verify = self.configuration.nimble_verify_cert_path or True
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return nimble_opts
|
||||||
|
|
||||||
def _check_config(self):
|
def _check_config(self):
|
||||||
"""Ensure that the flags we care about are set."""
|
"""Ensure that the flags we care about are set."""
|
||||||
required_config = ['san_ip', 'san_login', 'san_password']
|
required_config = ['san_ip', 'san_login', 'san_password']
|
||||||
|
@ -695,6 +695,10 @@ class DPLCOMMONDriver(driver.CloneableImageVD,
|
|||||||
cert_path=cert_path)
|
cert_path=cert_path)
|
||||||
self._stats = {}
|
self._stats = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return options.DPL_OPTS
|
||||||
|
|
||||||
def _convert_size_GB(self, size):
|
def _convert_size_GB(self, size):
|
||||||
s = round(float(size) / units.Gi, 2)
|
s = round(float(size) / units.Gi, 2)
|
||||||
if s > 0:
|
if s > 0:
|
||||||
|
@ -203,6 +203,10 @@ class PureBaseVolumeDriver(san.SanDriver):
|
|||||||
'platform': platform.platform()
|
'platform': platform.platform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return PURE_OPTS
|
||||||
|
|
||||||
def parse_replication_configs(self):
|
def parse_replication_configs(self):
|
||||||
self._replication_pg_name = (
|
self._replication_pg_name = (
|
||||||
self.configuration.pure_replication_pg_name)
|
self.configuration.pure_replication_pg_name)
|
||||||
|
@ -63,7 +63,8 @@ CONF.register_opts(qnap_opts, group=configuration.SHARED_CONF_GROUP)
|
|||||||
class QnapISCSIDriver(san.SanISCSIDriver):
|
class QnapISCSIDriver(san.SanISCSIDriver):
|
||||||
"""QNAP iSCSI based cinder driver
|
"""QNAP iSCSI based cinder driver
|
||||||
|
|
||||||
.. code-block:: default
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
Version History:
|
Version History:
|
||||||
1.0.0:
|
1.0.0:
|
||||||
@ -105,6 +106,10 @@ class QnapISCSIDriver(san.SanISCSIDriver):
|
|||||||
self.target_iqns = []
|
self.target_iqns = []
|
||||||
self.nasInfoCache = {}
|
self.nasInfoCache = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return qnap_opts
|
||||||
|
|
||||||
def _check_config(self):
|
def _check_config(self):
|
||||||
"""Ensure that the flags we care about are set."""
|
"""Ensure that the flags we care about are set."""
|
||||||
LOG.debug('in _check_config')
|
LOG.debug('in _check_config')
|
||||||
|
@ -96,7 +96,11 @@ class QuobyteDriver(remotefs_drv.RemoteFSSnapDriverDistributed):
|
|||||||
Note: To be compliant with the inherited RemoteFSSnapDriver, Quobyte
|
Note: To be compliant with the inherited RemoteFSSnapDriver, Quobyte
|
||||||
volumes are also referred to as shares.
|
volumes are also referred to as shares.
|
||||||
|
|
||||||
Version history:
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
|
||||||
1.0 - Initial driver.
|
1.0 - Initial driver.
|
||||||
1.1 - Adds optional insecure NAS settings
|
1.1 - Adds optional insecure NAS settings
|
||||||
1.1.1 - Removes getfattr calls from driver
|
1.1.1 - Removes getfattr calls from driver
|
||||||
@ -130,6 +134,10 @@ class QuobyteDriver(remotefs_drv.RemoteFSSnapDriverDistributed):
|
|||||||
# Used to manage snapshots which are currently attached to a VM.
|
# Used to manage snapshots which are currently attached to a VM.
|
||||||
self._nova = None
|
self._nova = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_opts
|
||||||
|
|
||||||
def _create_regular_file(self, path, size):
|
def _create_regular_file(self, path, size):
|
||||||
"""Creates a regular file of given size in GiB using fallocate."""
|
"""Creates a regular file of given size in GiB using fallocate."""
|
||||||
self._fallocate_file(path, size)
|
self._fallocate_file(path, size)
|
||||||
|
@ -243,6 +243,10 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
|
|||||||
self._replication_targets = []
|
self._replication_targets = []
|
||||||
self._target_names = []
|
self._target_names = []
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return RBD_OPTS
|
||||||
|
|
||||||
def _get_target_config(self, target_id):
|
def _get_target_config(self, target_id):
|
||||||
"""Get a replication target from known replication targets."""
|
"""Get a replication target from known replication targets."""
|
||||||
for target in self._replication_targets:
|
for target in self._replication_targets:
|
||||||
|
@ -43,5 +43,9 @@ class HPMSAFCDriver(dothill_fc.DotHillFCDriver):
|
|||||||
super(HPMSAFCDriver, self).__init__(*args, **kwargs)
|
super(HPMSAFCDriver, self).__init__(*args, **kwargs)
|
||||||
self.configuration.append_config_values(hpmsa_common.common_opts)
|
self.configuration.append_config_values(hpmsa_common.common_opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return hpmsa_common.common_opts
|
||||||
|
|
||||||
def _init_common(self):
|
def _init_common(self):
|
||||||
return hpmsa_common.HPMSACommon(self.configuration)
|
return hpmsa_common.HPMSACommon(self.configuration)
|
||||||
|
@ -45,5 +45,9 @@ class HPMSAISCSIDriver(dothill_iscsi.DotHillISCSIDriver):
|
|||||||
self.configuration.append_config_values(hpmsa_common.iscsi_opts)
|
self.configuration.append_config_values(hpmsa_common.iscsi_opts)
|
||||||
self.iscsi_ips = self.configuration.hpmsa_iscsi_ips
|
self.iscsi_ips = self.configuration.hpmsa_iscsi_ips
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return hpmsa_common.common_opts + hpmsa_common.iscsi_opts
|
||||||
|
|
||||||
def _init_common(self):
|
def _init_common(self):
|
||||||
return hpmsa_common.HPMSACommon(self.configuration)
|
return hpmsa_common.HPMSACommon(self.configuration)
|
||||||
|
@ -452,6 +452,10 @@ class SheepdogDriver(driver.VolumeDriver):
|
|||||||
self.node_list = [addr]
|
self.node_list = [addr]
|
||||||
self.client = SheepdogClient(self.node_list, self.port)
|
self.client = SheepdogClient(self.node_list, self.port)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return sheepdog_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
"""Check cluster status and update node list."""
|
"""Check cluster status and update node list."""
|
||||||
self.client.check_cluster_status()
|
self.client.check_cluster_status()
|
||||||
|
@ -292,6 +292,10 @@ class SolidFireDriver(san.SanISCSIDriver):
|
|||||||
|
|
||||||
self._set_cluster_pairs()
|
self._set_cluster_pairs()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return sf_opts
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
if hasattr(self.target_driver, attr):
|
if hasattr(self.target_driver, attr):
|
||||||
return getattr(self.target_driver, attr)
|
return getattr(self.target_driver, attr)
|
||||||
|
@ -59,6 +59,10 @@ class SPDKDriver(driver.VolumeDriver):
|
|||||||
db=self.db,
|
db=self.db,
|
||||||
executor=self._execute)
|
executor=self._execute)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return []
|
||||||
|
|
||||||
def _rpc_call(self, method, params=None):
|
def _rpc_call(self, method, params=None):
|
||||||
payload = {}
|
payload = {}
|
||||||
payload['jsonrpc'] = '2.0'
|
payload['jsonrpc'] = '2.0'
|
||||||
|
@ -99,6 +99,10 @@ class StorPoolDriver(driver.VolumeDriver):
|
|||||||
self._ourIdInt = None
|
self._ourIdInt = None
|
||||||
self._attach = None
|
self._attach = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return storpool_opts
|
||||||
|
|
||||||
def _backendException(self, e):
|
def _backendException(self, e):
|
||||||
return exception.VolumeBackendAPIException(data=six.text_type(e))
|
return exception.VolumeBackendAPIException(data=six.text_type(e))
|
||||||
|
|
||||||
|
@ -27,7 +27,9 @@ LOG = logging.getLogger(__name__)
|
|||||||
class SynoISCSIDriver(driver.ISCSIDriver):
|
class SynoISCSIDriver(driver.ISCSIDriver):
|
||||||
"""OpenStack Cinder drivers for Synology storage.
|
"""OpenStack Cinder drivers for Synology storage.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
1.0.0 - Initial driver. Provide Cinder minimum features
|
1.0.0 - Initial driver. Provide Cinder minimum features
|
||||||
"""
|
"""
|
||||||
# ThirdPartySystems wiki page
|
# ThirdPartySystems wiki page
|
||||||
@ -41,6 +43,10 @@ class SynoISCSIDriver(driver.ISCSIDriver):
|
|||||||
self.configuration.append_config_values(common.cinder_opts)
|
self.configuration.append_config_values(common.cinder_opts)
|
||||||
self.stats = {}
|
self.stats = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return common.cinder_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self.common = common.SynoCommon(self.configuration, 'iscsi')
|
self.common = common.SynoCommon(self.configuration, 'iscsi')
|
||||||
|
|
||||||
|
@ -69,6 +69,10 @@ class HyperScaleDriver(driver.VolumeDriver):
|
|||||||
self.old_free = 0
|
self.old_free = 0
|
||||||
self.my_dnid = None
|
self.my_dnid = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return []
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _fetch_config_for_controller():
|
def _fetch_config_for_controller():
|
||||||
return HyperScaleDriver._fetch_config_information(
|
return HyperScaleDriver._fetch_config_information(
|
||||||
|
@ -74,7 +74,9 @@ class ACCESSIscsiDriver(driver.ISCSIDriver):
|
|||||||
Executes commands relating to ACCESS ISCSI.
|
Executes commands relating to ACCESS ISCSI.
|
||||||
Supports creation of volumes on ACCESS.
|
Supports creation of volumes on ACCESS.
|
||||||
|
|
||||||
API version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
API version history:
|
||||||
|
|
||||||
1.0 - Initial version.
|
1.0 - Initial version.
|
||||||
"""
|
"""
|
||||||
@ -124,6 +126,10 @@ class ACCESSIscsiDriver(driver.ISCSIDriver):
|
|||||||
if verify_path:
|
if verify_path:
|
||||||
self.verify = verify_path
|
self.verify = verify_path
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return VA_VOL_OPTS
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
"""Any initialization the volume driver does while starting."""
|
"""Any initialization the volume driver does while starting."""
|
||||||
super(ACCESSIscsiDriver, self).do_setup(context)
|
super(ACCESSIscsiDriver, self).do_setup(context)
|
||||||
|
@ -293,6 +293,10 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
self._dc_cache = {}
|
self._dc_cache = {}
|
||||||
self._ds_regex = None
|
self._ds_regex = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return vmdk_opts
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def volumeops(self):
|
def volumeops(self):
|
||||||
return self._volumeops
|
return self._volumeops
|
||||||
|
@ -126,7 +126,9 @@ class VZStorageDriver(remotefs_drv.RemoteFSSnapDriver):
|
|||||||
|
|
||||||
Creates volumes as files on the mounted vzstorage cluster.
|
Creates volumes as files on the mounted vzstorage cluster.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
1.0 - Initial driver.
|
1.0 - Initial driver.
|
||||||
1.1 - Supports vz:volume_format in vendor properties.
|
1.1 - Supports vz:volume_format in vendor properties.
|
||||||
"""
|
"""
|
||||||
@ -153,6 +155,10 @@ class VZStorageDriver(remotefs_drv.RemoteFSSnapDriver):
|
|||||||
vzstorage_mount_point_base=self.base,
|
vzstorage_mount_point_base=self.base,
|
||||||
vzstorage_mount_options=opts)
|
vzstorage_mount_options=opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return vzstorage_opts
|
||||||
|
|
||||||
def _update_volume_stats(self):
|
def _update_volume_stats(self):
|
||||||
super(VZStorageDriver, self)._update_volume_stats()
|
super(VZStorageDriver, self)._update_volume_stats()
|
||||||
self._stats['vendor_name'] = 'Virtuozzo'
|
self._stats['vendor_name'] = 'Virtuozzo'
|
||||||
|
@ -67,6 +67,10 @@ class WindowsISCSIDriver(driver.ISCSIDriver):
|
|||||||
self._tgt_utils = utilsfactory.get_iscsi_target_utils()
|
self._tgt_utils = utilsfactory.get_iscsi_target_utils()
|
||||||
self._hostutils = utilsfactory.get_hostutils()
|
self._hostutils = utilsfactory.get_hostutils()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return windows_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
"""Setup the Windows Volume driver.
|
"""Setup the Windows Volume driver.
|
||||||
|
|
||||||
|
@ -124,6 +124,10 @@ class WindowsSmbfsDriver(remotefs_drv.RevertToSnapshotMixin,
|
|||||||
self._thin_provisioning_support = thin_enabled
|
self._thin_provisioning_support = thin_enabled
|
||||||
self._thick_provisioning_support = not thin_enabled
|
self._thick_provisioning_support = not thin_enabled
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return volume_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
self._check_os_platform()
|
self._check_os_platform()
|
||||||
|
|
||||||
|
@ -285,7 +285,9 @@ class ZadaraVPSAConnection(object):
|
|||||||
class ZadaraVPSAISCSIDriver(driver.ISCSIDriver):
|
class ZadaraVPSAISCSIDriver(driver.ISCSIDriver):
|
||||||
"""Zadara VPSA iSCSI/iSER volume driver.
|
"""Zadara VPSA iSCSI/iSER volume driver.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
15.07 - Initial driver
|
15.07 - Initial driver
|
||||||
16.05 - Move from httplib to requests
|
16.05 - Move from httplib to requests
|
||||||
"""
|
"""
|
||||||
@ -299,6 +301,10 @@ class ZadaraVPSAISCSIDriver(driver.ISCSIDriver):
|
|||||||
super(ZadaraVPSAISCSIDriver, self).__init__(*args, **kwargs)
|
super(ZadaraVPSAISCSIDriver, self).__init__(*args, **kwargs)
|
||||||
self.configuration.append_config_values(zadara_opts)
|
self.configuration.append_config_values(zadara_opts)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return zadara_opts
|
||||||
|
|
||||||
def do_setup(self, context):
|
def do_setup(self, context):
|
||||||
"""Any initialization the volume driver does while starting.
|
"""Any initialization the volume driver does while starting.
|
||||||
|
|
||||||
|
@ -140,6 +140,10 @@ class ZFSSAISCSIDriver(driver.ISCSIDriver):
|
|||||||
self._stats = None
|
self._stats = None
|
||||||
self.tgtiqn = None
|
self.tgtiqn = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return ZFSSA_OPTS
|
||||||
|
|
||||||
def _get_target_alias(self):
|
def _get_target_alias(self):
|
||||||
"""return target alias."""
|
"""return target alias."""
|
||||||
return self.configuration.zfssa_target_group
|
return self.configuration.zfssa_target_group
|
||||||
|
@ -65,7 +65,9 @@ class BrcdFCZoneDriver(fc_zone_driver.FCZoneDriver):
|
|||||||
OpenStack Fibre Channel zone driver to manage FC zoning in
|
OpenStack Fibre Channel zone driver to manage FC zoning in
|
||||||
Brocade SAN fabrics.
|
Brocade SAN fabrics.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
1.0 - Initial Brocade FC zone driver
|
1.0 - Initial Brocade FC zone driver
|
||||||
1.1 - Implements performance enhancements
|
1.1 - Implements performance enhancements
|
||||||
1.2 - Added support for friendly zone name
|
1.2 - Added support for friendly zone name
|
||||||
@ -111,6 +113,10 @@ class BrcdFCZoneDriver(fc_zone_driver.FCZoneDriver):
|
|||||||
self.fabric_configs = fabric_opts.load_fabric_configurations(
|
self.fabric_configs = fabric_opts.load_fabric_configurations(
|
||||||
fabric_names)
|
fabric_names)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return brcd_opts
|
||||||
|
|
||||||
@lockutils.synchronized('brcd', 'fcfabric-', True)
|
@lockutils.synchronized('brcd', 'fcfabric-', True)
|
||||||
def add_connection(self, fabric, initiator_target_map, host_name=None,
|
def add_connection(self, fabric, initiator_target_map, host_name=None,
|
||||||
storage_system=None):
|
storage_system=None):
|
||||||
|
@ -65,7 +65,9 @@ class CiscoFCZoneDriver(fc_zone_driver.FCZoneDriver):
|
|||||||
OpenStack Fibre Channel zone driver to manage FC zoning in
|
OpenStack Fibre Channel zone driver to manage FC zoning in
|
||||||
Cisco SAN fabrics.
|
Cisco SAN fabrics.
|
||||||
|
|
||||||
Version history:
|
.. code-block:: none
|
||||||
|
|
||||||
|
Version history:
|
||||||
1.0 - Initial Cisco FC zone driver
|
1.0 - Initial Cisco FC zone driver
|
||||||
1.1 - Added friendly zone name support
|
1.1 - Added friendly zone name support
|
||||||
"""
|
"""
|
||||||
@ -118,6 +120,10 @@ class CiscoFCZoneDriver(fc_zone_driver.FCZoneDriver):
|
|||||||
self.fabric_configs = fabric_opts.load_fabric_configurations(
|
self.fabric_configs = fabric_opts.load_fabric_configurations(
|
||||||
fabric_names)
|
fabric_names)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_driver_options():
|
||||||
|
return cisco_opts
|
||||||
|
|
||||||
@lockutils.synchronized('cisco', 'fcfabric-', True)
|
@lockutils.synchronized('cisco', 'fcfabric-', True)
|
||||||
def add_connection(self, fabric, initiator_target_map, host_name=None,
|
def add_connection(self, fabric, initiator_target_map, host_name=None,
|
||||||
storage_system=None):
|
storage_system=None):
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
"""Generate list of Cinder drivers"""
|
"""Generate list of Cinder drivers"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import operator
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import textwrap
|
import textwrap
|
||||||
@ -73,19 +74,56 @@ def format_description(desc, output):
|
|||||||
output.write('')
|
output.write('')
|
||||||
output.write(textwrap.dedent('\n'.join(lines[1:])))
|
output.write(textwrap.dedent('\n'.join(lines[1:])))
|
||||||
|
|
||||||
def print_drivers(drivers, config_name, output):
|
|
||||||
for driver in sorted(drivers, key=lambda x: x.class_fqn):
|
def format_options(driver_options, output):
|
||||||
driver_name = driver.class_name
|
if driver_options and len(driver_options) > 0:
|
||||||
|
|
||||||
|
output.write('* Driver Configuration Options:')
|
||||||
|
output.write('')
|
||||||
|
output.write('.. list-table:: **Driver configuration options**')
|
||||||
|
output.write(' :header-rows: 1')
|
||||||
|
output.write(' :widths: 14 30')
|
||||||
|
output.write('')
|
||||||
|
output.write(' * - Name = Default Value')
|
||||||
|
output.write(' - (Type) Description')
|
||||||
|
sorted_options = sorted(driver_options,
|
||||||
|
key=operator.attrgetter('name'))
|
||||||
|
for opt in sorted_options:
|
||||||
|
output.write(' * - %s = %s' %
|
||||||
|
(opt.name, opt.default))
|
||||||
|
output.write(' - (%s) %s' % (opt.type, opt.help))
|
||||||
|
output.write('')
|
||||||
|
|
||||||
|
def filter_drivers(drivers):
|
||||||
|
'''This filters all of the drivers into separate lists.'''
|
||||||
|
|
||||||
|
supported_drivers = []
|
||||||
|
unsupported_drivers = []
|
||||||
|
|
||||||
|
for driver in drivers:
|
||||||
if not driver.supported:
|
if not driver.supported:
|
||||||
|
unsupported_drivers.append(driver)
|
||||||
|
else:
|
||||||
|
supported_drivers.append(driver)
|
||||||
|
|
||||||
|
return supported_drivers, unsupported_drivers
|
||||||
|
|
||||||
|
|
||||||
|
def print_drivers(drivers, config_name, output, section_char='-',
|
||||||
|
display_unsupported=True):
|
||||||
|
for driver in sorted(drivers, key=lambda x: x.class_name):
|
||||||
|
driver_name = driver.class_name
|
||||||
|
if not driver.supported and display_unsupported:
|
||||||
driver_name += " (unsupported)"
|
driver_name += " (unsupported)"
|
||||||
output.write(driver_name)
|
output.write(driver_name)
|
||||||
output.write('-' * len(driver_name))
|
output.write(section_char * len(driver_name))
|
||||||
if driver.version:
|
if driver.version:
|
||||||
output.write('* Version: %s' % driver.version)
|
output.write('* Version: %s' % driver.version)
|
||||||
output.write('* %s=%s' % (config_name, driver.class_fqn))
|
output.write('* %s=%s' % (config_name, driver.class_fqn))
|
||||||
if driver.ci_wiki_name and 'Cinder_Jenkins' not in driver.ci_wiki_name:
|
if driver.ci_wiki_name and 'Cinder_Jenkins' not in driver.ci_wiki_name:
|
||||||
output.write('* CI info: %s%s' % (CI_WIKI_ROOT,
|
output.write('* CI info: %s%s' % (CI_WIKI_ROOT,
|
||||||
driver.ci_wiki_name))
|
driver.ci_wiki_name))
|
||||||
|
format_options(driver.driver_options, output)
|
||||||
format_description(driver.desc, output)
|
format_description(driver.desc, output)
|
||||||
output.write('')
|
output.write('')
|
||||||
output.write('')
|
output.write('')
|
||||||
@ -95,7 +133,18 @@ def output_str(cinder_root, args):
|
|||||||
with Output(cinder_root, args.output_list) as output:
|
with Output(cinder_root, args.output_list) as output:
|
||||||
output.write('Volume Drivers')
|
output.write('Volume Drivers')
|
||||||
output.write('==============')
|
output.write('==============')
|
||||||
print_drivers(util.get_volume_drivers(), 'volume_driver', output)
|
supported_drivers, unsupported_drivers = filter_drivers(
|
||||||
|
util.get_volume_drivers())
|
||||||
|
|
||||||
|
output.write('Supported Drivers')
|
||||||
|
output.write('-----------------')
|
||||||
|
output.write('')
|
||||||
|
print_drivers(supported_drivers, 'volume_driver', output, '~')
|
||||||
|
|
||||||
|
output.write('Unsupported Drivers')
|
||||||
|
output.write('-------------------')
|
||||||
|
output.write('')
|
||||||
|
print_drivers(unsupported_drivers, 'volume_driver', output, '~')
|
||||||
|
|
||||||
output.write('Backup Drivers')
|
output.write('Backup Drivers')
|
||||||
output.write('==============')
|
output.write('==============')
|
||||||
@ -114,7 +163,9 @@ def collect_driver_info(driver):
|
|||||||
'fqn': driver.class_fqn,
|
'fqn': driver.class_fqn,
|
||||||
'description': driver.desc,
|
'description': driver.desc,
|
||||||
'ci_wiki_name': driver.ci_wiki_name,
|
'ci_wiki_name': driver.ci_wiki_name,
|
||||||
'supported': driver.supported}
|
'supported': driver.supported,
|
||||||
|
'options': driver.driver_options,
|
||||||
|
}
|
||||||
|
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user