diff --git a/cinder/cmd/status.py b/cinder/cmd/status.py index 9e8540016ab..a2f8728eadb 100644 --- a/cinder/cmd/status.py +++ b/cinder/cmd/status.py @@ -18,12 +18,20 @@ import os import sys +from cinder import objects +from cinder import service # noqa from oslo_config import cfg from oslo_upgradecheck import upgradecheck as uc from cinder.policy import DEFAULT_POLICY_FILENAME import cinder.service # noqa +# We must first register Cinder's objects. Otherwise +# we cannot import the volume manager. +objects.register_all() + +import cinder.volume.manager as volume_manager + CONF = cfg.CONF SUCCESS = uc.Code.SUCCESS @@ -31,6 +39,20 @@ FAILURE = uc.Code.FAILURE WARNING = uc.Code.WARNING +def _get_enabled_drivers(): + """Returns a list of volume_driver entries""" + volume_drivers = [] + if CONF.enabled_backends: + for backend in filter(None, CONF.enabled_backends): + # Each backend group needs to be registered first + CONF.register_opts(volume_manager.volume_backend_opts, + group=backend) + volume_driver = CONF[backend]['volume_driver'] + volume_drivers.append(volume_driver) + + return volume_drivers + + class Checks(uc.UpgradeCommands): """Upgrade checks to run.""" @@ -151,10 +173,35 @@ class Checks(uc.UpgradeCommands): return uc.Result(SUCCESS) + def _check_legacy_windows_config(self): + """Checks to ensure that the Windows driver path is properly updated. + + The WindowsDriver was renamed in the Queens release to + WindowsISCSIDriver to avoid confusion with the SMB driver. + The backwards compatibility for this has now been removed, so + any cinder.conf settings still using + cinder.volume.drivers.windows.windows.WindowsDriver + must now be updated to use + cinder.volume.drivers.windows.iscsi.WindowsISCSIDriver. + """ + for volume_driver in _get_enabled_drivers(): + if (volume_driver == + "cinder.volume.drivers.windows.windows.WindowsDriver"): + return uc.Result( + FAILURE, + 'Setting volume_driver to ' + 'cinder.volume.drivers.windows.windows.WindowsDriver ' + 'is no longer supported. Please update to use ' + 'cinder.volume.drivers.windows.iscsi.WindowsISCSIDriver ' + 'in cinder.conf.') + + return uc.Result(SUCCESS) + _upgrade_checks = ( # added in Stein ('Backup Driver Path', _check_backup_module), ('Use of Policy File', _check_policy_file), + ('Windows Driver Path', _check_legacy_windows_config), # added in Train ('Periodic Interval Use', _check_periodic_interval), ('Use of Nest Quota Driver', _check_nested_quota), diff --git a/cinder/tests/unit/cmd/test_status.py b/cinder/tests/unit/cmd/test_status.py index 26997944015..ae8cb4fb0a1 100644 --- a/cinder/tests/unit/cmd/test_status.py +++ b/cinder/tests/unit/cmd/test_status.py @@ -20,6 +20,8 @@ import testtools from cinder.cmd import status +import cinder.volume.manager as volume_manager + CONF = cfg.CONF @@ -48,6 +50,16 @@ class TestCinderStatus(testtools.TestCase): CONF.set_override(key, value, group=group) self.addCleanup(CONF.clear_override, key, group=group) + def _set_volume_driver(self, volume_driver, enabled_backend): + CONF.register_opts(volume_manager.volume_backend_opts, + group=enabled_backend) + CONF.set_override('enabled_backends', enabled_backend) + CONF.set_override('volume_driver', volume_driver, + group=enabled_backend) + self.addCleanup(CONF.clear_override, 'volume_driver', + group=enabled_backend) + self.addCleanup(CONF.clear_override, 'enabled_backends') + def test_check_backup_module(self): self._set_config( 'backup_driver', @@ -123,3 +135,23 @@ class TestCinderStatus(testtools.TestCase): else: expected = uc.Code.WARNING self.assertEqual(expected, result.code) + + def test_check_legacy_win_conf(self): + self._set_volume_driver( + 'cinder.volume.drivers.windows.iscsi.WindowsISCSIDriver', + 'winiscsi') + result = self.checks._check_legacy_windows_config() + self.assertEqual(uc.Code.SUCCESS, result.code) + + def test_check_legacy_win_conf_fail(self): + self._set_volume_driver( + 'cinder.volume.drivers.windows.windows.WindowsDriver', + 'winiscsi') + result = self.checks._check_legacy_windows_config() + self.assertEqual(uc.Code.FAILURE, result.code) + self.assertIn('Please update to use', result.details) + + def test_check_legacy_win_conf_no_drivers(self): + self._set_config('enabled_backends', None) + result = self.checks._check_legacy_windows_config() + self.assertEqual(uc.Code.SUCCESS, result.code) diff --git a/doc/source/cli/cinder-status.rst b/doc/source/cli/cinder-status.rst index a19145bbe39..295092ee974 100644 --- a/doc/source/cli/cinder-status.rst +++ b/doc/source/cli/cinder-status.rst @@ -89,6 +89,7 @@ Upgrade class path and not just the module path. * Checks for the presence of a **policy.json** file have been added to warn if policy changes should be present in a **policy.yaml** file. + * Ensure that correct volume_driver path is used for Windows iSCSI driver. **15.0.0 (Train)** diff --git a/releasenotes/notes/cinder-status-check-windows_iscsi_driver-5f4e0b93c7b92f53.yaml b/releasenotes/notes/cinder-status-check-windows_iscsi_driver-5f4e0b93c7b92f53.yaml new file mode 100644 index 00000000000..1911fcb56a7 --- /dev/null +++ b/releasenotes/notes/cinder-status-check-windows_iscsi_driver-5f4e0b93c7b92f53.yaml @@ -0,0 +1,8 @@ +--- +upgrade: + - | + A new check is added to the ``cinder-status upgrade check`` CLI to check + for the use of ``cinder.volume.drivers.windows.windows.WindowsDriver`` + and a message is reported that the user needs to update the setting + to ``cinder.volume.drivers.windows.iscsi.WindowsISCSIDriver`` if + it is encountered.