Save the backup.service just before _run_backup
When the judgement of self.is_working() is false, it means the backup service is not ready and the backup will be interrupted. We will not allow to delete this backup util the backup service is configured correctly and starts successfully. This patch fix this, if the backup service was not working or we just used a wrong backup service at that time, and now we want to cleanup the backups, it is OK to do backup delete. There is no need to do more! Change-Id: I7163f026a497db8876c495d15bef9c006eadd17b
This commit is contained in:
@@ -369,7 +369,6 @@ class BackupManager(manager.ThreadPoolManager):
|
|||||||
self._notify_about_backup_usage(context, backup, "create.start")
|
self._notify_about_backup_usage(context, backup, "create.start")
|
||||||
|
|
||||||
backup.host = self.host
|
backup.host = self.host
|
||||||
backup.service = self.driver_name
|
|
||||||
backup.availability_zone = self.az
|
backup.availability_zone = self.az
|
||||||
backup.save()
|
backup.save()
|
||||||
|
|
||||||
@@ -408,9 +407,12 @@ class BackupManager(manager.ThreadPoolManager):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if not self.is_working():
|
if not self.is_working():
|
||||||
err = _('Create backup aborted due to backup service is down')
|
err = _('Create backup aborted due to backup service is down.')
|
||||||
self._update_backup_error(backup, err)
|
self._update_backup_error(backup, err)
|
||||||
raise exception.InvalidBackup(reason=err)
|
raise exception.InvalidBackup(reason=err)
|
||||||
|
|
||||||
|
backup.service = self.driver_name
|
||||||
|
backup.save()
|
||||||
updates = self._run_backup(context, backup, volume)
|
updates = self._run_backup(context, backup, volume)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
@@ -736,8 +738,8 @@ class BackupManager(manager.ThreadPoolManager):
|
|||||||
self._update_backup_error(backup, err)
|
self._update_backup_error(backup, err)
|
||||||
raise exception.InvalidBackup(reason=err)
|
raise exception.InvalidBackup(reason=err)
|
||||||
|
|
||||||
if not self.is_working():
|
if backup.service and not self.is_working():
|
||||||
err = _('Delete backup is aborted due to backup service is down')
|
err = _('Delete backup is aborted due to backup service is down.')
|
||||||
status = fields.BackupStatus.ERROR_DELETING
|
status = fields.BackupStatus.ERROR_DELETING
|
||||||
self._update_backup_error(backup, err, status)
|
self._update_backup_error(backup, err, status)
|
||||||
raise exception.InvalidBackup(reason=err)
|
raise exception.InvalidBackup(reason=err)
|
||||||
|
@@ -1440,6 +1440,27 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
backup.destroy()
|
backup.destroy()
|
||||||
|
|
||||||
|
@mock.patch('cinder.backup.manager.BackupManager.is_working')
|
||||||
|
@mock.patch('cinder.db.service_get_all')
|
||||||
|
def test_delete_backup_service_is_none_and_is_not_working(
|
||||||
|
self, _mock_service_get_all, _mock_backup_is_working):
|
||||||
|
_mock_service_get_all.return_value = [
|
||||||
|
{'availability_zone': 'az1', 'host': 'testhost',
|
||||||
|
'disabled': 0, 'updated_at': timeutils.utcnow(),
|
||||||
|
'uuid': 'a3a593da-7f8d-4bb7-8b4c-f2bc1e0b4824'}]
|
||||||
|
_mock_backup_is_working.return_value = False
|
||||||
|
backup = utils.create_backup(self.context,
|
||||||
|
status=fields.BackupStatus.AVAILABLE,
|
||||||
|
availability_zone='az1', host='testhost',
|
||||||
|
service=None)
|
||||||
|
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
||||||
|
fake.PROJECT_ID, backup.id))
|
||||||
|
req.method = 'DELETE'
|
||||||
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
res = req.get_response(fakes.wsgi_app(
|
||||||
|
fake_auth_context=self.user_context))
|
||||||
|
self.assertEqual(http_client.ACCEPTED, res.status_int)
|
||||||
|
|
||||||
@mock.patch('cinder.backup.api.API._get_available_backup_service_host')
|
@mock.patch('cinder.backup.api.API._get_available_backup_service_host')
|
||||||
def test_restore_backup_volume_id_specified_json(
|
def test_restore_backup_volume_id_specified_json(
|
||||||
self, _mock_get_backup_host):
|
self, _mock_get_backup_host):
|
||||||
|
Reference in New Issue
Block a user