Deleting a backup removed the backup record from database

Instead we should be marking the backup as deleted so that we have an audit
of all the backups. Backups are now marked deleted in the way that volumes
are.

Fixes bug: 1169943
Fixes bug: 1169857

Change-Id: I52c603be138c0f1d6d411d167977041255ac9053
This commit is contained in:
Michael Kerrin 2013-04-17 15:36:28 +00:00
parent b2e20f87d2
commit a4ba17b668
2 changed files with 57 additions and 7 deletions

View File

@ -1936,28 +1936,31 @@ def sm_volume_get_all(context):
@require_context
def backup_get(context, backup_id, session=None):
result = model_query(context, models.Backup,
read_deleted="yes").filter_by(id=backup_id).first()
session=session, project_only=True).\
filter_by(id=backup_id).\
first()
if not result:
raise exception.BackupNotFound(backup_id=backup_id)
return result
@require_admin_context
def backup_get_all(context):
return model_query(context, models.Backup, read_deleted="yes").all()
return model_query(context, models.Backup).all()
@require_admin_context
def backup_get_all_by_host(context, host):
return model_query(context, models.Backup,
read_deleted="yes").filter_by(host=host).all()
return model_query(context, models.Backup).filter_by(host=host).all()
@require_context
def backup_get_all_by_project(context, project_id):
authorize_project_context(context, project_id)
return model_query(context, models.Backup, read_deleted="yes").\
return model_query(context, models.Backup).\
filter_by(project_id=project_id).all()
@ -1992,5 +1995,9 @@ def backup_update(context, backup_id, values):
def backup_destroy(context, backup_id):
session = get_session()
with session.begin():
model_query(context, models.Backup,
read_deleted="yes").filter_by(id=backup_id).delete()
session.query(models.Backup).\
filter_by(id=backup_id).\
update({'status': 'deleted',
'deleted': True,
'deleted_at': timeutils.utcnow(),
'updated_at': literal_column('updated_at')})

View File

@ -25,6 +25,7 @@ from cinder import exception
from cinder import flags
from cinder.openstack.common import importutils
from cinder.openstack.common import log as logging
from cinder.openstack.common import timeutils
from cinder import test
FLAGS = flags.FLAGS
@ -341,6 +342,12 @@ class BackupTestCase(test.TestCase):
self.ctxt,
backup_id)
ctxt_read_deleted = context.get_admin_context('yes')
backup = db.backup_get(ctxt_read_deleted, backup_id)
self.assertEqual(backup.deleted, True)
self.assertTrue(timeutils.utcnow() > backup.deleted_at)
self.assertEqual(backup.status, 'deleted')
def test_list_backup(self):
backups = db.backup_get_all_by_project(self.ctxt, 'project1')
self.assertEqual(len(backups), 0)
@ -350,3 +357,39 @@ class BackupTestCase(test.TestCase):
backups = db.backup_get_all_by_project(self.ctxt, 'project1')
self.assertEqual(len(backups), 1)
self.assertEqual(backups[0].id, b2)
def test_backup_get_all_by_project_with_deleted(self):
"""Test deleted backups don't show up in backup_get_all_by_project.
Unless context.read_deleted is 'yes'"""
backups = db.backup_get_all_by_project(self.ctxt, 'fake')
self.assertEqual(len(backups), 0)
backup_id_keep = self._create_backup_db_entry()
backup_id = self._create_backup_db_entry()
db.backup_destroy(self.ctxt, backup_id)
backups = db.backup_get_all_by_project(self.ctxt, 'fake')
self.assertEqual(len(backups), 1)
self.assertEqual(backups[0].id, backup_id_keep)
ctxt_read_deleted = context.get_admin_context('yes')
backups = db.backup_get_all_by_project(ctxt_read_deleted, 'fake')
self.assertEqual(len(backups), 2)
def test_backup_get_all_by_host_with_deleted(self):
"""Test deleted backups don't show up in backup_get_all_by_project.
Unless context.read_deleted is 'yes'"""
backups = db.backup_get_all_by_host(self.ctxt, 'testhost')
self.assertEqual(len(backups), 0)
backup_id_keep = self._create_backup_db_entry()
backup_id = self._create_backup_db_entry()
db.backup_destroy(self.ctxt, backup_id)
backups = db.backup_get_all_by_host(self.ctxt, 'testhost')
self.assertEqual(len(backups), 1)
self.assertEqual(backups[0].id, backup_id_keep)
ctxt_read_deleted = context.get_admin_context('yes')
backups = db.backup_get_all_by_host(ctxt_read_deleted, 'testhost')
self.assertEqual(len(backups), 2)