diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-04-23 15:19:33 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-04-23 15:19:33 +0000 |
| commit | 979abde683b3c606b76da22bac90f2c9fb1920f9 (patch) | |
| tree | 9fb16013230986f7e23e9daa2281a3fc0b154fd3 /nova | |
| parent | bfc3a3ccb2811cc8a96a15987528e6639ec029bf (diff) | |
| parent | 231964f76532dac66289448dba6b035594010d4c (diff) | |
Merge "Add option to exclude joins from instance_get_by_uuid"
Diffstat (limited to 'nova')
| -rwxr-xr-x | nova/compute/manager.py | 3 | ||||
| -rw-r--r-- | nova/conductor/api.py | 12 | ||||
| -rw-r--r-- | nova/conductor/manager.py | 8 | ||||
| -rw-r--r-- | nova/conductor/rpcapi.py | 9 | ||||
| -rw-r--r-- | nova/db/api.py | 4 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 28 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute.py | 3 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 39 |
8 files changed, 83 insertions, 23 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 5da050f60..7fbe8910e 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -3798,7 +3798,8 @@ class ComputeManager(manager.SchedulerDependentManager): # We re-query the DB to get the latest instance info to minimize # (not eliminate) race condition. u = self.conductor_api.instance_get_by_uuid(context, - db_instance['uuid']) + db_instance['uuid'], + columns_to_join=[]) db_power_state = u["power_state"] vm_state = u['vm_state'] diff --git a/nova/conductor/api.py b/nova/conductor/api.py index c7e824df4..eacc215ee 100644 --- a/nova/conductor/api.py +++ b/nova/conductor/api.py @@ -67,8 +67,10 @@ class LocalAPI(object): def instance_get(self, context, instance_id): return self._manager.instance_get(context, instance_id) - def instance_get_by_uuid(self, context, instance_uuid): - return self._manager.instance_get_by_uuid(context, instance_uuid) + def instance_get_by_uuid(self, context, instance_uuid, + columns_to_join=None): + return self._manager.instance_get_by_uuid(context, instance_uuid, + columns_to_join) def instance_destroy(self, context, instance): return self._manager.instance_destroy(context, instance) @@ -397,9 +399,11 @@ class API(object): def instance_get(self, context, instance_id): return self.conductor_rpcapi.instance_get(context, instance_id) - def instance_get_by_uuid(self, context, instance_uuid): + def instance_get_by_uuid(self, context, instance_uuid, + columns_to_join=None): return self.conductor_rpcapi.instance_get_by_uuid(context, - instance_uuid) + instance_uuid, + columns_to_join) def instance_get_all(self, context): return self.conductor_rpcapi.instance_get_all(context) diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 604d2ab4b..e6ccba5d1 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -49,7 +49,7 @@ datetime_fields = ['launched_at', 'terminated_at', 'updated_at'] class ConductorManager(manager.Manager): """Mission: TBD.""" - RPC_API_VERSION = '1.48' + RPC_API_VERSION = '1.49' def __init__(self, *args, **kwargs): super(ConductorManager, self).__init__(*args, **kwargs) @@ -102,9 +102,11 @@ class ConductorManager(manager.Manager): self.db.instance_get(context, instance_id)) @rpc_common.client_exceptions(exception.InstanceNotFound) - def instance_get_by_uuid(self, context, instance_uuid): + def instance_get_by_uuid(self, context, instance_uuid, + columns_to_join=None): return jsonutils.to_primitive( - self.db.instance_get_by_uuid(context, instance_uuid)) + self.db.instance_get_by_uuid(context, instance_uuid, + columns_to_join)) def instance_get_all(self, context): return jsonutils.to_primitive(self.db.instance_get_all(context)) diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py index adfe752ca..437bbfb81 100644 --- a/nova/conductor/rpcapi.py +++ b/nova/conductor/rpcapi.py @@ -87,6 +87,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): 1.47 - Added columns_to_join to instance_get_all_by_host and instance_get_all_by_filters 1.48 - Added compute_unrescue + 1.49 - Added columns_to_join to instance_get_by_uuid """ BASE_RPC_API_VERSION = '1.0' @@ -116,10 +117,12 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): instance_id=instance_id) return self.call(context, msg, version='1.24') - def instance_get_by_uuid(self, context, instance_uuid): + def instance_get_by_uuid(self, context, instance_uuid, + columns_to_join=None): msg = self.make_msg('instance_get_by_uuid', - instance_uuid=instance_uuid) - return self.call(context, msg, version='1.2') + instance_uuid=instance_uuid, + columns_to_join=columns_to_join) + return self.call(context, msg, version='1.49') def migration_get(self, context, migration_id): msg = self.make_msg('migration_get', migration_id=migration_id) diff --git a/nova/db/api.py b/nova/db/api.py index 4c00f05f9..289dbf1d7 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -588,9 +588,9 @@ def instance_destroy(context, instance_uuid, constraint=None, return rv -def instance_get_by_uuid(context, uuid): +def instance_get_by_uuid(context, uuid, columns_to_join=None): """Get an instance or raise if it does not exist.""" - return IMPL.instance_get_by_uuid(context, uuid) + return IMPL.instance_get_by_uuid(context, uuid, columns_to_join) def instance_get(context, instance_id): diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 4224d9c06..e9486ca22 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -38,6 +38,7 @@ from sqlalchemy import MetaData from sqlalchemy import or_ from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload_all +from sqlalchemy.orm import noload from sqlalchemy.schema import Table from sqlalchemy.sql.expression import asc from sqlalchemy.sql.expression import desc @@ -1511,13 +1512,15 @@ def instance_destroy(context, instance_uuid, constraint=None): @require_context -def instance_get_by_uuid(context, uuid): - return _instance_get_by_uuid(context, uuid) +def instance_get_by_uuid(context, uuid, columns_to_join=None): + return _instance_get_by_uuid(context, uuid, + columns_to_join=columns_to_join) @require_context -def _instance_get_by_uuid(context, uuid, session=None): - result = _build_instance_get(context, session=session).\ +def _instance_get_by_uuid(context, uuid, session=None, columns_to_join=None): + result = _build_instance_get(context, session=session, + columns_to_join=columns_to_join).\ filter_by(uuid=uuid).\ first() @@ -1545,13 +1548,20 @@ def instance_get(context, instance_id): @require_context -def _build_instance_get(context, session=None): - return model_query(context, models.Instance, session=session, +def _build_instance_get(context, session=None, columns_to_join=None): + query = model_query(context, models.Instance, session=session, project_only=True).\ options(joinedload_all('security_groups.rules')).\ - options(joinedload('info_cache')).\ - options(joinedload('metadata')).\ - options(joinedload('system_metadata')) + options(joinedload('info_cache')) + if columns_to_join is None: + columns_to_join = ['metadata', 'system_metadata'] + for column in columns_to_join: + query = query.options(joinedload(column)) + #NOTE(alaski) Stop lazy loading of columns not needed. + for col in ['metadata', 'system_metadata']: + if col not in columns_to_join: + query = query.options(noload(col)) + return query def _instances_fill_metadata(context, instances, manual_joins=None): diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 6bf612eee..dbd72a797 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -3888,7 +3888,8 @@ class ComputeTestCase(BaseTestCase): 'instance_uuid': instance['uuid'], 'status': None}) - def fake_instance_get_by_uuid(context, instance_uuid): + def fake_instance_get_by_uuid(context, instance_uuid, + cols_to_join=None): # raise InstanceNotFound exception for uuid 'noexist' if instance_uuid == 'noexist': raise exception.InstanceNotFound(instance_id=instance_uuid) diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 93685c359..0af6ed143 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -204,6 +204,45 @@ class DbApiTestCase(DbTestCase): {'display_name': u'test'}) self.assertEqual(1, len(result)) + def test_instance_get_by_uuid(self): + inst = self.create_instances_with_args() + fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) + result = db.instance_get_by_uuid(self.context, inst['uuid']) + meta = utils.metadata_to_dict(result['metadata']) + self.assertEqual(meta, fake_meta) + sys_meta = utils.metadata_to_dict(result['system_metadata']) + self.assertEqual(sys_meta, fake_sys) + + def test_instance_get_by_uuid_join_empty(self): + inst = self.create_instances_with_args() + fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) + result = db.instance_get_by_uuid(self.context, inst['uuid'], + columns_to_join=[]) + meta = utils.metadata_to_dict(result['metadata']) + self.assertEqual(meta, {}) + sys_meta = utils.metadata_to_dict(result['system_metadata']) + self.assertEqual(sys_meta, {}) + + def test_instance_get_by_uuid_join_meta(self): + inst = self.create_instances_with_args() + fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) + result = db.instance_get_by_uuid(self.context, inst['uuid'], + columns_to_join=['metadata']) + meta = utils.metadata_to_dict(result['metadata']) + self.assertEqual(meta, fake_meta) + sys_meta = utils.metadata_to_dict(result['system_metadata']) + self.assertEqual(sys_meta, {}) + + def test_instance_get_by_uuid_join_sys_meta(self): + inst = self.create_instances_with_args() + fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) + result = db.instance_get_by_uuid(self.context, inst['uuid'], + columns_to_join=['system_metadata']) + meta = utils.metadata_to_dict(result['metadata']) + self.assertEqual(meta, {}) + sys_meta = utils.metadata_to_dict(result['system_metadata']) + self.assertEqual(sys_meta, fake_sys) + def test_instance_get_all_by_filters_deleted(self): inst1 = self.create_instances_with_args() inst2 = self.create_instances_with_args(reservation_id='b') |
