From ca0079803090d4c0ea6a492dbd076277e71134de Mon Sep 17 00:00:00 2001 From: Maari Tamm Date: Fri, 20 Aug 2021 12:49:16 +0000 Subject: [PATCH] [OSC] Implement Replica Export Locations commands In this patch we add the following openstack share commands: share replica export location list share replica export location show Partially-implements: bp openstack-client-support Change-Id: Ib7ae453da665ae17b40c7b91b3563bc301769410 --- .../osc/v2/share_replica_export_locations.py | 87 ++++++++++++ manilaclient/tests/unit/osc/v2/fakes.py | 2 + .../v2/test_share_replica_export_locations.py | 124 ++++++++++++++++++ setup.cfg | 2 + 4 files changed, 215 insertions(+) create mode 100644 manilaclient/osc/v2/share_replica_export_locations.py create mode 100644 manilaclient/tests/unit/osc/v2/test_share_replica_export_locations.py diff --git a/manilaclient/osc/v2/share_replica_export_locations.py b/manilaclient/osc/v2/share_replica_export_locations.py new file mode 100644 index 000000000..2e2197895 --- /dev/null +++ b/manilaclient/osc/v2/share_replica_export_locations.py @@ -0,0 +1,87 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +from osc_lib.command import command +from osc_lib import utils as osc_utils + +from manilaclient.common._i18n import _ + + +class ShareReplicaListExportLocation(command.Lister): + """List export locations of a share replica.""" + + _description = _("List export locations of a share replica.") + + def get_parser(self, prog_name): + parser = super( + ShareReplicaListExportLocation, self).get_parser(prog_name) + parser.add_argument( + "replica", + metavar="", + help=_("ID of the share replica.") + ) + return parser + + def take_action(self, parsed_args): + share_client = self.app.client_manager.share + + columns = [ + 'ID', + 'Availability Zone', + 'Replica State', + 'Preferred', + 'Path', + ] + + replica = osc_utils.find_resource( + share_client.share_replicas, + parsed_args.replica) + + export_locations = share_client.share_replica_export_locations.list( + replica) + + data = (osc_utils.get_dict_properties( + location._info, columns) for location in export_locations) + + return (columns, data) + + +class ShareReplicaShowExportLocation(command.ShowOne): + """Show details of a share replica's export location.""" + + _description = _("Show details of a share replica's export location.") + + def get_parser(self, prog_name): + parser = super( + ShareReplicaShowExportLocation, self).get_parser(prog_name) + parser.add_argument( + "replica", + metavar="", + help=_("ID of the share replica.") + ) + parser.add_argument( + "export_location", + metavar="", + help=_("ID of the share replica export location.") + ) + return parser + + def take_action(self, parsed_args): + share_client = self.app.client_manager.share + + replica = osc_utils.find_resource( + share_client.share_replicas, + parsed_args.replica) + + export_location = share_client.share_replica_export_locations.get( + replica, parsed_args.export_location) + + return self.dict2columns(export_location._info) diff --git a/manilaclient/tests/unit/osc/v2/fakes.py b/manilaclient/tests/unit/osc/v2/fakes.py index d9f30692d..578834f6d 100644 --- a/manilaclient/tests/unit/osc/v2/fakes.py +++ b/manilaclient/tests/unit/osc/v2/fakes.py @@ -37,6 +37,7 @@ class FakeShareClient(object): self.share_snapshots = mock.Mock() self.share_snapshot_export_locations = mock.Mock() self.share_replicas = mock.Mock() + self.share_replica_export_locations = mock.Mock() self.shares.resource_class = osc_fakes.FakeResource(None, {}) self.share_export_locations = mock.Mock() self.share_export_locations.resource_class = ( @@ -305,6 +306,7 @@ class FakeShareExportLocation(object): "fake_path": "/foo/el/path", "fake_share_instance_id": 'share-instance-id' + uuid.uuid4().hex, "fake_uuid": "foo_el_uuid", + "id": "id-" + uuid.uuid4().hex, "is_admin_only": False, "preferred": False, "updated_at": 'time-' + uuid.uuid4().hex, diff --git a/manilaclient/tests/unit/osc/v2/test_share_replica_export_locations.py b/manilaclient/tests/unit/osc/v2/test_share_replica_export_locations.py new file mode 100644 index 000000000..956c751e8 --- /dev/null +++ b/manilaclient/tests/unit/osc/v2/test_share_replica_export_locations.py @@ -0,0 +1,124 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +from osc_lib import utils as oscutils + +from manilaclient.osc.v2 import ( + share_replica_export_locations as osc_replica_el +) + +from manilaclient.tests.unit.osc.v2 import fakes as manila_fakes + + +class TestShareReplica(manila_fakes.TestShare): + + def setUp(self): + super(TestShareReplica, self).setUp() + + self.replicas_mock = self.app.client_manager.share.share_replicas + self.replicas_mock.reset_mock() + + self.export_locations_mock = ( + self.app.client_manager.share.share_replica_export_locations) + self.export_locations_mock.reset_mock() + + +class TestShareReplicaExportLocationList(TestShareReplica): + + columns = [ + 'ID', + 'Availability Zone', + 'Replica State', + 'Preferred', + 'Path' + ] + + def setUp(self): + super(TestShareReplicaExportLocationList, self).setUp() + + self.share_replica = ( + manila_fakes.FakeShareReplica.create_one_replica()) + + self.replicas_mock.get.return_value = self.share_replica + + self.export_locations = ([ + manila_fakes.FakeShareExportLocation.create_one_export_location() + ]) + + self.export_locations_mock.list.return_value = self.export_locations + self.values = (oscutils.get_dict_properties( + e._info, self.columns) for e in self.export_locations) + + self.cmd = osc_replica_el.ShareReplicaListExportLocation( + self.app, None) + + def test_replica_export_locations_list(self): + arglist = [ + self.share_replica.id + ] + verifylist = [ + ('replica', self.share_replica.id) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.replicas_mock.get.assert_called_with(self.share_replica.id) + self.export_locations_mock.list.assert_called_with( + self.share_replica) + + self.assertEqual(self.columns, columns) + self.assertCountEqual(self.values, data) + + +class TestShareReplicaExportLocationShow(TestShareReplica): + + def setUp(self): + super(TestShareReplicaExportLocationShow, self).setUp() + + self.share_replica = ( + manila_fakes.FakeShareReplica.create_one_replica()) + + self.replicas_mock.get.return_value = self.share_replica + + self.export_location = ( + manila_fakes.FakeShareExportLocation.create_one_export_location()) + + self.export_locations_mock.get.return_value = self.export_location + + self.cmd = osc_replica_el.ShareReplicaShowExportLocation( + self.app, None) + + def test_replica_export_locations_show(self): + arglist = [ + self.share_replica.id, + self.export_location.id + ] + verifylist = [ + ('replica', self.share_replica.id), + ('export_location', self.export_location.id) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.replicas_mock.get.assert_called_with(self.share_replica.id) + self.export_locations_mock.get.assert_called_with( + self.share_replica, + self.export_location.id) + + self.assertCountEqual( + tuple(self.export_location._info.keys()), + columns) + self.assertCountEqual(self.export_location._info.values(), data) diff --git a/setup.cfg b/setup.cfg index 6cf16c152..8c3b1e9c1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -89,6 +89,8 @@ openstack.share.v2 = share_replica_set = manilaclient.osc.v2.share_replicas:SetShareReplica share_replica_promote = manilaclient.osc.v2.share_replicas:PromoteShareReplica share_replica_resync = manilaclient.osc.v2.share_replicas:ResyncShareReplica + share_replica_export_location_list = manilaclient.osc.v2.share_replica_export_locations:ShareReplicaListExportLocation + share_replica_export_location_show = manilaclient.osc.v2.share_replica_export_locations:ShareReplicaShowExportLocation share_availability_zone_list = manilaclient.osc.v2.availability_zones:ShareAvailabilityZoneList [coverage:run]