summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJoe Gordon <jogo@cloudscaling.com>2012-08-02 17:44:18 -0700
committerJoe Gordon <jogo@cloudscaling.com>2013-01-08 14:00:41 -0800
commit9f4534ab584faeee1e24d4c1bb38a2b194f24626 (patch)
tree969f294fcb40434e4432bf4e8eaefc96ced17284 /nova/api
parent61e9e0112bf2fd09892a5e1974d4f454ea2a4469 (diff)
Enable Aggregate based availability zones
Instead of implementing availability zones in the service table, availability zones are implemented using general aggregate metadata. This patch does not remove availability zones from the service table, a latter patch will do that. * In theory supports a single compute node in multiple availability zones * Drop availability_zone column from Aggregate table (is now a property) * map aggregate metadata 'availability_zone' so API does not change Implements blueprint aggregate-based-availability-zones Change-Id: I2a2ac5bfaa526d639dff5efa392c051347dbd9bb
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/ec2/cloud.py17
1 files changed, 16 insertions, 1 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index d40f25c4d..208574903 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -257,12 +257,18 @@ class CloudController(object):
if not zone in available_zones:
available_zones.append(zone)
+ # aggregate based availability_zones
+ metadata = db.aggregate_host_get_by_metadata_key(context,
+ key='availability_zone')
+ for zone_set in metadata.values():
+ for zone in zone_set:
+ if zone not in available_zones:
+ available_zones.append(zone)
not_available_zones = []
for zone in [service.availability_zone for service in disabled_services
if not service['availability_zone'] in available_zones]:
if not zone in not_available_zones:
not_available_zones.append(zone)
-
return (available_zones, not_available_zones)
def _describe_availability_zones(self, context, **kwargs):
@@ -294,6 +300,15 @@ class CloudController(object):
host_services.setdefault(service['host'], [])
host_services[service['host']].append(service)
+ # aggregate based available_zones
+ metadata = db.aggregate_host_get_by_metadata_key(context,
+ key='availability_zone')
+ # metdata: {machine: set( az1, az2 )}
+ for host, zones in metadata.items():
+ for zone in zones:
+ zone_hosts.setdefault(zone, [])
+ if host not in zone_hosts[zone]:
+ zone_hosts[zone].append(host)
result = []
for zone in available_zones: