diff options
| author | Richard Theis <rtheis@us.ibm.com> | 2016-01-14 08:22:09 -0600 |
|---|---|---|
| committer | Richard Theis <rtheis@us.ibm.com> | 2016-01-14 15:47:19 -0600 |
| commit | a8ec2ac49475c60c8e72a0fc3db6df778918bb49 (patch) | |
| tree | e5442a3e59f28f7672b1253813aba64fc55163a5 /openstackclient/tests | |
| parent | 84174440fc9fd4679f3a72d24ed50f0b1927b91d (diff) | |
| download | python-openstackclient-a8ec2ac49475c60c8e72a0fc3db6df778918bb49.tar.gz | |
Support listing volume availability zones
Update the "os availability zone list" command to support listing
volume availability zones along with the currently listed compute
availability zones. This adds a --compute and --volume option to
the command in order to select the availability zones to list. By
default, all availability zones are listed.
If the Block Storage API does not support listing availability
zones then an warning message will be issued.
Change-Id: I8159509a41bd1fb1b4e77fdbb512cf64a5ac11a9
Closes-Bug: #1532945
Diffstat (limited to 'openstackclient/tests')
| -rw-r--r-- | openstackclient/tests/common/test_availability_zone.py | 99 | ||||
| -rw-r--r-- | openstackclient/tests/volume/v2/fakes.py | 54 |
2 files changed, 143 insertions, 10 deletions
diff --git a/openstackclient/tests/common/test_availability_zone.py b/openstackclient/tests/common/test_availability_zone.py index 35089d06..232b56c9 100644 --- a/openstackclient/tests/common/test_availability_zone.py +++ b/openstackclient/tests/common/test_availability_zone.py @@ -17,6 +17,7 @@ from openstackclient.common import availability_zone from openstackclient.tests.compute.v2 import fakes as compute_fakes from openstackclient.tests import fakes from openstackclient.tests import utils +from openstackclient.tests.volume.v2 import fakes as volume_fakes def _build_compute_az_datalist(compute_az, long_datalist=False): @@ -39,6 +40,22 @@ def _build_compute_az_datalist(compute_az, long_datalist=False): return (datalist,) +def _build_volume_az_datalist(volume_az, long_datalist=False): + datalist = () + if not long_datalist: + datalist = ( + volume_az.zoneName, + 'available', + ) + else: + datalist = ( + volume_az.zoneName, + 'available', + '', '', '', + ) + return (datalist,) + + class TestAvailabilityZone(utils.TestCommand): def setUp(self): @@ -53,16 +70,37 @@ class TestAvailabilityZone(utils.TestCommand): self.compute_azs_mock = compute_client.availability_zones self.compute_azs_mock.reset_mock() + volume_client = volume_fakes.FakeVolumeClient( + endpoint=fakes.AUTH_URL, + token=fakes.AUTH_TOKEN, + ) + self.app.client_manager.volume = volume_client + + self.volume_azs_mock = volume_client.availability_zones + self.volume_azs_mock.reset_mock() + class TestAvailabilityZoneList(TestAvailabilityZone): compute_azs = \ compute_fakes.FakeAvailabilityZone.create_availability_zones() + volume_azs = \ + volume_fakes.FakeAvailabilityZone.create_availability_zones(count=1) + + short_columnslist = ('Zone Name', 'Zone Status') + long_columnslist = ( + 'Zone Name', + 'Zone Status', + 'Host Name', + 'Service Name', + 'Service Status', + ) def setUp(self): super(TestAvailabilityZoneList, self).setUp() self.compute_azs_mock.list.return_value = self.compute_azs + self.volume_azs_mock.list.return_value = self.volume_azs # Get the command object to test self.cmd = availability_zone.ListAvailabilityZone(self.app, None) @@ -76,12 +114,14 @@ class TestAvailabilityZoneList(TestAvailabilityZone): columns, data = self.cmd.take_action(parsed_args) self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_called_with() - columnslist = ('Zone Name', 'Zone Status') - self.assertEqual(columnslist, columns) + self.assertEqual(self.short_columnslist, columns) datalist = () for compute_az in self.compute_azs: datalist += _build_compute_az_datalist(compute_az) + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az) self.assertEqual(datalist, tuple(data)) def test_availability_zone_list_long(self): @@ -97,17 +137,56 @@ class TestAvailabilityZoneList(TestAvailabilityZone): columns, data = self.cmd.take_action(parsed_args) self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_called_with() - columnslist = ( - 'Zone Name', - 'Zone Status', - 'Host Name', - 'Service Name', - 'Service Status', - ) - self.assertEqual(columnslist, columns) + self.assertEqual(self.long_columnslist, columns) datalist = () for compute_az in self.compute_azs: datalist += _build_compute_az_datalist(compute_az, long_datalist=True) + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az, + long_datalist=True) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_compute(self): + arglist = [ + '--compute', + ] + verifylist = [ + ('compute', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_not_called() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for compute_az in self.compute_azs: + datalist += _build_compute_az_datalist(compute_az) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_volume(self): + arglist = [ + '--volume', + ] + verifylist = [ + ('volume', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_not_called() + self.volume_azs_mock.list.assert_called_with() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az) self.assertEqual(datalist, tuple(data)) diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py index 60cec335..2e58e58d 100644 --- a/openstackclient/tests/volume/v2/fakes.py +++ b/openstackclient/tests/volume/v2/fakes.py @@ -202,6 +202,8 @@ class FakeVolumeClient(object): self.restores.resource_class = fakes.FakeResource(None, {}) self.qos_specs = mock.Mock() self.qos_specs.resource_class = fakes.FakeResource(None, {}) + self.availability_zones = mock.Mock() + self.availability_zones.resource_class = fakes.FakeResource(None, {}) self.auth_token = kwargs['token'] self.management_url = kwargs['endpoint'] @@ -304,3 +306,55 @@ class FakeVolume(object): volumes = FakeVolume.create_volumes(count) return mock.MagicMock(side_effect=volumes) + + +class FakeAvailabilityZone(object): + """Fake one or more volume availability zones (AZs).""" + + @staticmethod + def create_one_availability_zone(attrs={}, methods={}): + """Create a fake AZ. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object with zoneName, zoneState, etc. + """ + # Set default attributes. + availability_zone = { + 'zoneName': uuid.uuid4().hex, + 'zoneState': {'available': True}, + } + + # Overwrite default attributes. + availability_zone.update(attrs) + + availability_zone = fakes.FakeResource( + info=copy.deepcopy(availability_zone), + methods=methods, + loaded=True) + return availability_zone + + @staticmethod + def create_availability_zones(attrs={}, methods={}, count=2): + """Create multiple fake AZs. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of AZs to fake + :return: + A list of FakeResource objects faking the AZs + """ + availability_zones = [] + for i in range(0, count): + availability_zone = \ + FakeAvailabilityZone.create_one_availability_zone( + attrs, methods) + availability_zones.append(availability_zone) + + return availability_zones |
