From 575ad8f77dc7095c8a0ba9dd8deb41bf2fddae1f Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Mon, 26 Mar 2012 20:43:43 +0000 Subject: [PATCH] Fix unrescue in invalid state Fixes bug 965667 Unrescue did not check for InstanceInvalidState exception and return the appropriate error. Change-Id: I3ca2c1dae09bd149086bfe67e2233c8359d5c8f8 --- nova/api/openstack/compute/contrib/rescue.py | 6 +++++- .../api/openstack/compute/contrib/test_rescue.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/nova/api/openstack/compute/contrib/rescue.py b/nova/api/openstack/compute/contrib/rescue.py index b46b12a1865..7bf815a3797 100644 --- a/nova/api/openstack/compute/contrib/rescue.py +++ b/nova/api/openstack/compute/contrib/rescue.py @@ -72,7 +72,11 @@ def _unrescue(self, req, id, body): context = req.environ["nova.context"] authorize(context) instance = self._get_instance(context, id) - self.compute_api.unrescue(context, instance) + try: + self.compute_api.unrescue(context, instance) + except exception.InstanceInvalidState as state_error: + common.raise_http_conflict_for_instance_invalid_state(state_error, + 'unrescue') return webob.Response(status_int=202) diff --git a/nova/tests/api/openstack/compute/contrib/test_rescue.py b/nova/tests/api/openstack/compute/contrib/test_rescue.py index c2c8aa28ca6..00efc2f274a 100644 --- a/nova/tests/api/openstack/compute/contrib/test_rescue.py +++ b/nova/tests/api/openstack/compute/contrib/test_rescue.py @@ -93,3 +93,18 @@ def test_unrescue(self): resp = req.get_response(fakes.wsgi_app()) self.assertEqual(resp.status_int, 202) + + def test_unrescue_of_active_instance(self): + body = dict(unrescue=None) + + def fake_unrescue(*args, **kwargs): + raise exception.InstanceInvalidState('fake message') + + self.stubs.Set(compute.api.API, "unrescue", fake_unrescue) + req = webob.Request.blank('/v2/fake/servers/test_inst/action') + req.method = "POST" + req.body = json.dumps(body) + req.headers["content-type"] = "application/json" + + resp = req.get_response(fakes.wsgi_app()) + self.assertEqual(resp.status_int, 409)