summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rick.harris@rackspace.com>2011-03-22 23:49:24 +0000
committerRick Harris <rick.harris@rackspace.com>2011-03-22 23:49:24 +0000
commit7d97f700811468303c21159454db64e84f71a2a0 (patch)
tree5cac33826300c089de0812d133777106882975e0
parentd8176eda3f31973a8718b98f35e202ff61c48bbc (diff)
Refactored out _safe_translate code
-rw-r--r--nova/api/openstack/images.py44
-rw-r--r--nova/compute/api.py10
2 files changed, 29 insertions, 25 deletions
diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py
index 97e62c22d..2d2f67fe1 100644
--- a/nova/api/openstack/images.py
+++ b/nova/api/openstack/images.py
@@ -193,6 +193,21 @@ def _translate_from_image_service_to_api(image_metadata):
return api_metadata
+def _safe_translate(image_metadata):
+ """Translate attributes for OpenStack API, temporary workaround for
+ S3ImageService attribute leakage.
+ """
+ # FIXME(sirp): The S3ImageService appears to be leaking implementation
+ # details, including its internal attribute names, and internal
+ # `status` values. Working around it for now.
+ s3_like_image = ('imageId' in image_metadata)
+ if s3_like_image:
+ translate = _translate_s3_like_images
+ else:
+ translate = _translate_from_image_service_to_api
+ return translate(image_metadata)
+
+
class Controller(wsgi.Controller):
_serialization_metadata = {
@@ -221,30 +236,18 @@ class Controller(wsgi.Controller):
req.environ['nova.context'])
service_image_metas = common.limited(service_image_metas, req)
-
- # FIXME(sirp): The S3ImageService appears to be leaking implementation
- # details, including its internal attribute names, and internal
- # `status` values. Working around it for now.
- s3_like_image = (service_image_metas and
- ('imageId' in service_image_metas[0]))
- if s3_like_image:
- translate = _translate_s3_like_images
- else:
- translate = _translate_from_image_service_to_api
-
- api_image_metas = [translate(service_image_meta)
+ api_image_metas = [_safe_translate(service_image_meta)
for service_image_meta in service_image_metas]
-
return dict(images=api_image_metas)
def show(self, req, id):
"""Return data about the given image id"""
image_id = common.get_image_id_from_image_hash(self._service,
req.environ['nova.context'], id)
-
- image = self._service.show(req.environ['nova.context'], image_id)
- _convert_image_id_to_hash(image)
- return dict(image=image)
+ service_image_meta = self._service.show(
+ req.environ['nova.context'], image_id)
+ api_image_meta = _safe_translate(service_image_meta)
+ return dict(image=api_image_meta)
def delete(self, req, id):
# Only public images are supported for now.
@@ -255,11 +258,10 @@ class Controller(wsgi.Controller):
env = self._deserialize(req.body, req.get_content_type())
instance_id = env["image"]["serverId"]
name = env["image"]["name"]
-
- image_meta = compute.API().snapshot(
+ service_image_meta = compute.API().snapshot(
context, instance_id, name)
-
- return dict(image=image_meta)
+ api_image_meta = _safe_translate(service_image_meta)
+ return dict(image=api_image_meta)
def update(self, req, id):
# Users may not modify public images, and that's all that
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 2fda9551d..25a533416 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -441,12 +441,14 @@ class API(base.Base):
:retval: A dict containing image metadata
"""
- data = {'name': name, 'is_public': False, 'instance_id': instance_id}
- image_meta = self.image_service.create(context, data)
- params = {'image_id': image_meta['id']}
+ properties = {'instance_id': str(instance_id)}
+ sent_meta = {'name': name, 'is_public': False,
+ 'properties': properties}
+ recv_meta = self.image_service.create(context, sent_meta)
+ params = {'image_id': recv_meta['id']}
self._cast_compute_message('snapshot_instance', context, instance_id,
params=params)
- return image_meta
+ return recv_meta
def reboot(self, context, instance_id):
"""Reboot the given instance."""