From d70d2f374d24b40dc7890b5dc2431dd73bde97ad Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Thu, 17 Jan 2013 12:11:37 -0500 Subject: [PATCH] Add instance_fault_create() to conductor This moves the use of db.instance_fault_create() from the compute utils to conductor. Related to blueprint no-db-compute Change-Id: If089ce1623374a259a2d63a99befc46fa3a130b6 --- nova/compute/manager.py | 13 +++++++------ nova/compute/utils.py | 5 +++-- nova/conductor/api.py | 6 ++++++ nova/conductor/manager.py | 6 +++++- nova/conductor/rpcapi.py | 5 +++++ nova/tests/compute/test_compute.py | 24 ++++++++++++++++-------- nova/tests/conductor/test_conductor.py | 9 +++++++++ 7 files changed, 51 insertions(+), 17 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 275611cdfc1c..6365a548c38a 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -229,7 +229,8 @@ def wrap_instance_fault(function): with excutils.save_and_reraise_exception(): compute_utils.add_instance_fault_from_exc(context, - kwargs['instance'], e, sys.exc_info()) + self.conductor_api, kwargs['instance'], + e, sys.exc_info()) return decorated_function @@ -732,8 +733,8 @@ class ComputeManager(manager.SchedulerDependentManager): instance_uuid = instance['uuid'] rescheduled = False - compute_utils.add_instance_fault_from_exc(context, instance, - exc_info[1], exc_info=exc_info) + compute_utils.add_instance_fault_from_exc(context, self.conductor_api, + instance, exc_info[1], exc_info=exc_info) try: self._deallocate_network(context, instance) @@ -1465,7 +1466,7 @@ class ComputeManager(manager.SchedulerDependentManager): LOG.error(_('Cannot reboot instance: %(exc)s'), locals(), context=context, instance=instance) compute_utils.add_instance_fault_from_exc(context, - instance, exc, sys.exc_info()) + self.conductor_api, instance, exc, sys.exc_info()) # Fall through and reset task_state to None current_power_state = self._get_power_state(context, instance) @@ -1995,8 +1996,8 @@ class ComputeManager(manager.SchedulerDependentManager): rescheduled = False instance_uuid = instance['uuid'] - compute_utils.add_instance_fault_from_exc(context, instance, - exc_info[0], exc_info=exc_info) + compute_utils.add_instance_fault_from_exc(context, self.conductor_api, + instance, exc_info[0], exc_info=exc_info) try: scheduler_method = self.scheduler_rpcapi.prep_resize diff --git a/nova/compute/utils.py b/nova/compute/utils.py index 1874e886f5d7..daf80874c9b6 100644 --- a/nova/compute/utils.py +++ b/nova/compute/utils.py @@ -37,7 +37,8 @@ CONF.import_opt('host', 'nova.netconf') LOG = log.getLogger(__name__) -def add_instance_fault_from_exc(context, instance, fault, exc_info=None): +def add_instance_fault_from_exc(context, conductor, + instance, fault, exc_info=None): """Adds the specified fault to the database.""" code = 500 @@ -61,7 +62,7 @@ def add_instance_fault_from_exc(context, instance, fault, exc_info=None): 'details': unicode(details), 'host': CONF.host } - db.instance_fault_create(context, values) + conductor.instance_fault_create(context, values) def get_device_name_for_instance(context, instance, bdms, device): diff --git a/nova/conductor/api.py b/nova/conductor/api.py index d05c94877a7f..b0e5afdcbc96 100644 --- a/nova/conductor/api.py +++ b/nova/conductor/api.py @@ -133,6 +133,9 @@ class LocalAPI(object): def instance_type_get(self, context, instance_type_id): return self._manager.instance_type_get(context, instance_type_id) + def instance_fault_create(self, context, values): + return self._manager.instance_fault_create(context, values) + def migration_get(self, context, migration_id): return self._manager.migration_get(context, migration_id) @@ -391,6 +394,9 @@ class API(object): return self.conductor_rpcapi.instance_type_get(context, instance_type_id) + def instance_fault_create(self, context, values): + return self.conductor_rpcapi.instance_fault_create(context, values) + def migration_get(self, context, migration_id): return self.conductor_rpcapi.migration_get(context, migration_id) diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 87b143912358..c4ae3362258d 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -43,7 +43,7 @@ datetime_fields = ['launched_at', 'terminated_at'] class ConductorManager(manager.SchedulerDependentManager): """Mission: TBD.""" - RPC_API_VERSION = '1.35' + RPC_API_VERSION = '1.36' def __init__(self, *args, **kwargs): super(ConductorManager, self).__init__(service_name='conductor', @@ -258,6 +258,10 @@ class ConductorManager(manager.SchedulerDependentManager): result = self.db.instance_type_get(context, instance_type_id) return jsonutils.to_primitive(result) + def instance_fault_create(self, context, values): + result = self.db.instance_fault_create(context, values) + return jsonutils.to_primitive(result) + def vol_get_usage_by_time(self, context, start_time): result = self.db.vol_get_usage_by_time(context, start_time) return jsonutils.to_primitive(result) diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py index 1699c85eda75..04e576cceb17 100644 --- a/nova/conductor/rpcapi.py +++ b/nova/conductor/rpcapi.py @@ -68,6 +68,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): 1.33 - Added compute_node_create and compute_node_update 1.34 - Added service_update 1.35 - Added instance_get_active_by_window_joined + 1.36 - Added instance_fault_create """ BASE_RPC_API_VERSION = '1.0' @@ -293,6 +294,10 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): msg = self.make_msg('instance_get_all_by_host', host=host, node=node) return self.call(context, msg, version='1.32') + def instance_fault_create(self, context, values): + msg = self.make_msg('instance_fault_create', values=values) + return self.call(context, msg, version='1.36') + def action_event_start(self, context, values): msg = self.make_msg('action_event_start', values=values) return self.call(context, msg, version='1.25') diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index dc381d800a38..be0f6740a390 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -2722,8 +2722,11 @@ class ComputeTestCase(BaseTestCase): self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create) ctxt = context.get_admin_context() - compute_utils.add_instance_fault_from_exc(ctxt, instance, - NotImplementedError('test'), exc_info) + compute_utils.add_instance_fault_from_exc(ctxt, + self.compute.conductor_api, + instance, + NotImplementedError('test'), + exc_info) def test_add_instance_fault_with_remote_error(self): instance = self._create_fake_instance() @@ -2751,8 +2754,8 @@ class ComputeTestCase(BaseTestCase): self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create) ctxt = context.get_admin_context() - compute_utils.add_instance_fault_from_exc(ctxt, instance, exc, - exc_info) + compute_utils.add_instance_fault_from_exc(ctxt, + self.compute.conductor_api, instance, exc, exc_info) def test_add_instance_fault_user_error(self): instance = self._create_fake_instance() @@ -2779,8 +2782,8 @@ class ComputeTestCase(BaseTestCase): self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create) ctxt = context.get_admin_context() - compute_utils.add_instance_fault_from_exc(ctxt, instance, user_exc, - exc_info) + compute_utils.add_instance_fault_from_exc(ctxt, + self.compute.conductor_api, instance, user_exc, exc_info) def test_add_instance_fault_no_exc_info(self): instance = self._create_fake_instance() @@ -2798,8 +2801,10 @@ class ComputeTestCase(BaseTestCase): self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create) ctxt = context.get_admin_context() - compute_utils.add_instance_fault_from_exc(ctxt, instance, - NotImplementedError('test')) + compute_utils.add_instance_fault_from_exc(ctxt, + self.compute.conductor_api, + instance, + NotImplementedError('test')) def test_cleanup_running_deleted_instances(self): admin_context = context.get_admin_context() @@ -6752,6 +6757,7 @@ class ComputeRescheduleOrReraiseTestCase(BaseTestCase): exc_info = sys.exc_info() compute_utils.add_instance_fault_from_exc(self.context, + self.compute.conductor_api, self.instance, exc_info[0], exc_info=exc_info) self.compute._deallocate_network(self.context, self.instance).AndRaise(InnerTestingException("Error")) @@ -6802,6 +6808,7 @@ class ComputeRescheduleOrReraiseTestCase(BaseTestCase): except Exception: exc_info = sys.exc_info() compute_utils.add_instance_fault_from_exc(self.context, + self.compute.conductor_api, self.instance, exc_info[0], exc_info=exc_info) self.compute._deallocate_network(self.context, self.instance) @@ -6830,6 +6837,7 @@ class ComputeRescheduleOrReraiseTestCase(BaseTestCase): exc_info = sys.exc_info() compute_utils.add_instance_fault_from_exc(self.context, + self.compute.conductor_api, self.instance, exc_info[0], exc_info=exc_info) self.compute._deallocate_network(self.context, self.instance) diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py index 30d176bbd5b2..c46663e50520 100644 --- a/nova/tests/conductor/test_conductor.py +++ b/nova/tests/conductor/test_conductor.py @@ -426,6 +426,15 @@ class _BaseTestCase(object): 'fake-values', False) self.assertEqual(result, 'fake-result') + def test_instance_fault_create(self): + self.mox.StubOutWithMock(db, 'instance_fault_create') + db.instance_fault_create(self.context, 'fake-values').AndReturn( + 'fake-result') + self.mox.ReplayAll() + result = self.conductor.instance_fault_create(self.context, + 'fake-values') + self.assertEqual(result, 'fake-result') + class ConductorTestCase(_BaseTestCase, test.TestCase): """Conductor Manager Tests."""