summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-09-26 22:02:34 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-10-03 22:22:24 -0400
commit981f52794ed41b6f25dfc4a25b4b736e8f030a0f (patch)
tree303fd6bd355697a66bd4fe8b0e14b300ff748b4b
parent3837f09ee0b7b0da23e1caa185f58610d30bffe6 (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.py6
-rw-r--r--nova/compute/manager.py11
-rw-r--r--nova/tests/integrated/test_servers.py22
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)