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): name = self.querystring.get("Name")[0] description = self._get_param("Description", if_none="") if self.is_not_dryrun("RegisterImage"): image = self.ec2_backend.register_image(name, description) template = self.response_template(REGISTER_IMAGE_RESPONSE) return template.render(image=image) 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 standard {{ 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 """ REGISTER_IMAGE_RESPONSE = """ 59dbff89-35bd-4eac-99ed-be587EXAMPLE {{ image.id }} """