Remove restoring soft deleted entries part 2

There is no need to reuse deleted entries, because they will be archived after
db-archiving implementation. And restoring soft deleted entries produce some
problem with db-unique-keys implementation. So the best way is to remove it.

instance_type_access_add() method
Remove restoring soft deleted instance_type_access entries

Add missing tests for instance_type_access_add

blueprint db-session-cleanup

Change-Id: I82ee56b50a8422a4b620f4e58967258bac7c01c6
This commit is contained in:
Boris Pavlovic 2013-01-15 13:25:11 +04:00
parent 3a92a9efe9
commit 309e47fd0c
2 changed files with 71 additions and 14 deletions

View File

@ -3671,7 +3671,7 @@ def instance_type_destroy(context, name):
@require_context
def _instance_type_access_query(context, session=None):
return model_query(context, models.InstanceTypeProjects, session=session,
read_deleted="yes")
read_deleted="no")
@require_admin_context
@ -3687,6 +3687,8 @@ def instance_type_access_get_by_flavor_id(context, flavor_id):
@require_admin_context
def instance_type_access_add(context, flavor_id, project_id):
"""Add given tenant to the flavor access list."""
# NOTE(boris-42): There is a race condition in this method and it will be
# rewritten after bp/db-unique-keys implementation.
session = get_session()
with session.begin():
instance_type_ref = instance_type_get_by_flavor_id(context, flavor_id,
@ -3694,21 +3696,16 @@ def instance_type_access_add(context, flavor_id, project_id):
instance_type_id = instance_type_ref['id']
access_ref = _instance_type_access_query(context, session=session).\
filter_by(instance_type_id=instance_type_id).\
filter_by(project_id=project_id).first()
if not access_ref:
access_ref = models.InstanceTypeProjects()
access_ref.instance_type_id = instance_type_id
access_ref.project_id = project_id
access_ref.save(session=session)
elif access_ref.deleted:
access_ref.update({'deleted': False,
'deleted_at': None})
access_ref.save(session=session)
else:
filter_by(project_id=project_id).\
first()
if access_ref:
raise exception.FlavorAccessExists(flavor_id=flavor_id,
project_id=project_id)
access_ref = models.InstanceTypeProjects()
access_ref.update({"instance_type_id": instance_type_id,
"project_id": project_id})
access_ref.save(session=session)
return access_ref
@ -3724,7 +3721,6 @@ def instance_type_access_remove(context, flavor_id, project_id):
filter_by(instance_type_id=instance_type_id).\
filter_by(project_id=project_id).\
soft_delete()
if count == 0:
raise exception.FlavorAccessNotFound(flavor_id=flavor_id,
project_id=project_id)

View File

@ -142,6 +142,67 @@ class InstanceTypeTestCase(test.TestCase):
self.assertRaises(exception.InvalidInput, instance_types.create,
name, 256, 1, 120, 100, flavorid)
def test_add_instance_type_access(self):
user_id = 'fake'
project_id = 'fake'
ctxt = context.RequestContext(user_id, project_id, is_admin=True)
flavor_id = 'flavor1'
type_ref = instance_types.create('some flavor', 256, 1, 120, 100,
flavorid=flavor_id)
access_ref = instance_types.add_instance_type_access(flavor_id,
project_id,
ctxt=ctxt)
self.assertEqual(access_ref["project_id"], project_id)
self.assertEqual(access_ref["instance_type_id"], type_ref["id"])
def test_add_instance_type_access_already_exists(self):
user_id = 'fake'
project_id = 'fake'
ctxt = context.RequestContext(user_id, project_id, is_admin=True)
flavor_id = 'flavor1'
type_ref = instance_types.create('some flavor', 256, 1, 120, 100,
flavorid=flavor_id)
access_ref = instance_types.add_instance_type_access(flavor_id,
project_id,
ctxt=ctxt)
self.assertRaises(exception.FlavorAccessExists,
instance_types.add_instance_type_access,
flavor_id, project_id, ctxt)
def test_add_instance_type_access_invalid_flavor(self):
user_id = 'fake'
project_id = 'fake'
ctxt = context.RequestContext(user_id, project_id, is_admin=True)
flavor_id = 'no_such_flavor'
self.assertRaises(exception.FlavorNotFound,
instance_types.add_instance_type_access,
flavor_id, project_id, ctxt)
def test_remove_instance_type_access(self):
user_id = 'fake'
project_id = 'fake'
ctxt = context.RequestContext(user_id, project_id, is_admin=True)
flavor_id = 'flavor1'
it = instance_types
type_ref = it.create('some flavor', 256, 1, 120, 100,
flavorid=flavor_id)
access_ref = it.add_instance_type_access(flavor_id, project_id, ctxt)
it.remove_instance_type_access(flavor_id, project_id, ctxt)
projects = it.get_instance_type_access_by_flavor_id(flavor_id, ctxt)
self.assertEqual([], projects)
def test_remove_instance_type_access_doesnt_exists(self):
user_id = 'fake'
project_id = 'fake'
ctxt = context.RequestContext(user_id, project_id, is_admin=True)
flavor_id = 'flavor1'
type_ref = instance_types.create('some flavor', 256, 1, 120, 100,
flavorid=flavor_id)
self.assertRaises(exception.FlavorAccessNotFound,
instance_types.remove_instance_type_access,
flavor_id, project_id, ctxt=ctxt)
def test_get_all_instance_types(self):
# Ensures that all instance types can be retrieved.
session = sql_session.get_session()