summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-07-27 15:40:52 +0000
committerGerrit Code Review <review@openstack.org>2012-07-27 15:40:52 +0000
commitb03e0dc04260401b34db0565026105662349f64f (patch)
treef6b817a291325d15a6bd6b3523461dcc1609b426 /nova/api
parent5110f707dfc31ef756624c48ad7139397692350c (diff)
parenta1aa75383fd4f04d690c547e23f79f51662f6608 (diff)
downloadnova-b03e0dc04260401b34db0565026105662349f64f.tar.gz
nova-b03e0dc04260401b34db0565026105662349f64f.tar.xz
nova-b03e0dc04260401b34db0565026105662349f64f.zip
Merge "Implements config_drive as extension"
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/compute/contrib/config_drive.py94
-rw-r--r--nova/api/openstack/compute/views/servers.py1
2 files changed, 94 insertions, 1 deletions
diff --git a/nova/api/openstack/compute/contrib/config_drive.py b/nova/api/openstack/compute/contrib/config_drive.py
new file mode 100644
index 000000000..49f0aef78
--- /dev/null
+++ b/nova/api/openstack/compute/contrib/config_drive.py
@@ -0,0 +1,94 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 OpenStack LLC.
+# 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.
+
+"""Config Drive extension"""
+
+import webob
+import webob.exc
+
+from nova.api.openstack.compute import servers
+from nova.api.openstack.compute import views
+from nova.api.openstack import extensions
+from nova.api.openstack import wsgi
+from nova.api.openstack import xmlutil
+from nova.compute import api as compute_api
+from nova import exception
+from nova import flags
+from nova.openstack.common import log as logging
+
+
+FLAGS = flags.FLAGS
+authorize = extensions.soft_extension_authorizer('compute', 'config_drive')
+
+
+class ServerConfigDriveTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('server')
+ root.set('config_drive', 'config_drive')
+ return xmlutil.SlaveTemplate(root, 1)
+
+
+class ServersConfigDriveTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('servers')
+ elem = xmlutil.SubTemplateElement(root, 'server', selector='servers')
+ elem.set('config_drive', 'config_drive')
+ return xmlutil.SlaveTemplate(root, 1)
+
+
+class Controller(servers.Controller):
+
+ def _add_config_drive(self, req, servers):
+ for server in servers:
+ db_server = req.get_db_instance(server['id'])
+ # server['id'] is guaranteed to be in the cache due to
+ # the core API adding it in its 'show'/'detail' methods.
+ server['config_drive'] = db_server['config_drive']
+
+ def _show(self, req, resp_obj):
+ if 'server' in resp_obj.obj:
+ resp_obj.attach(xml=ServerConfigDriveTemplate())
+ server = resp_obj.obj['server']
+ self._add_config_drive(req, [server])
+
+ @wsgi.extends
+ def show(self, req, resp_obj, id):
+ context = req.environ['nova.context']
+ if authorize(context):
+ self._show(req, resp_obj)
+
+ @wsgi.extends
+ def detail(self, req, resp_obj):
+ context = req.environ['nova.context']
+ if 'servers' in resp_obj.obj and authorize(context):
+ resp_obj.attach(xml=ServersConfigDriveTemplate())
+ servers = resp_obj.obj['servers']
+ self._add_config_drive(req, servers)
+
+
+class Config_drive(extensions.ExtensionDescriptor):
+ """Config Drive Extension"""
+
+ name = "ConfigDrive"
+ alias = "os-config_drive"
+ namespace = "http://docs.openstack.org/compute/ext/config_drive/api/v1.1"
+ updated = "2012-07-16T00:00:00+00:00"
+
+ def get_controller_extensions(self):
+ controller = Controller()
+ extension = extensions.ControllerExtension(self, 'servers', controller)
+ return [extension]
diff --git a/nova/api/openstack/compute/views/servers.py b/nova/api/openstack/compute/views/servers.py
index a5acd9870..b423b37d4 100644
--- a/nova/api/openstack/compute/views/servers.py
+++ b/nova/api/openstack/compute/views/servers.py
@@ -104,7 +104,6 @@ class ViewBuilder(common.ViewBuilder):
"addresses": self._get_addresses(request, instance),
"accessIPv4": instance.get("access_ip_v4") or "",
"accessIPv6": instance.get("access_ip_v6") or "",
- "config_drive": instance.get("config_drive"),
"links": self._get_links(request,
instance["uuid"],
self._collection_name),