summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Knouff <philip.knouff@mailtrust.com>2012-03-05 19:41:12 +0000
committerPhilip Knouff <philip.knouff@mailtrust.com>2012-03-05 19:42:32 +0000
commit913ecb84d286413cfec3dff7cf1b1b71f93bcfce (patch)
tree191e55a1066e2b6c07402754d056edac3c763e65
parent84dc739b289a81848134184f8bfadfe69835feee (diff)
downloadnova-913ecb84d286413cfec3dff7cf1b1b71f93bcfce.tar.gz
nova-913ecb84d286413cfec3dff7cf1b1b71f93bcfce.tar.xz
nova-913ecb84d286413cfec3dff7cf1b1b71f93bcfce.zip
Raise 409 when rescuing instance in RESCUE mode
fixes bud #940581 Change-Id: I8c6b600d36a35ef4e32f35b888f8f2eb8effebcd
-rw-r--r--nova/api/openstack/compute/contrib/rescue.py8
-rw-r--r--nova/api/openstack/extensions.py2
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_rescue.py16
3 files changed, 25 insertions, 1 deletions
diff --git a/nova/api/openstack/compute/contrib/rescue.py b/nova/api/openstack/compute/contrib/rescue.py
index bd2d09162..20158ff22 100644
--- a/nova/api/openstack/compute/contrib/rescue.py
+++ b/nova/api/openstack/compute/contrib/rescue.py
@@ -17,6 +17,7 @@
import webob
from webob import exc
+from nova.api.openstack import common
from nova.api.openstack import extensions as exts
from nova.api.openstack import wsgi
from nova import compute
@@ -56,7 +57,12 @@ class RescueController(wsgi.Controller):
password = utils.generate_password(FLAGS.password_length)
instance = self._get_instance(context, id)
- self.compute_api.rescue(context, instance, rescue_password=password)
+ try:
+ self.compute_api.rescue(context, instance,
+ rescue_password=password)
+ except exception.InstanceInvalidState as state_error:
+ common.raise_http_conflict_for_instance_invalid_state(state_error,
+ 'rescue')
return {'adminPass': password}
@wsgi.action('unrescue')
diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py
index 7d4a167dd..87d215974 100644
--- a/nova/api/openstack/extensions.py
+++ b/nova/api/openstack/extensions.py
@@ -301,6 +301,8 @@ def wrap_errors(fn):
def wrapped(*args, **kwargs):
try:
return fn(*args, **kwargs)
+ except webob.exc.HTTPException:
+ raise
except Exception:
raise webob.exc.HTTPInternalServerError()
return wrapped
diff --git a/nova/tests/api/openstack/compute/contrib/test_rescue.py b/nova/tests/api/openstack/compute/contrib/test_rescue.py
index 9a3706173..c2c8aa28c 100644
--- a/nova/tests/api/openstack/compute/contrib/test_rescue.py
+++ b/nova/tests/api/openstack/compute/contrib/test_rescue.py
@@ -17,6 +17,7 @@ import json
import webob
from nova import compute
+from nova import exception
from nova import flags
from nova import test
from nova.tests.api.openstack import fakes
@@ -68,6 +69,21 @@ class RescueTest(test.TestCase):
resp_json = json.loads(resp.body)
self.assertEqual(FLAGS.password_length, len(resp_json['adminPass']))
+ def test_rescue_of_rescued_instance(self):
+ body = dict(rescue=None)
+
+ def fake_rescue(*args, **kwargs):
+ raise exception.InstanceInvalidState('fake message')
+
+ self.stubs.Set(compute.api.API, "rescue", fake_rescue)
+ 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)
+
def test_unrescue(self):
body = dict(unrescue=None)
req = webob.Request.blank('/v2/fake/servers/test_inst/action')