summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorisethi <iccha.sethi@rackspace.com>2012-07-11 19:46:25 +0000
committerisethi <iccha.sethi@rackspace.com>2012-07-17 18:05:47 +0000
commit26dbf7d03875e10b13d644bc75f21069cf27a671 (patch)
tree2120246ff6ec31bf8bcc878afe8e7aa4a754fe8f
parentacb158714c562d3142bf2f3f560dc374daa2df7d (diff)
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
-rw-r--r--nova/api/openstack/compute/contrib/keypairs.py53
-rw-r--r--nova/api/openstack/compute/views/servers.py1
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_keypairs.py24
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py10
4 files changed, 76 insertions, 12 deletions
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"],
diff --git a/nova/tests/api/openstack/compute/contrib/test_keypairs.py b/nova/tests/api/openstack/compute/contrib/test_keypairs.py
index bcb33eb47..795e3dcec 100644
--- a/nova/tests/api/openstack/compute/contrib/test_keypairs.py
+++ b/nova/tests/api/openstack/compute/contrib/test_keypairs.py
@@ -56,8 +56,10 @@ class KeypairsTest(test.TestCase):
def setUp(self):
super(KeypairsTest, self).setUp()
+ self.Controller = keypairs.Controller()
fakes.stub_out_networking(self.stubs)
fakes.stub_out_rate_limiting(self.stubs)
+
self.stubs.Set(db, "key_pair_get_all_by_user",
db_key_pair_get_all_by_user)
self.stubs.Set(db, "key_pair_create",
@@ -256,6 +258,28 @@ class KeypairsTest(test.TestCase):
print res
self.assertEqual(res.status_int, 404)
+ def test_show(self):
+ self.stubs.Set(db, 'instance_get',
+ fakes.fake_instance_get())
+ req = webob.Request.blank('/v2/fake/servers/1')
+ req.headers['Content-Type'] = 'application/json'
+ response = req.get_response(fakes.wsgi_app())
+ self.assertEquals(response.status_int, 200)
+ res_dict = jsonutils.loads(response.body)
+ self.assertTrue('key_name' in res_dict['server'])
+ self.assertEquals(res_dict['server']['key_name'], '')
+
+ def test_detail_servers(self):
+ self.stubs.Set(db, 'instance_get',
+ fakes.fake_instance_get())
+ req = fakes.HTTPRequest.blank('/v2/fake/servers/detail')
+ res = req.get_response(fakes.wsgi_app())
+ server_dicts = jsonutils.loads(res.body)['servers']
+
+ for server_dict in server_dicts:
+ self.asserTrue('key_name' in server_dict)
+ self.assertEquals(server_dict['key_name'], '')
+
class KeypairsXMLSerializerTest(test.TestCase):
def setUp(self):
diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py
index 1d97f86fa..904882bb8 100644
--- a/nova/tests/api/openstack/compute/test_servers.py
+++ b/nova/tests/api/openstack/compute/test_servers.py
@@ -173,7 +173,6 @@ class ServersControllerTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "10",
"links": [
@@ -241,7 +240,6 @@ class ServersControllerTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "10",
"links": [
@@ -312,7 +310,6 @@ class ServersControllerTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "10",
"links": [
@@ -2983,7 +2980,6 @@ class ServersViewBuilderTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "5",
"links": [
@@ -3052,7 +3048,6 @@ class ServersViewBuilderTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "5",
"links": [
@@ -3197,7 +3192,6 @@ class ServersViewBuilderTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "5",
"links": [
@@ -3257,7 +3251,6 @@ class ServersViewBuilderTest(test.TestCase):
"created": "2010-10-10T12:00:00Z",
"progress": 0,
"name": "test_server",
- "key_name": "",
"status": "BUILD",
"hostId": '',
"image": {
@@ -3321,7 +3314,6 @@ class ServersViewBuilderTest(test.TestCase):
"created": "2010-10-10T12:00:00Z",
"progress": 0,
"name": "test_server",
- "key_name": "",
"status": "BUILD",
"hostId": '',
"image": {
@@ -3391,7 +3383,6 @@ class ServersViewBuilderTest(test.TestCase):
"accessIPv4": "",
"accessIPv6": "",
"hostId": '',
- "key_name": '',
"image": {
"id": "5",
"links": [
@@ -3536,7 +3527,6 @@ class ServerXMLSerializationTest(test.TestCase):
"name": "test_server",
"status": "BUILD",
"hostId": 'e4d909c290d0fb1ca068ffaddf22cbd0',
- "key_name": '',
"accessIPv4": "1.2.3.4",
"accessIPv6": "fead::1234",
"image": {