summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-08-19 09:54:05 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-08-19 09:54:05 -0400
commit98c7aeddbec9279970fcb197c89315839f6d94cb (patch)
treea220e4e4e95bacf32954231879d9633998911de0 /nova/api
parent254d45ac22c1f4f9cb6e6b02e7a416e5d94f401e (diff)
parentba079e5ccfa6b5f9fdfa036842f3e5ba51df4b75 (diff)
merge with trunk
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/contrib/rescue.py83
-rw-r--r--nova/api/openstack/contrib/virtual_interfaces.py108
-rw-r--r--nova/api/openstack/servers.py6
3 files changed, 197 insertions, 0 deletions
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/contrib/virtual_interfaces.py b/nova/api/openstack/contrib/virtual_interfaces.py
new file mode 100644
index 000000000..dab61efc8
--- /dev/null
+++ b/nova/api/openstack/contrib/virtual_interfaces.py
@@ -0,0 +1,108 @@
+# Copyright (C) 2011 Midokura KK
+# All Rights Reserved.
+#
+# 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 virtual interfaces extension."""
+
+from webob import exc
+import webob
+
+from nova import compute
+from nova import exception
+from nova import log as logging
+from nova.api.openstack import common
+from nova.api.openstack import extensions
+from nova.api.openstack import faults
+from nova.api.openstack import wsgi
+
+
+LOG = logging.getLogger("nova.api.virtual_interfaces")
+
+
+def _translate_vif_summary_view(_context, vif):
+ """Maps keys for VIF summary view."""
+ d = {}
+ d['id'] = vif['uuid']
+ d['mac_address'] = vif['address']
+ return d
+
+
+def _get_metadata():
+ metadata = {
+ "attributes": {
+ 'virtual_interface': ["id", "mac_address"]}}
+ return metadata
+
+
+class ServerVirtualInterfaceController(object):
+ """The instance VIF API controller for the Openstack API.
+ """
+
+ def __init__(self):
+ self.compute_api = compute.API()
+ super(ServerVirtualInterfaceController, self).__init__()
+
+ def _items(self, req, server_id, entity_maker):
+ """Returns a list of VIFs, transformed through entity_maker."""
+ context = req.environ['nova.context']
+
+ try:
+ instance = self.compute_api.get(context, server_id)
+ except exception.NotFound:
+ return faults.Fault(exc.HTTPNotFound())
+
+ vifs = instance['virtual_interfaces']
+ limited_list = common.limited(vifs, req)
+ res = [entity_maker(context, vif) for vif in limited_list]
+ return {'virtual_interfaces': res}
+
+ def index(self, req, server_id):
+ """Returns the list of VIFs for a given instance."""
+ return self._items(req, server_id,
+ entity_maker=_translate_vif_summary_view)
+
+
+class Virtual_interfaces(extensions.ExtensionDescriptor):
+
+ def get_name(self):
+ return "VirtualInterfaces"
+
+ def get_alias(self):
+ return "virtual_interfaces"
+
+ def get_description(self):
+ return "Virtual interface support"
+
+ def get_namespace(self):
+ return "http://docs.openstack.org/ext/virtual_interfaces/api/v1.1"
+
+ def get_updated(self):
+ return "2011-08-17T00:00:00+00:00"
+
+ def get_resources(self):
+ resources = []
+
+ metadata = _get_metadata()
+ body_serializers = {
+ 'application/xml': wsgi.XMLDictSerializer(metadata=metadata,
+ xmlns=wsgi.XMLNS_V11)}
+ serializer = wsgi.ResponseSerializer(body_serializers, None)
+ res = extensions.ResourceExtension(
+ 'os-virtual-interfaces',
+ controller=ServerVirtualInterfaceController(),
+ parent=dict(member_name='server', collection_name='servers'),
+ serializer=serializer)
+ resources.append(res)
+
+ return resources
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 49903d503..214174273 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -925,6 +925,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 = {