diff options
| author | isethi <iccha.sethi@rackspace.com> | 2012-07-11 19:46:25 +0000 |
|---|---|---|
| committer | isethi <iccha.sethi@rackspace.com> | 2012-07-17 18:05:47 +0000 |
| commit | 26dbf7d03875e10b13d644bc75f21069cf27a671 (patch) | |
| tree | 2120246ff6ec31bf8bcc878afe8e7aa4a754fe8f | |
| parent | acb158714c562d3142bf2f3f560dc374daa2df7d (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.py | 53 | ||||
| -rw-r--r-- | nova/api/openstack/compute/views/servers.py | 1 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_keypairs.py | 24 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/test_servers.py | 10 |
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": { |
