Add filters support for volume transfer

Currently ``id`` and ``volume_id`` filters are working
correctly for transfer-list command.
support for filtering by ``name`` is handled in patch
provided in Depends-On.
Since filtering by all parameters is supported by API,
we can happily add the filters option on the client for
volume transfers.

Also adds functional test for transfers.

Related-Bug: #1860100

Depends-On: https://review.opendev.org/#/c/703658/

Change-Id: I2fd3a6a7b9add65a9a21388df44efb6747065a74
This commit is contained in:
Rajat Dhasmana 2020-01-16 17:43:32 +00:00
parent ed8e570e63
commit 8d0d0521c6
5 changed files with 85 additions and 1 deletions

View File

@ -156,7 +156,9 @@ class ClientTestBase(base.ClientTestBase):
output = self.cinder(cmd, params=params)
object = self._get_property_from_output(output)
self.addCleanup(self.object_delete, object_name, object['id'])
self.wait_for_object_status(object_name, object['id'], 'available')
if object_name in ('volume', 'snapshot', 'backup'):
self.wait_for_object_status(
object_name, object['id'], 'available')
return object
def object_delete(self, object_name, object_id):

View File

@ -102,3 +102,36 @@ class CinderBackupTests(base.ClientTestBase):
self.check_object_deleted('volume', volume['id'])
self.object_delete('backup', backup['id'])
self.check_object_deleted('backup', backup['id'])
class VolumeTransferTests(base.ClientTestBase):
"""Check of base cinder volume transfers command"""
TRANSFER_PROPERTY = ('created_at', 'volume_id', 'id', 'auth_key', 'name')
TRANSFER_SHOW_PROPERTY = ('created_at', 'volume_id', 'id', 'name')
def test_transfer_create_delete(self):
"""Create and delete a volume transfer"""
volume = self.object_create('volume', params='1')
transfer = self.object_create('transfer', params=volume['id'])
self.assert_object_details(self.TRANSFER_PROPERTY, transfer.keys())
self.object_delete('transfer', transfer['id'])
self.check_object_deleted('transfer', transfer['id'])
self.object_delete('volume', volume['id'])
self.check_object_deleted('volume', volume['id'])
def test_transfer_show_delete_by_name(self):
"""Show volume transfer by name"""
volume = self.object_create('volume', params='1')
self.object_create(
'transfer',
params=('%s --name TEST_TRANSFER_SHOW' % volume['id']))
output = self.cinder('transfer-show', params='TEST_TRANSFER_SHOW')
transfer = self._get_property_from_output(output)
self.assertEqual('TEST_TRANSFER_SHOW', transfer['name'])
self.assert_object_details(self.TRANSFER_SHOW_PROPERTY,
transfer.keys())
self.object_delete('transfer', 'TEST_TRANSFER_SHOW')
self.check_object_deleted('transfer', 'TEST_TRANSFER_SHOW')
self.object_delete('volume', volume['id'])
self.check_object_deleted('volume', volume['id'])

View File

@ -1560,3 +1560,35 @@ class ShellTest(utils.TestCase):
for e in expected_commands:
self.assertIn(' ' + e, help_text)
@ddt.data(
# testcases for list transfers
{'command':
'transfer-list --filters volume_id=456',
'expected':
'/os-volume-transfer/detail?volume_id=456'},
{'command':
'transfer-list --filters id=123',
'expected':
'/os-volume-transfer/detail?id=123'},
{'command':
'transfer-list --filters name=abc',
'expected':
'/os-volume-transfer/detail?name=abc'},
{'command':
'transfer-list --filters name=abc --filters volume_id=456',
'expected':
'/os-volume-transfer/detail?name=abc&volume_id=456'},
{'command':
'transfer-list --filters id=123 --filters volume_id=456',
'expected':
'/os-volume-transfer/detail?id=123&volume_id=456'},
{'command':
'transfer-list --filters id=123 --filters name=abc',
'expected':
'/os-volume-transfer/detail?id=123&name=abc'},
)
@ddt.unpack
def test_transfer_list_with_filters(self, command, expected):
self.run_command('--os-volume-api-version 3.52 %s' % command)
self.assert_called('GET', expected)

View File

@ -2569,12 +2569,22 @@ def do_transfer_create(cs, args):
default=None,
help='Sort keys and directions in the form of <key>[:<asc|desc>].',
start_version='3.59')
@utils.arg('--filters',
action=AppendFilters,
type=six.text_type,
nargs='*',
start_version='3.52',
metavar='<key=value>',
default=None,
help="Filter key and value pairs.")
def do_transfer_list(cs, args):
"""Lists all transfers."""
all_tenants = int(os.environ.get("ALL_TENANTS", args.all_tenants))
search_opts = {
'all_tenants': all_tenants,
}
if AppendFilters.filters:
search_opts.update(shell_utils.extract_filters(AppendFilters.filters))
sort = getattr(args, 'sort', None)
if sort:
@ -2587,3 +2597,4 @@ def do_transfer_list(cs, args):
transfers = cs.transfers.list(search_opts=search_opts, sort=sort)
columns = ['ID', 'Volume ID', 'Name']
utils.print_list(transfers, columns)
AppendFilters.filters = []

View File

@ -0,0 +1,6 @@
---
features:
- New command option ``--filters`` is added to ``transfer-list``
command to support filtering.
The ``transfer-list`` command can be used with filters when
communicating with the Block Storage API version 3.52 and higher.