diff options
| author | Joe Gordon <jogo@cloudscaling.com> | 2012-08-02 17:44:18 -0700 |
|---|---|---|
| committer | Joe Gordon <jogo@cloudscaling.com> | 2013-01-08 14:00:41 -0800 |
| commit | 9f4534ab584faeee1e24d4c1bb38a2b194f24626 (patch) | |
| tree | 969f294fcb40434e4432bf4e8eaefc96ced17284 /nova/api | |
| parent | 61e9e0112bf2fd09892a5e1974d4f454ea2a4469 (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.py | 17 |
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: |
