Fix marker pagination for /servers
Fixes bug 1053028. Recent changes to pagination required passing in full sqlalchemy objects into paginate_query. However, calls to paginate_query were passing in strings. Change-Id: Ib1396a78a12aef1a9cdc31f3624af30f19da44b5
This commit is contained in:
@@ -496,9 +496,14 @@ class Controller(wsgi.Controller):
|
|||||||
search_opts['user_id'] = context.user_id
|
search_opts['user_id'] = context.user_id
|
||||||
|
|
||||||
limit, marker = common.get_limit_and_marker(req)
|
limit, marker = common.get_limit_and_marker(req)
|
||||||
|
try:
|
||||||
instance_list = self.compute_api.get_all(context,
|
instance_list = self.compute_api.get_all(context,
|
||||||
search_opts=search_opts,
|
search_opts=search_opts,
|
||||||
limit=limit, marker=marker)
|
limit=limit,
|
||||||
|
marker=marker)
|
||||||
|
except exception.MarkerNotFound as e:
|
||||||
|
msg = _('marker [%s] not found') % marker
|
||||||
|
raise webob.exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
if is_detail:
|
if is_detail:
|
||||||
self._add_instance_faults(context, instance_list)
|
self._add_instance_faults(context, instance_list)
|
||||||
|
|||||||
@@ -1596,6 +1596,11 @@ def instance_get_all_by_filters(context, filters, sort_key, sort_dir,
|
|||||||
query_prefix = regex_filter(query_prefix, models.Instance, filters)
|
query_prefix = regex_filter(query_prefix, models.Instance, filters)
|
||||||
|
|
||||||
# paginate query
|
# paginate query
|
||||||
|
if marker is not None:
|
||||||
|
try:
|
||||||
|
marker = instance_get_by_uuid(context, marker, session=session)
|
||||||
|
except exception.InstanceNotFound as e:
|
||||||
|
raise exception.MarkerNotFound(marker)
|
||||||
query_prefix = paginate_query(query_prefix, models.Instance, limit,
|
query_prefix = paginate_query(query_prefix, models.Instance, limit,
|
||||||
[sort_key, 'created_at', 'id'],
|
[sort_key, 'created_at', 'id'],
|
||||||
marker=marker,
|
marker=marker,
|
||||||
|
|||||||
@@ -1067,6 +1067,10 @@ class InstanceNotFound(NotFound):
|
|||||||
message = _("Instance %(instance_id)s could not be found.")
|
message = _("Instance %(instance_id)s could not be found.")
|
||||||
|
|
||||||
|
|
||||||
|
class MarkerNotFound(NotFound):
|
||||||
|
message = _("Marker %(marker)s could not be found.")
|
||||||
|
|
||||||
|
|
||||||
class InvalidInstanceIDMalformed(Invalid):
|
class InvalidInstanceIDMalformed(Invalid):
|
||||||
message = _("Invalid id: %(val)s (expecting \"i-...\").")
|
message = _("Invalid id: %(val)s (expecting \"i-...\").")
|
||||||
|
|
||||||
|
|||||||
@@ -402,7 +402,7 @@ def fake_instance_get_all_by_filters(num_servers=5, **kwargs):
|
|||||||
found_marker = True
|
found_marker = True
|
||||||
servers_list = []
|
servers_list = []
|
||||||
if not marker is None and not found_marker:
|
if not marker is None and not found_marker:
|
||||||
raise webob.exc.HTTPBadRequest
|
raise exc.MarkerNotFound(marker)
|
||||||
if not limit is None:
|
if not limit is None:
|
||||||
servers_list = servers_list[:limit]
|
servers_list = servers_list[:limit]
|
||||||
return servers_list
|
return servers_list
|
||||||
|
|||||||
@@ -126,19 +126,24 @@ class DbApiTestCase(test.TestCase):
|
|||||||
result = db.instance_get_all_by_filters(self.context,
|
result = db.instance_get_all_by_filters(self.context,
|
||||||
{'display_name': '%test%'},
|
{'display_name': '%test%'},
|
||||||
sort_dir="asc",
|
sort_dir="asc",
|
||||||
marker=test1)
|
marker=test1['uuid'])
|
||||||
self.assertEqual(2, len(result))
|
self.assertEqual(2, len(result))
|
||||||
result = db.instance_get_all_by_filters(self.context,
|
result = db.instance_get_all_by_filters(self.context,
|
||||||
{'display_name': '%test%'},
|
{'display_name': '%test%'},
|
||||||
sort_dir="asc",
|
sort_dir="asc",
|
||||||
marker=test2)
|
marker=test2['uuid'])
|
||||||
self.assertEqual(1, len(result))
|
self.assertEqual(1, len(result))
|
||||||
result = db.instance_get_all_by_filters(self.context,
|
result = db.instance_get_all_by_filters(self.context,
|
||||||
{'display_name': '%test%'},
|
{'display_name': '%test%'},
|
||||||
sort_dir="asc",
|
sort_dir="asc",
|
||||||
marker=test3)
|
marker=test3['uuid'])
|
||||||
self.assertEqual(0, len(result))
|
self.assertEqual(0, len(result))
|
||||||
|
|
||||||
|
self.assertRaises(exception.MarkerNotFound,
|
||||||
|
db.instance_get_all_by_filters,
|
||||||
|
self.context, {'display_name': '%test%'},
|
||||||
|
marker=str(utils.gen_uuid()))
|
||||||
|
|
||||||
def test_migration_get_unconfirmed_by_dest_compute(self):
|
def test_migration_get_unconfirmed_by_dest_compute(self):
|
||||||
ctxt = context.get_admin_context()
|
ctxt = context.get_admin_context()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user