diff options
| author | Maru Newby <mnewby@internap.com> | 2012-03-12 23:19:16 -0700 |
|---|---|---|
| committer | Brian Waldon <bcwaldon@gmail.com> | 2012-03-13 10:09:12 -0700 |
| commit | 0929e3a289af39fc38b46c4a55db06b8888e671e (patch) | |
| tree | e7c90b6bfd014b06a4cc612b1c91e18a247e6111 /nova/api | |
| parent | 094985ea657f590936906829486829846a558f05 (diff) | |
Refactor glance id<->internal id conversion for s3
* Moves nova.image.s3.S3ImageService functions for converting
between glance ('image_uuid') and internal (db) ids to ec2utils:
get_image_id => ec2utils.glance_id_to_id
get_image_uuid => ec2utils.id_to_glance_id
* Refactors ec2utils.glance_id_to_id to create a new S3Image
object associating a glance id to an internal id if such a
mapping does not already exist. Previously, only calls to
nova.api.ec2.cloud.CloudController.describe_images would
add new mappings, but now any attempt to convert a glance id
to an internal id will succeed, resolving bug 948286.
* Adds 2 convenience methods to ec2utils, as per bcwaldon:
ec2_id_to_glance_id
glance_id_to_ec2_id
* Since this is a strict refactor and only streamlines existing
well-tested functionality, this change includes no new tests.
Change-Id: I810afe05223228df1bcc20a0ac688d8c62c472b4
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/ec2/cloud.py | 28 | ||||
| -rw-r--r-- | nova/api/ec2/ec2utils.py | 26 |
2 files changed, 35 insertions, 19 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 81f0c9a7e..a95a0324f 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -967,15 +967,14 @@ class CloudController(object): kernel_uuid = instance_ref['kernel_id'] if kernel_uuid is None or kernel_uuid == '': return - kernel_id = self._get_image_id(context, kernel_uuid) - result[key] = ec2utils.image_ec2_id(kernel_id, 'aki') + result[key] = ec2utils.glance_id_to_ec2_id(context, kernel_uuid, 'aki') def _format_ramdisk_id(self, context, instance_ref, result, key): ramdisk_uuid = instance_ref['ramdisk_id'] if ramdisk_uuid is None or ramdisk_uuid == '': return - ramdisk_id = self._get_image_id(context, ramdisk_uuid) - result[key] = ec2utils.image_ec2_id(ramdisk_id, 'ari') + result[key] = ec2utils.glance_id_to_ec2_id(context, ramdisk_uuid, + 'ari') def describe_instance_attribute(self, context, instance_id, attribute, **kwargs): @@ -1173,8 +1172,7 @@ class CloudController(object): ec2_id = ec2utils.id_to_ec2_id(instance_id) i['instanceId'] = ec2_id image_uuid = instance['image_ref'] - image_id = self._get_image_id(context, image_uuid) - i['imageId'] = ec2utils.image_ec2_id(image_id) + i['imageId'] = ec2utils.glance_id_to_ec2_id(context, image_uuid) self._format_kernel_id(context, instance, i, 'kernelId') self._format_ramdisk_id(context, instance, i, 'ramdiskId') i['instanceState'] = _state_description( @@ -1287,16 +1285,17 @@ class CloudController(object): max_count = int(kwargs.get('max_count', 1)) if kwargs.get('kernel_id'): kernel = self._get_image(context, kwargs['kernel_id']) - kwargs['kernel_id'] = self._get_image_uuid(context, kernel['id']) + kwargs['kernel_id'] = ec2utils.id_to_glance_id(context, + kernel['id']) if kwargs.get('ramdisk_id'): ramdisk = self._get_image(context, kwargs['ramdisk_id']) - kwargs['ramdisk_id'] = self._get_image_uuid(context, - ramdisk['id']) + kwargs['ramdisk_id'] = ec2utils.id_to_glance_id(context, + ramdisk['id']) for bdm in kwargs.get('block_device_mapping', []): _parse_block_device_mapping(bdm) image = self._get_image(context, kwargs['image_id']) - image_uuid = self._get_image_uuid(context, image['id']) + image_uuid = ec2utils.id_to_glance_id(context, image['id']) if image: image_state = self._get_image_state(image) @@ -1383,15 +1382,6 @@ class CloudController(object): raise exception.ImageNotFound(image_id=ec2_id) return image - # NOTE(bcwaldon): We need access to the image uuid since we directly - # call the compute api from this class - def _get_image_uuid(self, context, internal_id): - return self.image_service.get_image_uuid(context, internal_id) - - # NOTE(bcwaldon): We also need to be able to map image uuids to integers - def _get_image_id(self, context, image_uuid): - return self.image_service.get_image_id(context, image_uuid) - def _format_image(self, image): """Convert from format defined by GlanceImageService to S3 format.""" i = {} diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index e44ae287e..1a6bb96bd 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -18,6 +18,7 @@ import re +from nova import db from nova import exception from nova import flags from nova import log as logging @@ -46,6 +47,31 @@ def image_type(image_type): return image_type +def id_to_glance_id(context, image_id): + """Convert an internal (db) id to a glance id.""" + return db.s3_image_get(context, image_id)['uuid'] + + +def glance_id_to_id(context, glance_id): + """Convert a glance id to an internal (db) id.""" + if glance_id is None: + return + try: + return db.s3_image_get_by_uuid(context, glance_id)['id'] + except exception.NotFound: + return db.s3_image_create(context, glance_id)['id'] + + +def ec2_id_to_glance_id(context, ec2_id): + image_id = ec2_id_to_id(ec2_id) + return id_to_glance_id(context, image_id) + + +def glance_id_to_ec2_id(context, glance_id, image_type='ami'): + image_id = glance_id_to_id(context, glance_id) + return image_ec2_id(image_id, image_type=image_type) + + def ec2_id_to_id(ec2_id): """Convert an ec2 ID (i-[base 16 number]) to an instance id (int)""" try: |
