From 19307bb1580db0d4205659b61c76cae1cab56bf7 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Tue, 27 Nov 2012 13:39:06 -0800 Subject: 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 --- nova/compute/manager.py | 16 +++++++++------- nova/conductor/api.py | 13 +++++++++++++ nova/conductor/manager.py | 10 +++++++++- nova/conductor/rpcapi.py | 10 ++++++++++ nova/tests/conductor/test_conductor.py | 14 ++++++++++++++ 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""" -- cgit