Skip to content

Commit

Permalink
Let admin list instances in vm_states.DELETED
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wenjianhn committed Aug 23, 2012
1 parent 9fecad9 commit d034ff1
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
7 changes: 7 additions & 0 deletions nova/api/openstack/compute/servers.py
Expand Up @@ -428,6 +428,13 @@ def _get_servers(self, req, is_detail):
# 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
Expand Down
25 changes: 25 additions & 0 deletions nova/tests/api/openstack/compute/test_servers.py
Expand Up @@ -718,6 +718,31 @@ def test_get_servers_invalid_status(self):
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())

Expand Down

0 comments on commit d034ff1

Please sign in to comment.