summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Smith <danms@us.ibm.com>2012-11-27 13:39:06 -0800
committerDan Smith <danms@us.ibm.com>2012-11-28 15:43:45 -0800
commit19307bb1580db0d4205659b61c76cae1cab56bf7 (patch)
treeccb05ce094acc2568d5672f4043729b2a7f4ab6c
parent39e5e4853c1c8c6696e4028fbc5102b70441687e (diff)
downloadnova-19307bb1580db0d4205659b61c76cae1cab56bf7.tar.gz
nova-19307bb1580db0d4205659b61c76cae1cab56bf7.tar.xz
nova-19307bb1580db0d4205659b61c76cae1cab56bf7.zip
Make compute manager use conductor for instance_gets
This patch adds support to nova-conductor for the following operations: instance_get_by_uuid() instance_get_all_by_host() It also makes the compute/manager use nova-conductor for those operations. Change-Id: Ia872a2ec6061b4aac9f89366125060fc0844dc22
-rw-r--r--nova/compute/manager.py16
-rw-r--r--nova/conductor/api.py13
-rw-r--r--nova/conductor/manager.py10
-rw-r--r--nova/conductor/rpcapi.py10
-rw-r--r--nova/tests/conductor/test_conductor.py14
5 files changed, 55 insertions, 8 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index a0835d107..c921c40e1 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -264,10 +264,12 @@ class ComputeVirtAPI(virtapi.VirtAPI):
**updates)
def instance_get_by_uuid(self, context, instance_uuid):
- return self._compute.db.instance_get_by_uuid(context, instance_uuid)
+ return self._compute.conductor_api.instance_get_by_uuid(
+ context, instance_uuid)
def instance_get_all_by_host(self, context, host):
- return self._compute.db.instance_get_all_by_host(context, host)
+ return self._compute.conductor_api.instance_get_all_by_host(
+ context, host)
def aggregate_get_by_host(self, context, host, key=None):
return self._compute.db.aggregate_get_by_host(context, host, key=key)
@@ -2744,7 +2746,7 @@ class ComputeManager(manager.SchedulerDependentManager):
while not instance or instance['host'] != self.host:
if instance_uuids:
try:
- instance = self.db.instance_get_by_uuid(context,
+ instance = self.conductor_api.instance_get_by_uuid(context,
instance_uuids.pop(0))
except exception.InstanceNotFound:
# Instance is gone. Try to grab another.
@@ -2813,8 +2815,8 @@ class ComputeManager(manager.SchedulerDependentManager):
"%(migration_id)s for instance %(instance_uuid)s"),
locals())
try:
- instance = self.db.instance_get_by_uuid(context,
- instance_uuid)
+ instance = self.conductor_api.instance_get_by_uuid(
+ context, instance_uuid)
except exception.InstanceNotFound:
reason = _("Instance %(instance_uuid)s not found")
_set_migration_to_error(migration, reason % locals())
@@ -3006,8 +3008,8 @@ class ComputeManager(manager.SchedulerDependentManager):
# for example, because of a broken libvirt driver.
# We re-query the DB to get the latest instance info to minimize
# (not eliminate) race condition.
- u = self.db.instance_get_by_uuid(context,
- db_instance['uuid'])
+ u = self.conductor_api.instance_get_by_uuid(context,
+ db_instance['uuid'])
db_power_state = u["power_state"]
vm_state = u['vm_state']
if self.host != u['host']:
diff --git a/nova/conductor/api.py b/nova/conductor/api.py
index 43d8fd0bc..7a0ae5c23 100644
--- a/nova/conductor/api.py
+++ b/nova/conductor/api.py
@@ -47,6 +47,12 @@ class LocalAPI(object):
"""Perform an instance update in the database"""
return self._manager.instance_update(context, instance_uuid, updates)
+ def instance_get_by_uuid(self, context, instance_uuid):
+ return self._manager.instance_get_by_uuid(context, instance_uuid)
+
+ def instance_get_all_by_host(self, context, host):
+ return self._manager.instance_get_all_by_host(context, host)
+
def migration_update(self, context, migration, status):
return self._manager.migration_update(context, migration, status)
@@ -62,6 +68,13 @@ class API(object):
return self.conductor_rpcapi.instance_update(context, instance_uuid,
updates)
+ def instance_get_by_uuid(self, context, instance_uuid):
+ return self.conductor_rpcapi.instance_get_by_uuid(context,
+ instance_uuid)
+
+ def instance_get_all_by_host(self, context, host):
+ return self.conductor_rpcapi.instance_get_all_by_host(context, host)
+
def migration_update(self, context, migration, status):
return self.conductor_rpcapi.migration_update(context, migration,
status)
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py
index 6270fb241..ce00cc8c5 100644
--- a/nova/conductor/manager.py
+++ b/nova/conductor/manager.py
@@ -35,7 +35,7 @@ allowed_updates = ['task_state', 'vm_state', 'expected_task_state',
class ConductorManager(manager.SchedulerDependentManager):
"""Mission: TBD"""
- RPC_API_VERSION = '1.1'
+ RPC_API_VERSION = '1.2'
def __init__(self, *args, **kwargs):
super(ConductorManager, self).__init__(service_name='conductor',
@@ -52,6 +52,14 @@ class ConductorManager(manager.SchedulerDependentManager):
notifications.send_update(context, old_ref, instance_ref)
return jsonutils.to_primitive(instance_ref)
+ def instance_get_by_uuid(self, context, instance_uuid):
+ return jsonutils.to_primitive(
+ self.db.instance_get_by_uuid(context, instance_uuid))
+
+ def instance_get_all_by_host(self, context, host):
+ return jsonutils.to_primitive(
+ self.db.instance_get_all_by_host(context.elevated(), host))
+
def migration_update(self, context, migration, status):
migration_ref = self.db.migration_update(context.elevated(),
migration['id'],
diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py
index 15750da76..555b7e015 100644
--- a/nova/conductor/rpcapi.py
+++ b/nova/conductor/rpcapi.py
@@ -28,6 +28,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.0 - Initial version.
1.1 - Added migration_update
+ 1.2 - Added instance_get_by_uuid and instance_get_all_by_host
"""
BASE_RPC_API_VERSION = '1.0'
@@ -43,6 +44,15 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
instance_uuid=instance_uuid,
updates=updates))
+ def instance_get_by_uuid(self, context, instance_uuid):
+ msg = self.make_msg('instance_get_by_uuid',
+ instance_uuid=instance_uuid)
+ return self.call(context, msg, version='1.2')
+
+ def instance_get_all_by_host(self, context, host):
+ msg = self.make_msg('instance_get_all_by_host', host=host)
+ return self.call(context, msg, version='1.2')
+
def migration_update(self, context, migration, status):
migration_p = jsonutils.to_primitive(migration)
msg = self.make_msg('migration_update', migration=migration_p,
diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py
index d3c555822..5eb0606d6 100644
--- a/nova/tests/conductor/test_conductor.py
+++ b/nova/tests/conductor/test_conductor.py
@@ -98,6 +98,20 @@ class ConductorTestCase(BaseTestCase):
'finished')
self.assertEqual(migration['status'], 'finished')
+ def test_instance_get_by_uuid(self):
+ orig_instance = self._create_fake_instance()
+ copy_instance = self.conductor.instance_get_by_uuid(
+ self.context, orig_instance['uuid'])
+ self.assertEqual(orig_instance['name'],
+ copy_instance['name'])
+
+ def test_instance_get_all_by_host(self):
+ orig_instance = jsonutils.to_primitive(self._create_fake_instance())
+ all_instances = self.conductor.instance_get_all_by_host(
+ self.context, orig_instance['host'])
+ self.assertEqual(orig_instance['name'],
+ all_instances[0]['name'])
+
class ConductorRPCAPITestCase(ConductorTestCase):
"""Conductor RPC API Tests"""