diff options
author | Jian Wen <wenjianhn@gmail.com> | 2012-08-16 22:32:54 +0800 |
---|---|---|
committer | Jian Wen <wenjianhn@gmail.com> | 2012-08-23 16:31:18 +0800 |
commit | d034ff1cc12889d3812545a5e1a74c70f66270f5 (patch) | |
tree | 7896ea8a99791e2880ed3e72c20e87074e71442c | |
parent | 9fecad9e6f7803f3422e7769c01ba3b9076ed308 (diff) | |
download | nova-d034ff1cc12889d3812545a5e1a74c70f66270f5.tar.gz nova-d034ff1cc12889d3812545a5e1a74c70f66270f5.tar.xz nova-d034ff1cc12889d3812545a5e1a74c70f66270f5.zip |
Let admin list instances in vm_states.DELETED
Command 'nova list --status DELETED' returns nothing at the moment.
Make 'nova list --status DELETED' work and work for admin only.
Fixes LP Bug #1037885
Change-Id: I0bace95df713a767bb17e470e66361e1891e628c
-rw-r--r-- | nova/api/openstack/compute/servers.py | 7 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/test_servers.py | 25 |
2 files changed, 32 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 104f6ab99..229c3b5aa 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -428,6 +428,13 @@ class Controller(wsgi.Controller): # No 'changes-since', so we only want non-deleted servers search_opts['deleted'] = False + if search_opts.get("vm_state") == "deleted": + if context.is_admin: + search_opts['deleted'] = True + else: + msg = _("Only administrators may list deleted instances") + raise exc.HTTPBadRequest(explanation=msg) + # NOTE(dprince) This prevents computes' get_all() from returning # instances from multiple tenants when an admin accounts is used. # By default non-admin accounts are always limited to project/user diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py index 6fc7c2fbe..3edf7a5ab 100644 --- a/nova/tests/api/openstack/compute/test_servers.py +++ b/nova/tests/api/openstack/compute/test_servers.py @@ -718,6 +718,31 @@ class ServersControllerTest(test.TestCase): use_admin_context=False) self.assertRaises(webob.exc.HTTPBadRequest, self.controller.index, req) + def test_get_servers_deleted_status_as_user(self): + req = fakes.HTTPRequest.blank('/v2/fake/servers?status=deleted', + use_admin_context=False) + self.assertRaises(webob.exc.HTTPBadRequest, + self.controller.detail, req) + + def test_get_servers_deleted_status_as_admin(self): + server_uuid = str(utils.gen_uuid()) + + def fake_get_all(compute_self, context, search_opts=None, + sort_key=None, sort_dir='desc'): + self.assertTrue('vm_state' in search_opts) + self.assertEqual(search_opts['vm_state'], 'deleted') + + return [fakes.stub_instance(100, uuid=server_uuid)] + + self.stubs.Set(nova.compute.API, 'get_all', fake_get_all) + + req = fakes.HTTPRequest.blank('/v2/fake/servers?status=deleted', + use_admin_context=True) + + servers = self.controller.detail(req)['servers'] + self.assertEqual(len(servers), 1) + self.assertEqual(servers[0]['id'], server_uuid) + def test_get_servers_allows_name(self): server_uuid = str(utils.gen_uuid()) |