from __future__ import unicode_literals from moto.core.responses import BaseResponse from moto.ec2.utils import filters_from_querystring class AmisResponse(BaseResponse): def create_image(self): name = self.querystring.get('Name')[0] description = self._get_param('Description', if_none='') instance_id = self._get_param('InstanceId') if self.is_not_dryrun('CreateImage'): image = self.ec2_backend.create_image( instance_id, name, description, context=self) template = self.response_template(CREATE_IMAGE_RESPONSE) return template.render(image=image) def copy_image(self): source_image_id = self._get_param('SourceImageId') source_region = self._get_param('SourceRegion') name = self._get_param('Name') description = self._get_param('Description') if self.is_not_dryrun('CopyImage'): image = self.ec2_backend.copy_image( source_image_id, source_region, name, description) template = self.response_template(COPY_IMAGE_RESPONSE) return template.render(image=image) def deregister_image(self): ami_id = self._get_param('ImageId') if self.is_not_dryrun('DeregisterImage'): success = self.ec2_backend.deregister_image(ami_id) template = self.response_template(DEREGISTER_IMAGE_RESPONSE) return template.render(success=str(success).lower()) def describe_images(self): ami_ids = self._get_multi_param('ImageId') filters = filters_from_querystring(self.querystring) owners = self._get_multi_param('Owner') exec_users = self._get_multi_param('ExecutableBy') images = self.ec2_backend.describe_images( ami_ids=ami_ids, filters=filters, exec_users=exec_users, owners=owners, context=self) template = self.response_template(DESCRIBE_IMAGES_RESPONSE) return template.render(images=images) def describe_image_attribute(self): ami_id = self._get_param('ImageId') groups = self.ec2_backend.get_launch_permission_groups(ami_id) users = self.ec2_backend.get_launch_permission_users(ami_id) template = self.response_template(DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE) return template.render(ami_id=ami_id, groups=groups, users=users) def modify_image_attribute(self): ami_id = self._get_param('ImageId') operation_type = self._get_param('OperationType') group = self._get_param('UserGroup.1') user_ids = self._get_multi_param('UserId') if self.is_not_dryrun('ModifyImageAttribute'): if (operation_type == 'add'): self.ec2_backend.add_launch_permission( ami_id, user_ids=user_ids, group=group) elif (operation_type == 'remove'): self.ec2_backend.remove_launch_permission( ami_id, user_ids=user_ids, group=group) return MODIFY_IMAGE_ATTRIBUTE_RESPONSE def register_image(self): if self.is_not_dryrun('RegisterImage'): raise NotImplementedError( 'AMIs.register_image is not yet implemented') def reset_image_attribute(self): if self.is_not_dryrun('ResetImageAttribute'): raise NotImplementedError( 'AMIs.reset_image_attribute is not yet implemented') CREATE_IMAGE_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {{ image.id }} """ COPY_IMAGE_RESPONSE = """ 60bc441d-fa2c-494d-b155-5d6a3EXAMPLE {{ image.id }} """ # TODO almost all of these params should actually be templated based on # the ec2 image DESCRIBE_IMAGES_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {% for image in images %} {{ image.id }} {{ image.image_location }} {{ image.state }} {{ image.owner_id }} {{ image.is_public_string }} {{ image.architecture }} {{ image.image_type }} {{ image.kernel_id }} ari-1a2b3c4d amazon {{ image.creation_date }} {{ image.name }} {% if image.platform %} {{ image.platform }} {% endif %} {{ image.description }} {{ image.root_device_type }} {{ image.root_device_name }} {{ image.root_device_name }} {{ image.ebs_snapshot.id }} 15 false {{ image.root_device_type }} {{ image.virtualization_type }} {% for tag in image.get_tags() %} {{ tag.resource_id }} {{ tag.resource_type }} {{ tag.key }} {{ tag.value }} {% endfor %} xen {% endfor %} """ DESCRIBE_IMAGE_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {{ image.id }} <{{ key }}> {{ value }} """ DEREGISTER_IMAGE_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {{ success }} """ DESCRIBE_IMAGE_ATTRIBUTES_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {{ ami_id }} {% if not groups and not users %} {% else %} {% if groups %} {% for group in groups %} {{ group }} {% endfor %} {% endif %} {% if users %} {% for user in users %} {{ user }} {% endfor %} {% endif %} {% endif %} """ MODIFY_IMAGE_ATTRIBUTE_RESPONSE = """ true """