summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorRyu Ishimoto <ryu@midokura.jp>2011-08-19 10:22:24 +0900
committerRyu Ishimoto <ryu@midokura.jp>2011-08-19 10:22:24 +0900
commit93bf9b46a8ca28063752bc9e6c14ed59e91c50a9 (patch)
treeaf112b10f3e1a352afea8eea25cdcd59d9ce87b9 /nova/api
parent54883a4ca07fe6b2f966a604f84e1127477d9a55 (diff)
parent862dc7acaf86bcfaebfce423c8198ea18b5e07c4 (diff)
downloadnova-93bf9b46a8ca28063752bc9e6c14ed59e91c50a9.tar.gz
nova-93bf9b46a8ca28063752bc9e6c14ed59e91c50a9.tar.xz
nova-93bf9b46a8ca28063752bc9e6c14ed59e91c50a9.zip
Merged trunk
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/common.py3
-rw-r--r--nova/api/openstack/contrib/rescue.py83
-rw-r--r--nova/api/openstack/create_instance_helper.py15
-rw-r--r--nova/api/openstack/server_metadata.py3
-rw-r--r--nova/api/openstack/servers.py6
5 files changed, 105 insertions, 5 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py
index b2a675653..d9eb832f2 100644
--- a/nova/api/openstack/common.py
+++ b/nova/api/openstack/common.py
@@ -241,7 +241,8 @@ def check_img_metadata_quota_limit(context, metadata):
quota_metadata = quota.allowed_metadata_items(context, num_metadata)
if quota_metadata < num_metadata:
expl = _("Image metadata limit exceeded")
- raise webob.exc.HTTPBadRequest(explanation=expl)
+ raise webob.exc.HTTPRequestEntityTooLarge(explanation=expl,
+ headers={'Retry-After': 0})
class MetadataXMLDeserializer(wsgi.XMLDeserializer):
diff --git a/nova/api/openstack/contrib/rescue.py b/nova/api/openstack/contrib/rescue.py
new file mode 100644
index 000000000..3de128895
--- /dev/null
+++ b/nova/api/openstack/contrib/rescue.py
@@ -0,0 +1,83 @@
+# Copyright 2011 Openstack, LLC.
+#
+# 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."""
+
+import webob
+from webob import exc
+
+from nova import compute
+from nova import log as logging
+from nova.api.openstack import extensions as exts
+from nova.api.openstack import faults
+
+
+LOG = logging.getLogger("nova.api.contrib.rescue")
+
+
+def wrap_errors(fn):
+ """"Ensure errors are not passed along."""
+ def wrapped(*args):
+ try:
+ fn(*args)
+ except Exception, e:
+ return faults.Fault(exc.HTTPInternalServerError())
+ return wrapped
+
+
+class Rescue(exts.ExtensionDescriptor):
+ """The Rescue controller for the OpenStack API."""
+ def __init__(self):
+ super(Rescue, self).__init__()
+ self.compute_api = compute.API()
+
+ @wrap_errors
+ def _rescue(self, input_dict, req, instance_id):
+ """Rescue an instance."""
+ context = req.environ["nova.context"]
+ self.compute_api.rescue(context, instance_id)
+
+ return webob.Response(status_int=202)
+
+ @wrap_errors
+ def _unrescue(self, input_dict, req, instance_id):
+ """Unrescue an instance."""
+ context = req.environ["nova.context"]
+ self.compute_api.unrescue(context, instance_id)
+
+ return webob.Response(status_int=202)
+
+ def get_name(self):
+ return "Rescue"
+
+ def get_alias(self):
+ return "os-rescue"
+
+ def get_description(self):
+ return "Instance rescue mode"
+
+ def get_namespace(self):
+ return "http://docs.openstack.org/ext/rescue/api/v1.1"
+
+ def get_updated(self):
+ return "2011-08-18T00:00:00+00:00"
+
+ def get_actions(self):
+ """Return the actions the extension adds, as required by contract."""
+ actions = [
+ exts.ActionExtension("servers", "rescue", self._rescue),
+ exts.ActionExtension("servers", "unrescue", self._unrescue),
+ ]
+
+ return actions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index 4e1da549e..978741682 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -122,6 +122,7 @@ class CreateInstanceHelper(object):
raise exc.HTTPBadRequest(explanation=msg)
zone_blob = server_dict.get('blob')
+ user_data = server_dict.get('user_data')
availability_zone = server_dict.get('availability_zone')
name = server_dict['name']
self._validate_server_name(name)
@@ -163,6 +164,7 @@ class CreateInstanceHelper(object):
reservation_id=reservation_id,
min_count=min_count,
max_count=max_count,
+ user_data=user_data,
availability_zone=availability_zone))
except quota.QuotaError as error:
self._handle_quota_error(error)
@@ -180,13 +182,20 @@ class CreateInstanceHelper(object):
"""
if error.code == "OnsetFileLimitExceeded":
expl = _("Personality file limit exceeded")
- raise exc.HTTPBadRequest(explanation=expl)
+ raise exc.HTTPRequestEntityTooLarge(explanation=error.message,
+ headers={'Retry-After': 0})
if error.code == "OnsetFilePathLimitExceeded":
expl = _("Personality file path too long")
- raise exc.HTTPBadRequest(explanation=expl)
+ raise exc.HTTPRequestEntityTooLarge(explanation=error.message,
+ headers={'Retry-After': 0})
if error.code == "OnsetFileContentLimitExceeded":
expl = _("Personality file content too long")
- raise exc.HTTPBadRequest(explanation=expl)
+ raise exc.HTTPRequestEntityTooLarge(explanation=error.message,
+ headers={'Retry-After': 0})
+ if error.code == "InstanceLimitExceeded":
+ expl = _("Instance quotas have been exceeded")
+ raise exc.HTTPRequestEntityTooLarge(explanation=error.message,
+ headers={'Retry-After': 0})
# if the original error is okay, just reraise it
raise error
diff --git a/nova/api/openstack/server_metadata.py b/nova/api/openstack/server_metadata.py
index 2b235f79a..8ac3319c9 100644
--- a/nova/api/openstack/server_metadata.py
+++ b/nova/api/openstack/server_metadata.py
@@ -151,7 +151,8 @@ class Controller(object):
def _handle_quota_error(self, error):
"""Reraise quota errors as api-specific http exceptions."""
if error.code == "MetadataLimitExceeded":
- raise exc.HTTPBadRequest(explanation=error.message)
+ raise exc.HTTPRequestEntityTooLarge(explanation=error.message,
+ headers={'Retry-After': 0})
raise error
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 335ecad86..41e63ec3c 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -923,6 +923,12 @@ class ServerXMLSerializer(wsgi.XMLDictSerializer):
node.setAttribute('adminPass', server_dict['server']['adminPass'])
return self.to_xml_string(node, True)
+ def update(self, server_dict):
+ xml_doc = minidom.Document()
+ node = self._server_to_xml_detailed(xml_doc,
+ server_dict['server'])
+ return self.to_xml_string(node, True)
+
def create_resource(version='1.0'):
controller = {