Merge "Fix "prev" link pagination for instances with identical timestamps"

This commit is contained in:
Zuul 2019-12-27 17:44:58 +00:00 committed by Gerrit Code Review
commit ee36da77f5
2 changed files with 28 additions and 12 deletions
openstack_dashboard
api
test/unit/api

@ -595,24 +595,38 @@ def server_list_paged(request,
view_marker = 'possibly_deleted' if deleted and marker else 'ok'
search_opts['marker'] = deleted if deleted else marker
search_opts['limit'] = page_size + 1
search_opts['sort_dir'] = sort_dir
# NOTE(amotoki): It looks like the 'sort_keys' must be unique to make
# the pagination in the nova API works as expected. Multiple servers
# can have a same 'created_at' as its resolution is a second.
# To ensure the uniqueness we add 'uuid' to the sort keys.
# 'display_name' is added before 'uuid' to list servers in the
# alphabetical order.
sort_keys = ['created_at', 'display_name', 'uuid']
servers = [Server(s, request)
for s in nova_client.servers.list(detailed, search_opts)]
for s in nova_client.servers.list(detailed, search_opts,
sort_keys=sort_keys,
sort_dirs=[sort_dir] * 3)]
if view_marker == 'possibly_deleted':
if not servers:
view_marker = 'head_deleted'
search_opts['sort_dir'] = 'desc'
reversed_order = False
servers = [Server(s, request)
for s in nova_client.servers.list(detailed,
search_opts)]
for s in
nova_client.servers.list(detailed,
search_opts,
sort_keys=sort_keys,
sort_dirs=['desc'] * 3)]
if not servers:
view_marker = 'tail_deleted'
search_opts['sort_dir'] = 'asc'
reversed_order = True
servers = [Server(s, request)
for s in nova_client.servers.list(detailed,
search_opts)]
for s in
nova_client.servers.list(detailed,
search_opts,
sort_keys=sort_keys,
sort_dirs=['asc'] * 3)]
(servers, has_more_data, has_prev_data) = update_pagination(
servers, page_size, marker, reversed_order)
has_prev_data = (False

@ -213,8 +213,9 @@ class ComputeApiTests(test.APIMockTestCase):
True,
{'all_tenants': True,
'marker': None,
'limit': page_size + 1,
'sort_dir': 'desc'})
'limit': page_size + 1},
sort_dirs=['desc', 'desc', 'desc'],
sort_keys=['created_at', 'display_name', 'uuid'])
@override_settings(API_RESULT_PAGE_SIZE=1)
@mock.patch.object(api._nova, 'novaclient')
@ -239,8 +240,9 @@ class ComputeApiTests(test.APIMockTestCase):
True,
{'all_tenants': True,
'marker': None,
'limit': page_size + 1,
'sort_dir': 'desc'})
'limit': page_size + 1},
sort_dirs=['desc', 'desc', 'desc'],
sort_keys=['created_at', 'display_name', 'uuid'])
@mock.patch.object(api._nova, 'novaclient')
def test_usage_get(self, mock_novaclient):