From 6f4acc45c62310d925c8f33a33c14d37990b6636 Mon Sep 17 00:00:00 2001 From: Huanxuan Ao <huanxuan.ao@easystack.cn> Date: Tue, 9 Aug 2016 13:21:40 +0800 Subject: [PATCH] Implement "volume transfer request create" command Add "volume transfer request create" command in volume v1 and v2. Also add the unit tests, docs, release note and functional tests Change-Id: If362df1acf214efdf6ba129cd917d33eb54e1030 Implements: bp cinder-command-support Co-Authored-By: Sheel Rana <ranasheel2000@gmail.com> --- .../volume-transfer-request.rst | 23 +++++- openstackclient/tests/unit/volume/v1/fakes.py | 7 +- .../unit/volume/v1/test_transfer_request.py | 72 ++++++++++++++++++- openstackclient/tests/unit/volume/v2/fakes.py | 7 +- .../unit/volume/v2/test_transfer_request.py | 72 ++++++++++++++++++- .../volume/v1/volume_transfer_request.py | 32 ++++++++- .../volume/v2/volume_transfer_request.py | 30 ++++++++ ...nder-command-support-cc8708c4395ce467.yaml | 4 ++ setup.cfg | 2 + 9 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/bp-cinder-command-support-cc8708c4395ce467.yaml diff --git a/doc/source/command-objects/volume-transfer-request.rst b/doc/source/command-objects/volume-transfer-request.rst index 79d84f7551..f9efb979fd 100644 --- a/doc/source/command-objects/volume-transfer-request.rst +++ b/doc/source/command-objects/volume-transfer-request.rst @@ -4,6 +4,27 @@ volume transfer request Block Storage v1, v2 +volume transfer request create +------------------------------ + +Create volume transfer request + +.. program:: volume transfer request create +.. code:: bash + + os volume transfer request create + [--name <name>] + <volume> + +.. option:: --name <name> + + New transfer request name (default to None) + +.. _volume_transfer_request_create-volume: +.. describe:: <volume> + + Volume to transfer (name or ID) + volume transfer request list ---------------------------- @@ -18,4 +39,4 @@ Lists all volume transfer requests. .. option:: --all-projects Shows detail for all projects. Admin only. - (defaults to False) \ No newline at end of file + (defaults to False) diff --git a/openstackclient/tests/unit/volume/v1/fakes.py b/openstackclient/tests/unit/volume/v1/fakes.py index 5c1f3b12f5..f63553fe71 100644 --- a/openstackclient/tests/unit/volume/v1/fakes.py +++ b/openstackclient/tests/unit/volume/v1/fakes.py @@ -146,9 +146,12 @@ class FakeTransfer(object): """ # Set default attribute transfer_info = { - 'volume_id': 'ce26708d-a7f8-4b4b-9861-4a80256615a7', + 'auth_key': 'key-' + uuid.uuid4().hex, + 'created_at': 'time-' + uuid.uuid4().hex, + 'volume_id': 'volume-id-' + uuid.uuid4().hex, 'name': 'fake_transfer_name', - 'id': '731a7f53-aa92-4fbd-9de3-6f7d729c926b' + 'id': 'id-' + uuid.uuid4().hex, + 'links': 'links-' + uuid.uuid4().hex, } # Overwrite default attributes if there are some attributes set diff --git a/openstackclient/tests/unit/volume/v1/test_transfer_request.py b/openstackclient/tests/unit/volume/v1/test_transfer_request.py index f7980c34aa..a5c31f8d27 100644 --- a/openstackclient/tests/unit/volume/v1/test_transfer_request.py +++ b/openstackclient/tests/unit/volume/v1/test_transfer_request.py @@ -12,7 +12,6 @@ # under the License. # - from openstackclient.tests.unit.volume.v1 import fakes as transfer_fakes from openstackclient.volume.v1 import volume_transfer_request @@ -26,6 +25,77 @@ class TestTransfer(transfer_fakes.TestVolumev1): self.transfer_mock = self.app.client_manager.volume.transfers self.transfer_mock.reset_mock() + # Get a shortcut to the VolumeManager Mock + self.volumes_mock = self.app.client_manager.volume.volumes + self.volumes_mock.reset_mock() + + +class TestTransferCreate(TestTransfer): + + volume = transfer_fakes.FakeVolume.create_one_volume() + + columns = ( + 'auth_key', + 'created_at', + 'id', + 'name', + 'volume_id', + ) + + def setUp(self): + super(TestTransferCreate, self).setUp() + + self.volume_transfer = transfer_fakes.FakeTransfer.create_one_transfer( + attrs={'volume_id': self.volume.id}) + self.data = ( + self.volume_transfer.auth_key, + self.volume_transfer.created_at, + self.volume_transfer.id, + self.volume_transfer.name, + self.volume_transfer.volume_id, + ) + + self.transfer_mock.create.return_value = self.volume_transfer + self.volumes_mock.get.return_value = self.volume + + # Get the command object to test + self.cmd = volume_transfer_request.CreateTransferRequest( + self.app, None) + + def test_transfer_create_without_name(self): + arglist = [ + self.volume.id, + ] + verifylist = [ + ('volume', self.volume.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.transfer_mock.create.assert_called_once_with( + self.volume.id, None) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_transfer_create_with_name(self): + arglist = [ + '--name', self.volume_transfer.name, + self.volume.id, + ] + verifylist = [ + ('name', self.volume_transfer.name), + ('volume', self.volume.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.transfer_mock.create.assert_called_once_with( + self.volume.id, self.volume_transfer.name,) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + class TestTransferList(TestTransfer): diff --git a/openstackclient/tests/unit/volume/v2/fakes.py b/openstackclient/tests/unit/volume/v2/fakes.py index a958c46803..51c952cdc6 100644 --- a/openstackclient/tests/unit/volume/v2/fakes.py +++ b/openstackclient/tests/unit/volume/v2/fakes.py @@ -39,9 +39,12 @@ class FakeTransfer(object): """ # Set default attribute transfer_info = { - 'volume_id': 'ce26708d-a7f8-4b4b-9861-4a80256615a7', + 'auth_key': 'key-' + uuid.uuid4().hex, + 'created_at': 'time-' + uuid.uuid4().hex, + 'volume_id': 'volume-id-' + uuid.uuid4().hex, 'name': 'fake_transfer_name', - 'id': '731a7f53-aa92-4fbd-9de3-6f7d729c926b' + 'id': 'id-' + uuid.uuid4().hex, + 'links': 'links-' + uuid.uuid4().hex, } # Overwrite default attributes if there are some attributes set diff --git a/openstackclient/tests/unit/volume/v2/test_transfer_request.py b/openstackclient/tests/unit/volume/v2/test_transfer_request.py index 32108c025d..8cc76bef4c 100644 --- a/openstackclient/tests/unit/volume/v2/test_transfer_request.py +++ b/openstackclient/tests/unit/volume/v2/test_transfer_request.py @@ -12,7 +12,6 @@ # under the License. # - from openstackclient.tests.unit.volume.v2 import fakes as transfer_fakes from openstackclient.volume.v2 import volume_transfer_request @@ -26,6 +25,77 @@ class TestTransfer(transfer_fakes.TestVolume): self.transfer_mock = self.app.client_manager.volume.transfers self.transfer_mock.reset_mock() + # Get a shortcut to the VolumeManager Mock + self.volumes_mock = self.app.client_manager.volume.volumes + self.volumes_mock.reset_mock() + + +class TestTransferCreate(TestTransfer): + + volume = transfer_fakes.FakeVolume.create_one_volume() + + columns = ( + 'auth_key', + 'created_at', + 'id', + 'name', + 'volume_id', + ) + + def setUp(self): + super(TestTransferCreate, self).setUp() + + self.volume_transfer = transfer_fakes.FakeTransfer.create_one_transfer( + attrs={'volume_id': self.volume.id}) + self.data = ( + self.volume_transfer.auth_key, + self.volume_transfer.created_at, + self.volume_transfer.id, + self.volume_transfer.name, + self.volume_transfer.volume_id, + ) + + self.transfer_mock.create.return_value = self.volume_transfer + self.volumes_mock.get.return_value = self.volume + + # Get the command object to test + self.cmd = volume_transfer_request.CreateTransferRequest( + self.app, None) + + def test_transfer_create_without_name(self): + arglist = [ + self.volume.id, + ] + verifylist = [ + ('volume', self.volume.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.transfer_mock.create.assert_called_once_with( + self.volume.id, None) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_transfer_create_with_name(self): + arglist = [ + '--name', self.volume_transfer.name, + self.volume.id, + ] + verifylist = [ + ('name', self.volume_transfer.name), + ('volume', self.volume.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.transfer_mock.create.assert_called_once_with( + self.volume.id, self.volume_transfer.name,) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + class TestTransferList(TestTransfer): diff --git a/openstackclient/volume/v1/volume_transfer_request.py b/openstackclient/volume/v1/volume_transfer_request.py index 5d8ff6839c..b1167340fb 100644 --- a/openstackclient/volume/v1/volume_transfer_request.py +++ b/openstackclient/volume/v1/volume_transfer_request.py @@ -12,14 +12,44 @@ # under the License. # -"""Volume v2 transfer action implementations""" +"""Volume v1 transfer action implementations""" from osc_lib.command import command from osc_lib import utils +import six from openstackclient.i18n import _ +class CreateTransferRequest(command.ShowOne): + """Create volume transfer request.""" + + def get_parser(self, prog_name): + parser = super(CreateTransferRequest, self).get_parser(prog_name) + parser.add_argument( + '--name', + metavar="<name>", + help=_('New transfer request name (default to None)') + ) + parser.add_argument( + 'volume', + metavar="<volume>", + help=_('Volume to transfer (name or ID)') + ) + return parser + + def take_action(self, parsed_args): + volume_client = self.app.client_manager.volume + volume_id = utils.find_resource( + volume_client.volumes, parsed_args.volume).id + volume_transfer_request = volume_client.transfers.create( + volume_id, parsed_args.name, + ) + volume_transfer_request._info.pop("links", None) + + return zip(*sorted(six.iteritems(volume_transfer_request._info))) + + class ListTransferRequests(command.Lister): """Lists all volume transfer requests.""" diff --git a/openstackclient/volume/v2/volume_transfer_request.py b/openstackclient/volume/v2/volume_transfer_request.py index 5d8ff6839c..45581586e6 100644 --- a/openstackclient/volume/v2/volume_transfer_request.py +++ b/openstackclient/volume/v2/volume_transfer_request.py @@ -16,10 +16,40 @@ from osc_lib.command import command from osc_lib import utils +import six from openstackclient.i18n import _ +class CreateTransferRequest(command.ShowOne): + """Create volume transfer request.""" + + def get_parser(self, prog_name): + parser = super(CreateTransferRequest, self).get_parser(prog_name) + parser.add_argument( + '--name', + metavar="<name>", + help=_('New transfer request name (default to None)'), + ) + parser.add_argument( + 'volume', + metavar="<volume>", + help=_('Volume to transfer (name or ID)'), + ) + return parser + + def take_action(self, parsed_args): + volume_client = self.app.client_manager.volume + volume_id = utils.find_resource( + volume_client.volumes, parsed_args.volume).id + volume_transfer_request = volume_client.transfers.create( + volume_id, parsed_args.name, + ) + volume_transfer_request._info.pop("links", None) + + return zip(*sorted(six.iteritems(volume_transfer_request._info))) + + class ListTransferRequests(command.Lister): """Lists all volume transfer requests.""" diff --git a/releasenotes/notes/bp-cinder-command-support-cc8708c4395ce467.yaml b/releasenotes/notes/bp-cinder-command-support-cc8708c4395ce467.yaml new file mode 100644 index 0000000000..686ff25e4e --- /dev/null +++ b/releasenotes/notes/bp-cinder-command-support-cc8708c4395ce467.yaml @@ -0,0 +1,4 @@ +--- +features: + - Add ``volume transfer request create`` command in volume v1 and v2 + [Blueprint `cinder-command-support <https://blueprints.launchpad.net/python-openstackclient/+spec/cinder-command-support>`_] diff --git a/setup.cfg b/setup.cfg index 7af6e0c7e2..262c276a7f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -483,6 +483,7 @@ openstack.volume.v1 = volume_service_list = openstackclient.volume.v1.service:ListService volume_service_set = openstackclient.volume.v1.service:SetService + volume_transfer_request_create = openstackclient.volume.v1.volume_transfer_request:CreateTransferRequest volume_transfer_request_list = openstackclient.volume.v1.volume_transfer_request:ListTransferRequests openstack.volume.v2 = @@ -531,6 +532,7 @@ openstack.volume.v2 = volume_service_list = openstackclient.volume.v2.service:ListService volume_service_set = openstackclient.volume.v2.service:SetService + volume_transfer_request_create = openstackclient.volume.v2.volume_transfer_request:CreateTransferRequest volume_transfer_request_list = openstackclient.volume.v2.volume_transfer_request:ListTransferRequests [build_sphinx]