Add new supported driver checks

This patch adds the new mechanism for tagging drivers as supported
or not as discussed in the TC mailing list post:
http://lists.openstack.org/pipermail/openstack-dev/2016-August/101589.html

This adds the following in place:
1) add new supported flag in every driver

2) When a driver no longer meets the Cinder community testing standards
   the driver supported flag will be set to False.

3) When the volume manager starts it checks to see if the driver is
   flagged not supported.  If the supported flag is False, then the
   volume manager will log an error and then check to see if the driver
   section configuration setting of 'enable_unsupported_driver = True'.
   If the conf setting is not enabled, the driver will not be started.

   a) When the driver maintainer conforms to the community testing
      standards, then a follow up patch will be submitted to re-enable
      the supported flag.

   b) If the driver maintainer continues to not support the community
      testing standards, then the Cinder community will revisit
      removing the driver in the following release.

   c) If the driver section in cinder.conf has the
      enable_unsupported_driver set, then the volume manager will start
      the driver, but log a warning on every driver call saying the
      driver isn't supported and may be removed in the future.

Implements: blueprint supported-drivers
Change-Id: I19a60df85d5fb205fc63e700475ae20b86309c1e
This commit is contained in:
Walter A. Boring IV 2016-08-15 12:06:56 -07:00 committed by Walter A. Boring IV (hemna)
parent ca9038628e
commit a227bf440e
5 changed files with 61 additions and 1 deletions

View File

@ -520,6 +520,21 @@ def require_driver_initialized(driver):
driver_name = driver.__class__.__name__
LOG.error(_LE("Volume driver %s not initialized"), driver_name)
raise exception.DriverNotInitialized()
else:
log_unsupported_driver_warning(driver)
def log_unsupported_driver_warning(driver):
"""Annoy the log about unsupported drivers."""
if not driver.supported:
# Check to see if the driver is flagged as supported.
LOG.warning(_LW("Volume driver (%(driver_name)s %(version)s) is "
"currently unsupported and may be removed in the "
"next release of OpenStack. Use at your own risk."),
{'driver_name': driver.__class__.__name__,
'version': driver.get_version()},
resource={'type': 'driver',
'id': driver.__class__.__name__})
def get_file_mode(path):

View File

@ -265,6 +265,13 @@ volume_opts = [
help='If this is set to True, the backup_use_temp_snapshot '
'path will be used during the backup. Otherwise, it '
'will use backup_use_temp_volume path.'),
cfg.BoolOpt('enable_unsupported_driver',
default=False,
help="Set this to True when you want to allow an usupported "
"driver to start. Drivers that haven't maintained a "
"working CI system and testing are marked as unsupported "
"until CI is working again. This also marks a driver as "
"deprecated and may be removed in the next release."),
]
# for backward compatibility
@ -356,6 +363,12 @@ class BaseVD(object):
# set True by manager after successful check_for_setup
self._initialized = False
# If a driver hasn't maintained their CI system, this will get
# set to False, which prevents the driver from starting.
# Add enable_unsupported_driver = True inn cinder.conf to get
# the unsupported driver started.
self._supported = True
def _driver_data_namespace(self):
namespace = self.__class__.__name__
if self.configuration:
@ -480,6 +493,10 @@ class BaseVD(object):
def initialized(self):
return self._initialized
@property
def supported(self):
return self._supported
def set_throttle(self):
bps_limit = ((self.configuration and
self.configuration.safe_get('volume_copy_bps_limit')) or

View File

@ -62,7 +62,7 @@ def RaiseXIODriverException():
raise exception.XIODriverException()
class XIOISEDriver(object):
class XIOISEDriver(driver.VolumeDriver):
VERSION = '1.1.4'

View File

@ -375,6 +375,17 @@ class VolumeManager(manager.SchedulerDependentManager):
def init_host(self, added_to_cluster=None):
"""Perform any required initialization."""
ctxt = context.get_admin_context()
if not self.driver.supported:
utils.log_unsupported_driver_warning(self.driver)
if not self.configuration.enable_unsupported_driver:
LOG.error(_LE("Unsupported drivers are disabled."
" You can re-enable by adding "
"enable_unsupported_driver=True to the "
"driver section in cinder.conf"),
resource={'type': 'driver',
'id': self.__class__.__name__})
return
# If we have just added this host to a cluster we have to include all
# our resources in that cluster.
@ -485,6 +496,17 @@ class VolumeManager(manager.SchedulerDependentManager):
{'driver_name': self.driver.__class__.__name__,
'version': self.driver.get_version()})
try:
# Make sure the driver is initialized first
utils.log_unsupported_driver_warning(self.driver)
utils.require_driver_initialized(self.driver)
except exception.DriverNotInitialized:
LOG.error(_LE("Cannot complete RPC initialization because "
"driver isn't initialized properly."),
resource={'type': 'driver',
'id': self.driver.__class__.__name__})
return
stats = self.driver.get_volume_stats(refresh=True)
svc_host = vol_utils.extract_host(self.host, 'backend')
try:
@ -522,6 +544,9 @@ class VolumeManager(manager.SchedulerDependentManager):
filter_properties=None, allow_reschedule=True,
volume=None):
"""Creates the volume."""
# Log about unsupported drivers
utils.log_unsupported_driver_warning(self.driver)
# FIXME(dulek): Remove this in v3.0 of RPC API.
if volume is None:
# For older clients, mimic the old behavior and look up the volume

View File

@ -0,0 +1,3 @@
---
features:
- Added supported driver checks on all drivers.