Add pagination to v2 image-list
* Use a recursive generator function to iterate over the image container. The presence of next links are indicators to continue pagination while their value drives the location of the next page. * A user can pass in --page-size on the command line, or page_size when using the controller directly, to control how many images are requested with each subsequent paginated request. Default page size is 20. * Add a flag (strict_url_check) for the FakeAPI class to control whether it chops off query params when trying to match a request to a fixture. * Related to bp glance-client-v2. Change-Id: Ib98e912a7af0bb570b4fd738733edd9b837d1a12
This commit is contained in:
@@ -13,19 +13,35 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
DEFAULT_PAGE_SIZE = 20
|
||||
|
||||
|
||||
class Controller(object):
|
||||
def __init__(self, http_client, model):
|
||||
self.http_client = http_client
|
||||
self.model = model
|
||||
|
||||
def list(self):
|
||||
def list(self, page_size=DEFAULT_PAGE_SIZE):
|
||||
"""Retrieve a listing of Image objects
|
||||
|
||||
:param page_size: Number of images to request in each paginated request
|
||||
:returns generator over list of Images
|
||||
"""
|
||||
resp, body = self.http_client.json_request('GET', '/v2/images')
|
||||
for image in body['images']:
|
||||
def paginate(url):
|
||||
resp, body = self.http_client.json_request('GET', url)
|
||||
for image in body['images']:
|
||||
yield image
|
||||
try:
|
||||
next_url = body['next']
|
||||
except KeyError:
|
||||
return
|
||||
else:
|
||||
for image in paginate(next_url):
|
||||
yield image
|
||||
|
||||
url = '/v2/images?limit=%s' % page_size
|
||||
|
||||
for image in paginate(url):
|
||||
#NOTE(bcwaldon): remove 'self' for now until we have an elegant
|
||||
# way to pass it into the model constructor without conflict
|
||||
image.pop('self', None)
|
||||
|
||||
Reference in New Issue
Block a user