summaryrefslogtreecommitdiff
path: root/openstackclient/common
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/common')
-rw-r--r--openstackclient/common/availability_zone.py66
-rw-r--r--openstackclient/common/utils.py45
2 files changed, 72 insertions, 39 deletions
diff --git a/openstackclient/common/availability_zone.py b/openstackclient/common/availability_zone.py
index fa5aee47..a941418b 100644
--- a/openstackclient/common/availability_zone.py
+++ b/openstackclient/common/availability_zone.py
@@ -30,6 +30,8 @@ def _xform_common_availability_zone(az, zone_info):
if hasattr(az, 'zoneName'):
zone_info['zone_name'] = az.zoneName
+ zone_info['zone_resource'] = ''
+
def _xform_compute_availability_zone(az, include_extra):
result = []
@@ -69,6 +71,18 @@ def _xform_volume_availability_zone(az):
return result
+def _xform_network_availability_zone(az):
+ result = []
+ zone_info = {}
+ zone_info['zone_name'] = getattr(az, 'name', '')
+ zone_info['zone_status'] = getattr(az, 'state', '')
+ if 'unavailable' == zone_info['zone_status']:
+ zone_info['zone_status'] = 'not available'
+ zone_info['zone_resource'] = getattr(az, 'resource', '')
+ result.append(zone_info)
+ return result
+
+
class ListAvailabilityZone(command.Lister):
"""List availability zones and their status"""
@@ -80,6 +94,11 @@ class ListAvailabilityZone(command.Lister):
default=False,
help='List compute availability zones')
parser.add_argument(
+ '--network',
+ action='store_true',
+ default=False,
+ help='List network availability zones')
+ parser.add_argument(
'--volume',
action='store_true',
default=False,
@@ -92,7 +111,7 @@ class ListAvailabilityZone(command.Lister):
)
return parser
- def get_compute_availability_zones(self, parsed_args):
+ def _get_compute_availability_zones(self, parsed_args):
compute_client = self.app.client_manager.compute
try:
data = compute_client.availability_zones.list()
@@ -108,36 +127,63 @@ class ListAvailabilityZone(command.Lister):
result += _xform_compute_availability_zone(zone, parsed_args.long)
return result
- def get_volume_availability_zones(self, parsed_args):
+ def _get_volume_availability_zones(self, parsed_args):
volume_client = self.app.client_manager.volume
+ data = []
try:
data = volume_client.availability_zones.list()
- except Exception:
- message = "Availability zones list not supported by " \
- "Block Storage API"
- self.log.warning(message)
+ except Exception as e:
+ self.log.debug('Volume availability zone exception: ' + str(e))
+ if parsed_args.volume:
+ 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
+ def _get_network_availability_zones(self, parsed_args):
+ network_client = self.app.client_manager.network
+ data = []
+ try:
+ # Verify that the extension exists.
+ network_client.find_extension('Availability Zone',
+ ignore_missing=False)
+ data = network_client.availability_zones()
+ except Exception as e:
+ self.log.debug('Network availability zone exception: ' + str(e))
+ if parsed_args.network:
+ message = "Availability zones list not supported by " \
+ "Network API"
+ self.log.warning(message)
+
+ result = []
+ for zone in data:
+ result += _xform_network_availability_zone(zone)
+ return result
+
def take_action(self, parsed_args):
if parsed_args.long:
- columns = ('Zone Name', 'Zone Status',
+ columns = ('Zone Name', 'Zone Status', 'Zone Resource',
'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)
+ show_all = (not parsed_args.compute and
+ not parsed_args.volume and
+ not parsed_args.network)
result = []
if parsed_args.compute or show_all:
- result += self.get_compute_availability_zones(parsed_args)
+ result += self._get_compute_availability_zones(parsed_args)
if parsed_args.volume or show_all:
- result += self.get_volume_availability_zones(parsed_args)
+ result += self._get_volume_availability_zones(parsed_args)
+ if parsed_args.network or show_all:
+ result += self._get_network_availability_zones(parsed_args)
return (columns,
(utils.get_dict_properties(
diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py
index 3ae30c8f..4142f830 100644
--- a/openstackclient/common/utils.py
+++ b/openstackclient/common/utils.py
@@ -26,33 +26,6 @@ from oslo_utils import importutils
from openstackclient.common import exceptions
-class log_method(object):
-
- def __init__(self, log=None, level=logging.DEBUG):
- self._log = log
- self._level = level
-
- def __call__(self, func):
- func_name = func.__name__
- if not self._log:
- self._log = logging.getLogger(func.__class__.__name__)
-
- @six.wraps(func)
- def wrapper(*args, **kwargs):
- if self._log.isEnabledFor(self._level):
- pretty_args = []
- if args:
- pretty_args.extend(str(a) for a in args)
- if kwargs:
- pretty_args.extend(
- "%s=%s" % (k, v) for k, v in six.iteritems(kwargs))
- self._log.log(self._level, "%s(%s)",
- func_name, ", ".join(pretty_args))
- return func(*args, **kwargs)
-
- return wrapper
-
-
def find_resource(manager, name_or_id, **kwargs):
"""Helper for the _find_* methods.
@@ -169,6 +142,16 @@ def format_list(data, separator=', '):
return separator.join(sorted(data))
+def format_list_of_dicts(data):
+ """Return a formatted string of key value pairs for each dict
+
+ :param data: a list of dicts
+ :rtype: a string formatted to key='value' with dicts separated by new line
+ """
+
+ return '\n'.join(format_dict(i) for i in data)
+
+
def get_field(item, field):
try:
if isinstance(item, dict):
@@ -331,6 +314,8 @@ def wait_for_status(status_f,
def wait_for_delete(manager,
res_id,
status_field='status',
+ error_status=['error'],
+ exception_name=['NotFound'],
sleep_time=5,
timeout=300,
callback=None):
@@ -341,6 +326,8 @@ def wait_for_delete(manager,
:param status_field: the status attribute in the returned resource object,
this is used to check for error states while the resource is being
deleted
+ :param error_status: a list of status strings for error
+ :param exception_name: a list of exception strings for deleted case
:param sleep_time: wait this long between checks (seconds)
:param timeout: check until this long (seconds)
:param callback: called per sleep cycle, useful to display progress; this
@@ -357,12 +344,12 @@ def wait_for_delete(manager,
# handle a NotFound exception here without parsing the message
res = manager.get(res_id)
except Exception as ex:
- if type(ex).__name__ == 'NotFound':
+ if type(ex).__name__ in exception_name:
return True
raise
status = getattr(res, status_field, '').lower()
- if status == 'error':
+ if status in error_status:
return False
if callback: