Generate instance faults when instance errors

Currently adds all exceptions having to do with a specific instance that are
generated in compute manager to the instance faults table.

Change-Id: Idf92348c6896b0bf0f26d3a0dbd4a48a4c1d4329
This commit is contained in:
Alex Meade
2011-12-15 13:35:02 -05:00
parent e1f9e3940e
commit f612c2d85b

View File

@@ -21,6 +21,7 @@ Tests For Compute
""" """
from copy import copy from copy import copy
import datetime import datetime
import time
from webob import exc from webob import exc
import mox import mox
@@ -179,6 +180,46 @@ class BaseTestCase(test.TestCase):
class ComputeTestCase(BaseTestCase): class ComputeTestCase(BaseTestCase):
def test_wrap_instance_fault(self):
inst_uuid = "fake_uuid"
called = {'fault_added': False}
def did_it_add_fault(_ctxt, _inst_uuid, _e):
called['fault_added'] = True
self.stubs.Set(self.compute, 'add_instance_fault_from_exc',
did_it_add_fault)
@nova.compute.manager.wrap_instance_fault
def failer(self2, context, instance_uuid):
raise NotImplementedError()
self.assertRaises(NotImplementedError, failer,
self.compute, self.context, inst_uuid)
self.assertTrue(called['fault_added'])
def test_wrap_instance_fault_no_instance(self):
inst_uuid = "fake_uuid"
called = {'fault_added': False}
def did_it_add_fault(_ctxt, _inst_uuid, _e):
called['fault_added'] = True
self.stubs.Set(self.compute, 'add_instance_fault_from_exc',
did_it_add_fault)
@nova.compute.manager.wrap_instance_fault
def failer(self2, context, instance_uuid):
raise exception.InstanceNotFound()
self.assertRaises(exception.InstanceNotFound, failer,
self.compute, self.context, inst_uuid)
self.assertFalse(called['fault_added'])
def test_create_instance_with_img_ref_associates_config_drive(self): def test_create_instance_with_img_ref_associates_config_drive(self):
"""Make sure create associates a config drive.""" """Make sure create associates a config drive."""
@@ -475,6 +516,42 @@ class ComputeTestCase(BaseTestCase):
self.compute.terminate_instance(self.context, inst_ref['uuid']) self.compute.terminate_instance(self.context, inst_ref['uuid'])
def test_set_admin_password_driver_error(self):
"""Ensure error is raised admin password set"""
def fake_sleep(_time):
pass
self.stubs.Set(time, 'sleep', fake_sleep)
def fake_driver_set_pass(self2, _instance, _pwd):
raise exception.NotAuthorized(_('Internal error'))
self.stubs.Set(nova.virt.fake.FakeConnection, 'set_admin_password',
fake_driver_set_pass)
instance = self._create_fake_instance()
instance_uuid = instance['uuid']
self.compute.run_instance(self.context, instance_uuid)
db.instance_update(self.context, instance_uuid,
{'task_state': task_states.UPDATING_PASSWORD})
inst_ref = db.instance_get_by_uuid(self.context, instance_uuid)
self.assertEqual(inst_ref['vm_state'], vm_states.ACTIVE)
self.assertEqual(inst_ref['task_state'], task_states.UPDATING_PASSWORD)
#error raised from the driver should not reveal internal information
#so a new error is raised
self.assertRaises(exception.Error,
self.compute.set_admin_password,
self.context, instance_uuid)
inst_ref = db.instance_get_by_uuid(self.context, instance_uuid)
self.assertEqual(inst_ref['vm_state'], vm_states.ERROR)
self.assertEqual(inst_ref['task_state'], None)
self.compute.terminate_instance(self.context, inst_ref['uuid'])
def test_inject_file(self): def test_inject_file(self):
"""Ensure we can write a file to an instance""" """Ensure we can write a file to an instance"""
called = {'inject': False} called = {'inject': False}
@@ -896,6 +973,48 @@ class ComputeTestCase(BaseTestCase):
self.assertEquals(payload['image_ref_url'], image_ref_url) self.assertEquals(payload['image_ref_url'], image_ref_url)
self.compute.terminate_instance(context, instance_uuid) self.compute.terminate_instance(context, instance_uuid)
def test_prep_resize_instance_migration_error(self):
"""Ensure prep_resize raise a migration error"""
self.flags(host="foo", allow_resize_to_same_host=False)
instance = self._create_fake_instance()
instance_uuid = instance['uuid']
context = self.context.elevated()
self.compute.run_instance(self.context, instance_uuid)
db.instance_update(self.context, instance_uuid, {'host': 'foo'})
self.assertRaises(exception.MigrationError, self.compute.prep_resize,
context, instance_uuid, 1)
self.compute.terminate_instance(context, instance_uuid)
def test_resize_instance_driver_error(self):
"""Ensure instance status set to Error on resize error"""
def throw_up(*args, **kwargs):
raise Exception()
self.stubs.Set(self.compute.driver, 'migrate_disk_and_power_off',
throw_up)
instance = self._create_fake_instance()
instance_uuid = instance['uuid']
context = self.context.elevated()
self.compute.run_instance(self.context, instance_uuid)
db.instance_update(self.context, instance_uuid, {'host': 'foo'})
self.compute.prep_resize(context, instance_uuid, 1)
migration_ref = db.migration_get_by_instance_and_status(context,
instance_uuid, 'pre-migrating')
#verify
self.assertRaises(Exception, self.compute.resize_instance, context,
instance_uuid, migration_ref['id'])
instance = db.instance_get_by_uuid(context, instance_uuid)
self.assertEqual(instance['vm_state'], vm_states.ERROR)
self.compute.terminate_instance(context, instance_uuid)
def test_resize_instance(self): def test_resize_instance(self):
"""Ensure instance can be migrated/resized""" """Ensure instance can be migrated/resized"""
instance = self._create_fake_instance() instance = self._create_fake_instance()
@@ -977,7 +1096,7 @@ class ComputeTestCase(BaseTestCase):
instance = self._create_fake_instance() instance = self._create_fake_instance()
self.compute.run_instance(self.context, instance['uuid']) self.compute.run_instance(self.context, instance['uuid'])
instance = db.instance_get_by_uuid(self.context, instance['uuid']) instance = db.instance_get_by_uuid(self.context, instance['uuid'])
self.assertRaises(exception.Error, self.compute.prep_resize, self.assertRaises(exception.MigrationError, self.compute.prep_resize,
self.context, instance['uuid'], 1) self.context, instance['uuid'], 1)
self.compute.terminate_instance(self.context, instance['uuid']) self.compute.terminate_instance(self.context, instance['uuid'])
@@ -1193,24 +1312,6 @@ class ComputeTestCase(BaseTestCase):
def test_add_instance_fault(self): def test_add_instance_fault(self):
instance_uuid = str(utils.gen_uuid()) instance_uuid = str(utils.gen_uuid())
def fake_db_fault_create(ctxt, values):
expected = {
'code': 404,
'message': 'HTTPNotFound',
'details': 'Error Details',
'instance_uuid': instance_uuid,
}
self.assertEquals(expected, values)
self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create)
ctxt = context.get_admin_context()
self.compute.add_instance_fault(ctxt, instance_uuid, 404,
'HTTPNotFound', 'Error Details')
def test_add_instance_fault_error(self):
instance_uuid = str(utils.gen_uuid())
def fake_db_fault_create(ctxt, values): def fake_db_fault_create(ctxt, values):
expected = { expected = {
'code': 500, 'code': 500,