Skip to content

Commit cc5379b

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add "--limit" and "--marker" options to "volume list" command"
2 parents f5c09fe + 6986a32 commit cc5379b

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
from mock import call
@@ -540,6 +541,7 @@ def test_volume_list_no_options(self):
540541
('all_projects', False),
541542
('name', None),
542543
('status', None),
544+
('limit', None),
543545
]
544546
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
545547

@@ -557,6 +559,7 @@ def test_volume_list_name(self):
557559
('all_projects', False),
558560
('name', volume_fakes.volume_name),
559561
('status', None),
562+
('limit', None),
560563
]
561564
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
562565

@@ -573,6 +576,7 @@ def test_volume_list_status(self):
573576
('all_projects', False),
574577
('name', None),
575578
('status', volume_fakes.volume_status),
579+
('limit', None),
576580
]
577581
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
578582

@@ -589,6 +593,7 @@ def test_volume_list_all_projects(self):
589593
('all_projects', True),
590594
('name', None),
591595
('status', None),
596+
('limit', None),
592597
]
593598
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
594599

@@ -605,6 +610,7 @@ def test_volume_list_long(self):
605610
('all_projects', False),
606611
('name', None),
607612
('status', None),
613+
('limit', None),
608614
]
609615

610616
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -635,6 +641,41 @@ def test_volume_list_long(self):
635641
), )
636642
self.assertEqual(datalist, tuple(data))
637643

644+
def test_volume_list_with_limit(self):
645+
arglist = [
646+
'--limit', '2',
647+
]
648+
verifylist = [
649+
('long', False),
650+
('all_projects', False),
651+
('name', None),
652+
('status', None),
653+
('limit', 2),
654+
]
655+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
656+
657+
columns, data = self.cmd.take_action(parsed_args)
658+
659+
self.volumes_mock.list.assert_called_once_with(
660+
limit=2,
661+
search_opts={
662+
'status': None,
663+
'display_name': None,
664+
'all_tenants': False, }
665+
)
666+
self.assertEqual(self.columns, columns)
667+
self.assertEqual(self.datalist, tuple(data))
668+
669+
def test_volume_list_negative_limit(self):
670+
arglist = [
671+
"--limit", "-2",
672+
]
673+
verifylist = [
674+
("limit", -2),
675+
]
676+
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
677+
self.cmd, arglist, verifylist)
678+
638679

639680
class TestVolumeSet(TestVolume):
640681

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
@@ -235,6 +235,13 @@ def get_parser(self, prog_name):
235235
default=False,
236236
help=_('List additional fields in output'),
237237
)
238+
parser.add_argument(
239+
'--limit',
240+
type=int,
241+
action=parseractions.NonNegativeAction,
242+
metavar='<limit>',
243+
help=_('Maximum number of volumes to display'),
244+
)
238245
return parser
239246

240247
def take_action(self, parsed_args):
@@ -310,7 +317,10 @@ def _format_attach(attachments):
310317
'status': parsed_args.status,
311318
}
312319

313-
data = volume_client.volumes.list(search_opts=search_opts)
320+
data = volume_client.volumes.list(
321+
search_opts=search_opts,
322+
limit=parsed_args.limit,
323+
)
314324

315325
return (column_headers,
316326
(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)