diff options
| author | Rick Harris <rick.harris@rackspace.com> | 2011-01-17 18:14:10 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-01-17 18:14:10 +0000 |
| commit | 93deb2e9a375a18300eff258f2353e597932c47b (patch) | |
| tree | 945c63448cfe712f3f526b852b3d5147e83a240f /nova/api | |
| parent | 825652456ac826a2108956ba8a9cbdc8221520dc (diff) | |
| parent | c947f4ed1214c83434436a8e5263233f945aa4f9 (diff) | |
The Openstack API requires image metadata to be returned immediately after an image-create call.
This is accomplished by having the ImageService create a 'queued' image in Glance.
When the image is subsequently uploaded, the image will go from 'queued' -> 'saving' -> 'queued'.
Related Future Work:
The ImageService needs to be cleaned up so that there is a canonical set of attributes (id, status, etc), and a canonical set of values ('queued', 'saving', etc). Right now, EC2 is fairly coupled to LocalImageService and S3ImageService while OpenStackAPI is coupled to GlanceImageService; ideally, we should be able mix-and-match from any of these.
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/images.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index a5f55a489..9d56bc508 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -78,7 +78,14 @@ def _translate_status(item): 'decrypting': 'preparing', 'untarring': 'saving', 'available': 'active'} - item['status'] = status_mapping[item['status']] + try: + item['status'] = status_mapping[item['status']] + except KeyError: + # TODO(sirp): Performing translation of status (if necessary) here for + # now. Perhaps this should really be done in EC2 API and + # S3ImageService + pass + return item @@ -92,9 +99,11 @@ def _filter_keys(item, keys): def _convert_image_id_to_hash(image): - image_id = abs(hash(image['imageId'])) - image['imageId'] = image_id - image['id'] = image_id + if 'imageId' in image: + # Convert EC2-style ID (i-blah) to Rackspace-style (int) + image_id = abs(hash(image['imageId'])) + image['imageId'] = image_id + image['id'] = image_id class Controller(wsgi.Controller): @@ -147,7 +156,11 @@ class Controller(wsgi.Controller): env = self._deserialize(req.body, req) instance_id = env["image"]["serverId"] name = env["image"]["name"] - return compute.API().snapshot(context, instance_id, name) + + image_meta = compute.API().snapshot( + context, instance_id, name) + + return dict(image=image_meta) def update(self, req, id): # Users may not modify public images, and that's all that |
