Skip to content

Commit e07b0e0

Browse files
author
Huanxuan Ao
committed
Add options to "volume backup list" command
Add "--name", "--status", "--volume", "--marker" (v2 only) and "--limit" (v2 only) options to "volume backup list" command Change-Id: If20cb7650f2359d393ee314d9e055a8659c73009 Closes-Bug: #1612484 Closes-Bug: #1639712
1 parent 0e3e050 commit e07b0e0

6 files changed

Lines changed: 211 additions & 10 deletions

File tree

doc/source/command-objects/volume-backup.rst

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,43 @@ List volume backups
8888
.. code:: bash
8989
9090
os volume backup list
91+
[--long]
92+
[--name <name>]
93+
[--status <status>]
94+
[--volume <volume>]
95+
[--marker <marker>]
96+
[--limit <limit>]
9197
9298
.. _volume_backup_list-backup:
9399
.. option:: --long
94100

95101
List additional fields in output
96102

103+
.. options:: --name <name>
104+
105+
Filters results by the backup name
106+
107+
.. options:: --status <status>
108+
109+
Filters results by the backup status
110+
('creating', 'available', 'deleting', 'error', 'restoring' or 'error_restoring')
111+
112+
.. options:: --volume <volume>
113+
114+
Filters results by the volume which they backup (name or ID)"
115+
116+
.. options:: --marker <marker>
117+
118+
The last backup of the previous page (name or ID)
119+
120+
*Volume version 2 only*
121+
122+
.. options:: --limit <limit>
123+
124+
Maximum number of backups to display
125+
126+
*Volume version 2 only*
127+
97128
volume backup restore
98129
---------------------
99130

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,26 +249,60 @@ def setUp(self):
249249

250250
self.volumes_mock.list.return_value = [self.volume]
251251
self.backups_mock.list.return_value = self.backups
252+
self.volumes_mock.get.return_value = self.volume
252253
# Get the command to test
253254
self.cmd = backup.ListVolumeBackup(self.app, None)
254255

255256
def test_backup_list_without_options(self):
256257
arglist = []
257-
verifylist = [("long", False)]
258+
verifylist = [
259+
("long", False),
260+
("name", None),
261+
("status", None),
262+
("volume", None),
263+
]
258264

259265
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
260266
columns, data = self.cmd.take_action(parsed_args)
261267

268+
search_opts = {
269+
"name": None,
270+
"status": None,
271+
"volume_id": None,
272+
}
273+
self.volumes_mock.get.assert_not_called
274+
self.backups_mock.list.assert_called_with(
275+
search_opts=search_opts,
276+
)
262277
self.assertEqual(self.columns, columns)
263278
self.assertEqual(self.data, list(data))
264279

265280
def test_backup_list_with_options(self):
266-
arglist = ["--long"]
267-
verifylist = [("long", True)]
281+
arglist = [
282+
"--long",
283+
"--name", self.backups[0].name,
284+
"--status", "error",
285+
"--volume", self.volume.id,
286+
]
287+
verifylist = [
288+
("long", True),
289+
("name", self.backups[0].name),
290+
("status", "error"),
291+
("volume", self.volume.id),
292+
]
268293

269294
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
270295
columns, data = self.cmd.take_action(parsed_args)
271296

297+
search_opts = {
298+
"name": self.backups[0].name,
299+
"status": "error",
300+
"volume_id": self.volume.id,
301+
}
302+
self.volumes_mock.get.assert_called_once_with(self.volume.id)
303+
self.backups_mock.list.assert_called_with(
304+
search_opts=search_opts,
305+
)
272306
self.assertEqual(self.columns_long, columns)
273307
self.assertEqual(self.data_long, list(data))
274308

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

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,26 +280,73 @@ def setUp(self):
280280

281281
self.volumes_mock.list.return_value = [self.volume]
282282
self.backups_mock.list.return_value = self.backups
283+
self.volumes_mock.get.return_value = self.volume
284+
self.backups_mock.get.return_value = self.backups[0]
283285
# Get the command to test
284286
self.cmd = backup.ListVolumeBackup(self.app, None)
285287

286288
def test_backup_list_without_options(self):
287289
arglist = []
288-
verifylist = [("long", False)]
290+
verifylist = [
291+
("long", False),
292+
("name", None),
293+
("status", None),
294+
("volume", None),
295+
("marker", None),
296+
("limit", None),
297+
]
289298

290299
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
291300
columns, data = self.cmd.take_action(parsed_args)
292301

302+
search_opts = {
303+
"name": None,
304+
"status": None,
305+
"volume_id": None,
306+
}
307+
self.volumes_mock.get.assert_not_called
308+
self.backups_mock.get.assert_not_called
309+
self.backups_mock.list.assert_called_with(
310+
search_opts=search_opts,
311+
marker=None,
312+
limit=None,
313+
)
293314
self.assertEqual(self.columns, columns)
294315
self.assertEqual(self.data, list(data))
295316

296317
def test_backup_list_with_options(self):
297-
arglist = ["--long"]
298-
verifylist = [("long", True)]
318+
arglist = [
319+
"--long",
320+
"--name", self.backups[0].name,
321+
"--status", "error",
322+
"--volume", self.volume.id,
323+
"--marker", self.backups[0].id,
324+
"--limit", "3",
325+
]
326+
verifylist = [
327+
("long", True),
328+
("name", self.backups[0].name),
329+
("status", "error"),
330+
("volume", self.volume.id),
331+
("marker", self.backups[0].id),
332+
("limit", 3),
333+
]
299334

300335
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
301336
columns, data = self.cmd.take_action(parsed_args)
302337

