summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMotoKen <motokentsai@gmail.com>2012-11-05 19:45:11 +0800
committerMotoKen <motokentsai@gmail.com>2012-11-07 11:02:41 +0800
commit79cc2a21b645138f70c6ca4b54053f69c0dde81d (patch)
tree20c5995e12d7d32c8080225eeb34c3b0d1ef05b7
parent066b3930cfffcd532ed70360902a14d8155289d4 (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
-rw-r--r--nova/api/ec2/cloud.py35
-rw-r--r--nova/api/ec2/ec2utils.py4
-rw-r--r--nova/api/metadata/base.py2
-rw-r--r--nova/tests/api/ec2/test_cinder_cloud.py15
-rw-r--r--nova/tests/api/ec2/test_cloud.py9
5 files changed, 33 insertions, 32 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'])
diff --git a/nova/tests/api/ec2/test_cinder_cloud.py b/nova/tests/api/ec2/test_cinder_cloud.py
index 13e854077..47f78ab75 100644
--- a/nova/tests/api/ec2/test_cinder_cloud.py
+++ b/nova/tests/api/ec2/test_cinder_cloud.py
@@ -678,8 +678,8 @@ class CinderCloudTestCase(test.TestCase):
'delete_on_termination': True},
]}
ec2_instance_id = self._run_instance(**kwargs)
- instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
- ec2_instance_id)
+ instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
+ ec2_instance_id)
vols = self.volume_api.get_all(self.context)
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
@@ -756,9 +756,8 @@ class CinderCloudTestCase(test.TestCase):
'volume_id': vol1_uuid,
'delete_on_termination': True}]}
ec2_instance_id = self._run_instance(**kwargs)
- instance_id = ec2utils.ec2_id_to_id(ec2_instance_id)
- instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
- ec2_instance_id)
+ instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
+ ec2_instance_id)
vols = self.volume_api.get_all(self.context)
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
@@ -769,7 +768,7 @@ class CinderCloudTestCase(test.TestCase):
vol = self.volume_api.get(self.context, vol2_uuid)
self._assert_volume_detached(vol)
- instance = db.instance_get(self.context, instance_id)
+ instance = db.instance_get_by_uuid(self.context, instance_uuid)
self.cloud.compute_api.attach_volume(self.context,
instance,
volume_id=vol2_uuid,
@@ -841,8 +840,8 @@ class CinderCloudTestCase(test.TestCase):
'snapshot_id': snap2_uuid,
'delete_on_termination': True}]}
ec2_instance_id = self._run_instance(**kwargs)
- instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
- ec2_instance_id)
+ instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
+ ec2_instance_id)
vols = self.volume_api.get_all(self.context)
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py
index 95003ee87..1978aa50a 100644
--- a/nova/tests/api/ec2/test_cloud.py
+++ b/nova/tests/api/ec2/test_cloud.py
@@ -259,7 +259,7 @@ class CloudTestCase(test.TestCase):
project_id=project_id)
fixed_ips = nw_info.fixed_ips()
- ec2_id = ec2utils.id_to_ec2_inst_id(inst['id'])
+ ec2_id = ec2utils.id_to_ec2_inst_id(inst['uuid'])
self.stubs.Set(ec2utils, 'get_ip_info_for_instance',
lambda *args: {'fixed_ips': ['10.0.0.1'],
@@ -2023,6 +2023,13 @@ class CloudTestCase(test.TestCase):
raise exception.VolumeNotFound(volume_id=volume_id)
self.stubs.Set(db, 'volume_get', fake_volume_get)
+ def fake_get_instance_uuid_by_ec2_id(ctxt, int_id):
+ if int_id == 305419896:
+ return 'e5fe5518-0288-4fa3-b0c4-c79764101b85'
+ raise exception.InstanceNotFound(instance_id=int_id)
+ self.stubs.Set(db, 'get_instance_uuid_by_ec2_id',
+ fake_get_instance_uuid_by_ec2_id)
+
get_attribute = functools.partial(
self.cloud.describe_instance_attribute,
self.context, 'i-12345678')