diff options
| author | Brian Lamar <brian.lamar@rackspace.com> | 2011-09-26 22:02:34 -0400 |
|---|---|---|
| committer | Brian Lamar <brian.lamar@rackspace.com> | 2011-10-03 22:22:24 -0400 |
| commit | 981f52794ed41b6f25dfc4a25b4b736e8f030a0f (patch) | |
| tree | 303fd6bd355697a66bd4fe8b0e14b300ff748b4b | |
| parent | 3837f09ee0b7b0da23e1caa185f58610d30bffe6 (diff) | |
Set error state on spawn error + integration test.
This branch should at least be considered a partial fix for bug 698336.
(Update) Grammar fix.
(Update) PEP8 fix.
(Update) Merged with origin/master
(Update) Fixed test (oops!) thanks comstud!
Change-Id: I10d607fd40953e334670cc39040a9a00ff6919ac
| -rw-r--r-- | nova/compute/api.py | 6 | ||||
| -rw-r--r-- | nova/compute/manager.py | 11 | ||||
| -rw-r--r-- | nova/tests/integrated/test_servers.py | 22 |
3 files changed, 31 insertions, 8 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py index 8b0c76cb1..944f35e43 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -81,17 +81,17 @@ def generate_default_display_name(instance): def _is_able_to_shutdown(instance, instance_id): vm_state = instance["vm_state"] - task_state = instance["task_state"] valid_shutdown_states = [ vm_states.ACTIVE, vm_states.REBUILDING, vm_states.BUILDING, + vm_states.ERROR, ] if vm_state not in valid_shutdown_states: - LOG.warn(_("Instance %(instance_id)s is not in an 'active' state. It " - "is currently %(vm_state)s. Shutdown aborted.") % locals()) + LOG.warn(_("Instance %(instance_id)s cannot be shutdown from " + "its current state: %(vm_state)s.") % locals()) return False return True diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 169439ffd..f4cad6180 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -436,11 +436,12 @@ class ComputeManager(manager.SchedulerDependentManager): try: self.driver.spawn(context, instance, network_info, block_device_info) - except Exception as ex: # pylint: disable=W0702 - msg = _("Instance '%(instance_id)s' failed to spawn. Is " - "virtualization enabled in the BIOS? Details: " - "%(ex)s") % locals() - LOG.exception(msg) + except Exception as error: # pylint: disable=W0702 + LOG.exception(_("Instance '%(instance_id)s' failed to spawn. " + "Details: %(error)s") % locals()) + self._instance_update(context, + instance_id, + vm_state=vm_states.ERROR) _deallocate_network() return diff --git a/nova/tests/integrated/test_servers.py b/nova/tests/integrated/test_servers.py index 94138526c..be9ed15ed 100644 --- a/nova/tests/integrated/test_servers.py +++ b/nova/tests/integrated/test_servers.py @@ -18,6 +18,7 @@ import time import unittest +import nova.virt.fake from nova.log import logging from nova.tests.integrated import integrated_helpers from nova.tests.integrated.api import client @@ -52,6 +53,27 @@ class ServersTest(integrated_helpers._IntegratedTestBase): for server in servers: LOG.debug("server: %s" % server) + def test_create_server_with_error(self): + """Create a server which will enter error state.""" + self.flags(stub_network=True) + + def throw_error(*_): + raise Exception() + + self.stubs.Set(nova.virt.fake.FakeConnection, 'spawn', throw_error) + + server = self._build_minimal_create_server_request() + created_server = self.api.post_server({"server": server}) + created_server_id = created_server['id'] + + found_server = self.api.get_server(created_server_id) + self.assertEqual(created_server_id, found_server['id']) + + found_server = self._wait_for_state_change(found_server, 'BUILD') + + self.assertEqual('ERROR', found_server['status']) + self._delete_server(created_server_id) + def test_create_and_delete_server(self): """Creates and deletes a server.""" self.flags(stub_network=True) |
