From 9f4534ab584faeee1e24d4c1bb38a2b194f24626 Mon Sep 17 00:00:00 2001 From: Joe Gordon Date: Thu, 2 Aug 2012 17:44:18 -0700 Subject: 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 --- nova/api/ec2/cloud.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'nova/api') 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: -- cgit