Add TagSpecification support to ec2:CreateImage (#3604)

* Bump `botocore` to minimum version that supports TagSpecifications for this action.
* Add test coverage.

Closes #3602
This commit is contained in:
Brian Pandola 2021-01-23 04:57:34 -08:00 committed by GitHub
commit cb03223c9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 82 additions and 3 deletions

View file

@ -615,3 +615,13 @@ class InvalidVpcEndPointIdError(EC2ClientError):
"InvalidVpcEndPointId.NotFound",
"The VpcEndPoint ID '{0}' does not exist".format(vpc_end_point_id),
)
class InvalidTaggableResourceType(EC2ClientError):
def __init__(self, resource_type):
super(InvalidTaggableResourceType, self).__init__(
"InvalidParameterValue",
"'{}' is not a valid taggable resource type for this operation.".format(
resource_type
),
)

View file

@ -109,6 +109,7 @@ from .exceptions import (
IncorrectStateIamProfileAssociationError,
InvalidAssociationIDIamProfileAssociationError,
InvalidVpcEndPointIdError,
InvalidTaggableResourceType,
)
from .utils import (
EC2_RESOURCE_TO_PREFIX,
@ -1522,10 +1523,26 @@ class AmiBackend(object):
ami_id = ami["ami_id"]
self.amis[ami_id] = Ami(self, **ami)
def create_image(self, instance_id, name=None, description=None, context=None):
def create_image(
self,
instance_id,
name=None,
description=None,
context=None,
tag_specifications=None,
):
# TODO: check that instance exists and pull info from it.
ami_id = random_ami_id()
instance = self.get_instance(instance_id)
tags = []
for tag_specification in tag_specifications:
resource_type = tag_specification["ResourceType"]
if resource_type == "image":
tags += tag_specification["Tag"]
elif resource_type == "snapshot":
raise NotImplementedError()
else:
raise InvalidTaggableResourceType(resource_type)
ami = Ami(
self,
@ -1536,6 +1553,8 @@ class AmiBackend(object):
description=description,
owner_id=OWNER_ID,
)
for tag in tags:
ami.add_tag(tag["Key"], tag["Value"])
self.amis[ami_id] = ami
return ami

View file

@ -8,9 +8,14 @@ class AmisResponse(BaseResponse):
name = self.querystring.get("Name")[0]
description = self._get_param("Description", if_none="")
instance_id = self._get_param("InstanceId")
tag_specifications = self._get_multi_param("TagSpecification")
if self.is_not_dryrun("CreateImage"):
image = self.ec2_backend.create_image(
instance_id, name, description, context=self
instance_id,
name,
description,
context=self,
tag_specifications=tag_specifications,
)
template = self.response_template(CREATE_IMAGE_RESPONSE)
return template.render(image=image)