Fix a lazy-load exception in security_group_update()

When security_group_api is nova, the update_security_group api raises http
500 error: group rules fails with lazy load exception. Because the rule
infos of the security group will be return in response body, but the rule
attribute hasn't been preloaded.

Closes-Bug: #1244018
Change-Id: Ie07879ac22e4add90f75968778bf334915e8349c
This commit is contained in:
huangtianhua 2013-10-24 10:21:50 +08:00
parent 18d3a0b07f
commit b9b55935cb
5 changed files with 24 additions and 12 deletions

View File

@ -3451,9 +3451,11 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
group = {'name': name,
'description': description}
columns_to_join = ['rules.grantee_group']
group_ref = self.db.security_group_update(context,
security_group['id'],
group)
security_group['id'],
group,
columns_to_join=columns_to_join)
return group_ref
def get(self, context, name=None, id=None, map_exception=False):

View File

@ -1248,9 +1248,11 @@ def security_group_create(context, values):
return IMPL.security_group_create(context, values)
def security_group_update(context, security_group_id, values):
def security_group_update(context, security_group_id, values,
columns_to_join=None):
"""Update a security group."""
return IMPL.security_group_update(context, security_group_id, values)
return IMPL.security_group_update(context, security_group_id, values,
columns_to_join=columns_to_join)
def security_group_ensure_default(context):

View File

@ -3719,13 +3719,16 @@ def security_group_create(context, values):
@require_context
def security_group_update(context, security_group_id, values):
def security_group_update(context, security_group_id, values,
columns_to_join=None):
session = get_session()
with session.begin():
security_group_ref = model_query(context, models.SecurityGroup,
session=session).\
filter_by(id=security_group_id).\
first()
query = model_query(context, models.SecurityGroup,
session=session).filter_by(id=security_group_id)
if columns_to_join:
for column in columns_to_join:
query = query.options(joinedload_all(column))
security_group_ref = query.first()
if not security_group_ref:
raise exception.SecurityGroupNotFound(

View File

@ -426,7 +426,8 @@ class TestSecurityGroups(test.TestCase):
self.assertEqual(sg['id'], group_id)
return security_group_db(sg)
def return_update_security_group(context, group_id, values):
def return_update_security_group(context, group_id, values,
columns_to_join=None):
self.assertEqual(sg_update['id'], group_id)
self.assertEqual(sg_update['name'], values['name'])
self.assertEqual(sg_update['description'], values['description'])

View File

@ -1297,11 +1297,15 @@ class SecurityGroupTestCase(test.TestCase, ModelsObjectComparatorMixin):
'user_id': 'fake_user1',
'project_id': 'fake_proj1',
}
columns_to_join = ['rules.grantee_group']
updated_group = db.security_group_update(self.ctxt,
security_group['id'],
new_values)
security_group['id'],
new_values,
columns_to_join=['rules.grantee_group'])
for key, value in new_values.iteritems():
self.assertEqual(updated_group[key], value)
self.assertEqual(updated_group['rules'], [])
def test_security_group_update_to_duplicate(self):
security_group1 = self._create_security_group(