diff --git a/openstackclient/common/availability_zone.py b/openstackclient/common/availability_zone.py index 935f90c6c4..af6980f1db 100644 --- a/openstackclient/common/availability_zone.py +++ b/openstackclient/common/availability_zone.py @@ -26,27 +26,20 @@ from openstackclient.i18n import _ LOG = logging.getLogger(__name__) -def _xform_common_availability_zone(az, zone_info): - if hasattr(az, 'zoneState'): - zone_info['zone_status'] = ( - 'available' if az.zoneState['available'] else 'not available' - ) - if hasattr(az, 'zoneName'): - zone_info['zone_name'] = az.zoneName - - zone_info['zone_resource'] = '' - - def _xform_compute_availability_zone(az, include_extra): result = [] - zone_info = {} - _xform_common_availability_zone(az, zone_info) + zone_info = { + 'zone_name': az.name, + 'zone_status': ( + 'available' if az.state['available'] else 'not available' + ), + } if not include_extra: result.append(zone_info) return result - if hasattr(az, 'hosts') and az.hosts: + if az.hosts: for host, services in az.hosts.items(): host_info = copy.deepcopy(zone_info) host_info['host_name'] = host @@ -70,8 +63,12 @@ def _xform_compute_availability_zone(az, include_extra): def _xform_volume_availability_zone(az): result = [] - zone_info = {} - _xform_common_availability_zone(az, zone_info) + zone_info = { + 'zone_name': az.name, + 'zone_status': ( + 'available' if az.state['available'] else 'not available' + ), + } result.append(zone_info) return result @@ -79,11 +76,11 @@ def _xform_volume_availability_zone(az): def _xform_network_availability_zone(az): result = [] zone_info = {} - zone_info['zone_name'] = getattr(az, 'name', '') - zone_info['zone_status'] = getattr(az, 'state', '') + zone_info['zone_name'] = az.name + zone_info['zone_status'] = az.state if 'unavailable' == zone_info['zone_status']: zone_info['zone_status'] = 'not available' - zone_info['zone_resource'] = getattr(az, 'resource', '') + zone_info['zone_resource'] = az.resource result.append(zone_info) return result @@ -92,7 +89,7 @@ class ListAvailabilityZone(command.Lister): _description = _("List availability zones and their status") def get_parser(self, prog_name): - parser = super(ListAvailabilityZone, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '--compute', action='store_true', @@ -120,26 +117,25 @@ class ListAvailabilityZone(command.Lister): return parser def _get_compute_availability_zones(self, parsed_args): - compute_client = self.app.client_manager.compute + compute_client = self.app.client_manager.sdk_connection.compute try: - data = compute_client.availability_zones.list() + data = compute_client.availability_zones(details=True) except nova_exceptions.Forbidden: # policy doesn't allow try: - data = compute_client.availability_zones.list(detailed=False) + data = compute_client.availability_zones(details=False) except Exception: raise - # Argh, the availability zones are not iterable... result = [] for zone in data: result += _xform_compute_availability_zone(zone, parsed_args.long) return result def _get_volume_availability_zones(self, parsed_args): - volume_client = self.app.client_manager.volume + volume_client = self.app.client_manager.sdk_connection.volume data = [] try: - data = volume_client.availability_zones.list() + data = volume_client.availability_zones() except Exception as e: LOG.debug('Volume availability zone exception: %s', e) if parsed_args.volume: @@ -165,7 +161,7 @@ class ListAvailabilityZone(command.Lister): LOG.debug('Network availability zone exception: ', e) if parsed_args.network: message = _( - "Availability zones list not supported by " "Network API" + "Availability zones list not supported by Network API" ) LOG.warning(message) return [] diff --git a/openstackclient/tests/unit/common/test_availability_zone.py b/openstackclient/tests/unit/common/test_availability_zone.py index 2ee6e2c4ad..0d38ad41dd 100644 --- a/openstackclient/tests/unit/common/test_availability_zone.py +++ b/openstackclient/tests/unit/common/test_availability_zone.py @@ -15,24 +15,23 @@ from unittest import mock from openstackclient.common import availability_zone from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes -from openstackclient.tests.unit import fakes from openstackclient.tests.unit.network.v2 import fakes as network_fakes from openstackclient.tests.unit import utils -from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes +from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes def _build_compute_az_datalist(compute_az, long_datalist=False): datalist = () if not long_datalist: datalist = ( - compute_az.zoneName, + compute_az.name, 'available', ) else: for host, services in compute_az.hosts.items(): for service, state in services.items(): datalist += ( - compute_az.zoneName, + compute_az.name, 'available', '', host, @@ -46,12 +45,12 @@ def _build_volume_az_datalist(volume_az, long_datalist=False): datalist = () if not long_datalist: datalist = ( - volume_az.zoneName, + volume_az.name, 'available', ) else: datalist = ( - volume_az.zoneName, + volume_az.name, 'available', '', '', @@ -84,33 +83,20 @@ class TestAvailabilityZone(utils.TestCommand): def setUp(self): super().setUp() - compute_client = compute_fakes.FakeComputev2Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - self.app.client_manager.compute = compute_client + self.app.client_manager.sdk_connection = mock.Mock() - self.compute_azs_mock = compute_client.availability_zones - self.compute_azs_mock.reset_mock() + self.app.client_manager.sdk_connection.compute = mock.Mock() + self.compute_client = self.app.client_manager.sdk_connection.compute + self.compute_client.availability_zones = mock.Mock() - volume_client = volume_fakes.FakeVolumeClient( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - self.app.client_manager.volume = volume_client + self.app.client_manager.sdk_connection.volume = mock.Mock() + self.volume_client = self.app.client_manager.sdk_connection.volume + self.volume_client.availability_zones = mock.Mock() - self.volume_azs_mock = volume_client.availability_zones - self.volume_azs_mock.reset_mock() - - network_client = network_fakes.FakeNetworkV2Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - self.app.client_manager.network = network_client - - network_client.availability_zones = mock.Mock() - network_client.find_extension = mock.Mock() - self.network_azs_mock = network_client.availability_zones + self.app.client_manager.network = mock.Mock() + self.network_client = self.app.client_manager.network + self.network_client.availability_zones = mock.Mock() + self.network_client.find_extension = mock.Mock() class TestAvailabilityZoneList(TestAvailabilityZone): @@ -131,9 +117,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): def setUp(self): super().setUp() - self.compute_azs_mock.list.return_value = self.compute_azs - self.volume_azs_mock.list.return_value = self.volume_azs - self.network_azs_mock.return_value = self.network_azs + self.compute_client.availability_zones.return_value = self.compute_azs + self.volume_client.availability_zones.return_value = self.volume_azs + self.network_client.availability_zones.return_value = self.network_azs # Get the command object to test self.cmd = availability_zone.ListAvailabilityZone(self.app, None) @@ -148,9 +134,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.compute_azs_mock.list.assert_called_with() - self.volume_azs_mock.list.assert_called_with() - self.network_azs_mock.assert_called_with() + self.compute_client.availability_zones.assert_called_with(details=True) + self.volume_client.availability_zones.assert_called_with() + self.network_client.availability_zones.assert_called_with() self.assertEqual(self.short_columnslist, columns) datalist = () @@ -176,9 +162,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.compute_azs_mock.list.assert_called_with() - self.volume_azs_mock.list.assert_called_with() - self.network_azs_mock.assert_called_with() + self.compute_client.availability_zones.assert_called_with(details=True) + self.volume_client.availability_zones.assert_called_with() + self.network_client.availability_zones.assert_called_with() self.assertEqual(self.long_columnslist, columns) datalist = () @@ -210,9 +196,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): # containing the data to be listed. 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.network_azs_mock.assert_not_called() + self.compute_client.availability_zones.assert_called_with(details=True) + self.volume_client.availability_zones.assert_not_called() + self.network_client.availability_zones.assert_not_called() self.assertEqual(self.short_columnslist, columns) datalist = () @@ -234,9 +220,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): # containing the data to be listed. 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.network_azs_mock.assert_not_called() + self.compute_client.availability_zones.assert_not_called() + self.volume_client.availability_zones.assert_called_with() + self.network_client.availability_zones.assert_not_called() self.assertEqual(self.short_columnslist, columns) datalist = () @@ -258,9 +244,9 @@ class TestAvailabilityZoneList(TestAvailabilityZone): # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.compute_azs_mock.list.assert_not_called() - self.volume_azs_mock.list.assert_not_called() - self.network_azs_mock.assert_called_with() + self.compute_client.availability_zones.assert_not_called() + self.volume_client.availability_zones.assert_not_called() + self.network_client.availability_zones.assert_called_with() self.assertEqual(self.short_columnslist, columns) datalist = () diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py index acee68e4e0..aac9104d30 100644 --- a/openstackclient/tests/unit/compute/v2/fakes.py +++ b/openstackclient/tests/unit/compute/v2/fakes.py @@ -20,6 +20,7 @@ import uuid from novaclient import api_versions from openstack.compute.v2 import aggregate as _aggregate +from openstack.compute.v2 import availability_zone as _availability_zone from openstack.compute.v2 import flavor as _flavor from openstack.compute.v2 import hypervisor as _hypervisor from openstack.compute.v2 import keypair as _keypair @@ -83,12 +84,6 @@ class FakeComputev2Client(object): self.agents = mock.Mock() self.agents.resource_class = fakes.FakeResource(None, {}) - self.aggregates = mock.Mock() - self.aggregates.resource_class = fakes.FakeResource(None, {}) - - self.availability_zones = mock.Mock() - self.availability_zones.resource_class = fakes.FakeResource(None, {}) - self.images = mock.Mock() self.images.resource_class = fakes.FakeResource(None, {}) @@ -783,36 +778,34 @@ def get_keypairs(keypairs=None, count=2): def create_one_availability_zone(attrs=None): """Create a fake AZ. - :param dict attrs: - A dictionary with all attributes - :return: - A FakeResource object with zoneName, zoneState, etc. + :param dict attrs: A dictionary with all attributes + :return: A fake openstack.compute.v2.availability_zone.AvailabilityZone + object """ attrs = attrs or {} # Set default attributes. host_name = uuid.uuid4().hex service_name = uuid.uuid4().hex - service_updated_at = uuid.uuid4().hex - availability_zone = { - 'zoneName': uuid.uuid4().hex, - 'zoneState': {'available': True}, + availability_zone_info = { + 'name': uuid.uuid4().hex, + 'state': {'available': True}, 'hosts': { host_name: { service_name: { 'available': True, 'active': True, - 'updated_at': service_updated_at, + 'updated_at': '2023-01-01T00:00:00.000000', } } }, } # Overwrite default attributes. - availability_zone.update(attrs) + availability_zone_info.update(attrs) - availability_zone = fakes.FakeResource( - info=copy.deepcopy(availability_zone), loaded=True + availability_zone = _availability_zone.AvailabilityZone( + **availability_zone_info ) return availability_zone @@ -820,12 +813,10 @@ def create_one_availability_zone(attrs=None): def create_availability_zones(attrs=None, count=2): """Create multiple fake AZs. - :param dict attrs: - A dictionary with all attributes - :param int count: - The number of AZs to fake - :return: - A list of FakeResource objects faking the AZs + :param dict attrs: A dictionary with all attributes + :param int count: The number of availability zones to fake + :return: A list of fake + openstack.compute.v2.availability_zone.AvailabilityZone objects """ availability_zones = [] for i in range(0, count): diff --git a/openstackclient/tests/unit/volume/v2/fakes.py b/openstackclient/tests/unit/volume/v2/fakes.py index d3d0aecb52..d8f9fc30a9 100644 --- a/openstackclient/tests/unit/volume/v2/fakes.py +++ b/openstackclient/tests/unit/volume/v2/fakes.py @@ -489,49 +489,6 @@ def get_volume_data(volume=None): return tuple(data_list) -def create_one_availability_zone(attrs=None): - """Create a fake AZ. - - :param dict attrs: - A dictionary with all attributes - :return: - A FakeResource object with zoneName, zoneState, etc. - """ - attrs = attrs or {} - - # 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), loaded=True - ) - return availability_zone - - -def create_availability_zones(attrs=None, count=2): - """Create multiple fake AZs. - - :param dict attrs: - A dictionary with all attributes - :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 = create_one_availability_zone(attrs) - availability_zones.append(availability_zone) - - return availability_zones - - def create_one_backup(attrs=None): """Create a fake backup. diff --git a/openstackclient/tests/unit/volume/v3/fakes.py b/openstackclient/tests/unit/volume/v3/fakes.py index eb7b7f9ab7..1fb3484df8 100644 --- a/openstackclient/tests/unit/volume/v3/fakes.py +++ b/openstackclient/tests/unit/volume/v3/fakes.py @@ -15,6 +15,7 @@ from unittest import mock import uuid from cinderclient import api_versions +from openstack.block_storage.v3 import availability_zone as _availability_zone from openstack.block_storage.v3 import block_storage_summary as _summary from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes @@ -75,6 +76,46 @@ create_one_volume = volume_v2_fakes.create_one_volume create_one_volume_type = volume_v2_fakes.create_one_volume_type +def create_one_availability_zone(attrs=None): + """Create a fake AZ. + + :param dict attrs: A dictionary with all attributes + :return: A fake + openstack.block_storage.v3.availability_zone.AvailabilityZone object + """ + attrs = attrs or {} + + # Set default attributes. + availability_zone_info = { + 'name': uuid.uuid4().hex, + 'state': {'available': True}, + } + + # Overwrite default attributes. + availability_zone_info.update(attrs) + + availability_zone = _availability_zone.AvailabilityZone( + **availability_zone_info + ) + return availability_zone + + +def create_availability_zones(attrs=None, count=2): + """Create multiple fake AZs. + + :param dict attrs: A dictionary with all attributes + :param int count: The number of availability zones to fake + :return: A list of fake + openstack.block_storage.v3.availability_zone.AvailabilityZone objects + """ + availability_zones = [] + for i in range(0, count): + availability_zone = create_one_availability_zone(attrs) + availability_zones.append(availability_zone) + + return availability_zones + + def create_one_cluster(attrs=None): """Create a fake service cluster.