summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/common.py28
-rw-r--r--nova/flags.py2
-rw-r--r--nova/tests/api/openstack/test_servers.py3
3 files changed, 19 insertions, 14 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py
index f85d1df9d..f598ac824 100644
--- a/nova/api/openstack/common.py
+++ b/nova/api/openstack/common.py
@@ -20,9 +20,11 @@ from urlparse import urlparse
import webob
from nova import exception
+from nova import flags
+FLAGS = flags.FLAGS
-def limited(items, request, max_limit=1000):
+def limited(items, request, max_limit=FLAGS.osapi_max_limit):
"""
Return a slice of items according to requested offset and limit.
@@ -56,10 +58,13 @@ def limited(items, request, max_limit=1000):
return items[offset:range_end]
-def limited_by_marker(items, request, max_limit=1000):
- ''' Return a slice of items according to requested marker and limit. '''
+def limited_by_marker(items, request, max_limit=FLAGS.osapi_max_limit):
+ """Return a slice of items according to the requested marker and limit."""
- marker = request.GET.get('marker')
+ try:
+ marker = int(request.GET.get('marker', 0))
+ except ValueError:
+ raise webob.exc.HTTPBadRequest(_('marker param must be an integer'))
try:
limit = int(request.GET.get('limit', max_limit))
@@ -69,17 +74,16 @@ def limited_by_marker(items, request, max_limit=1000):
if limit < 0:
raise webob.exc.HTTPBadRequest(_('limit param must be positive'))
- limit = min(max_limit, limit or max_limit)
+ limit = min(max_limit, limit)
start_index = 0
- if marker != None:
- found_it = False
+ if marker:
+ start_index = -1
for i, item in enumerate(items):
- if str(item['id']) == marker:
- start_index = i
- found_it = True
+ if item['id'] == marker:
+ start_index = i + 1
break
- if not found_it:
- raise webob.exc.HTTPBadRequest(_('marker not found'))
+ if start_index < 0:
+ raise webob.exc.HTTPBadRequest(_('marker [%s] not found' % marker))
range_end = start_index + limit
return items[start_index:range_end]
diff --git a/nova/flags.py b/nova/flags.py
index 9123e9ac7..d1817dc3b 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -302,6 +302,8 @@ DEFINE_string('osapi_host', '$my_ip', 'ip of api server')
DEFINE_string('osapi_scheme', 'http', 'prefix for openstack')
DEFINE_integer('osapi_port', 8774, 'OpenStack API port')
DEFINE_string('osapi_path', '/v1.0/', 'suffix for openstack')
+DEFINE_integer('osapi_max_limit', 1000,
+ 'max number of items returned in a collection response')
DEFINE_string('default_project', 'openstack', 'default project for openstack')
DEFINE_string('default_image', 'ami-11111',
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 09b08ce8d..cfed78b90 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -242,9 +242,8 @@ class ServersTest(test.TestCase):
def test_get_servers_with_marker(self):
req = webob.Request.blank('/v1.1/servers?marker=2')
res = req.get_response(fakes.wsgi_app())
- print 'body:', res.body
servers = json.loads(res.body)['servers']
- self.assertEqual([s['id'] for s in servers], [2, 3, 4])
+ self.assertEqual([s['id'] for s in servers], [3, 4])
def _setup_for_create_instance(self):
"""Shared implementation for tests below that create instance"""