summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Rosa <andrea.rosa@hp.com>2013-04-11 17:28:51 +0100
committerAndrea Rosa <andrea.rosa@hp.com>2013-04-11 17:28:51 +0100
commit7172fdc2bf4061039fe34cdb97e442c073a7570a (patch)
tree136c2294c1f61cd1167088d90db725c8b501c08a
parent284cc009175f0d87683dc6a98ee997e8476ef87c (diff)
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
-rw-r--r--nova/api/openstack/compute/contrib/availability_zone.py28
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_availability_zone.py15
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())