From a8ec2ac49475c60c8e72a0fc3db6df778918bb49 Mon Sep 17 00:00:00 2001 From: Richard Theis Date: Thu, 14 Jan 2016 08:22:09 -0600 Subject: 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 --- openstackclient/common/availability_zone.py | 75 +++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 14 deletions(-) (limited to 'openstackclient/common/availability_zone.py') diff --git a/openstackclient/common/availability_zone.py b/openstackclient/common/availability_zone.py index 0fe6c73a..e72732e7 100644 --- a/openstackclient/common/availability_zone.py +++ b/openstackclient/common/availability_zone.py @@ -11,7 +11,7 @@ # under the License. # -"""Compute v2 Availability Zone action implementations""" +"""Availability Zone action implementations""" import copy import logging @@ -24,15 +24,19 @@ from openstackclient.common import utils from openstackclient.i18n import _ # noqa -def _xform_availability_zone(az, include_extra): - result = [] - zone_info = {} +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 + +def _xform_compute_availability_zone(az, include_extra): + result = [] + zone_info = {} + _xform_common_availability_zone(az, zone_info) + if not include_extra: result.append(zone_info) return result @@ -58,6 +62,14 @@ def _xform_availability_zone(az, include_extra): return result +def _xform_volume_availability_zone(az): + result = [] + zone_info = {} + _xform_common_availability_zone(az, zone_info) + result.append(zone_info) + return result + + class ListAvailabilityZone(lister.Lister): """List availability zones and their status""" @@ -65,6 +77,16 @@ class ListAvailabilityZone(lister.Lister): def get_parser(self, prog_name): parser = super(ListAvailabilityZone, self).get_parser(prog_name) + parser.add_argument( + '--compute', + action='store_true', + default=False, + help='List compute availability zones') + parser.add_argument( + '--volume', + action='store_true', + default=False, + help='List volume availability zones') parser.add_argument( '--long', action='store_true', @@ -73,15 +95,7 @@ class ListAvailabilityZone(lister.Lister): ) return parser - @utils.log_method(log) - def take_action(self, parsed_args): - - if parsed_args.long: - columns = ('Zone Name', 'Zone Status', - 'Host Name', 'Service Name', 'Service Status') - else: - columns = ('Zone Name', 'Zone Status') - + def get_compute_availability_zones(self, parsed_args): compute_client = self.app.client_manager.compute try: data = compute_client.availability_zones.list() @@ -94,7 +108,40 @@ class ListAvailabilityZone(lister.Lister): # Argh, the availability zones are not iterable... result = [] for zone in data: - result += _xform_availability_zone(zone, parsed_args.long) + 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 + try: + data = volume_client.availability_zones.list() + except Exception: + message = "Availability zones list not supported by " \ + "Block Storage API" + self.log.warning(message) + + result = [] + for zone in data: + result += _xform_volume_availability_zone(zone) + return result + + @utils.log_method(log) + def take_action(self, parsed_args): + + if parsed_args.long: + columns = ('Zone Name', 'Zone Status', + 'Host Name', 'Service Name', 'Service Status') + else: + columns = ('Zone Name', 'Zone Status') + + # Show everything by default. + show_all = (not parsed_args.compute and not parsed_args.volume) + + result = [] + if parsed_args.compute or show_all: + result += self.get_compute_availability_zones(parsed_args) + if parsed_args.volume or show_all: + result += self.get_volume_availability_zones(parsed_args) return (columns, (utils.get_dict_properties( -- cgit v1.2.1