refactor/unify driver version strings

This patch updates each driver to provide
the same mechanism for reporting the version
of the driver.  It also includes fixing the
reported driver version at get_volume_stats()
time to be the version set in the driver.

When the manager starts the driver it now
logs the driver's name and version in the log file.

fixes Bug #1212878

Change-Id: Icefd065f885ad417735490e6ac90e2b21557d2dc
This commit is contained in:
Walter A. Boring IV 2013-08-15 15:54:30 -07:00
parent b0018248b0
commit abac1a6c1c
26 changed files with 74 additions and 33 deletions

View File

@ -119,7 +119,7 @@ class TestBlockDeviceDriver(cinder.test.TestCase):
self.configuration.reserved_percentage,
'QoS_support': False,
'vendor_name': "Open Source",
'driver_version': '1.0',
'driver_version': self.drv.VERSION,
'storage_protocol': 'unknown',
'volume_backend_name': 'BlockDeviceDriver',
})

View File

@ -299,7 +299,7 @@ class RBDTestCase(test.TestCase):
expected = dict(
volume_backend_name='RBD',
vendor_name='Open Source',
driver_version=driver.VERSION,
driver_version=self.driver.VERSION,
storage_protocol='ceph',
total_capacity_gb=1177,
free_capacity_gb=953,
@ -325,7 +325,7 @@ class RBDTestCase(test.TestCase):
expected = dict(
volume_backend_name='RBD',
vendor_name='Open Source',
driver_version=driver.VERSION,
driver_version=self.driver.VERSION,
storage_protocol='ceph',
total_capacity_gb='unknown',
free_capacity_gb='unknown',

View File

@ -68,7 +68,7 @@ class SheepdogTestCase(test.TestCase):
expected = dict(
volume_backend_name='sheepdog',
vendor_name='Open Source',
dirver_version='1.0',
dirver_version=self.driver.VERSION,
storage_protocol='sheepdog',
total_capacity_gb=float(107287605248) / (1024 ** 3),
free_capacity_gb=float(107287605248 - 3623897354) / (1024 ** 3),
@ -84,7 +84,7 @@ class SheepdogTestCase(test.TestCase):
expected = dict(
volume_backend_name='sheepdog',
vendor_name='Open Source',
dirver_version='1.0',
dirver_version=self.driver.VERSION,
storage_protocol='sheepdog',
total_capacity_gb='unknown',
free_capacity_gb='unknown',

View File

@ -95,6 +95,9 @@ CONF.import_opt('iser_helper', 'cinder.brick.iser.iser')
class VolumeDriver(object):
"""Executes commands relating to Volumes."""
VERSION = "N/A"
def __init__(self, execute=utils.execute, *args, **kwargs):
# NOTE(vish): db is set by Manager
self.db = None
@ -107,6 +110,10 @@ class VolumeDriver(object):
def set_execute(self, execute):
self._execute = execute
def get_version(self):
"""Get the current version of this driver."""
return self.VERSION
def _is_non_recoverable(self, err, non_recoverable_list):
for item in non_recoverable_list:
if item in err:

View File

@ -41,7 +41,7 @@ CONF.register_opts(volume_opts)
class BlockDeviceDriver(driver.ISCSIDriver):
VERSION = '1.0'
VERSION = '1.0.0'
def __init__(self, *args, **kwargs):
self.tgtadm = iscsi.get_target_admin()

View File

@ -433,7 +433,7 @@ class CoraidDriver(driver.VolumeDriver):
def get_volume_stats(self, refresh=False):
"""Return Volume Stats."""
data = {'driver_version': '1.0',
data = {'driver_version': self.VERSION,
'free_capacity_gb': 'unknown',
'reserved_percentage': 0,
'storage_protocol': 'aoe',

View File

@ -32,6 +32,8 @@ LOG = logging.getLogger(__name__)
class EMCSMISISCSIDriver(driver.ISCSIDriver):
"""EMC ISCSI Drivers for VMAX and VNX using SMI-S."""
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
super(EMCSMISISCSIDriver, self).__init__(*args, **kwargs)

View File

@ -41,7 +41,6 @@ volume_opts = [
help=('Create volumes as sparsed files which take no space.'
'If set to False volume is created as regular file.'
'In such case volume creation takes a lot of time.'))]
VERSION = '1.0'
CONF = cfg.CONF
CONF.register_opts(volume_opts)
@ -55,7 +54,7 @@ class GlusterfsDriver(nfs.RemoteFsDriver):
driver_volume_type = 'glusterfs'
driver_prefix = 'glusterfs'
volume_backend_name = 'GlusterFS'
version = VERSION
VERSION = '1.0.0'
def __init__(self, *args, **kwargs):
super(GlusterfsDriver, self).__init__(*args, **kwargs)

View File

@ -31,7 +31,6 @@ from cinder.openstack.common import log as logging
from cinder import units
from cinder.volume import driver
VERSION = 1.0
GPFS_CLONE_MIN_RELEASE = 1200
LOG = logging.getLogger(__name__)
@ -74,6 +73,8 @@ class GPFSDriver(driver.VolumeDriver):
"""Implements volume functions using GPFS primitives."""
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
super(GPFSDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(gpfs_opts)
@ -399,7 +400,7 @@ class GPFSDriver(driver.VolumeDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
data["volume_backend_name"] = backend_name or 'GPFS'
data["vendor_name"] = 'IBM'
data["driver_version"] = '1.0'
data["driver_version"] = self.VERSION
data["storage_protocol"] = 'file'
free, capacity = self._get_available_capacity(self.configuration.
gpfs_mount_point_base)

View File

@ -144,6 +144,8 @@ def _read_config(xml_config_file):
class HUSDriver(driver.ISCSIDriver):
"""HDS HUS volume driver."""
VERSION = HDS_VERSION
def _array_info_get(self):
"""Get array parameters."""
out = self.bend.get_version(self.config['hus_cmd'],

View File

@ -129,6 +129,8 @@ class SSHConn(utils.SSHPool):
class HuaweiISCSIDriver(driver.ISCSIDriver):
"""Huawei T series and Dorado iSCSI volume driver."""
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
super(HuaweiISCSIDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(huawei_opt)
@ -1509,7 +1511,7 @@ class HuaweiISCSIDriver(driver.ISCSIDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
data["volume_backend_name"] = backend_name or 'HuaweiISCSIDriver'
data['vendor_name'] = 'Huawei'
data['driver_version'] = '1.0'
data['driver_version'] = self.VERSION
data['storage_protocol'] = 'iSCSI'
data['total_capacity_gb'] = 'infinite'

View File

@ -60,7 +60,7 @@ CONF.register_opts(volume_opts)
class LVMVolumeDriver(driver.VolumeDriver):
"""Executes commands relating to Volumes."""
VERSION = '1.0'
VERSION = '1.0.0'
def __init__(self, *args, **kwargs):
super(LVMVolumeDriver, self).__init__(*args, **kwargs)

View File

@ -83,6 +83,8 @@ class NetAppLun(object):
class NetAppDirectISCSIDriver(driver.ISCSIDriver):
"""NetApp Direct iSCSI volume driver."""
VERSION = "1.0.0"
IGROUP_PREFIX = 'openstack-'
required_flags = ['netapp_transport_type', 'netapp_login',
'netapp_password', 'netapp_server_hostname',
@ -1122,7 +1124,7 @@ class NetAppDirect7modeISCSIDriver(NetAppDirectISCSIDriver):
data["volume_backend_name"] = (
backend_name or 'NetApp_iSCSI_7mode_direct')
data["vendor_name"] = 'NetApp'
data["driver_version"] = '1.0'
data["driver_version"] = self.VERSION
data["storage_protocol"] = 'iSCSI'
data['total_capacity_gb'] = 'infinite'

View File

@ -49,6 +49,9 @@ class NetAppNFSDriver(nfs.NfsDriver):
"""Base class for NetApp NFS driver.
Executes commands relating to Volumes.
"""
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
# NOTE(vish): db is set by Manager
validate_instantiation(**kwargs)
@ -484,6 +487,6 @@ class NetAppDirect7modeNfsDriver (NetAppDirectNfsDriver):
self._stats["volume_backend_name"] = (backend_name or
'NetApp_NFS_7mode_direct')
self._stats["vendor_name"] = 'NetApp'
self._stats["driver_version"] = '1.0'
self._stats["driver_version"] = self.VERSION
provide_ems(self, self._client, self._stats, netapp_backend,
server_type="7mode")

View File

@ -31,7 +31,6 @@ from cinder.volume import driver
from cinder.volume.drivers import nexenta
from cinder.volume.drivers.nexenta import jsonrpc
VERSION = '1.0'
LOG = logging.getLogger(__name__)
NEXENTA_OPTS = [
@ -78,6 +77,8 @@ CONF.register_opts(NEXENTA_OPTS)
class NexentaDriver(driver.ISCSIDriver): # pylint: disable=R0921
"""Executes volume driver commands on Nexenta Appliance."""
VERSION = '1.0.0'
def __init__(self, *args, **kwargs):
super(NexentaDriver, self).__init__(*args, **kwargs)
self.nms = None
@ -367,7 +368,7 @@ class NexentaDriver(driver.ISCSIDriver): # pylint: disable=R0921
backend_name = self.configuration.safe_get('volume_backend_name')
data["volume_backend_name"] = backend_name or self.__class__.__name__
data["vendor_name"] = 'Nexenta'
data["driver_version"] = VERSION
data["driver_version"] = self.VERSION
data["storage_protocol"] = 'iSCSI'
stats = self.nms.volume.get_child_props(CONF.nexenta_volume,

View File

@ -27,6 +27,8 @@ from cinder.openstack.common import log as logging
from cinder import units
from cinder.volume import driver
VERSION = '1.1.0'
LOG = logging.getLogger(__name__)
volume_opts = [
@ -57,7 +59,6 @@ volume_opts = [
'number, the destination will no longer be valid.'))
]
VERSION = '1.1'
CONF = cfg.CONF
CONF.register_opts(volume_opts)
@ -66,6 +67,8 @@ CONF.register_opts(volume_opts)
class RemoteFsDriver(driver.VolumeDriver):
"""Common base for drivers that work like NFS."""
VERSION = "0.0.0"
def check_for_setup_error(self):
"""Just to override parent behavior."""
pass
@ -295,7 +298,7 @@ class RemoteFsDriver(driver.VolumeDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
data['volume_backend_name'] = backend_name or self.volume_backend_name
data['vendor_name'] = 'Open Source'
data['driver_version'] = self.version
data['driver_version'] = self.get_version()
data['storage_protocol'] = self.driver_volume_type
self._ensure_shares_mounted()
@ -346,7 +349,7 @@ class NfsDriver(RemoteFsDriver):
driver_volume_type = 'nfs'
driver_prefix = 'nfs'
volume_backend_name = 'Generic_NFS'
version = VERSION
VERSION = VERSION
def __init__(self, *args, **kwargs):
super(NfsDriver, self).__init__(*args, **kwargs)

View File

@ -64,8 +64,6 @@ rbd_opts = [
help='where to store temporary image files if the volume '
'driver does not write them directly to the volume'), ]
VERSION = '1.1'
def ascii_str(string):
"""Convert a string to ascii, or return None if the input is None.
@ -240,6 +238,9 @@ CONF.register_opts(rbd_opts)
class RBDDriver(driver.VolumeDriver):
"""Implements RADOS block device (RBD) volume commands."""
VERSION = '1.1.0'
def __init__(self, *args, **kwargs):
super(RBDDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(rbd_opts)
@ -317,7 +318,7 @@ class RBDDriver(driver.VolumeDriver):
def _update_volume_stats(self):
stats = {
'vendor_name': 'Open Source',
'driver_version': VERSION,
'driver_version': self.VERSION,
'storage_protocol': 'ceph',
'total_capacity_gb': 'unknown',
'free_capacity_gb': 'unknown',

View File

@ -40,7 +40,6 @@ import cinder.volume.driver
from cinder.volume.drivers.san.hp import hp_3par_common as hpcommon
from cinder.volume.drivers.san import san
VERSION = 1.1
LOG = logging.getLogger(__name__)
@ -54,6 +53,8 @@ class HP3PARFCDriver(cinder.volume.driver.FibreChannelDriver):
copy volume <--> Image.
"""
VERSION = "1.1.0"
def __init__(self, *args, **kwargs):
super(HP3PARFCDriver, self).__init__(*args, **kwargs)
self.common = None
@ -75,6 +76,7 @@ class HP3PARFCDriver(cinder.volume.driver.FibreChannelDriver):
self.common.client_login()
stats = self.common.get_volume_stats(refresh)
stats['storage_protocol'] = 'FC'
stats['driver_version'] = self.VERSION
backend_name = self.configuration.safe_get('volume_backend_name')
stats['volume_backend_name'] = backend_name or self.__class__.__name__
self.common.client_logout()

View File

@ -41,7 +41,6 @@ import cinder.volume.driver
from cinder.volume.drivers.san.hp import hp_3par_common as hpcommon
from cinder.volume.drivers.san import san
VERSION = 1.1
LOG = logging.getLogger(__name__)
DEFAULT_ISCSI_PORT = 3260
@ -55,6 +54,9 @@ class HP3PARISCSIDriver(cinder.volume.driver.ISCSIDriver):
session changes, faster clone, requires 3.1.2 MU2 firmware.
"""
VERSION = "1.1.0"
def __init__(self, *args, **kwargs):
super(HP3PARISCSIDriver, self).__init__(*args, **kwargs)
self.common = None
@ -76,6 +78,7 @@ class HP3PARISCSIDriver(cinder.volume.driver.ISCSIDriver):
self.common.client_login()
stats = self.common.get_volume_stats(refresh)
stats['storage_protocol'] = 'iSCSI'
stats['driver_version'] = self.VERSION
backend_name = self.configuration.safe_get('volume_backend_name')
stats['volume_backend_name'] = backend_name or self.__class__.__name__
self.common.client_logout()

View File

@ -51,6 +51,8 @@ class HpSanISCSIDriver(SanISCSIDriver):
compute layer.
"""
VERSION = "1.0.0"
device_stats = {}
def __init__(self, *args, **kwargs):
@ -298,7 +300,7 @@ class HpSanISCSIDriver(SanISCSIDriver):
data = {}
backend_name = self.configuration.safe_get('volume_backend_name')
data['volume_backend_name'] = backend_name or self.__class__.__name__
data['driver_version'] = '1.0'
data['driver_version'] = self.VERSION
data['reserved_percentage'] = 0
data['storage_protocol'] = 'iSCSI'
data['vendor_name'] = 'Hewlett-Packard'

View File

@ -55,6 +55,8 @@ class ScalityDriver(driver.VolumeDriver):
devices.
"""
VERSION = '1.0.0'
def _check_prerequisites(self):
"""Sanity checks before attempting to mount SOFS."""
@ -221,7 +223,7 @@ class ScalityDriver(driver.VolumeDriver):
"""
stats = {
'vendor_name': 'Scality',
'driver_version': '1.0',
'driver_version': self.VERSION,
'storage_protocol': 'scality',
'total_capacity_gb': 'infinite',
'free_capacity_gb': 'infinite',

View File

@ -40,6 +40,8 @@ CONF.import_opt("image_conversion_dir", "cinder.image.image_utils")
class SheepdogDriver(driver.VolumeDriver):
"""Executes commands relating to Sheepdog Volumes"""
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
super(SheepdogDriver, self).__init__(*args, **kwargs)
self.stats_pattern = re.compile(r'[\w\s%]*Total\s(\d+)\s(\d+)*')
@ -157,7 +159,7 @@ class SheepdogDriver(driver.VolumeDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
stats["volume_backend_name"] = backend_name or 'sheepdog'
stats['vendor_name'] = 'Open Source'
stats['dirver_version'] = '1.0'
stats['dirver_version'] = self.VERSION
stats['storage_protocol'] = 'sheepdog'
stats['total_capacity_gb'] = 'unknown'
stats['free_capacity_gb'] = 'unknown'

View File

@ -34,7 +34,6 @@ from cinder.openstack.common import timeutils
from cinder.volume.drivers.san.san import SanISCSIDriver
from cinder.volume import volume_types
VERSION = '1.2'
LOG = logging.getLogger(__name__)
sf_opts = [
@ -64,6 +63,8 @@ class SolidFireDriver(SanISCSIDriver):
"""
VERSION = '1.2.0'
sf_qos_dict = {'slow': {'minIOPS': 100,
'maxIOPS': 200,
'burstIOPS': 200},
@ -652,7 +653,7 @@ class SolidFireDriver(SanISCSIDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
data["volume_backend_name"] = backend_name or self.__class__.__name__
data["vendor_name"] = 'SolidFire Inc'
data["driver_version"] = VERSION
data["driver_version"] = self.VERSION
data["storage_protocol"] = 'iSCSI'
data['total_capacity_gb'] = results['maxProvisionedSpace']

View File

@ -56,7 +56,6 @@ from cinder import utils
from cinder.volume.drivers.san import san
from cinder.volume import volume_types
VERSION = 1.1
LOG = logging.getLogger(__name__)
storwize_svc_opts = [
@ -118,6 +117,7 @@ class StorwizeSVCDriver(san.SanDriver):
"""====================================================================="""
""" SETUP """
"""====================================================================="""
VERSION = "1.1.0"
def __init__(self, *args, **kwargs):
super(StorwizeSVCDriver, self).__init__(*args, **kwargs)
@ -1363,7 +1363,7 @@ class StorwizeSVCDriver(san.SanDriver):
data = {}
data['vendor_name'] = 'IBM'
data['driver_version'] = '1.1'
data['driver_version'] = self.VERSION
data['storage_protocol'] = list(self._enabled_protocols)
data['total_capacity_gb'] = 0 # To be overwritten

View File

@ -58,6 +58,9 @@ CONF.register_opts(xenapi_nfs_opts)
class XenAPINFSDriver(driver.VolumeDriver):
VERSION = "1.0.0"
def __init__(self, *args, **kwargs):
super(XenAPINFSDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(xenapi_opts)
@ -250,7 +253,7 @@ class XenAPINFSDriver(driver.VolumeDriver):
backend_name = self.configuration.safe_get('volume_backend_name')
data["volume_backend_name"] = backend_name or 'XenAPINFS',
data['vendor_name'] = 'Open Source',
data['driver_version'] = '1.0'
data['driver_version'] = self.VERSION
data['storage_protocol'] = 'xensm'
data['total_capacity_gb'] = 'unknown'
data['free_capacity_gb'] = 'unknown'

View File

@ -145,6 +145,9 @@ class VolumeManager(manager.SchedulerDependentManager):
"""
ctxt = context.get_admin_context()
LOG.info(_("Starting volume driver %(driver_name)s (%(version)s)") %
{'driver_name': self.driver.__class__.__name__,
'version': self.driver.get_version()})
self.driver.do_setup(ctxt)
self.driver.check_for_setup_error()