From 26dbf7d03875e10b13d644bc75f21069cf27a671 Mon Sep 17 00:00:00 2001 From: isethi Date: Wed, 11 Jul 2012 19:46:25 +0000 Subject: Display key_name only if keypairs extension is used GET /servers/xxx will display the key_name only if the keypairs extension is being used. Fixes bug 1024986 Change-Id: Ie37880f63b7595ae3dd2f3b23c6c3097dac2f57c --- nova/api/openstack/compute/contrib/keypairs.py | 53 +++++++++++++++++++++++++- nova/api/openstack/compute/views/servers.py | 1 - 2 files changed, 52 insertions(+), 2 deletions(-) (limited to 'nova/api') diff --git a/nova/api/openstack/compute/contrib/keypairs.py b/nova/api/openstack/compute/contrib/keypairs.py index 474673794..c3f9c69ef 100644 --- a/nova/api/openstack/compute/contrib/keypairs.py +++ b/nova/api/openstack/compute/contrib/keypairs.py @@ -20,6 +20,7 @@ import webob import webob.exc +from nova.api.openstack.compute import servers from nova.api.openstack import extensions from nova.api.openstack import wsgi from nova.api.openstack import xmlutil @@ -28,6 +29,7 @@ from nova import exception authorize = extensions.extension_authorizer('compute', 'keypairs') +soft_authorize = extensions.soft_extension_authorizer('compute', 'keypairs') class KeypairTemplate(xmlutil.TemplateBuilder): @@ -125,6 +127,51 @@ class KeypairController(object): return {'keypairs': rval} +class ServerKeyNameTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('server') + root.set('key_name', 'key_name') + return xmlutil.SlaveTemplate(root, 1) + + +class ServersKeyNameTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('servers') + elem = xmlutil.SubTemplateElement(root, 'server', selector='servers') + elem.set('key_name', 'key_name') + return xmlutil.SlaveTemplate(root, 1) + + +class Controller(servers.Controller): + + def _add_key_name(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['key_name'] = db_server['key_name'] + + def _show(self, req, resp_obj): + if 'server' in resp_obj.obj: + resp_obj.attach(xml=ServerKeyNameTemplate()) + server = resp_obj.obj['server'] + self._add_key_name(req, [server]) + + @wsgi.extends + def show(self, req, resp_obj, id): + context = req.environ['nova.context'] + if soft_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=ServersKeyNameTemplate()) + servers = resp_obj.obj['servers'] + self._add_key_name(req, servers) + + class Keypairs(extensions.ExtensionDescriptor): """Keypair Support""" @@ -139,6 +186,10 @@ class Keypairs(extensions.ExtensionDescriptor): res = extensions.ResourceExtension( 'os-keypairs', KeypairController()) - resources.append(res) return resources + + 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 9aaf96fe3..a5acd9870 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 "", - "key_name": instance.get("key_name") or "", "config_drive": instance.get("config_drive"), "links": self._get_links(request, instance["uuid"], -- cgit