diff --git a/cinderclient/tests/unit/v3/fakes_base.py b/cinderclient/tests/unit/v3/fakes_base.py index fdbbf1052..b85401d7f 100644 --- a/cinderclient/tests/unit/v3/fakes_base.py +++ b/cinderclient/tests/unit/v3/fakes_base.py @@ -1032,6 +1032,14 @@ class FakeHTTPClient(base_client.HTTPClient): # VolumeTransfers # + def get_os_volume_transfer_1234(self, **kw): + base_uri = 'http://localhost:8776' + tenant_id = '0fa851f6668144cf9cd8c8419c1646c1' + transfer1 = '1234' + return (200, {}, + {'transfer': + _stub_transfer_full(transfer1, base_uri, tenant_id)}) + def get_os_volume_transfer_5678(self, **kw): base_uri = 'http://localhost:8776' tenant_id = '0fa851f6668144cf9cd8c8419c1646c1' @@ -1050,6 +1058,9 @@ class FakeHTTPClient(base_client.HTTPClient): _stub_transfer_full(transfer1, base_uri, tenant_id), _stub_transfer_full(transfer2, base_uri, tenant_id)]}) + def delete_os_volume_transfer_1234(self, **kw): + return (202, {}, None) + def delete_os_volume_transfer_5678(self, **kw): return (202, {}, None) diff --git a/cinderclient/tests/unit/v3/test_shell.py b/cinderclient/tests/unit/v3/test_shell.py index ee7162040..89e89d842 100644 --- a/cinderclient/tests/unit/v3/test_shell.py +++ b/cinderclient/tests/unit/v3/test_shell.py @@ -1653,6 +1653,15 @@ class ShellTest(utils.TestCase): url = ('/volume-transfers/detail') self.assert_called('GET', url) + def test_delete_transfer(self): + self.run_command('transfer-delete 1234') + self.assert_called('DELETE', '/os-volume-transfer/1234') + + def test_delete_transfers(self): + self.run_command('transfer-delete 1234 5678') + self.assert_called_anytime('DELETE', '/os-volume-transfer/1234') + self.assert_called_anytime('DELETE', '/os-volume-transfer/5678') + def test_subcommand_parser(self): """Ensure that all the expected commands show up. diff --git a/cinderclient/v3/shell_base.py b/cinderclient/v3/shell_base.py index 034071b05..25d99bb0f 100644 --- a/cinderclient/v3/shell_base.py +++ b/cinderclient/v3/shell_base.py @@ -1348,12 +1348,21 @@ def do_transfer_create(cs, args): shell_utils.print_dict(info) -@utils.arg('transfer', metavar='', +@utils.arg('transfer', metavar='', nargs='+', help='Name or ID of transfer to delete.') def do_transfer_delete(cs, args): """Undoes a transfer.""" - transfer = shell_utils.find_transfer(cs, args.transfer) - transfer.delete() + failure_count = 0 + for t in args.transfer: + try: + transfer = shell_utils.find_transfer(cs, t) + transfer.delete() + except Exception as e: + failure_count += 1 + print("Delete for volume transfer %s failed: %s" % (t, e)) + if failure_count == len(args.transfer): + raise exceptions.CommandError("Unable to delete any of the specified " + "volume transfers.") @utils.arg('transfer', metavar='', diff --git a/releasenotes/notes/fix-transfer-delete-multiple-transfer-43a76c403e7c7e7c.yaml b/releasenotes/notes/fix-transfer-delete-multiple-transfer-43a76c403e7c7e7c.yaml new file mode 100644 index 000000000..7d34c14d7 --- /dev/null +++ b/releasenotes/notes/fix-transfer-delete-multiple-transfer-43a76c403e7c7e7c.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + `Bug #2069992 `_: + Fixed transfer-delete command to accept multiple transfers.