Skip to content

Commit 6986a32

Browse files
author
Huanxuan Ao
committed
Add "--limit" and "--marker" options to "volume list" command
Add ``--limit`` option to ``volume list`` command in volume v1, add ``--limit`` and ``--marker`` options to ``volume list`` command in volume v2. Change-Id: I327a252aa83ed84166da99cf6aa80334e0e6dd44 Partial-Bug: #1612484
1 parent 676a0e9 commit 6986a32

6 files changed

Lines changed: 159 additions & 2 deletions

File tree

doc/source/command-objects/volume.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ List volumes
121121
[--status <status>]
122122
[--all-projects]
123123
[--long]
124+
[--limit <limit>]
125+
[--marker <marker>]
124126
125127
.. option:: --project <project>
126128
@@ -166,6 +168,16 @@ List volumes
166168
167169
List additional fields in output
168170
171+
.. option:: --limit <limit>
172+
173+
Maximum number of volumes to display
174+
175+
.. option:: --marker <marker>
176+
177+
The last volume ID of the previous page
178+
179+
*Volume version 2 only*
180+
169181
volume set
170182
----------
171183

openstackclient/tests/unit/volume/v1/test_volume.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# under the License.
1414
#
1515

16+
import argparse
1617
import copy
1718
import mock
1819

@@ -437,6 +438,7 @@ def test_volume_list_no_options(self):
437438
('all_projects', False),
438439
('name', None),
439440
('status', None),
441+
('limit', None),
440442
]
441443
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
442444

@@ -454,6 +456,7 @@ def test_volume_list_name(self):
454456
('all_projects', False),
455457
('name', volume_fakes.volume_name),
456458
('status', None),
459+
('limit', None),
457460
]
458461
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
459462

@@ -470,6 +473,7 @@ def test_volume_list_status(self):
470473
('all_projects', False),
471474
('name', None),
472475
('status', volume_fakes.volume_status),
476+
('limit', None),
473477
]
474478
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
475479

@@ -486,6 +490,7 @@ def test_volume_list_all_projects(self):
486490
('all_projects', True),
487491
('name', None),
488492
('status', None),
493+
('limit', None),
489494
]
490495
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
491496

@@ -502,6 +507,7 @@ def test_volume_list_long(self):
502507
('all_projects', False),
503508
('name', None),
504509
('status', None),
510+
('limit', None),
505511
]
506512

507513
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -532,6 +538,41 @@ def test_volume_list_long(self):
532538
), )
533539
self.assertEqual(datalist, tuple(data))
534540

541+
def test_volume_list_with_limit(self):
542+
arglist = [
543+
'--limit', '2',
544+
]
545+
verifylist = [
546+
('long', False),
547+
('all_projects', False),
548+
('name', None),
549+
('status', None),
550+
('limit', 2),
551+
]
552+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
553+
554+
columns, data = self.cmd.take_action(parsed_args)
555+
556+
self.volumes_mock.list.assert_called_once_with(
557+
limit=2,
558+
search_opts={
559+
'status': None,
560+
'display_name': None,
561+
'all_tenants': False, }
562+
)
563+
self.assertEqual(self.columns, columns)
564+
self.assertEqual(self.datalist, tuple(data))
565+
566+
def test_volume_list_negative_limit(self):
567+
arglist = [
568+
"--limit", "-2",
569+
]
570+
verifylist = [
571+
("limit", -2),
572+
]
573+
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
574+
self.cmd, arglist, verifylist)
575+
535576

536577
class TestVolumeSet(TestVolume):
537578

openstackclient/tests/unit/volume/v2/test_volume.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# under the License.
1313
#
1414

15+
import argparse
1516
import mock
1617
from mock import call
1718

@@ -553,6 +554,8 @@ def test_volume_list_no_options(self):
553554
('all_projects', False),
554555
('name', None),
555556
('status', None),
557+
('marker', None),
558+
('limit', None),
556559
]
557560
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
558561

@@ -581,6 +584,8 @@ def test_volume_list_project(self):
581584
('long', False),
582585
('all_projects', False),
583586
('status', None),
587+
('marker', None),
588+
('limit', None),
584589
]
585590
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
586591

@@ -611,6 +616,8 @@ def test_volume_list_project_domain(self):
611616
('long', False),
612617
('all_projects', False),
613618
('status', None),
619+
('marker', None),
620+
('limit', None),
614621
]
615622
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
616623

@@ -639,6 +646,8 @@ def test_volume_list_user(self):
639646
('long', False),
640647
('all_projects', False),
641648
('status', None),
649+
('marker', None),
650+
('limit', None),
642651
]
643652
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
644653

@@ -668,6 +677,8 @@ def test_volume_list_user_domain(self):
668677
('long', False),
669678
('all_projects', False),
670679
('status', None),
680+
('marker', None),
681+
('limit', None),
671682
]
672683
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
673684

