Skip to content

Commit

Permalink
Adding pagination to the instance views
Browse files Browse the repository at this point in the history
Modifying the api.nova.server_list() method to optionally handle
pagination.  The method will also work without pagination to
support the many other place than the instance views that continue
to call the method.

Fixes: bug #1046915

Change-Id: I8195f1f2d8922e1722743d7a2d627a8645e8b3bd
  • Loading branch information
dklyle committed Apr 12, 2013
1 parent de1940c commit 81247fd
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 78 deletions.
17 changes: 15 additions & 2 deletions openstack_dashboard/api/nova.py
Expand Up @@ -362,14 +362,27 @@ def server_get(request, instance_id):


def server_list(request, search_opts=None, all_tenants=False):
page_size = getattr(settings, 'API_RESULT_PAGE_SIZE', 20)
paginate = False
if search_opts is None:
search_opts = {}
elif 'paginate' in search_opts:
paginate = search_opts.pop('paginate')
if paginate:
search_opts['limit'] = page_size + 1

if all_tenants:
search_opts['all_tenants'] = True
else:
search_opts['project_id'] = request.user.tenant_id
return [Server(s, request)
for s in novaclient(request).servers.list(True, search_opts)]
servers = [Server(s, request)
for s in novaclient(request).servers.list(True, search_opts)]

has_more_data = False
if paginate and len(servers) > page_size:
servers.pop(-1)
has_more_data = True
return (servers, has_more_data)


def server_console_output(request, instance_id, tail_length=None):
Expand Down
2 changes: 1 addition & 1 deletion openstack_dashboard/api/quantum.py
Expand Up @@ -168,7 +168,7 @@ def disassociate(self, floating_ip_id, port_id):

def list_targets(self):
ports = port_list(self.request)
servers = nova.server_list(self.request)
servers, has_more = nova.server_list(self.request)
server_dict = SortedDict([(s.id, s.name) for s in servers])
targets = []
for p in ports:
Expand Down
24 changes: 18 additions & 6 deletions openstack_dashboard/dashboards/admin/instances/tests.py
Expand Up @@ -35,8 +35,10 @@ def test_index(self):
tenants = self.tenants.list()
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True).\
AndReturn(tenants)
search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(servers)
all_tenants=True, search_opts=search_opts) \
.AndReturn([servers, False])
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
self.mox.ReplayAll()

Expand All @@ -54,8 +56,10 @@ def test_index_flavor_list_exception(self):
flavors = self.flavors.list()
full_flavors = SortedDict([(f.id, f) for f in flavors])

search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(servers)
all_tenants=True, search_opts=search_opts) \
.AndReturn([servers, False])
api.nova.flavor_list(IsA(http.HttpRequest)). \
AndRaise(self.exceptions.nova)
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True).\
Expand Down Expand Up @@ -83,8 +87,10 @@ def test_index_flavor_get_exception(self):
for i, server in enumerate(servers):
server.flavor['id'] = str(uuid.UUID(int=i))

search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(servers)
all_tenants=True, search_opts=search_opts) \
.AndReturn([servers, False])
api.nova.flavor_list(IsA(http.HttpRequest)). \
AndReturn(flavors)
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True).\
Expand All @@ -102,8 +108,10 @@ def test_index_flavor_get_exception(self):

@test.create_stubs({api.nova: ('server_list',)})
def test_index_server_list_exception(self):
search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndRaise(self.exceptions.nova)
all_tenants=True, search_opts=search_opts) \
.AndRaise(self.exceptions.nova)

self.mox.ReplayAll()

