summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/api/ec2/cloud.py33
-rw-r--r--nova/image/s3.py28
2 files changed, 29 insertions, 32 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index aa1dcbe33..3ea3fa07e 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -843,10 +843,19 @@ class CloudController(object):
self.compute_api.update(context, instance_id=instance_id, **kwargs)
return True
+ _type_prefix_map = {'machine': 'ami',
+ 'kernel': 'aki',
+ 'ramdisk': 'ari'}
+
+ def _image_ec2_id(self, image_id, image_type):
+ prefix = self._type_prefix_map[image_type]
+ template = prefix + '-%08x'
+ return ec2utils.id_to_ec2_id(int(image_id), template=template)
+
def _format_image(self, image):
"""Convert from format defined by BaseImageService to S3 format."""
i = {}
- i['imageId'] = image.get('id')
+ i['imageId'] = self._image_ec2_id(image.get('id'), image.get('type'))
i['kernelId'] = image['properties'].get('kernel_id')
i['ramdiskId'] = image['properties'].get('ramdisk_id')
i['imageOwnerId'] = image['properties'].get('owner_id')
@@ -863,7 +872,8 @@ class CloudController(object):
images = []
for ec2_id in image_id:
try:
- image = self.image_service.show(context, ec2_id)
+ internal_id = ec2utils.ec2_id_to_id(ec2_id)
+ image = self.image_service.show(context, internal_id)
except exception.NotFound:
raise exception.NotFound(_('Image %s not found') %
ec2_id)
@@ -875,14 +885,16 @@ class CloudController(object):
def deregister_image(self, context, image_id, **kwargs):
LOG.audit(_("De-registering image %s"), image_id, context=context)
- self.image_service.delete(context, image_id)
+ internal_id = ec2utils.ec2_id_to_id(image_id)
+ self.image_service.delete(context, internal_id)
return {'imageId': image_id}
def register_image(self, context, image_location=None, **kwargs):
if image_location is None and 'name' in kwargs:
image_location = kwargs['name']
- image = {"image_location": image_location}
- image_id = self.image_service.create(context, image)
+ metadata = {"image_location": image_location}
+ image = self.image_service.create(context, metadata)
+ image_id = self._image_ec2_id(image['id'], image['type'])
msg = _("Registered image %(image_location)s with"
" id %(image_id)s") % locals()
LOG.audit(msg, context=context)
@@ -893,8 +905,9 @@ class CloudController(object):
raise exception.ApiError(_('attribute not supported: %s')
% attribute)
try:
+ internal_id = ec2utils.ec2_id_to_id(image_id)
image = self._format_image(self.image_service.show(context,
- image_id))
+ internal_id))
except (IndexError, exception.NotFound):
raise exception.NotFound(_('Image %s not found') % image_id)
result = {'image_id': image_id, 'launchPermission': []}
@@ -917,13 +930,15 @@ class CloudController(object):
LOG.audit(_("Updating image %s publicity"), image_id, context=context)
try:
- metadata = self.image_service.show(context, image_id)
+ internal_id = ec2utils.ec2_id_to_id(image_id)
+ metadata = self.image_service.show(context, internal_id)
except exception.NotFound:
raise exception.NotFound(_('Image %s not found') % image_id)
del(metadata['id'])
metadata['properties']['is_public'] = (operation_type == 'add')
- return self.image_service.update(context, image_id, metadata)
+ return self.image_service.update(context, internal_id, metadata)
def update_image(self, context, image_id, **kwargs):
- result = self.image_service.update(context, image_id, dict(kwargs))
+ internal_id = ec2utils.ec2_id_to_id(image_id)
+ result = self.image_service.update(context, internal_id, dict(kwargs))
return result
diff --git a/nova/image/s3.py b/nova/image/s3.py
index e9542c7bd..c7446f4b0 100644
--- a/nova/image/s3.py
+++ b/nova/image/s3.py
@@ -36,7 +36,6 @@ from nova import flags
from nova import utils
from nova.auth import manager
from nova.image import service
-from nova.api.ec2 import ec2utils
FLAGS = flags.FLAGS
@@ -44,17 +43,6 @@ flags.DEFINE_string('image_decryption_dir', '/tmp',
'parent dir for tempdir used for image decryption')
-_type_prefix_map = {'machine': 'ami',
- 'kernel': 'aki',
- 'ramdisk': 'ari'}
-
-
-def image_ec2_id(image_id, image_type):
- prefix = _type_prefix_map[image_type]
- template = prefix + '-%08x'
- return ec2utils.id_to_ec2_id(int(image_id), template=template)
-
-
class S3ImageService(service.BaseImageService):
def __init__(self, service=None, *args, **kwargs):
if service == None:
@@ -62,23 +50,20 @@ class S3ImageService(service.BaseImageService):
self.service = service
self.service.__init__(*args, **kwargs)
- def create(self, context, properties, data=None):
- """image should contain image_location"""
- image_id, metadata = self._s3_create(context, properties)
- return image_ec2_id(image_id, metadata['type'])
+ def create(self, context, metadata, data=None):
+ """metadata should contain image_location"""
+ image = self._s3_create(context, metadata)
+ return image
def delete(self, context, image_id):
# FIXME(vish): call to show is to check filter
self.show(context, image_id)
- image_id = ec2utils.ec2_id_to_id(image_id)
self.service.delete(context, image_id)
def update(self, context, image_id, metadata, data=None):
# FIXME(vish): call to show is to check filter
self.show(context, image_id)
- image_id = ec2utils.ec2_id_to_id(image_id)
image = self.service.update(context, image_id, metadata, data)
- image['id'] = image_ec2_id(image['id'], image['type'])
return image
def index(self, context):
@@ -103,16 +88,13 @@ class S3ImageService(service.BaseImageService):
for image in images:
if not S3ImageService._is_visible(context, image):
continue
- image['id'] = image_ec2_id(image['id'], image['type'])
filtered.append(image)
return filtered
def show(self, context, image_id):
- image_id = ec2utils.ec2_id_to_id(image_id)
image = self.service.show(context, image_id)
if not self._is_visible(context, image):
raise exception.NotFound
- image['id'] = image_ec2_id(image['id'], image['type'])
return image
@staticmethod
@@ -233,7 +215,7 @@ class S3ImageService(service.BaseImageService):
eventlet.spawn_n(delayed_create)
- return image_id, metadata
+ return image
@staticmethod
def _decrypt_image(encrypted_filename, encrypted_key, encrypted_iv,