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
(cherry picked from commit b9b55935cb
)
Conflicts:
nova/tests/api/openstack/compute/contrib/test_security_groups.py
Change-Id: Ie07879ac22e4add90f75968778bf334915e8349c
This commit is contained in:
parent
c91ad019ac
commit
98a2613bbc
|
@ -3412,9 +3412,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):
|
||||
|
|
|
@ -1231,9 +1231,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):
|
||||
|
|
|
@ -3694,13 +3694,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(
|
||||
|
|
|
@ -422,10 +422,11 @@ class TestSecurityGroups(test.TestCase):
|
|||
self.assertEquals(sg['id'], group_id)
|
||||
return security_group_db(sg)
|
||||
|
||||
def return_update_security_group(context, group_id, values):
|
||||
self.assertEquals(sg_update['id'], group_id)
|
||||
self.assertEquals(sg_update['name'], values['name'])
|
||||
self.assertEquals(sg_update['description'], values['description'])
|
||||
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'])
|
||||
return security_group_db(sg_update)
|
||||
|
||||
self.stubs.Set(nova.db, 'security_group_update',
|
||||
|
|
|
@ -1247,11 +1247,14 @@ class SecurityGroupTestCase(test.TestCase, ModelsObjectComparatorMixin):
|
|||
'user_id': 'fake_user1',
|
||||
'project_id': 'fake_proj1',
|
||||
}
|
||||
|
||||
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(
|
||||
|
|
Loading…
Reference in New Issue