summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-04-23 15:19:33 +0000
committerGerrit Code Review <review@openstack.org>2013-04-23 15:19:33 +0000
commit979abde683b3c606b76da22bac90f2c9fb1920f9 (patch)
tree9fb16013230986f7e23e9daa2281a3fc0b154fd3 /nova
parentbfc3a3ccb2811cc8a96a15987528e6639ec029bf (diff)
parent231964f76532dac66289448dba6b035594010d4c (diff)
Merge "Add option to exclude joins from instance_get_by_uuid"
Diffstat (limited to 'nova')
-rwxr-xr-xnova/compute/manager.py3
-rw-r--r--nova/conductor/api.py12
-rw-r--r--nova/conductor/manager.py8
-rw-r--r--nova/conductor/rpcapi.py9
-rw-r--r--nova/db/api.py4
-rw-r--r--nova/db/sqlalchemy/api.py28
-rw-r--r--nova/tests/compute/test_compute.py3
-rw-r--r--nova/tests/test_db_api.py39
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')