Add support '--all-tenants' for cinder backup-list
Also added support '--name', '--status', '--volume-id' arguments for cinder backup-list. DocImpact Closes-Bug: #1422046 Depends On: I73f6377c7d6fd92d0464d13f9c8dd6682fef78e3 Change-Id: I5f2ab6370a8333a9ee498c6158037b0433f36a23
This commit is contained in:
@@ -947,3 +947,35 @@ class ShellTest(utils.TestCase):
|
|||||||
expected = {"os-unset_image_metadata": {"key": "key1"}}
|
expected = {"os-unset_image_metadata": {"key": "key1"}}
|
||||||
self.assert_called('POST', '/volumes/1234/action',
|
self.assert_called('POST', '/volumes/1234/action',
|
||||||
body=expected)
|
body=expected)
|
||||||
|
|
||||||
|
def _get_params_from_stack(self, pos=-1):
|
||||||
|
method, url = self.shell.cs.client.callstack[pos][0:2]
|
||||||
|
path, query = parse.splitquery(url)
|
||||||
|
params = parse.parse_qs(query)
|
||||||
|
return path, params
|
||||||
|
|
||||||
|
def test_backup_list_all_tenants(self):
|
||||||
|
self.run_command('backup-list --all-tenants=1 --name=bc '
|
||||||
|
'--status=available --volume-id=1234')
|
||||||
|
expected = {
|
||||||
|
'all_tenants': ['1'],
|
||||||
|
'name': ['bc'],
|
||||||
|
'status': ['available'],
|
||||||
|
'volume_id': ['1234'],
|
||||||
|
}
|
||||||
|
|
||||||
|
path, params = self._get_params_from_stack()
|
||||||
|
|
||||||
|
self.assertEqual('/backups/detail', path)
|
||||||
|
self.assertEqual(4, len(params))
|
||||||
|
|
||||||
|
for k in params.keys():
|
||||||
|
self.assertEqual(expected[k], params[k])
|
||||||
|
|
||||||
|
def test_backup_list_volume_id(self):
|
||||||
|
self.run_command('backup-list --volume-id=1234')
|
||||||
|
self.assert_called('GET', '/backups/detail?volume_id=1234')
|
||||||
|
|
||||||
|
def test_backup_list(self):
|
||||||
|
self.run_command('backup-list')
|
||||||
|
self.assert_called('GET', '/backups/detail')
|
||||||
|
@@ -1229,10 +1229,45 @@ def do_backup_show(cs, args):
|
|||||||
utils.print_dict(info)
|
utils.print_dict(info)
|
||||||
|
|
||||||
|
|
||||||
|
@utils.arg('--all-tenants',
|
||||||
|
metavar='<all_tenants>',
|
||||||
|
nargs='?',
|
||||||
|
type=int,
|
||||||
|
const=1,
|
||||||
|
default=0,
|
||||||
|
help='Shows details for all tenants. Admin only.')
|
||||||
|
@utils.arg('--all_tenants',
|
||||||
|
nargs='?',
|
||||||
|
type=int,
|
||||||
|
const=1,
|
||||||
|
help=argparse.SUPPRESS)
|
||||||
|
@utils.arg('--name',
|
||||||
|
metavar='<name>',
|
||||||
|
default=None,
|
||||||
|
help='Filters results by a name. Default=None.')
|
||||||
|
@utils.arg('--status',
|
||||||
|
metavar='<status>',
|
||||||
|
default=None,
|
||||||
|
help='Filters results by a status. Default=None.')
|
||||||
|
@utils.arg('--volume-id',
|
||||||
|
metavar='<volume-id>',
|
||||||
|
default=None,
|
||||||
|
help='Filters results by a volume ID. Default=None.')
|
||||||
|
@utils.arg('--volume_id',
|
||||||
|
help=argparse.SUPPRESS)
|
||||||
@utils.service_type('volumev2')
|
@utils.service_type('volumev2')
|
||||||
def do_backup_list(cs, args):
|
def do_backup_list(cs, args):
|
||||||
"""Lists all backups."""
|
"""Lists all backups."""
|
||||||
backups = cs.backups.list()
|
|
||||||
|
search_opts = {
|
||||||
|
'all_tenants': args.all_tenants,
|
||||||
|
'name': args.name,
|
||||||
|
'status': args.status,
|
||||||
|
'volume_id': args.volume_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
backups = cs.backups.list(search_opts=search_opts)
|
||||||
|
_translate_volume_snapshot_keys(backups)
|
||||||
columns = ['ID', 'Volume ID', 'Status', 'Name', 'Size', 'Object Count',
|
columns = ['ID', 'Volume ID', 'Status', 'Name', 'Size', 'Object Count',
|
||||||
'Container']
|
'Container']
|
||||||
utils.print_list(backups, columns)
|
utils.print_list(backups, columns)
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
"""
|
"""
|
||||||
Volume Backups interface (1.1 extension).
|
Volume Backups interface (1.1 extension).
|
||||||
"""
|
"""
|
||||||
|
from six.moves.urllib.parse import urlencode
|
||||||
from cinderclient import base
|
from cinderclient import base
|
||||||
|
|
||||||
|
|
||||||
@@ -68,10 +68,16 @@ class VolumeBackupManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:rtype: list of :class:`VolumeBackup`
|
:rtype: list of :class:`VolumeBackup`
|
||||||
"""
|
"""
|
||||||
if detailed is True:
|
search_opts = search_opts or {}
|
||||||
return self._list("/backups/detail", "backups")
|
|
||||||
else:
|
qparams = dict((key, val) for key, val in search_opts.items() if val)
|
||||||
return self._list("/backups", "backups")
|
|
||||||
|
query_string = ("?%s" % urlencode(qparams)) if qparams else ""
|
||||||
|
|
||||||
|
detail = '/detail' if detailed else ''
|
||||||
|
|
||||||
|
return self._list("/backups%s%s" % (detail, query_string),
|
||||||
|
"backups")
|
||||||
|
|
||||||
def delete(self, backup):
|
def delete(self, backup):
|
||||||
"""Delete a volume backup.
|
"""Delete a volume backup.
|
||||||
|
Reference in New Issue
Block a user