diff options
| author | Philip Knouff <philip.knouff@mailtrust.com> | 2012-03-05 19:41:12 +0000 |
|---|---|---|
| committer | Philip Knouff <philip.knouff@mailtrust.com> | 2012-03-05 19:42:32 +0000 |
| commit | 913ecb84d286413cfec3dff7cf1b1b71f93bcfce (patch) | |
| tree | 191e55a1066e2b6c07402754d056edac3c763e65 | |
| parent | 84dc739b289a81848134184f8bfadfe69835feee (diff) | |
| download | nova-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.py | 8 | ||||
| -rw-r--r-- | nova/api/openstack/extensions.py | 2 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_rescue.py | 16 |
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') |
