summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorEldar Nugaev <enugaev@griddynamics.com>2011-01-07 05:59:30 +0300
committerEldar Nugaev <enugaev@griddynamics.com>2011-01-07 05:59:30 +0300
commit3478e90442ad7a22497b53153ae893df96e55b4e (patch)
tree25ff5c66fee6c7676f4a0f3bbbc6aa7556ed8f03 /nova/api
parent9eca4d51f55b078942c9886fd5b785d6f045c6d2 (diff)
downloadnova-3478e90442ad7a22497b53153ae893df96e55b4e.tar.gz
nova-3478e90442ad7a22497b53153ae893df96e55b4e.tar.xz
nova-3478e90442ad7a22497b53153ae893df96e55b4e.zip
merge
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/ec2/cloud.py34
1 files changed, 30 insertions, 4 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 6619b5452..b6966e605 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -140,6 +140,12 @@ class CloudController(object):
{"method": "refresh_security_group",
"args": {"security_group_id": security_group.id}})
+ def _get_availability_zone_by_host(self, context, host):
+ services = db.service_get_all_by_host(context, host)
+ if len(services) > 0:
+ return services[0]['availability_zone']
+ return 'unknown zone'
+
def get_metadata(self, address):
ctxt = context.get_admin_context()
instance_ref = self.compute_api.get_all(ctxt, fixed_ip=address)
@@ -152,6 +158,8 @@ class CloudController(object):
else:
keys = ''
hostname = instance_ref['hostname']
+ availability_zone = self._get_availability_zone_by_host(ctxt,
+ instance_ref['host'])
floating_ip = db.instance_get_floating_address(ctxt,
instance_ref['id'])
ec2_id = id_to_ec2_id(instance_ref['id'])
@@ -174,8 +182,7 @@ class CloudController(object):
'local-hostname': hostname,
'local-ipv4': address,
'kernel-id': instance_ref['kernel_id'],
- # TODO(vish): real zone
- 'placement': {'availability-zone': 'nova'},
+ 'placement': {'availability-zone': availability_zone},
'public-hostname': hostname,
'public-ipv4': floating_ip or '',
'public-keys': keys,
@@ -199,8 +206,25 @@ class CloudController(object):
return self._describe_availability_zones(context, **kwargs)
def _describe_availability_zones(self, context, **kwargs):
- return {'availabilityZoneInfo': [{'zoneName': 'nova',
- 'zoneState': 'available'}]}
+ enabled_services = db.service_get_all(context)
+ disabled_services = db.service_get_all(context, True)
+ available_zones = []
+ for zone in [service.availability_zone for service in enabled_services]:
+ if not zone in available_zones:
+ available_zones.append(zone)
+ not_available_zones = []
+ for zone in [service.availability_zone for service in disabled_services
+ and not service['availability_zone'] in available_zones]:
+ if not zone in not_available_zones:
+ not_available_zones.append(zone)
+ result = []
+ for zone in available_zones:
+ result.append({'zoneName': zone,
+ 'zoneState': "available"})
+ for zone in not_available_zones:
+ result.append({'zoneName': zone,
+ 'zoneState': "not available"})
+ return {'availabilityZoneInfo': result}
def _describe_availability_zones_verbose(self, context, **kwargs):
rv = {'availabilityZoneInfo': [{'zoneName': 'nova',
@@ -632,6 +656,8 @@ class CloudController(object):
i['amiLaunchIndex'] = instance['launch_index']
i['displayName'] = instance['display_name']
i['displayDescription'] = instance['display_description']
+ availability_zone = self._get_availability_zone_by_host(context, instance['host'])
+ i['placement'] = {'availabilityZone': availability_zone}
if instance['reservation_id'] not in reservations:
r = {}
r['reservationId'] = instance['reservation_id']