Expand Down Expand Up @@ -146,8 +154,10 @@ def test_ajax_loading_instances(self):
def test_index_options_before_migrate(self):
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True).\
AndReturn(self.tenants.list())
search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(self.servers.list())
all_tenants=True, search_opts=search_opts) \
.AndReturn([self.servers.list(), False])
api.nova.flavor_list(IsA(http.HttpRequest)).\
AndReturn(self.flavors.list())
self.mox.ReplayAll()
Expand All @@ -164,8 +174,10 @@ def test_index_options_after_migrate(self):
server.status = "VERIFY_RESIZE"
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True).\
AndReturn(self.tenants.list())
search_opts = {'marker': None, 'paginate': True}
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(self.servers.list())
all_tenants=True, search_opts=search_opts) \
.AndReturn([self.servers.list(), False])
api.nova.flavor_list(IsA(http.HttpRequest)).\
AndReturn(self.flavors.list())
self.mox.ReplayAll()
Expand Down
12 changes: 11 additions & 1 deletion openstack_dashboard/dashboards/admin/instances/views.py
Expand Up @@ -46,11 +46,21 @@ class AdminIndexView(tables.DataTableView):
table_class = AdminInstancesTable
template_name = 'admin/instances/index.html'

def has_more_data(self, table):
return self._more

def get_data(self):
instances = []
marker = self.request.GET.get(
AdminInstancesTable._meta.pagination_param, None)
try:
instances = api.nova.server_list(self.request, all_tenants=True)
instances, self._more = api.nova.server_list(
self.request,
search_opts={'marker': marker,
'paginate': True},
all_tenants=True)
except:
self._more = False
exceptions.handle(self.request,
_('Unable to retrieve instance list.'))
if instances:
Expand Down
4 changes: 2 additions & 2 deletions openstack_dashboard/dashboards/admin/volumes/tests.py
Expand Up @@ -33,7 +33,7 @@ def test_index(self):
cinder.volume_list(IsA(http.HttpRequest), search_opts={
'all_tenants': 1}).AndReturn(self.volumes.list())
api.nova.server_list(IsA(http.HttpRequest)).\
AndReturn(self.servers.list())
AndReturn([self.servers.list(), False])
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
keystone.tenant_list(IsA(http.HttpRequest),
Expand Down Expand Up @@ -75,7 +75,7 @@ def test_delete_volume_type(self):
cinder.volume_list(IsA(http.HttpRequest), search_opts={
'all_tenants': 1}).AndReturn(self.volumes.list())
api.nova.server_list(IsA(http.HttpRequest)).\
AndReturn(self.servers.list())
AndReturn([self.servers.list(), False])
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
cinder.volume_type_delete(IsA(http.HttpRequest),
Expand Down
Expand Up @@ -132,7 +132,8 @@ def test_disassociate_post(self):
self.mox.StubOutWithMock(api.nova, 'server_list')

api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(self.servers.list())
all_tenants=True).AndReturn([self.servers.list(),
False])
api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \
.AndReturn(self.floating_ips.list())
api.network.floating_ip_disassociate(IsA(http.HttpRequest),
Expand All @@ -154,7 +155,8 @@ def test_disassociate_post_with_exception(self):
self.mox.StubOutWithMock(api.nova, 'server_list')

api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(self.servers.list())
all_tenants=True).AndReturn([self.servers.list(),
False])
api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \
.AndReturn(self.floating_ips.list())

Expand Down
Expand Up @@ -91,7 +91,8 @@ def get_floating_ips_data(self):

instances = []
try:
instances = nova.server_list(self.request, all_tenants=True)
instances, has_more = nova.server_list(self.request,
all_tenants=True)
except:
exceptions.handle(self.request,
_('Unable to retrieve instance list.'))
Expand Down
Expand Up @@ -43,7 +43,8 @@ def test_index(self):
self.mox.StubOutWithMock(api.nova, 'server_list')

api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True).AndReturn(self.servers.list())
all_tenants=True).AndReturn([self.servers.list(),
False])
api.nova.keypair_list(IsA(http.HttpRequest)).AndReturn(keypairs)
api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \
.AndReturn(floating_ips)
Expand Down

0 comments on commit 81247fd

Please sign in to comment.