import boto3 import json import sure # noqa # pylint: disable=unused-import from moto import ( mock_cloudformation, mock_ec2, ) from uuid import uuid4 @mock_cloudformation @mock_ec2 def test_transit_gateway_by_cloudformation_simple(): ec2 = boto3.client("ec2", region_name="us-east-1") cf_client = boto3.client("cloudformation", "us-east-1") template = { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Template for Transit Gateway creation.", "Resources": { "ttg": { "Type": "AWS::EC2::TransitGateway", "Properties": {"Description": "My CF Gateway"}, } }, } template = json.dumps(template) stack_name = str(uuid4()) cf_client.create_stack(StackName=stack_name, TemplateBody=template) resources = cf_client.list_stack_resources(StackName=stack_name)[ "StackResourceSummaries" ] gateway_id = resources[0]["PhysicalResourceId"] gateways = ec2.describe_transit_gateways(TransitGatewayIds=[gateway_id])[ "TransitGateways" ] gateways.should.have.length_of(1) gateways[0]["TransitGatewayId"].should.match("tgw-[0-9a-z]+") gateways[0]["State"].should.equal("available") gateways[0]["Description"].should.equal("My CF Gateway") gateways[0]["Options"]["AmazonSideAsn"].should.equal(64512) gateways[0]["Options"]["AutoAcceptSharedAttachments"].should.equal("disable") gateways[0]["Options"]["DefaultRouteTableAssociation"].should.equal("enable") # Gateway will only have the OOTB CF tags gateways[0]["Tags"].should.have.length_of(3) @mock_cloudformation @mock_ec2 def test_transit_gateway_by_cloudformation(): ec2 = boto3.client("ec2", region_name="us-east-1") cf_client = boto3.client("cloudformation", "us-east-1") template = { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Template for Transit Gateway creation.", "Resources": { "ttg": { "Type": "AWS::EC2::TransitGateway", "Properties": { "Description": "My CF Gateway", "AmazonSideAsn": 1, "AutoAcceptSharedAttachments": "enable", "DefaultRouteTableAssociation": "disable", "Tags": [{"Key": "foo", "Value": "bar"}], }, } }, } template = json.dumps(template) stack_name = str(uuid4()) cf_client.create_stack(StackName=stack_name, TemplateBody=template) resources = cf_client.list_stack_resources(StackName=stack_name)[ "StackResourceSummaries" ] gateway_id = resources[0]["PhysicalResourceId"] gateways = ec2.describe_transit_gateways(TransitGatewayIds=[gateway_id])[ "TransitGateways" ] gateways.should.have.length_of(1) gateways[0]["TransitGatewayId"].should.match("tgw-[0-9a-z]+") gateways[0]["State"].should.equal("available") gateways[0]["Description"].should.equal("My CF Gateway") gateways[0]["Options"]["AmazonSideAsn"].should.equal(1) gateways[0]["Options"]["AutoAcceptSharedAttachments"].should.equal("enable") gateways[0]["Options"]["DefaultRouteTableAssociation"].should.equal("disable") tags = gateways[0].get("Tags", {}) tags.should.have.length_of(4) tags.should.contain({"Key": "foo", "Value": "bar"}) tags.should.contain({"Key": "aws:cloudformation:stack-name", "Value": stack_name}) tags.should.contain({"Key": "aws:cloudformation:logical-id", "Value": "ttg"})