diff --git a/cinder/backup/manager.py b/cinder/backup/manager.py index 1110cebdb76..600a890cd6f 100644 --- a/cinder/backup/manager.py +++ b/cinder/backup/manager.py @@ -369,7 +369,6 @@ class BackupManager(manager.ThreadPoolManager): self._notify_about_backup_usage(context, backup, "create.start") backup.host = self.host - backup.service = self.driver_name backup.availability_zone = self.az backup.save() @@ -408,9 +407,12 @@ class BackupManager(manager.ThreadPoolManager): try: 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) raise exception.InvalidBackup(reason=err) + + backup.service = self.driver_name + backup.save() updates = self._run_backup(context, backup, volume) except Exception as err: with excutils.save_and_reraise_exception(): @@ -736,8 +738,8 @@ class BackupManager(manager.ThreadPoolManager): self._update_backup_error(backup, err) raise exception.InvalidBackup(reason=err) - if not self.is_working(): - err = _('Delete backup is aborted due to backup service is down') + if backup.service and not self.is_working(): + err = _('Delete backup is aborted due to backup service is down.') status = fields.BackupStatus.ERROR_DELETING self._update_backup_error(backup, err, status) raise exception.InvalidBackup(reason=err) diff --git a/cinder/tests/unit/api/contrib/test_backups.py b/cinder/tests/unit/api/contrib/test_backups.py index d30019bbf20..f43c5b2664e 100644 --- a/cinder/tests/unit/api/contrib/test_backups.py +++ b/cinder/tests/unit/api/contrib/test_backups.py @@ -1441,6 +1441,27 @@ class BackupsAPITestCase(test.TestCase): 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') def test_restore_backup_volume_id_specified_json( self, _mock_get_backup_host):