diff options
| author | MotoKen <motokentsai@gmail.com> | 2012-11-05 19:45:11 +0800 |
|---|---|---|
| committer | MotoKen <motokentsai@gmail.com> | 2012-11-07 11:02:41 +0800 |
| commit | 79cc2a21b645138f70c6ca4b54053f69c0dde81d (patch) | |
| tree | 20c5995e12d7d32c8080225eeb34c3b0d1ef05b7 /nova/api | |
| parent | 066b3930cfffcd532ed70360902a14d8155289d4 (diff) | |
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
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/ec2/cloud.py | 35 | ||||
| -rw-r--r-- | nova/api/ec2/ec2utils.py | 4 | ||||
| -rw-r--r-- | nova/api/metadata/base.py | 2 |
3 files changed, 18 insertions, 23 deletions
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']) |
