Skip to content

Commit e288e01

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Handle the pagination for image list"
2 parents 3284384 + 3c7b518 commit e288e01

4 files changed

Lines changed: 52 additions & 15 deletions

File tree

‎openstackclient/image/v1/image.py‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,17 @@ def take_action(self, parsed_args):
405405
columns = ("ID", "Name")
406406
column_headers = columns
407407

408-
data = image_client.api.image_list(**kwargs)
408+
# List of image data received
409+
data = []
410+
# No pages received yet, so start the page marker at None.
411+
marker = None
412+
while True:
413+
page = image_client.api.image_list(marker=marker, **kwargs)
414+
if not page:
415+
break
416+
data.extend(page)
417+
# Set the marker to the id of the last item we received
418+
marker = page[-1]['id']
409419

410420
if parsed_args.property:
411421
# NOTE(dtroyer): coerce to a list to subscript it in py3

‎openstackclient/image/v2/image.py‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,17 @@ def take_action(self, parsed_args):
156156
columns = ("ID", "Name")
157157
column_headers = columns
158158

159-
data = image_client.api.image_list(**kwargs)
159+
# List of image data received
160+
data = []
161+
# No pages received yet, so start the page marker at None.
162+
marker = None
163+
while True:
164+
page = image_client.api.image_list(marker=marker, **kwargs)
165+
if not page:
166+
break
167+
data.extend(page)
168+
# Set the marker to the id of the last item we received
169+
marker = page[-1]['id']
160170

161171
if parsed_args.property:
162172
# NOTE(dtroyer): coerce to a list to subscript it in py3

‎openstackclient/tests/image/v1/test_image.py‎

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ def setUp(self):
306306
super(TestImageList, self).setUp()
307307

