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:
Mark Washenberger
2012-09-19 18:41:03 +00:00
parent 8473bb4cf9
commit 09b903ed5e
5 changed files with 26 additions and 7 deletions

View File

@@ -496,9 +496,14 @@ class Controller(wsgi.Controller):
search_opts['user_id'] = context.user_id
limit, marker = common.get_limit_and_marker(req)
instance_list = self.compute_api.get_all(context,
search_opts=search_opts,
limit=limit, marker=marker)
try:
instance_list = self.compute_api.get_all(context,
search_opts=search_opts,
limit=limit,
marker=marker)
except exception.MarkerNotFound as e:
msg = _('marker [%s] not found') % marker
raise webob.exc.HTTPBadRequest(explanation=msg)
if is_detail:
self._add_instance_faults(context, instance_list)

View File

@@ -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)
# 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,
[sort_key, 'created_at', 'id'],
marker=marker,

View File

@@ -1067,6 +1067,10 @@ class InstanceNotFound(NotFound):
message = _("Instance %(instance_id)s could not be found.")
class MarkerNotFound(NotFound):
message = _("Marker %(marker)s could not be found.")
class InvalidInstanceIDMalformed(Invalid):
message = _("Invalid id: %(val)s (expecting \"i-...\").")

View File

@@ -402,7 +402,7 @@ def fake_instance_get_all_by_filters(num_servers=5, **kwargs):
found_marker = True
servers_list = []
if not marker is None and not found_marker:
raise webob.exc.HTTPBadRequest
raise exc.MarkerNotFound(marker)
if not limit is None:
servers_list = servers_list[:limit]
return servers_list

View File

@@ -126,19 +126,24 @@ class DbApiTestCase(test.TestCase):
result = db.instance_get_all_by_filters(self.context,
{'display_name': '%test%'},
sort_dir="asc",
marker=test1)
marker=test1['uuid'])
self.assertEqual(2, len(result))
result = db.instance_get_all_by_filters(self.context,
{'display_name': '%test%'},
sort_dir="asc",
marker=test2)
marker=test2['uuid'])
self.assertEqual(1, len(result))
result = db.instance_get_all_by_filters(self.context,
{'display_name': '%test%'},
sort_dir="asc",
marker=test3)
marker=test3['uuid'])
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):
ctxt = context.get_admin_context()