'Describe the known availability zones
:param enable_cache: Enable az cache
:param refresh_cache: Refresh cache immediately
:return: tuple of dicts, each with a \'name\' and \'available\' key'

def list_availability_zones(self, enable_cache=False, refresh_cache=False):

    if enable_cache:
        if (self.availability_zones_last_fetched is None):
            refresh_cache = True
        else:
            cache_age = timeutils.delta_seconds(self.availability_zones_last_fetched, timeutils.utcnow())
            if (cache_age >= CONF.az_cache_duration):
                refresh_cache = True
    if (refresh_cache or (not enable_cache)):
        topic = constants.VOLUME_TOPIC
        ctxt = context.get_admin_context()
        services = objects.ServiceList.get_all_by_topic(ctxt, topic)
        az_data = [(s.availability_zone, s.disabled) for s in services]
        disabled_map = {}
        for (az_name, disabled) in az_data:
            tracked_disabled = disabled_map.get(az_name, True)
            disabled_map[az_name] = (tracked_disabled and disabled)
        azs = [{'name': name, 'available': (not disabled)} for (name, disabled) in disabled_map.items()]
        if refresh_cache:
            now = timeutils.utcnow()
            self.availability_zones = azs
            self.availability_zones_last_fetched = now
            LOG.debug('Availability    zone    cache    updated,    next    update    will    occur    around    %s.', (now + datetime.timedelta(seconds=CONF.az_cache_duration)))
    else:
        azs = self.availability_zones
    LOG.info('Availability    Zones    retrieved    successfully.')
    return tuple(azs)
