From a1aa75383fd4f04d690c547e23f79f51662f6608 Mon Sep 17 00:00:00 2001 From: isethi Date: Mon, 23 Jul 2012 15:36:13 +0000 Subject: Implements config_drive as extension Adding config drive as an extension allows users to turn it off in case they do not want to use it. Config drive was not intended to be a part of the core functionality. Fixes bug 833331 Change-Id: Icf4b5a21d8cc9df0f140a1a87908ff48c447004b --- nova/api/openstack/compute/contrib/config_drive.py | 94 ++++++++++++++++++++++ nova/api/openstack/compute/views/servers.py | 1 - 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 nova/api/openstack/compute/contrib/config_drive.py (limited to 'nova/api') 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), -- cgit