summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJian Wen <wenjianhn@gmail.com>2012-08-16 22:32:54 +0800
committerJian Wen <wenjianhn@gmail.com>2012-08-23 16:31:18 +0800
commitd034ff1cc12889d3812545a5e1a74c70f66270f5 (patch)
tree7896ea8a99791e2880ed3e72c20e87074e71442c
parent9fecad9e6f7803f3422e7769c01ba3b9076ed308 (diff)
downloadnova-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.py7
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py25
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())