Skip to content

Commit 3c7b518

Browse files
committed
Handle the pagination for image list
Handle the paginatiion for image list. We were sorting the data here, so nothing lost for the generator. Change-Id: I2d7d4b3d5c9f650953f309c971ac53b64f6f7f77
1 parent e60bf28 commit 3c7b518

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)