From 5c4349cffea146ff8aac2e63249141c3c1474353 Mon Sep 17 00:00:00 2001 From: Gorka Eguileor Date: Thu, 28 Oct 2021 09:45:33 +0200 Subject: [PATCH] Support driver's setup method As part of the effort to simplify and properly define the driver interface, Cinder consolidated methods do_setup and check_for_setup_error in a single method called setup. This patch provides support for both mechanisms in cinderlib. Change-Id: Id037c1b8a570eea704c136f35ac0b262ca5b0dfa --- cinderlib/cinderlib.py | 10 +++++-- cinderlib/tests/unit/test_cinderlib.py | 41 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/cinderlib/cinderlib.py b/cinderlib/cinderlib.py index bf2aa95..bc4bde5 100644 --- a/cinderlib/cinderlib.py +++ b/cinderlib/cinderlib.py @@ -106,8 +106,14 @@ class Backend(object): host='%s@%s' % (cfg.CONF.host, volume_backend_name), cluster_name=None, # We don't use cfg.CONF.cluster for now active_backend_id=None) # No failover for now - self.driver.do_setup(objects.CONTEXT) - self.driver.check_for_setup_error() + + # do_setup and check_for_setup errors were merged into setup in Yoga. + # First try the old interface, and if it fails, try the new one. + try: + self.driver.do_setup(objects.CONTEXT) + self.driver.check_for_setup_error() + except AttributeError: + self.driver.setup(objects.CONTEXT) self.driver.init_capabilities() self.driver.set_throttle() diff --git a/cinderlib/tests/unit/test_cinderlib.py b/cinderlib/tests/unit/test_cinderlib.py index 99dd51b..83d8f5d 100644 --- a/cinderlib/tests/unit/test_cinderlib.py +++ b/cinderlib/tests/unit/test_cinderlib.py @@ -104,6 +104,47 @@ class TestCinderlib(base.BaseTest): self.assertEqual(('default',), backend.pool_names) mock_workarounds.assert_called_once_with(mock_config.return_value) + @mock.patch('cinderlib.Backend._apply_backend_workarounds') + @mock.patch('oslo_utils.importutils.import_object') + @mock.patch('cinderlib.Backend._get_backend_config') + @mock.patch('cinderlib.Backend.global_setup') + def test_init_setup(self, mock_global_setup, mock_config, mock_import, + mock_workarounds): + """Test initialization with the new 'setup' driver method.""" + cfg.CONF.set_override('host', 'host') + driver_cfg = {'k': 'v', 'k2': 'v2', 'volume_backend_name': 'Test'} + cinderlib.Backend.global_initialization = False + driver = mock_import.return_value + driver.do_setup.side_effect = AttributeError + driver.capabilities = {'pools': [{'pool_name': 'default'}]} + + backend = objects.Backend(**driver_cfg) + + mock_global_setup.assert_called_once_with() + self.assertIn('Test', objects.Backend.backends) + self.assertEqual(backend, objects.Backend.backends['Test']) + mock_config.assert_called_once_with(driver_cfg) + + conf = mock_config.return_value + mock_import.assert_called_once_with(conf.volume_driver, + configuration=conf, + db=self.persistence.db, + host='host@Test', + cluster_name=None, + active_backend_id=None) + self.assertEqual(backend.driver, driver) + driver.do_setup.assert_called_once_with(objects.CONTEXT) + driver.check_for_setup_error.assert_not_called() + driver.setup.assert_called_once_with(objects.CONTEXT) + driver.init_capabilities.assert_called_once_with() + driver.set_throttle.assert_called_once_with() + driver.set_initialized.assert_called_once_with() + self.assertEqual(driver_cfg, backend._driver_cfg) + self.assertIsNone(backend._volumes) + driver.get_volume_stats.assert_not_called() + self.assertEqual(('default',), backend.pool_names) + mock_workarounds.assert_called_once_with(mock_config.return_value) + @mock.patch.object(objects.Backend, 'global_initialization', True) @mock.patch.object(objects.Backend, '_apply_backend_workarounds') @mock.patch('oslo_utils.importutils.import_object')