diff options
| author | Dan Prince <dan.prince@rackspace.com> | 2011-06-07 13:47:40 -0400 |
|---|---|---|
| committer | Dan Prince <dan.prince@rackspace.com> | 2011-06-07 13:47:40 -0400 |
| commit | e8d6740fefcac3734021edaf53a40ecb145ccaa3 (patch) | |
| tree | 656aa085c190b421bdfa961851467895067235e4 | |
| parent | 3aad6758c0acc9b05f6f895fb814cced9580b758 (diff) | |
| download | nova-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.py | 25 |
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', |
