summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2012-01-04 18:54:45 -0500
committerBrian Lamar <brian.lamar@rackspace.com>2012-01-05 11:49:10 -0500
commit18f72f29a92733e56d8641e48b2099df1b8b30f4 (patch)
treef5f927f3699d2126319518c4bd432e4b0017e1ee
parent1aa34d4538f071386813d646d707364eb6c788bc (diff)
downloadnova-18f72f29a92733e56d8641e48b2099df1b8b30f4.tar.gz
nova-18f72f29a92733e56d8641e48b2099df1b8b30f4.tar.xz
nova-18f72f29a92733e56d8641e48b2099df1b8b30f4.zip
Return 409s instead of 500s when deleting certain instances.
Fixes bug 911879 Change-Id: Ib2ae875ec2d1eeea21d15a756b96c27047b12bee
-rw-r--r--nova/api/openstack/v2/servers.py4
-rw-r--r--nova/tests/api/openstack/v2/test_servers.py34
2 files changed, 38 insertions, 0 deletions
diff --git a/nova/api/openstack/v2/servers.py b/nova/api/openstack/v2/servers.py
index d98d532dc..bab2976f9 100644
--- a/nova/api/openstack/v2/servers.py
+++ b/nova/api/openstack/v2/servers.py
@@ -575,6 +575,10 @@ class Controller(wsgi.Controller):
self._delete(req.environ['nova.context'], id)
except exception.NotFound:
raise exc.HTTPNotFound()
+ except exception.InstanceInvalidState as state_error:
+ state = state_error.kwargs.get("state")
+ msg = _("Unable to delete instance when %s") % state
+ raise exc.HTTPConflict(explanation=msg)
def _get_key_name(self, req, body):
if 'server' in body:
diff --git a/nova/tests/api/openstack/v2/test_servers.py b/nova/tests/api/openstack/v2/test_servers.py
index 03627c833..6272eb5eb 100644
--- a/nova/tests/api/openstack/v2/test_servers.py
+++ b/nova/tests/api/openstack/v2/test_servers.py
@@ -1200,6 +1200,40 @@ class ServersControllerTest(test.TestCase):
self.assertEqual(self.server_delete_called, True)
+ def test_delete_server_instance_while_building(self):
+ req = fakes.HTTPRequest.blank('/v2/fake/servers/%s' % FAKE_UUID)
+ req.method = 'DELETE'
+
+ self.server_delete_called = False
+
+ new_return_server = return_server_with_attributes(
+ vm_state=vm_states.BUILDING)
+ self.stubs.Set(nova.db, 'instance_get', new_return_server)
+
+ def instance_destroy_mock(context, id):
+ self.server_delete_called = True
+ self.stubs.Set(nova.db, 'instance_destroy', instance_destroy_mock)
+
+ with self.assertRaises(webob.exc.HTTPConflict):
+ self.controller.delete(req, FAKE_UUID)
+
+ def test_delete_server_instance_while_resize(self):
+ req = fakes.HTTPRequest.blank('/v2/fake/servers/%s' % FAKE_UUID)
+ req.method = 'DELETE'
+
+ self.server_delete_called = False
+
+ new_return_server = return_server_with_attributes(
+ vm_state=vm_states.RESIZING)
+ self.stubs.Set(nova.db, 'instance_get', new_return_server)
+
+ def instance_destroy_mock(context, id):
+ self.server_delete_called = True
+ self.stubs.Set(nova.db, 'instance_destroy', instance_destroy_mock)
+
+ with self.assertRaises(webob.exc.HTTPConflict):
+ self.controller.delete(req, FAKE_UUID)
+
class ServerStatusTest(test.TestCase):