summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dan.prince@rackspace.com>2011-06-07 13:47:40 -0400
committerDan Prince <dan.prince@rackspace.com>2011-06-07 13:47:40 -0400
commite8d6740fefcac3734021edaf53a40ecb145ccaa3 (patch)
tree656aa085c190b421bdfa961851467895067235e4
parent3aad6758c0acc9b05f6f895fb814cced9580b758 (diff)
downloadnova-e8d6740fefcac3734021edaf53a40ecb145ccaa3.tar.gz
nova-e8d6740fefcac3734021edaf53a40ecb145ccaa3.tar.xz
nova-e8d6740fefcac3734021edaf53a40ecb145ccaa3.zip
DRY up the image_state logic. Fix an issue where glance style images (which aren't required to have an 'image_state' property) couldn't be used to run instances on the EC2 controller.
-rw-r--r--nova/api/ec2/cloud.py25
1 files changed, 14 insertions, 11 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index ac73cd595..316298c39 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -136,6 +136,13 @@ class CloudController(object):
return services[0]['availability_zone']
return 'unknown zone'
+ def _get_image_state(self, image):
+ # NOTE(vish): fallback status if image_state isn't set
+ state = image.get('status')
+ if state == 'active':
+ state = 'available'
+ return image['properties'].get('image_state', state)
+
def get_metadata(self, address):
ctxt = context.get_admin_context()
instance_ref = self.compute_api.get_all(ctxt, fixed_ip=address)
@@ -896,14 +903,13 @@ class CloudController(object):
ramdisk = self._get_image(context, kwargs['ramdisk_id'])
kwargs['ramdisk_id'] = ramdisk['id']
image = self._get_image(context, kwargs['image_id'])
- if not image:
+
+ if image:
+ image_state = self._get_image_state(image)
+ else:
raise exception.ImageNotFound(image_id=kwargs['image_id'])
- try:
- available = (image['properties']['image_state'] == 'available')
- except KeyError:
- available = False
- if not available:
+ if image_state != 'available':
raise exception.ApiError(_('Image must be available'))
instances = self.compute_api.create(context,
@@ -1021,11 +1027,8 @@ class CloudController(object):
get('image_location'), name)
else:
i['imageLocation'] = image['properties'].get('image_location')
- # NOTE(vish): fallback status if image_state isn't set
- state = image.get('status')
- if state == 'active':
- state = 'available'
- i['imageState'] = image['properties'].get('image_state', state)
+
+ i['imageState'] = self._get_image_state(image)
i['displayName'] = name
i['description'] = image.get('description')
display_mapping = {'aki': 'kernel',