308308
self.api_mock = mock.Mock()
309-
self.api_mock.image_list.return_value = [
310-
copy.deepcopy(image_fakes.IMAGE),
309+
self.api_mock.image_list.side_effect = [
310+
[copy.deepcopy(image_fakes.IMAGE)], [],
311311
]
312312
self.app.client_manager.image.api = self.api_mock
313313

@@ -327,6 +327,7 @@ def test_image_list_no_options(self):
327327
columns, data = self.cmd.take_action(parsed_args)
328328
self.api_mock.image_list.assert_called_with(
329329
detailed=False,
330+
marker=image_fakes.image_id,
330331
)
331332

332333
collist = ('ID', 'Name')
@@ -354,6 +355,7 @@ def test_image_list_public_option(self):
354355
self.api_mock.image_list.assert_called_with(
355356
detailed=False,
356357
public=True,
358+
marker=image_fakes.image_id,
357359
)
358360

359361
collist = ('ID', 'Name')
@@ -381,6 +383,7 @@ def test_image_list_private_option(self):
381383
self.api_mock.image_list.assert_called_with(
382384
detailed=False,
383385
private=True,
386+
marker=image_fakes.image_id,
384387
)
385388

386389
collist = ('ID', 'Name')
@@ -405,6 +408,7 @@ def test_image_list_long_option(self):
405408
columns, data = self.cmd.take_action(parsed_args)
406409
self.api_mock.image_list.assert_called_with(
407410
detailed=True,
411+
marker=image_fakes.image_id,
408412
)
409413

410414
collist = (
@@ -437,8 +441,8 @@ def test_image_list_long_option(self):
437441

438442
@mock.patch('openstackclient.api.utils.simple_filter')
439443
def test_image_list_property_option(self, sf_mock):
440-
sf_mock.return_value = [
441-
copy.deepcopy(image_fakes.IMAGE),
444+
sf_mock.side_effect = [
445+
[copy.deepcopy(image_fakes.IMAGE)], [],
442446
]
443447

444448
arglist = [
@@ -453,6 +457,7 @@ def test_image_list_property_option(self, sf_mock):
453457
columns, data = self.cmd.take_action(parsed_args)
454458
self.api_mock.image_list.assert_called_with(
455459
detailed=True,
460+
marker=image_fakes.image_id,
456461
)
457462
sf_mock.assert_called_with(
458463
[image_fakes.IMAGE],
@@ -472,8 +477,8 @@ def test_image_list_property_option(self, sf_mock):
472477

473478
@mock.patch('openstackclient.common.utils.sort_items')
474479
def test_image_list_sort_option(self, si_mock):
475-
si_mock.return_value = [
476-
copy.deepcopy(image_fakes.IMAGE)
480+
si_mock.side_effect = [
481+
[copy.deepcopy(image_fakes.IMAGE)], [],
477482
]
478483

479484
arglist = ['--sort', 'name:asc']
@@ -483,7 +488,8 @@ def test_image_list_sort_option(self, si_mock):
483488
# DisplayCommandBase.take_action() returns two tuples
484489
columns, data = self.cmd.take_action(parsed_args)
485490
self.api_mock.image_list.assert_called_with(
486-
detailed=False
491+
detailed=False,
492+
marker=image_fakes.image_id,
487493
)
488494
si_mock.assert_called_with(
489495
[image_fakes.IMAGE],

‎openstackclient/tests/image/v2/test_image.py‎

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ def setUp(self):
7070
super(TestImageList, self).setUp()
7171

7272
self.api_mock = mock.Mock()
73-
self.api_mock.image_list.return_value = [
74-
copy.deepcopy(image_fakes.IMAGE),
73+
self.api_mock.image_list.side_effect = [
74+
[copy.deepcopy(image_fakes.IMAGE)], [],
7575
]
7676
self.app.client_manager.image.api = self.api_mock
7777

@@ -90,7 +90,9 @@ def test_image_list_no_options(self):
9090

9191
# DisplayCommandBase.take_action() returns two tuples
9292
columns, data = self.cmd.take_action(parsed_args)
93-
self.api_mock.image_list.assert_called_with()
93+
self.api_mock.image_list.assert_called_with(
94+
marker=image_fakes.image_id,
95+
)
9496

9597
collist = ('ID', 'Name')
9698

@@ -117,6 +119,7 @@ def test_image_list_public_option(self):
117119
columns, data = self.cmd.take_action(parsed_args)
118120
self.api_mock.image_list.assert_called_with(
119121
public=True,
122+
marker=image_fakes.image_id,
120123
)
121124

122125
collist = ('ID', 'Name')
@@ -144,6 +147,7 @@ def test_image_list_private_option(self):
144147
columns, data = self.cmd.take_action(parsed_args)
145148
self.api_mock.image_list.assert_called_with(
146149
private=True,
150+
marker=image_fakes.image_id,
147151
)
148152

149153
collist = ('ID', 'Name')
@@ -171,6 +175,7 @@ def test_image_list_shared_option(self):
171175
columns, data = self.cmd.take_action(parsed_args)
172176
self.api_mock.image_list.assert_called_with(
173177
shared=True,
178+
marker=image_fakes.image_id,
174179
)
175180

176181
collist = ('ID', 'Name')
@@ -193,7 +198,9 @@ def test_image_list_long_option(self):
193198

194199
# DisplayCommandBase.take_action() returns two tuples
195200
columns, data = self.cmd.take_action(parsed_args)
196-
self.api_mock.image_list.assert_called_with()
201+
self.api_mock.image_list.assert_called_with(
202+
marker=image_fakes.image_id,
203+
)
197204

198205
collist = (
199206
'ID',
@@ -239,7 +246,9 @@ def test_image_list_property_option(self, sf_mock):
239246

240247
# DisplayCommandBase.take_action() returns two tuples
241248
columns, data = self.cmd.take_action(parsed_args)
242-
self.api_mock.image_list.assert_called_with()
249+
self.api_mock.image_list.assert_called_with(
250+
marker=image_fakes.image_id,
251+
)
243252
sf_mock.assert_called_with(
244253
[image_fakes.IMAGE],
245254
attr='a',
@@ -268,7 +277,9 @@ def test_image_list_sort_option(self, si_mock):
268277

269278
# DisplayCommandBase.take_action() returns two tuples
270279
columns, data = self.cmd.take_action(parsed_args)
271-
self.api_mock.image_list.assert_called_with()
280+
self.api_mock.image_list.assert_called_with(
281+
marker=image_fakes.image_id,
282+
)
272283
si_mock.assert_called_with(
273284
[image_fakes.IMAGE],
274285
'name:asc'

0 commit comments

Comments
 (0)