Browse Source

Call _init_volume_driver in backup manager

When fixing backup using temp snapshot code path, the call to
_init_volume_driver was missed:
    https://review.openstack.org/#/c/321943/

For drivers that rely on do_setup to initialize the driver, this
is a problem because the driver cannot be used without this call.

This patch fixes the problem by calling _init_volume_driver in
init_host.

Change-Id: Ic197046a480dbf8d73a229580e59cd6d489355fa
Closes-Bug: #1594225
changes/35/331835/4
xing-yang 5 years ago
parent
commit
cbdd0fa1fa
  1. 20
      cinder/backup/manager.py
  2. 16
      cinder/tests/unit/backup/test_backup.py

20
cinder/backup/manager.py

@ -170,6 +170,23 @@ class BackupManager(manager.SchedulerDependentManager):
LOG.debug("Registering default backend %s.", default)
self.volume_managers['default'] = default
def _init_volume_driver(self, ctxt, driver):
LOG.info(_LI("Starting volume driver %(driver_name)s (%(version)s)."),
{'driver_name': driver.__class__.__name__,
'version': driver.get_version()})
try:
driver.do_setup(ctxt)
driver.check_for_setup_error()
except Exception:
LOG.exception(_LE("Error encountered during initialization of "
"driver: %(name)s."),
{'name': driver.__class__.__name__})
# we don't want to continue since we failed
# to initialize the driver correctly.
return
driver.set_initialized()
@property
def driver_name(self):
"""This function maps old backup services to backup drivers."""
@ -192,6 +209,9 @@ class BackupManager(manager.SchedulerDependentManager):
"""Run initialization needed for a standalone service."""
ctxt = context.get_admin_context()
for mgr in self.volume_managers.values():
self._init_volume_driver(ctxt, mgr.driver)
try:
self._cleanup_incomplete_backup_operations(ctxt)
except Exception:

16
cinder/tests/unit/backup/test_backup.py

@ -26,6 +26,7 @@ from oslo_db import exception as db_exc
from oslo_utils import importutils
from oslo_utils import timeutils
import cinder
from cinder.backup import api
from cinder.backup import manager
from cinder import context
@ -204,8 +205,15 @@ class BaseBackupTest(test.TestCase):
class BackupTestCase(BaseBackupTest):
"""Test Case for backups."""
@mock.patch.object(cinder.tests.unit.fake_driver.FakeISCSIDriver,
'set_initialized')
@mock.patch.object(cinder.tests.unit.fake_driver.FakeISCSIDriver,
'do_setup')
@mock.patch.object(cinder.tests.unit.fake_driver.FakeISCSIDriver,
'check_for_setup_error')
@mock.patch('cinder.context.get_admin_context')
def test_init_host(self, mock_get_admin_context):
def test_init_host(self, mock_get_admin_context, mock_check, mock_setup,
mock_set_initialized):
"""Test stuck volumes and backups.
Make sure stuck volumes and backups are reset to correct
@ -249,8 +257,14 @@ class BackupTestCase(BaseBackupTest):
temp_snapshot_id=temp_snap.id)
mock_get_admin_context.side_effect = get_admin_context
self.volume = importutils.import_object(CONF.volume_manager)
self.backup_mgr.volume_managers = {'driver': self.volume}
self.backup_mgr.init_host()
mock_setup.assert_called_once_with(self.ctxt)
mock_check.assert_called_once_with()
mock_set_initialized.assert_called_once_with()
vol1 = db.volume_get(self.ctxt, vol1_id)
self.assertEqual('available', vol1['status'])
vol2 = db.volume_get(self.ctxt, vol2_id)

Loading…
Cancel
Save