From 79cc2a21b645138f70c6ca4b54053f69c0dde81d Mon Sep 17 00:00:00 2001 From: MotoKen Date: Mon, 5 Nov 2012 19:45:11 +0800 Subject: Decouple EC2 API from using instance id Continuation of 0dc32690fe158e4cb11c2c9bcc65acaf73b94a7a Some code in ec2 api use Instance.id rather than InstanceIdMapping.id directly while converting ec2 id to an instance object. This is very dangerous if Instance.id is not equal to InstanceIdMapping.id for the same instance uuid. To avoid the id mapping confusion, this patch: * uses instance_id_mappings.id instead of instances.id * uses instance_uuid in ec2utils.id_to_ec2_inst_id * removes ec2utils.ec2_instance_id_to_uuid Change-Id: I22638f667c18eefe542b03e31f1a3aa2ce782db7 --- nova/api/ec2/cloud.py | 35 +++++++++++++++++------------------ nova/api/ec2/ec2utils.py | 4 ---- nova/api/metadata/base.py | 2 +- 3 files changed, 18 insertions(+), 23 deletions(-) (limited to 'nova/api') diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 8a7471951..9d73673a4 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -696,8 +696,8 @@ class CloudController(object): else: ec2_id = instance_id validate_ec2_id(ec2_id) - instance_id = ec2utils.ec2_id_to_id(ec2_id) - instance = self.compute_api.get(context, instance_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_id) + instance = self.compute_api.get(context, instance_uuid) output = self.compute_api.get_console_output(context, instance) now = timeutils.utcnow() return {"InstanceId": ec2_id, @@ -807,8 +807,8 @@ class CloudController(object): validate_ec2_id(instance_id) validate_ec2_id(volume_id) volume_id = ec2utils.ec2_vol_id_to_uuid(volume_id) - instance_id = ec2utils.ec2_id_to_id(instance_id) - instance = self.compute_api.get(context, instance_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, instance_id) + instance = self.compute_api.get(context, instance_uuid) msg = _("Attach volume %(volume_id)s to instance %(instance_id)s" " at %(device)s") % locals() LOG.audit(msg, context=context) @@ -822,7 +822,7 @@ class CloudController(object): volume = self.volume_api.get(context, volume_id) return {'attachTime': volume['attach_time'], 'device': volume['mountpoint'], - 'instanceId': ec2utils.id_to_ec2_inst_id(instance_id), + 'instanceId': ec2utils.id_to_ec2_inst_id(instance_uuid), 'requestId': context.request_id, 'status': volume['attach_status'], 'volumeId': ec2utils.id_to_ec2_vol_id(volume_id)} @@ -921,11 +921,10 @@ class CloudController(object): raise exception.EC2APIError( _('attribute not supported: %s') % attribute) - ec2_instance_id = instance_id validate_ec2_id(instance_id) - instance_id = ec2utils.ec2_id_to_id(ec2_instance_id) - instance = self.compute_api.get(context, instance_id) - result = {'instance_id': ec2_instance_id} + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, instance_id) + instance = self.compute_api.get(context, instance_uuid) + result = {'instance_id': instance_id} fn(instance, result) return result @@ -958,8 +957,8 @@ class CloudController(object): i['previousState'] = _state_description(previous_state['vm_state'], previous_state['shutdown_terminate']) try: - internal_id = ec2utils.ec2_id_to_id(ec2_id) - instance = self.compute_api.get(context, internal_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_id) + instance = self.compute_api.get(context, instance_uuid) i['currentState'] = _state_description(instance['vm_state'], instance['shutdown_terminate']) except exception.NotFound: @@ -1154,8 +1153,8 @@ class CloudController(object): def associate_address(self, context, instance_id, public_ip, **kwargs): LOG.audit(_("Associate address %(public_ip)s to" " instance %(instance_id)s") % locals(), context=context) - instance_id = ec2utils.ec2_id_to_id(instance_id) - instance = self.compute_api.get(context, instance_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, instance_id) + instance = self.compute_api.get(context, instance_uuid) cached_ipinfo = ec2utils.get_ip_info_for_instance(context, instance) fixed_ips = cached_ipinfo['fixed_ips'] + cached_ipinfo['fixed_ip6s'] @@ -1249,8 +1248,8 @@ class CloudController(object): instances = [] for ec2_id in instance_id: validate_ec2_id(ec2_id) - _instance_id = ec2utils.ec2_id_to_id(ec2_id) - instance = self.compute_api.get(context, _instance_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_id) + instance = self.compute_api.get(context, instance_uuid) instances.append(instance) return instances @@ -1513,8 +1512,8 @@ class CloudController(object): name = kwargs.get('name') validate_ec2_id(instance_id) ec2_instance_id = instance_id - instance_id = ec2utils.ec2_id_to_id(ec2_instance_id) - instance = self.compute_api.get(context, instance_id) + instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_instance_id) + instance = self.compute_api.get(context, instance_uuid) bdms = self.compute_api.get_instance_bdms(context, instance) @@ -1544,7 +1543,7 @@ class CloudController(object): start_time = time.time() while vm_state != vm_states.STOPPED: time.sleep(1) - instance = self.compute_api.get(context, instance_id) + instance = self.compute_api.get(context, instance_uuid) vm_state = instance['vm_state'] # NOTE(yamahata): timeout and error. 1 hour for now for safety. # Is it too short/long? diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index de05aa903..997197d38 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -252,10 +252,6 @@ def get_snapshot_uuid_from_int_id(context, int_id): return db.get_snapshot_uuid_by_ec2_id(context, int_id) -def ec2_instance_id_to_uuid(context, ec2_id): - int_id = ec2_id_to_id(ec2_id) - return db.instance_get(context, int_id)['uuid'] - _c2u = re.compile('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))') diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py index 21fb4a7da..469d87d46 100644 --- a/nova/api/metadata/base.py +++ b/nova/api/metadata/base.py @@ -110,7 +110,7 @@ class InstanceMetadata(): self.ec2_ids = {} self.ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id( - instance['id']) + instance['uuid']) self.ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(ctxt, instance['image_ref']) -- cgit