Remove conductor usage from add_instance_fault_from_exc()

This makes add_instance_fault_from_exc() use the InstanceFault
object instead of a raw conductor call. This is actually a
minor change except that all callers of this method must now
stop passing the conductor API, and tests must return something
valid from the mocked call.

Related to blueprint virt-objects-juno

Change-Id: I49b17c1ef3d14fd36f016c37d88287e62126bf68
This commit is contained in:
Dan Smith
2014-04-29 11:30:52 -07:00
parent cf6b0fdbff
commit f23498d7a2
12 changed files with 62 additions and 78 deletions
+5 -7
View File
@@ -310,8 +310,7 @@ def wrap_instance_fault(function):
with excutils.save_and_reraise_exception():
compute_utils.add_instance_fault_from_exc(context,
self.conductor_api, kwargs['instance'],
e, sys.exc_info())
kwargs['instance'], e, sys.exc_info())
return decorated_function
@@ -1418,7 +1417,7 @@ class ComputeManager(manager.Manager):
instance_uuid = instance['uuid']
rescheduled = False
compute_utils.add_instance_fault_from_exc(context, self.conductor_api,
compute_utils.add_instance_fault_from_exc(context,
instance, exc_info[1], exc_info=exc_info)
self._notify_about_instance_usage(context, instance,
'instance.create.error', fault=exc_info[1])
@@ -2670,7 +2669,7 @@ class ComputeManager(manager.Manager):
LOG.warning(_('Reboot failed but instance is running'),
context=context, instance=instance)
compute_utils.add_instance_fault_from_exc(context,
self.conductor_api, instance, error, exc_info)
instance, error, exc_info)
self._notify_about_instance_usage(context, instance,
'reboot.error', fault=error)
ctxt.reraise = False
@@ -3410,7 +3409,7 @@ class ComputeManager(manager.Manager):
LOG.exception(_("Error trying to reschedule"),
instance_uuid=instance_uuid)
compute_utils.add_instance_fault_from_exc(context,
self.conductor_api, instance, error,
instance, error,
exc_info=sys.exc_info())
self._notify_about_instance_usage(context, instance,
'resize.error', fault=error)
@@ -3418,8 +3417,7 @@ class ComputeManager(manager.Manager):
if rescheduled:
self._log_original_error(exc_info, instance_uuid)
compute_utils.add_instance_fault_from_exc(context,
self.conductor_api, instance, exc_info[1],
exc_info=exc_info)
instance, exc_info[1], exc_info=exc_info)
self._notify_about_instance_usage(context, instance,
'resize.error', fault=exc_info[1])
else:
+9 -14
View File
@@ -29,6 +29,7 @@ from nova import exception
from nova.network import model as network_model
from nova import notifications
from nova.objects import instance as instance_obj
from nova.objects import instance_fault as instance_fault_obj
from nova.openstack.common.gettextutils import _
from nova.openstack.common import log
from nova.openstack.common import timeutils
@@ -82,22 +83,16 @@ def _get_fault_details(exc_info, error_code):
return unicode(details)
def add_instance_fault_from_exc(context, conductor,
instance, fault, exc_info=None):
def add_instance_fault_from_exc(context, instance, fault, exc_info=None):
"""Adds the specified fault to the database."""
fault_dict = exception_to_dict(fault)
code = fault_dict["code"]
details = _get_fault_details(exc_info, code)
values = {
'instance_uuid': instance['uuid'],
'code': code,
'message': fault_dict["message"],
'details': details,
'host': CONF.host
}
conductor.instance_fault_create(context, values)
fault_obj = instance_fault_obj.InstanceFault(context=context)
fault_obj.host = CONF.host
fault_obj.instance_uuid = instance['uuid']
fault_obj.update(exception_to_dict(fault))
code = fault_obj.code
fault_obj.details = _get_fault_details(exc_info, code)
fault_obj.create()
def pack_action_start(context, instance_uuid, action_name):
-2
View File
@@ -25,7 +25,6 @@ from oslo.config import cfg
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova.conductor import api as conductor_api
from nova import db
from nova import exception
from nova import notifications
@@ -68,7 +67,6 @@ def handle_schedule_error(context, ex, instance_uuid, request_spec):
notifications.send_update(context, old_ref, new_ref,
service="scheduler")
compute_utils.add_instance_fault_from_exc(context,
conductor_api.LocalAPI(),
new_ref, ex, sys.exc_info())
properties = request_spec.get('instance_properties', {})
-3
View File
@@ -72,8 +72,6 @@ def set_vm_state_and_notify(context, service, method, updates, ex,
# be removed along with the 'if instance_uuid:' if we can
# verify that uuid is always set.
uuids = [properties.get('uuid')]
from nova.conductor import api as conductor_api
conductor = conductor_api.LocalAPI()
notifier = rpc.get_notifier(service)
for instance_uuid in request_spec.get('instance_uuids') or uuids:
if instance_uuid:
@@ -87,7 +85,6 @@ def set_vm_state_and_notify(context, service, method, updates, ex,
notifications.send_update(context, old_ref, new_ref,
service=service)
compute_utils.add_instance_fault_from_exc(context,
conductor,
new_ref, ex, sys.exc_info())
payload = dict(request_spec=request_spec,
+17 -8
View File
@@ -5506,6 +5506,16 @@ class ComputeTestCase(BaseTestCase):
self.assertEqual(len(instances), 1)
self.assertIsNone(instances[0]['task_state'])
def _fill_fault(self, values):
extra = dict([(x, None) for x in ['created_at',
'deleted_at',
'updated_at',
'deleted']])
extra['id'] = 1
extra['details'] = ''
extra.update(values)
return extra
def test_add_instance_fault(self):
instance = self._create_fake_instance()
exc_info = None
@@ -5521,6 +5531,7 @@ class ComputeTestCase(BaseTestCase):
'host': self.compute.host
}
self.assertEqual(expected, values)
return self._fill_fault(expected)
try:
raise NotImplementedError('test')
@@ -5531,7 +5542,6 @@ class ComputeTestCase(BaseTestCase):
ctxt = context.get_admin_context()
compute_utils.add_instance_fault_from_exc(ctxt,
self.compute.conductor_api,
instance,
NotImplementedError('test'),
exc_info)
@@ -5552,6 +5562,7 @@ class ComputeTestCase(BaseTestCase):
'host': self.compute.host
}
self.assertEqual(expected, values)
return self._fill_fault(expected)
try:
raise messaging.RemoteError('test', 'My Test Message')
@@ -5562,7 +5573,7 @@ class ComputeTestCase(BaseTestCase):
ctxt = context.get_admin_context()
compute_utils.add_instance_fault_from_exc(ctxt,
self.compute.conductor_api, instance, exc, exc_info)
instance, exc, exc_info)
def test_add_instance_fault_user_error(self):
instance = self._create_fake_instance()
@@ -5578,6 +5589,7 @@ class ComputeTestCase(BaseTestCase):
'host': self.compute.host
}
self.assertEqual(expected, values)
return self._fill_fault(expected)
user_exc = exception.Invalid('fake details', code=400)
@@ -5590,7 +5602,7 @@ class ComputeTestCase(BaseTestCase):
ctxt = context.get_admin_context()
compute_utils.add_instance_fault_from_exc(ctxt,
self.compute.conductor_api, instance, user_exc, exc_info)
instance, user_exc, exc_info)
def test_add_instance_fault_no_exc_info(self):
instance = self._create_fake_instance()
@@ -5604,12 +5616,12 @@ class ComputeTestCase(BaseTestCase):
'host': self.compute.host
}
self.assertEqual(expected, values)
return self._fill_fault(expected)
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,
self.compute.conductor_api,
instance,
NotImplementedError('test'))
@@ -5627,12 +5639,12 @@ class ComputeTestCase(BaseTestCase):
'host': self.compute.host
}
self.assertEqual(expected, values)
return self._fill_fault(expected)
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,
self.compute.conductor_api,
instance,
NotImplementedError(message))
@@ -10111,7 +10123,6 @@ class ComputeRescheduleOrErrorTestCase(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._shutdown_instance(self.context, self.instance,
mox.IgnoreArg(),
@@ -10199,7 +10210,6 @@ class ComputeRescheduleOrErrorTestCase(BaseTestCase):
except test.TestingException:
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._shutdown_instance(self.context, self.instance,
@@ -10232,7 +10242,6 @@ class ComputeRescheduleOrErrorTestCase(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._shutdown_instance(self.context, self.instance,
mox.IgnoreArg(),
+14 -10
View File
@@ -40,6 +40,7 @@ from nova import test
from nova.tests.compute import fake_resource_tracker
from nova.tests import fake_block_device
from nova.tests import fake_instance
from nova.tests.objects import test_instance_fault
from nova.tests.objects import test_instance_info_cache
@@ -936,9 +937,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
fake_vol_migrate_volume_completion)
self.stubs.Set(db, 'block_device_mapping_update',
lambda *a, **k: fake_bdm)
self.stubs.Set(self.compute.conductor_api,
self.stubs.Set(db,
'instance_fault_create',
lambda x, y: None)
lambda x, y:
test_instance_fault.fake_faults['fake-uuid'][0])
# Good path
self.compute.swap_volume(self.context, old_volume_id, new_volume_id,
@@ -1033,10 +1035,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
self.context, instance, dest_check_data)
if do_raise:
mock_meth.AndRaise(test.TestingException())
self.mox.StubOutWithMock(self.compute.conductor_api,
'instance_fault_create')
self.compute.conductor_api.instance_fault_create(self.context,
mox.IgnoreArg())
self.mox.StubOutWithMock(db, 'instance_fault_create')
db.instance_fault_create(
self.context, mox.IgnoreArg()).AndReturn(
test_instance_fault.fake_faults['fake-uuid'][0])
else:
mock_meth.AndReturn(mig_data)
self.compute.driver.check_can_live_migrate_destination_cleanup(
@@ -1866,14 +1868,15 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
'action_event_start'),
mock.patch.object(self.compute.conductor_api,
'action_event_finish'),
mock.patch.object(self.compute.conductor_api,
'instance_fault_create'),
mock.patch.object(db, 'instance_fault_create'),
mock.patch.object(self.compute, '_instance_update'),
mock.patch.object(self.migration, 'save'),
mock.patch.object(self.context, 'elevated',
return_value=elevated_context)
) as (meth, event_start, event_finish, fault_create, instance_update,
migration_save, context_elevated):
fault_create.return_value = (
test_instance_fault.fake_faults['fake-uuid'][0])
self.assertRaises(
exception.ResizeError, self.compute.finish_resize,
context=self.context, disk_info=[], image=self.image,
@@ -1894,8 +1897,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
'action_event_start'),
mock.patch.object(self.compute.conductor_api,
'action_event_finish'),
mock.patch.object(self.compute.conductor_api,
'instance_fault_create'),
mock.patch.object(db, 'instance_fault_create'),
mock.patch.object(self.compute, '_instance_update'),
mock.patch.object(self.migration, 'save'),
mock.patch.object(self.context, 'elevated',
@@ -1913,6 +1915,8 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
) as (meth, event_start, event_finish, fault_create, instance_update,
migration_save, context_elevated, nw_info, save_inst, notify,
vol_block_info, bdm):
fault_create.return_value = (
test_instance_fault.fake_faults['fake-uuid'][0])
self.assertRaises(
exception.ResizeError, self.compute.resize_instance,
context=self.context, instance=self.instance, image=self.image,
@@ -23,7 +23,6 @@ import mox
from nova.compute import rpcapi as compute_rpcapi
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova.conductor import api as conductor_api
from nova import context
from nova import db
from nova import exception
@@ -130,8 +129,7 @@ class ChanceSchedulerTestCase(test_scheduler.SchedulerTestCase):
old_ref, new_ref = db.instance_update_and_get_original(ctxt, uuid,
{'vm_state': vm_states.ERROR,
'task_state': None}).AndReturn(({}, {}))
compute_utils.add_instance_fault_from_exc(ctxt,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(ctxt, new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.ReplayAll()
@@ -24,7 +24,6 @@ import mox
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova.conductor import api as conductor_api
from nova import context
from nova import db
from nova import exception
@@ -88,8 +87,7 @@ class FilterSchedulerTestCase(test_scheduler.SchedulerTestCase):
old_ref, new_ref = db.instance_update_and_get_original(fake_context,
uuid, {'vm_state': vm_states.ERROR, 'task_state':
None}).AndReturn(({}, {}))
compute_utils.add_instance_fault_from_exc(fake_context,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(fake_context, new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.StubOutWithMock(db, 'compute_node_get_all')
@@ -124,8 +122,7 @@ class FilterSchedulerTestCase(test_scheduler.SchedulerTestCase):
old_ref, new_ref = db.instance_update_and_get_original(fake_context,
uuid, {'vm_state': vm_states.ERROR, 'task_state':
None}).AndReturn(({}, {}))
compute_utils.add_instance_fault_from_exc(fake_context,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(fake_context, new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.ReplayAll()
sched.schedule_run_instance(
+12 -19
View File
@@ -27,7 +27,6 @@ from nova.compute import api as compute_api
from nova.compute import task_states
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova.conductor import api as conductor_api
from nova.conductor.tasks import live_migrate
from nova import context
from nova import db
@@ -43,6 +42,7 @@ from nova.tests import fake_instance
from nova.tests import fake_server_actions
from nova.tests.image import fake as fake_image
from nova.tests import matchers
from nova.tests.objects import test_instance_fault
from nova.tests.scheduler import fakes
from nova import utils
@@ -152,8 +152,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
{"vm_state": vm_states.ERROR,
"task_state": None}).AndReturn((inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
new_ref, mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.ReplayAll()
self.manager.run_instance(self.context, request_spec,
@@ -180,8 +179,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
"task_state": None,
"expected_task_state": task_states.MIGRATING,
}).AndReturn((inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), inst,
compute_utils.add_instance_fault_from_exc(self.context, inst,
mox.IsA(exception.NoValidHost),
mox.IgnoreArg())
@@ -213,8 +211,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
"task_state": None,
"expected_task_state": task_states.MIGRATING,
}).AndReturn((inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), inst,
compute_utils.add_instance_fault_from_exc(self.context, inst,
mox.IsA(exception.ComputeServiceUnavailable),
mox.IgnoreArg())
@@ -254,8 +251,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
db.instance_update_and_get_original(self.context, inst["uuid"],
{"vm_state": vm_states.ERROR,
}).AndReturn((inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), inst,
compute_utils.add_instance_fault_from_exc(self.context, inst,
mox.IsA(ValueError),
mox.IgnoreArg())
@@ -295,8 +291,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
fake_instance_uuid,
{"vm_state": vm_states.ACTIVE, "task_state": None}).AndReturn(
(inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(self.context, new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.ReplayAll()
@@ -331,8 +326,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
fake_instance_uuid,
{"vm_state": vm_states.STOPPED, "task_state": None}).AndReturn(
(inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(self.context, new_ref,
mox.IsA(exception.NoValidHost), mox.IgnoreArg())
self.mox.ReplayAll()
@@ -373,8 +367,7 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
fake_instance_uuid,
{"vm_state": vm_states.ERROR,
"task_state": None}).AndReturn((inst, inst))
compute_utils.add_instance_fault_from_exc(self.context,
mox.IsA(conductor_api.LocalAPI), new_ref,
compute_utils.add_instance_fault_from_exc(self.context, new_ref,
mox.IsA(test.TestingException), mox.IgnoreArg())
self.mox.ReplayAll()
@@ -391,12 +384,12 @@ class SchedulerManagerTestCase(test.NoDBTestCase):
self.mox.StubOutWithMock(db, 'instance_fault_create')
self.mox.StubOutWithMock(rpc, 'get_notifier')
notifier = self.mox.CreateMockAnything()
rpc.get_notifier('conductor', CONF.host).AndReturn(notifier)
rpc.get_notifier('scheduler').AndReturn(notifier)
db.instance_update_and_get_original(self.context, 'fake-uuid',
updates).AndReturn((None,
fake_inst))
db.instance_fault_create(self.context, mox.IgnoreArg())
db.instance_fault_create(self.context, mox.IgnoreArg()).AndReturn(
test_instance_fault.fake_faults['fake-uuid'][0])
notifier.error(self.context, 'scheduler.foo', mox.IgnoreArg())
self.mox.ReplayAll()
@@ -504,10 +497,10 @@ class SchedulerTestCase(test.NoDBTestCase):
db.instance_update_and_get_original(self.context, instance['uuid'],
mox.IgnoreArg()).AndReturn(
(None, instance))
db.instance_fault_create(self.context, mox.IgnoreArg())
db.instance_fault_create(self.context, mox.IgnoreArg()).AndReturn(
test_instance_fault.fake_faults['fake-uuid'][0])
self.mox.StubOutWithMock(rpc, 'get_notifier')
notifier = self.mox.CreateMockAnything()
rpc.get_notifier('conductor', CONF.host).AndReturn(notifier)
rpc.get_notifier('scheduler').AndReturn(notifier)
notifier.error(self.context, 'scheduler.run_instance', mox.IgnoreArg())
self.mox.ReplayAll()
@@ -21,7 +21,6 @@ from oslo.config import cfg
from nova.compute import flavors
from nova.compute import utils as compute_utils
from nova.conductor import api as conductor_api
from nova import db
from nova import notifications
from nova import rpc
@@ -81,7 +80,6 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
self.mox.StubOutWithMock(rpc, 'get_notifier')
notifier = self.mox.CreateMockAnything()
rpc.get_notifier('conductor', CONF.host).AndReturn(notifier)
rpc.get_notifier(service).AndReturn(notifier)
old_ref = 'old_ref'
@@ -94,7 +92,6 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
service=service)
compute_utils.add_instance_fault_from_exc(
self.context,
mox.IsA(conductor_api.LocalAPI),
new_ref, exc_info, mox.IsA(tuple))
payload = dict(request_spec=request_spec,
+1 -1
View File
@@ -1176,7 +1176,7 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
called = {}
def fake_add_instance_fault(*args, **kwargs):
called["fake_add_instance_fault"] = args[3]
called["fake_add_instance_fault"] = args[2]
self.stubs.Set(compute_utils, 'add_instance_fault_from_exc',
fake_add_instance_fault)
+1 -3
View File
@@ -25,7 +25,6 @@ from oslo.config import cfg
from nova.api.metadata import password
from nova.compute import utils as compute_utils
from nova import conductor
from nova import context
from nova import crypto
from nova import exception
@@ -186,9 +185,8 @@ class XenAPIBasedAgent(object):
instance=self.instance, exc_info=True)
try:
ctxt = context.get_admin_context()
capi = conductor.API()
compute_utils.add_instance_fault_from_exc(
ctxt, capi, self.instance, error, exc_info=exc_info)
ctxt, self.instance, error, exc_info=exc_info)
except Exception:
LOG.debug(_("Error setting instance fault."), exc_info=True)