diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-06-24 16:34:33 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-06-24 16:34:33 +0000 |
commit | 1980a0d2e3e1b844f907db59b4d5e4bc9c34ec39 (patch) | |
tree | 220c3062edc3173dcd269b137a877cca694c5b03 /nova/api/openstack/compute/plugins/v3 | |
parent | 278a1a9bc7cd76e77c8a3cb207720d948b045c61 (diff) | |
parent | ca29b25a424098f2de3710ca7ec39b13eeff6b56 (diff) | |
download | nova-1980a0d2e3e1b844f907db59b4d5e4bc9c34ec39.tar.gz nova-1980a0d2e3e1b844f907db59b4d5e4bc9c34ec39.tar.xz nova-1980a0d2e3e1b844f907db59b4d5e4bc9c34ec39.zip |
Merge "Port rescue API to v3 Part 1"
Diffstat (limited to 'nova/api/openstack/compute/plugins/v3')
-rw-r--r-- | nova/api/openstack/compute/plugins/v3/rescue.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/plugins/v3/rescue.py b/nova/api/openstack/compute/plugins/v3/rescue.py new file mode 100644 index 000000000..c89d11117 --- /dev/null +++ b/nova/api/openstack/compute/plugins/v3/rescue.py @@ -0,0 +1,96 @@ +# Copyright 2011 OpenStack Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""The rescue mode extension.""" + +from oslo.config import cfg +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 +from nova import exception +from nova import utils + + +CONF = cfg.CONF +authorize = exts.extension_authorizer('compute', 'rescue') + + +class RescueController(wsgi.Controller): + def __init__(self, *args, **kwargs): + super(RescueController, self).__init__(*args, **kwargs) + self.compute_api = compute.API() + + def _get_instance(self, context, instance_id): + try: + return self.compute_api.get(context, instance_id) + except exception.InstanceNotFound: + msg = _("Server not found") + raise exc.HTTPNotFound(msg) + + @wsgi.action('rescue') + def _rescue(self, req, id, body): + """Rescue an instance.""" + context = req.environ["nova.context"] + authorize(context) + + if body['rescue'] and 'adminPass' in body['rescue']: + password = body['rescue']['adminPass'] + else: + password = utils.generate_password() + + instance = self._get_instance(context, id) + 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') + except exception.InvalidVolume as volume_error: + raise exc.HTTPConflict(explanation=volume_error.format_message()) + except exception.InstanceNotRescuable as non_rescuable: + raise exc.HTTPBadRequest( + explanation=non_rescuable.format_message()) + + return {'adminPass': password} + + @wsgi.action('unrescue') + def _unrescue(self, req, id, body): + """Unrescue an instance.""" + context = req.environ["nova.context"] + authorize(context) + instance = self._get_instance(context, id) + 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) + + +class Rescue(exts.ExtensionDescriptor): + """Instance rescue mode.""" + + name = "Rescue" + alias = "os-rescue" + namespace = "http://docs.openstack.org/compute/ext/rescue/api/v1.1" + updated = "2011-08-18T00:00:00+00:00" + + def get_controller_extensions(self): + controller = RescueController() + extension = exts.ControllerExtension(self, 'servers', controller) + return [extension] |