From 91db10a0fd43c30ed088082583b7d43667339ac5 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Sat, 9 Feb 2013 10:32:49 -0500 Subject: Make the metadata paths use conductor This patch makes the metadata service use conductor instead of hitting the database directly. It adds a get_ec2_ids() method to conductor, which encapsulates a bunch of very small id translation database queries. It also does the AZ lookup via conductor. Fixes bug 1120402 Change-Id: Iceef753b1451ff53e29dfbf97a696b952b47d5a3 --- nova/api/ec2/ec2utils.py | 4 ++-- nova/api/metadata/base.py | 53 +++++++++++++++++++++----------------------- nova/api/metadata/handler.py | 7 ++++-- 3 files changed, 32 insertions(+), 32 deletions(-) (limited to 'nova/api') diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index bc47b3e0d..bb0f7245a 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -115,10 +115,10 @@ def get_ip_info_for_instance(context, instance): return get_ip_info_for_instance_from_nw_info(nw_info) -def get_availability_zone_by_host(services, host): +def get_availability_zone_by_host(services, host, conductor_api=None): if len(services) > 0: return availability_zones.get_host_availability_zone( - context.get_admin_context(), host) + context.get_admin_context(), host, conductor_api) return 'unknown zone' diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py index 34d412268..275af2b32 100644 --- a/nova/api/metadata/base.py +++ b/nova/api/metadata/base.py @@ -26,8 +26,8 @@ import posixpath from nova.api.ec2 import ec2utils from nova.api.metadata import password from nova import block_device +from nova import conductor from nova import context -from nova import db from nova import network from nova.openstack.common import cfg from nova.openstack.common import timeutils @@ -83,7 +83,8 @@ class InvalidMetadataPath(Exception): class InstanceMetadata(): """Instance metadata.""" - def __init__(self, instance, address=None, content=[], extra_md=None): + def __init__(self, instance, address=None, content=[], extra_md=None, + conductor_api=None): """Creation of this object should basically cover all time consuming collection. Methods after that should not cause time delays due to network operations or lengthy cpu operations. @@ -95,39 +96,32 @@ class InstanceMetadata(): self.instance = instance self.extra_md = extra_md + if conductor_api: + self.conductor_api = conductor_api + else: + self.conductor_api = conductor.API() + ctxt = context.get_admin_context() - services = db.service_get_all_by_host(ctxt.elevated(), - instance['host']) + capi = self.conductor_api + services = capi.service_get_all_by_host(ctxt.elevated(), + instance['host']) self.availability_zone = ec2utils.get_availability_zone_by_host( - services, instance['host']) + services, instance['host'], capi) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) - self.security_groups = db.security_group_get_by_instance(ctxt, - instance['id']) + self.security_groups = capi.security_group_get_by_instance(ctxt, + instance) - self.mappings = _format_instance_mapping(ctxt, instance) + self.mappings = _format_instance_mapping(capi, ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_raw = base64.b64decode(instance['user_data']) else: self.userdata_raw = None - self.ec2_ids = {} - - self.ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id( - instance['uuid']) - self.ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(ctxt, - instance['image_ref']) - - for image_type in ['kernel', 'ramdisk']: - if self.instance.get('%s_id' % image_type): - image_id = self.instance['%s_id' % image_type] - ec2_image_type = ec2utils.image_type(image_type) - ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, - ec2_image_type) - self.ec2_ids['%s-id' % image_type] = ec2_id + self.ec2_ids = capi.get_ec2_ids(ctxt, instance) self.address = address @@ -404,23 +398,26 @@ class InstanceMetadata(): yield ('%s/%s/%s' % ("openstack", CONTENT_DIR, cid), content) -def get_metadata_by_address(address): +def get_metadata_by_address(conductor_api, address): ctxt = context.get_admin_context() fixed_ip = network.API().get_fixed_ip_by_address(ctxt, address) - return get_metadata_by_instance_id(fixed_ip['instance_uuid'], + return get_metadata_by_instance_id(conductor_api, + fixed_ip['instance_uuid'], address, ctxt) -def get_metadata_by_instance_id(instance_id, address, ctxt=None): +def get_metadata_by_instance_id(conductor_api, instance_id, address, + ctxt=None): ctxt = ctxt or context.get_admin_context() - instance = db.instance_get_by_uuid(ctxt, instance_id) + instance = conductor_api.instance_get_by_uuid(ctxt, instance_id) return InstanceMetadata(instance, address) -def _format_instance_mapping(ctxt, instance): - bdms = db.block_device_mapping_get_all_by_instance(ctxt, instance['uuid']) +def _format_instance_mapping(conductor_api, ctxt, instance): + bdms = conductor_api.block_device_mapping_get_all_by_instance( + ctxt, instance) return block_device.instance_block_mapping(instance, bdms) diff --git a/nova/api/metadata/handler.py b/nova/api/metadata/handler.py index 4a425f876..cedb27370 100644 --- a/nova/api/metadata/handler.py +++ b/nova/api/metadata/handler.py @@ -26,6 +26,7 @@ import webob.exc from nova.api.metadata import base from nova.common import memorycache +from nova import conductor from nova import exception from nova.openstack.common import cfg from nova.openstack.common import log as logging @@ -58,6 +59,7 @@ class MetadataRequestHandler(wsgi.Application): def __init__(self): self._cache = memorycache.get_client() + self.conductor_api = conductor.API() def get_metadata_by_remote_address(self, address): if not address: @@ -69,7 +71,7 @@ class MetadataRequestHandler(wsgi.Application): return data try: - data = base.get_metadata_by_address(address) + data = base.get_metadata_by_address(self.conductor_api, address) except exception.NotFound: return None @@ -84,7 +86,8 @@ class MetadataRequestHandler(wsgi.Application): return data try: - data = base.get_metadata_by_instance_id(instance_id, address) + data = base.get_metadata_by_instance_id(self.conductor_api, + instance_id, address) except exception.NotFound: return None -- cgit