diff --git a/moto/ec2/models.py b/moto/ec2/models.py index 6666a964b..7a0cef7a2 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -3969,10 +3969,12 @@ class RouteTableBackend(object): self.route_tables = {} super(RouteTableBackend, self).__init__() - def create_route_table(self, vpc_id, main=False): + def create_route_table(self, vpc_id, tags=[], main=False): route_table_id = random_route_table_id() vpc = self.get_vpc(vpc_id) # Validate VPC exists route_table = RouteTable(self, route_table_id, vpc_id, main=main) + for tag in tags: + route_table.add_tag(tag.get("Key"), tag.get("Value")) self.route_tables[route_table_id] = route_table # AWS creates a default local route. @@ -4300,8 +4302,10 @@ class InternetGatewayBackend(object): self.internet_gateways = {} super(InternetGatewayBackend, self).__init__() - def create_internet_gateway(self): + def create_internet_gateway(self, tags=[]): igw = InternetGateway(self) + for tag in tags: + igw.add_tag(tag.get("Key"), tag.get("Value")) self.internet_gateways[igw.id] = igw return igw @@ -5299,10 +5303,12 @@ class NetworkAclBackend(object): raise InvalidNetworkAclIdError(network_acl_id) return network_acl - def create_network_acl(self, vpc_id, default=False): + def create_network_acl(self, vpc_id, tags=[], default=False): network_acl_id = random_network_acl_id() self.get_vpc(vpc_id) network_acl = NetworkAcl(self, network_acl_id, vpc_id, default) + for tag in tags: + network_acl.add_tag(tag.get("Key"), tag.get("Value")) self.network_acls[network_acl_id] = network_acl if default: self.add_default_entries(network_acl_id) diff --git a/moto/ec2/responses/internet_gateways.py b/moto/ec2/responses/internet_gateways.py index d232b3b05..cec29849d 100644 --- a/moto/ec2/responses/internet_gateways.py +++ b/moto/ec2/responses/internet_gateways.py @@ -14,7 +14,10 @@ class InternetGateways(BaseResponse): def create_internet_gateway(self): if self.is_not_dryrun("CreateInternetGateway"): - igw = self.ec2_backend.create_internet_gateway() + tags = self._get_multi_param("TagSpecification") + if tags: + tags = tags[0].get("Tag") + igw = self.ec2_backend.create_internet_gateway(tags=tags) template = self.response_template(CREATE_INTERNET_GATEWAY_RESPONSE) return template.render(internet_gateway=igw) diff --git a/moto/ec2/responses/network_acls.py b/moto/ec2/responses/network_acls.py index c0a9c7c90..4b1c4c2c5 100644 --- a/moto/ec2/responses/network_acls.py +++ b/moto/ec2/responses/network_acls.py @@ -6,7 +6,10 @@ from moto.ec2.utils import filters_from_querystring class NetworkACLs(BaseResponse): def create_network_acl(self): vpc_id = self._get_param("VpcId") - network_acl = self.ec2_backend.create_network_acl(vpc_id) + tags = self._get_multi_param("TagSpecification") + if tags: + tags = tags[0].get("Tag") + network_acl = self.ec2_backend.create_network_acl(vpc_id, tags=tags) template = self.response_template(CREATE_NETWORK_ACL_RESPONSE) return template.render(network_acl=network_acl) @@ -161,7 +164,7 @@ DESCRIBE_NETWORK_ACL_RESPONSE = """ {{ tag.resource_id }} {{ tag.resource_type }} - {{ tag.key }} + {{ tag.key}} {{ tag.value }} {% endfor %} diff --git a/moto/ec2/responses/route_tables.py b/moto/ec2/responses/route_tables.py index a91d02317..c929ffb9e 100644 --- a/moto/ec2/responses/route_tables.py +++ b/moto/ec2/responses/route_tables.py @@ -39,7 +39,10 @@ class RouteTables(BaseResponse): def create_route_table(self): vpc_id = self._get_param("VpcId") - route_table = self.ec2_backend.create_route_table(vpc_id) + tags = self._get_multi_param("TagSpecification") + if tags: + tags = tags[0].get("Tag") + route_table = self.ec2_backend.create_route_table(vpc_id, tags) template = self.response_template(CREATE_ROUTE_TABLE_RESPONSE) return template.render(route_table=route_table) diff --git a/tests/test_ec2/test_internet_gateways.py b/tests/test_ec2/test_internet_gateways.py index 5941643cf..2319bf062 100644 --- a/tests/test_ec2/test_internet_gateways.py +++ b/tests/test_ec2/test_internet_gateways.py @@ -7,11 +7,13 @@ from nose.tools import assert_raises import re import boto +import boto3 + from boto.exception import EC2ResponseError import sure # noqa -from moto import mock_ec2_deprecated +from moto import mock_ec2_deprecated, mock_ec2 VPC_CIDR = "10.0.0.0/16" @@ -269,3 +271,19 @@ def test_igw_filter_by_attachment_state(): result = conn.get_all_internet_gateways(filters={"attachment.state": "available"}) result.should.have.length_of(1) result[0].id.should.equal(igw1.id) + + +@mock_ec2 +def test_create_internet_gateway_with_tags(): + ec2 = boto3.resource("ec2", region_name="eu-central-1") + + igw = ec2.create_internet_gateway( + TagSpecifications=[ + { + "ResourceType": "internet-gateway", + "Tags": [{"Key": "test", "Value": "TestRouteTable"}], + } + ], + ) + igw.tags.should.have.length_of(1) + igw.tags.should.equal([{"Key": "test", "Value": "TestRouteTable"}]) diff --git a/tests/test_ec2/test_network_acls.py b/tests/test_ec2/test_network_acls.py index f255fa67f..c20bf75c6 100644 --- a/tests/test_ec2/test_network_acls.py +++ b/tests/test_ec2/test_network_acls.py @@ -304,3 +304,26 @@ def test_describe_network_acls(): "An error occurred (InvalidRouteTableID.NotFound) when calling the " "DescribeNetworkAcls operation: The routeTable ID '1' does not exist" ) + + +@mock_ec2 +def test_create_network_acl_with_tags(): + conn = boto3.client("ec2", region_name="us-west-2") + + vpc = conn.create_vpc(CidrBlock="10.0.0.0/16") + vpc_id = vpc["Vpc"]["VpcId"] + + network_acl = conn.create_network_acl( + VpcId=vpc_id, + TagSpecifications=[ + { + "ResourceType": "network-acl", + "Tags": [{"Key": "test", "Value": "TestTags"}], + } + ], + ) + + (len(network_acl.get("NetworkAcl").get("Tags"))).should.equal(1) + network_acl.get("NetworkAcl").get("Tags").should.equal( + [{"Key": "test", "Value": "TestTags"}] + ) diff --git a/tests/test_ec2/test_route_tables.py b/tests/test_ec2/test_route_tables.py index 7bb4db695..a652bd1cf 100644 --- a/tests/test_ec2/test_route_tables.py +++ b/tests/test_ec2/test_route_tables.py @@ -715,3 +715,22 @@ def test_create_vpc_end_point(): ) vpc_end_point["VpcEndpoint"]["VpcId"].should.equal(vpc["Vpc"]["VpcId"]) len(vpc_end_point["VpcEndpoint"]["DnsEntries"]).should.be.greater_than(0) + + +@mock_ec2 +def test_create_route_tables_with_tags(): + ec2 = boto3.resource("ec2", region_name="eu-central-1") + + vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") + + route_table = ec2.create_route_table( + VpcId=vpc.id, + TagSpecifications=[ + { + "ResourceType": "route-table", + "Tags": [{"Key": "test", "Value": "TestRouteTable"}], + } + ], + ) + + route_table.tags.should.have.length_of(1)