Merged trunk.

This commit is contained in:
Brian Lamar 2011-03-28 13:19:16 -04:00
commit ba3bf6a571
4 changed files with 46 additions and 19 deletions

View File

@ -141,12 +141,6 @@ class ComputeManager(manager.SchedulerDependentManager):
"""
self.driver.init_host(host=self.host)
def periodic_tasks(self, context=None):
"""Tasks to be run at a periodic interval."""
super(ComputeManager, self).periodic_tasks(context)
if FLAGS.rescue_timeout > 0:
self.driver.poll_rescued_instances(FLAGS.rescue_timeout)
def _update_state(self, context, instance_id):
"""Update the state of an instance from the driver info."""
# FIXME(ja): include other fields from state?
@ -1032,12 +1026,21 @@ class ComputeManager(manager.SchedulerDependentManager):
if error_list is None:
error_list = []
try:
if FLAGS.rescue_timeout > 0:
self.driver.poll_rescued_instances(FLAGS.rescue_timeout)
except Exception as ex:
LOG.warning(_("Error during poll_rescued_instances: %s"),
unicode(ex))
error_list.append(ex)
try:
self._poll_instance_states(context)
except Exception as ex:
LOG.warning(_("Error during instance poll: %s"),
unicode(ex))
error_list.append(ex)
return error_list
def _poll_instance_states(self, context):
@ -1051,16 +1054,33 @@ class ComputeManager(manager.SchedulerDependentManager):
for db_instance in db_instances:
name = db_instance['name']
db_state = db_instance['state']
vm_instance = vm_instances.get(name)
if vm_instance is None:
LOG.info(_("Found instance '%(name)s' in DB but no VM. "
"Setting state to shutoff.") % locals())
vm_state = power_state.SHUTOFF
# NOTE(justinsb): We have to be very careful here, because a
# concurrent operation could be in progress (e.g. a spawn)
if db_state == power_state.NOSTATE:
# Assume that NOSTATE => spawning
# TODO(justinsb): This does mean that if we crash during a
# spawn, the machine will never leave the spawning state,
# but this is just the way nova is; this function isn't
# trying to correct that problem.
# We could have a separate task to correct this error.
# TODO(justinsb): What happens during a live migration?
LOG.info(_("Found instance '%(name)s' in DB but no VM. "
"State=%(db_state)s, so assuming spawn is in "
"progress.") % locals())
vm_state = db_state
else:
LOG.info(_("Found instance '%(name)s' in DB but no VM. "
"State=%(db_state)s, so setting state to "
"shutoff.") % locals())
vm_state = power_state.SHUTOFF
else:
vm_state = vm_instance.state
vms_not_found_in_db.remove(name)
db_state = db_instance['state']
if vm_state != db_state:
LOG.info(_("DB/VM state mismatch. Changing state from "
"'%(db_state)s' to '%(vm_state)s'") % locals())

View File

@ -43,9 +43,14 @@ from nova.tests.api.openstack import fakes
FLAGS = flags.FLAGS
class BaseImageServiceTests(object):
class _BaseImageServiceTests(test.TestCase):
"""Tasks to test for all image services"""
def __init__(self, *args, **kwargs):
super(_BaseImageServiceTests, self).__init__(*args, **kwargs)
self.service = None
self.context = None
def test_create(self):
fixture = self._make_fixture('test image')
num_images = len(self.service.index(self.context))
@ -116,8 +121,7 @@ class BaseImageServiceTests(object):
return fixture
class LocalImageServiceTest(test.TestCase,
BaseImageServiceTests):
class LocalImageServiceTest(_BaseImageServiceTests):
"""Tests the local image service"""
@ -147,8 +151,7 @@ class LocalImageServiceTest(test.TestCase,
self.assertEqual(3, len(found_image_ids), len(found_image_ids))
class GlanceImageServiceTest(test.TestCase,
BaseImageServiceTests):
class GlanceImageServiceTest(_BaseImageServiceTests):
"""Tests the Glance image service, in particular that metadata translation
works properly.

View File

@ -80,10 +80,10 @@ class user_and_project_generator(object):
self.manager.delete_project(self.project)
class AuthManagerTestCase(object):
class _AuthManagerBaseTestCase(test.TestCase):
def setUp(self):
FLAGS.auth_driver = self.auth_driver
super(AuthManagerTestCase, self).setUp()
super(_AuthManagerBaseTestCase, self).setUp()
self.flags(connection_type='fake')
self.manager = manager.AuthManager(new=True)
@ -331,11 +331,11 @@ class AuthManagerTestCase(object):
self.assertTrue(user.is_admin())
class AuthManagerLdapTestCase(AuthManagerTestCase, test.TestCase):
class AuthManagerLdapTestCase(_AuthManagerBaseTestCase):
auth_driver = 'nova.auth.ldapdriver.FakeLdapDriver'
class AuthManagerDbTestCase(AuthManagerTestCase, test.TestCase):
class AuthManagerDbTestCase(_AuthManagerBaseTestCase):
auth_driver = 'nova.auth.dbdriver.DbDriver'

View File

@ -232,3 +232,7 @@ class ComputeDriver(object):
def inject_network_info(self, instance):
"""inject network info for specified instance"""
raise NotImplementedError()
def poll_rescued_instances(self, timeout):
"""Poll for rescued instances"""
raise NotImplementedError()