@@ -696,6 +707,8 @@ def test_volume_list_name(self):
696707
('all_projects', False),
697708
('name', self.mock_volume.name),
698709
('status', None),
710+
('marker', None),
711+
('limit', None),
699712
]
700713
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
701714

@@ -724,6 +737,8 @@ def test_volume_list_status(self):
724737
('all_projects', False),
725738
('name', None),
726739
('status', self.mock_volume.status),
740+
('marker', None),
741+
('limit', None),
727742
]
728743
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
729744

@@ -752,6 +767,8 @@ def test_volume_list_all_projects(self):
752767
('all_projects', True),
753768
('name', None),
754769
('status', None),
770+
('marker', None),
771+
('limit', None),
755772
]
756773
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
757774

@@ -780,6 +797,8 @@ def test_volume_list_long(self):
780797
('all_projects', False),
781798
('name', None),
782799
('status', None),
800+
('marker', None),
801+
('limit', None),
783802
]
784803

785804
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -813,6 +832,58 @@ def test_volume_list_long(self):
813832
), )
814833
self.assertEqual(datalist, tuple(data))
815834

835+
def test_volume_list_with_marker_and_limit(self):
836+
arglist = [
837+
"--marker", self.mock_volume.id,
838+
"--limit", "2",
839+
]
840+
verifylist = [
841+
('long', False),
842+
('all_projects', False),
843+
('name', None),
844+
('status', None),
845+
('marker', self.mock_volume.id),
846+
('limit', 2),
847+
]
848+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
849+
850+
columns, data = self.cmd.take_action(parsed_args)
851+
852+
self.assertEqual(self.columns, columns)
853+
854+
server = self.mock_volume.attachments[0]['server_id']
855+
device = self.mock_volume.attachments[0]['device']
856+
msg = 'Attached to %s on %s ' % (server, device)
857+
datalist = ((
858+
self.mock_volume.id,
859+
self.mock_volume.name,
860+
self.mock_volume.status,
861+
self.mock_volume.size,
862+
msg,
863+
), )
864+
865+
self.volumes_mock.list.assert_called_once_with(
866+
marker=self.mock_volume.id,
867+
limit=2,
868+
search_opts={
869+
'status': None,
870+
'project_id': None,
871+
'user_id': None,
872+
'display_name': None,
873+
'all_tenants': False, }
874+
)
875+
self.assertEqual(datalist, tuple(data))
876+
877+
def test_volume_list_negative_limit(self):
878+
arglist = [
879+
"--limit", "-2",
880+
]
881+
verifylist = [
882+
("limit", -2),
883+
]
884+
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
885+
self.cmd, arglist, verifylist)
886+
816887

817888
class TestVolumeSet(TestVolume):
818889

openstackclient/volume/v1/volume.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,13 @@ def get_parser(self, prog_name):
220220
default=False,
221221
help=_('List additional fields in output'),
222222
)
223+
parser.add_argument(
224+
'--limit',
225+
type=int,
226+
action=parseractions.NonNegativeAction,
227+
metavar='<limit>',
228+
help=_('Maximum number of volumes to display'),
229+
)
223230
return parser
224231

225232
def take_action(self, parsed_args):
@@ -295,7 +302,10 @@ def _format_attach(attachments):
295302
'status': parsed_args.status,
296303
}
297304

298-
data = volume_client.volumes.list(search_opts=search_opts)
305+
data = volume_client.volumes.list(
306+
search_opts=search_opts,
307+
limit=parsed_args.limit,
308+
)
299309

300310
return (column_headers,
301311
(utils.get_item_properties(

openstackclient/volume/v2/volume.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,18 @@ def get_parser(self, prog_name):
246246
default=False,
247247
help=_('List additional fields in output'),
248248
)
249+
parser.add_argument(
250+
'--marker',
251+
metavar='<marker>',
252+
help=_('The last volume ID of the previous page'),
253+
)
254+
parser.add_argument(
255+
'--limit',
256+
type=int,
257+
action=parseractions.NonNegativeAction,
258+
metavar='<limit>',
259+
help=_('Maximum number of volumes to display'),
260+
)
249261
return parser
250262

251263
def take_action(self, parsed_args):
@@ -328,7 +340,11 @@ def _format_attach(attachments):
328340
'status': parsed_args.status,
329341
}
330342

331-
data = volume_client.volumes.list(search_opts=search_opts)
343+
data = volume_client.volumes.list(
344+
search_opts=search_opts,
345+
marker=parsed_args.marker,
346+
limit=parsed_args.limit,
347+
)
332348

333349
return (column_headers,
334350
(utils.get_item_properties(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
Add ``--limit`` option to ``volume list`` command in volume v1,
5+
add ``--limit`` and ``--marker`` options to ``volume list``
6+
command in volume v2.
7+
[Bug `1612484 <https://bugs.launchpad.net/bugs/1612484>`_]

0 commit comments

Comments
 (0)