From 7172fdc2bf4061039fe34cdb97e442c073a7570a Mon Sep 17 00:00:00 2001 From: Andrea Rosa Date: Thu, 11 Apr 2013 17:28:51 +0100 Subject: Fix bug in os-availability-zone extension. Fixes bug 1167956. The call to get the list of availability zones (GET V2/os-availability-zone) doesn't hide internal availability zone if all services in that zone are disabled. Change-Id: I2c49ad68c2ee5ddea0536dfa770f649fbb392b63 --- .../openstack/compute/contrib/availability_zone.py | 28 ++++++++++++---------- .../compute/contrib/test_availability_zone.py | 15 ++++++++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/nova/api/openstack/compute/contrib/availability_zone.py b/nova/api/openstack/compute/contrib/availability_zone.py index 14602265b..22001b65f 100644 --- a/nova/api/openstack/compute/contrib/availability_zone.py +++ b/nova/api/openstack/compute/contrib/availability_zone.py @@ -76,24 +76,28 @@ class AvailabilityZoneController(wsgi.Controller): super(AvailabilityZoneController, self).__init__() self.servicegroup_api = servicegroup.API() - def _describe_availability_zones(self, context, **kwargs): - ctxt = context.elevated() - available_zones, not_available_zones = \ - availability_zones.get_availability_zones(ctxt) - + def _get_filtered_availability_zones(self, zones, is_available): result = [] - for zone in available_zones: + for zone in zones: # Hide internal_service_availability_zone if zone == CONF.internal_service_availability_zone: continue result.append({'zoneName': zone, - 'zoneState': {'available': True}, - "hosts": None}) - for zone in not_available_zones: - result.append({'zoneName': zone, - 'zoneState': {'available': False}, + 'zoneState': {'available': is_available}, "hosts": None}) - return {'availabilityZoneInfo': result} + return result + + def _describe_availability_zones(self, context, **kwargs): + ctxt = context.elevated() + available_zones, not_available_zones = \ + availability_zones.get_availability_zones(ctxt) + + filtered_available_zones = \ + self._get_filtered_availability_zones(available_zones, True) + filtered_not_available_zones = \ + self._get_filtered_availability_zones(not_available_zones, False) + return {'availabilityZoneInfo': filtered_available_zones + + filtered_not_available_zones} def _describe_availability_zones_verbose(self, context, **kwargs): ctxt = context.elevated() diff --git a/nova/tests/api/openstack/compute/contrib/test_availability_zone.py b/nova/tests/api/openstack/compute/contrib/test_availability_zone.py index cd4c616d7..b9066a975 100644 --- a/nova/tests/api/openstack/compute/contrib/test_availability_zone.py +++ b/nova/tests/api/openstack/compute/contrib/test_availability_zone.py @@ -81,6 +81,21 @@ class AvailabilityZoneApiTest(test.TestCase): fake_set_availability_zones) self.stubs.Set(servicegroup.API, 'service_is_up', fake_service_is_up) + def test_filtered_availability_zones(self): + az = availability_zone.AvailabilityZoneController() + zones = ['zone1', 'internal'] + expected = [{'zoneName': 'zone1', + 'zoneState': {'available': True}, + "hosts": None}] + result = az._get_filtered_availability_zones(zones, True) + self.assertEqual(result, expected) + + expected = [{'zoneName': 'zone1', + 'zoneState': {'available': False}, + "hosts": None}] + result = az._get_filtered_availability_zones(zones, False) + self.assertEqual(result, expected) + def test_availability_zone_index(self): req = webob.Request.blank('/v2/fake/os-availability-zone') resp = req.get_response(fakes.wsgi_app()) -- cgit