diff --git a/nova/compute/api.py b/nova/compute/api.py index 6f4f81d96603..45f0eebd4dab 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -4099,13 +4099,16 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase): def get(self, context, name=None, id=None, map_exception=False): self.ensure_default(context) + cols = ['rules'] try: if name: return self.db.security_group_get_by_name(context, context.project_id, - name) + name, + columns_to_join=cols) elif id: - return self.db.security_group_get(context, id) + return self.db.security_group_get(context, id, + columns_to_join=cols) except exception.NotFound as exp: if map_exception: msg = exp.format_message() diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ed482b9b77fa..ed1d82b8d80e 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -4301,7 +4301,11 @@ def security_group_get_all(context): @require_context @main_context_manager.reader def security_group_get(context, security_group_id, columns_to_join=None): - query = _security_group_get_query(context, project_only=True).\ + join_rules = columns_to_join and 'rules' in columns_to_join + if join_rules: + columns_to_join.remove('rules') + query = _security_group_get_query(context, project_only=True, + join_rules=join_rules).\ filter_by(id=security_group_id) if columns_to_join is None: diff --git a/nova/tests/unit/api/openstack/compute/test_security_groups.py b/nova/tests/unit/api/openstack/compute/test_security_groups.py index c72b46cbc347..7ab10354d07d 100644 --- a/nova/tests/unit/api/openstack/compute/test_security_groups.py +++ b/nova/tests/unit/api/openstack/compute/test_security_groups.py @@ -114,7 +114,8 @@ def return_non_running_server(context, server_id, columns_to_join=None): 'uuid': server_id, 'host': "localhost", 'name': 'asdf'}) -def return_security_group_by_name(context, project_id, group_name): +def return_security_group_by_name(context, project_id, group_name, + columns_to_join=None): return {'id': 1, 'name': group_name, "instances": [{'id': 1, 'uuid': UUID_SERVER}]} @@ -473,7 +474,7 @@ class TestSecurityGroupsV21(test.TestCase): def test_get_security_group_by_id(self): sg = security_group_template(id=2, rules=[]) - def return_security_group(context, group_id): + def return_security_group(context, group_id, columns_to_join=None): self.assertEqual(sg['id'], group_id) return security_group_db(sg) @@ -498,7 +499,7 @@ class TestSecurityGroupsV21(test.TestCase): sg_update = security_group_template(id=2, rules=[], name='update_name', description='update_desc') - def return_security_group(context, group_id): + def return_security_group(context, group_id, columns_to_join=None): self.assertEqual(sg['id'], group_id) return security_group_db(sg) @@ -523,7 +524,7 @@ class TestSecurityGroupsV21(test.TestCase): def test_update_security_group_name_to_default(self): sg = security_group_template(id=2, rules=[], name='default') - def return_security_group(context, group_id): + def return_security_group(context, group_id, columns_to_join=None): self.assertEqual(sg['id'], group_id) return security_group_db(sg) @@ -548,7 +549,7 @@ class TestSecurityGroupsV21(test.TestCase): def security_group_destroy(context, id): self.called = True - def return_security_group(context, group_id): + def return_security_group(context, group_id, columns_to_join=None): self.assertEqual(sg['id'], group_id) return security_group_db(sg) @@ -592,7 +593,7 @@ class TestSecurityGroupsV21(test.TestCase): def security_group_in_use(context, id): return True - def return_security_group(context, group_id): + def return_security_group(context, group_id, columns_to_join=None): self.assertEqual(sg['id'], group_id) return security_group_db(sg) diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index 7b3ec229f7dd..db61ad13b92d 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -2004,14 +2004,16 @@ class SecurityGroupTestCase(test.TestCase, ModelsObjectComparatorMixin): self.ctxt, security_group1['id']) self._assertEqualObjects(db.security_group_get( self.ctxt, security_group2['id'], - columns_to_join=['instances']), security_group2) + columns_to_join=['instances', + 'rules']), security_group2) def test_security_group_get(self): security_group1 = self._create_security_group({}) self._create_security_group({'name': 'fake_sec_group2'}) real_security_group = db.security_group_get(self.ctxt, security_group1['id'], - columns_to_join=['instances']) + columns_to_join=['instances', + 'rules']) self._assertEqualObjects(security_group1, real_security_group)