338+
search_opts = {
339+
"name": self.backups[0].name,
340+
"status": "error",
341+
"volume_id": self.volume.id,
342+
}
343+
self.volumes_mock.get.assert_called_once_with(self.volume.id)
344+
self.backups_mock.get.assert_called_once_with(self.backups[0].id)
345+
self.backups_mock.list.assert_called_with(
346+
search_opts=search_opts,
347+
marker=self.backups[0].id,
348+
limit=3,
349+
)
303350
self.assertEqual(self.columns_long, columns)
304351
self.assertEqual(self.data_long, list(data))
305352

openstackclient/volume/v1/backup.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,30 @@ def get_parser(self, prog_name):
152152
default=False,
153153
help=_('List additional fields in output'),
154154
)
155+
parser.add_argument(
156+
"--name",
157+
metavar="<name>",
158+
help=_("Filters results by the backup name")
159+
)
160+
parser.add_argument(
161+
"--status",
162+
metavar="<status>",
163+
choices=['creating', 'available', 'deleting',
164+
'error', 'restoring', 'error_restoring'],
165+
help=_("Filters results by the backup status "
166+
"('creating', 'available', 'deleting', "
167+
"'error', 'restoring' or 'error_restoring')")
168+
)
169+
parser.add_argument(
170+
"--volume",
171+
metavar="<volume>",
172+
help=_("Filters results by the volume which they "
173+
"backup (name or ID)")
174+
)
155175
return parser
156176

157177
def take_action(self, parsed_args):
178+
volume_client = self.app.client_manager.volume
158179

159180
def _format_volume_id(volume_id):
160181
"""Return a volume name if available
@@ -180,13 +201,24 @@ def _format_volume_id(volume_id):
180201
# Cache the volume list
181202
volume_cache = {}
182203
try:
183-
for s in self.app.client_manager.volume.volumes.list():
204+
for s in volume_client.volumes.list():
184205
volume_cache[s.id] = s
185206
except Exception:
186207
# Just forget it if there's any trouble
187208
pass
188209

189-
data = self.app.client_manager.volume.backups.list()
210+
filter_volume_id = None
211+
if parsed_args.volume:
212+
filter_volume_id = utils.find_resource(volume_client.volumes,
213+
parsed_args.volume).id
214+
search_opts = {
215+
'name': parsed_args.name,
216+
'status': parsed_args.status,
217+
'volume_id': filter_volume_id,
218+
}
219+
data = volume_client.backups.list(
220+
search_opts=search_opts,
221+
)
190222

191223
return (column_headers,
192224
(utils.get_item_properties(

openstackclient/volume/v2/backup.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import copy
1818
import logging
1919

20+
from osc_lib.cli import parseractions
2021
from osc_lib.command import command
2122
from osc_lib import exceptions
2223
from osc_lib import utils
@@ -179,9 +180,42 @@ def get_parser(self, prog_name):
179180
default=False,
180181
help=_("List additional fields in output")
181182
)
183+
parser.add_argument(
184+
"--name",
185+
metavar="<name>",
186+
help=_("Filters results by the backup name")
187+
)
188+
parser.add_argument(
189+
"--status",
190+
metavar="<status>",
191+
choices=['creating', 'available', 'deleting',
192+
'error', 'restoring', 'error_restoring'],
193+
help=_("Filters results by the backup status "
194+
"('creating', 'available', 'deleting', "
195+
"'error', 'restoring' or 'error_restoring')")
196+
)
197+
parser.add_argument(
198+
"--volume",
199+
metavar="<volume>",
200+
help=_("Filters results by the volume which they "
201+
"backup (name or ID)")
202+
)
203+
parser.add_argument(
204+
'--marker',
205+
metavar='<marker>',
206+
help=_('The last backup of the previous page (name or ID)'),
207+
)
208+
parser.add_argument(
209+
'--limit',
210+
type=int,
211+
action=parseractions.NonNegativeAction,
212+
metavar='<limit>',
213+
help=_('Maximum number of backups to display'),
214+
)
182215
return parser
183216

184217
def take_action(self, parsed_args):
218+
volume_client = self.app.client_manager.volume
185219

186220
def _format_volume_id(volume_id):
187221
"""Return a volume name if available
@@ -207,13 +241,30 @@ def _format_volume_id(volume_id):
207241
# Cache the volume list
208242
volume_cache = {}
209243
try:
210-
for s in self.app.client_manager.volume.volumes.list():
244+
for s in volume_client.volumes.list():
211245
volume_cache[s.id] = s
212246
except Exception:
213247
# Just forget it if there's any trouble
214248
pass
215249

216-
data = self.app.client_manager.volume.backups.list()
250+
filter_volume_id = None
251+
if parsed_args.volume:
252+
filter_volume_id = utils.find_resource(volume_client.volumes,
253+
parsed_args.volume).id
254+
marker_backup_id = None
255+
if parsed_args.marker:
256+
marker_backup_id = utils.find_resource(volume_client.backups,
257+
parsed_args.marker).id
258+
search_opts = {
259+
'name': parsed_args.name,
260+
'status': parsed_args.status,
261+
'volume_id': filter_volume_id,
262+
}
263+
data = volume_client.backups.list(
264+
search_opts=search_opts,
265+
marker=marker_backup_id,
266+
limit=parsed_args.limit,
267+
)
217268

218269
return (column_headers,
219270
(utils.get_item_properties(
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``--name``, ``--status``, ``--volume``, ``--marker`` and ``--limit`` options
5+
to ``volume backup list`` command
6+
[Bug `1639712 <https://bugs.launchpad.net/bugs/1639712>`_]

0 commit comments

Comments
 (0)