From 48e3cbec99ba4eba6c253fdf115554eb30e5cd8e Mon Sep 17 00:00:00 2001 From: Bert Blommers Date: Mon, 11 Apr 2022 19:43:33 +0000 Subject: [PATCH] EC2 - search_transit_gateway_routes -search by CIDR (#5020) --- .../_models/transit_gateway_route_tables.py | 9 ++++- tests/test_ec2/test_transit_gateway.py | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/moto/ec2/_models/transit_gateway_route_tables.py b/moto/ec2/_models/transit_gateway_route_tables.py index 1165aef47..90ea85d55 100644 --- a/moto/ec2/_models/transit_gateway_route_tables.py +++ b/moto/ec2/_models/transit_gateway_route_tables.py @@ -138,13 +138,20 @@ class TransitGatewayRouteTableBackend(object): def search_transit_gateway_routes( self, transit_gateway_route_table_id, filters, max_results=None ): + """ + The following filters are currently supported: type, state, route-search.exact-match + """ transit_gateway_route_table = self.transit_gateways_route_tables.get( transit_gateway_route_table_id ) if not transit_gateway_route_table: return [] - attr_pairs = (("type", "type"), ("state", "state")) + attr_pairs = ( + ("type", "type"), + ("state", "state"), + ("route-search.exact-match", "destinationCidrBlock"), + ) routes = transit_gateway_route_table.routes.copy() for key in transit_gateway_route_table.routes: diff --git a/tests/test_ec2/test_transit_gateway.py b/tests/test_ec2/test_transit_gateway.py index e2a07e9a8..a2d638bef 100644 --- a/tests/test_ec2/test_transit_gateway.py +++ b/tests/test_ec2/test_transit_gateway.py @@ -446,6 +446,43 @@ def test_search_transit_gateway_routes_by_state(): routes.should.equal([]) +@mock_ec2 +def test_search_transit_gateway_routes_by_routesearch(): + client = boto3.client("ec2", region_name="us-west-2") + vpc = client.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] + subnet = client.create_subnet(VpcId=vpc["VpcId"], CidrBlock="10.0.1.0/24")["Subnet"] + + tgw = client.create_transit_gateway(Description="description") + tgw_id = tgw["TransitGateway"]["TransitGatewayId"] + route_table = client.create_transit_gateway_route_table(TransitGatewayId=tgw_id) + transit_gateway_route_id = route_table["TransitGatewayRouteTable"][ + "TransitGatewayRouteTableId" + ] + + attachment = client.create_transit_gateway_vpc_attachment( + TransitGatewayId=tgw_id, VpcId=vpc["VpcId"], SubnetIds=[subnet["SubnetId"]] + ) + transit_gateway_attachment_id = attachment["TransitGatewayVpcAttachment"][ + "TransitGatewayAttachmentId" + ] + + exported_cidr_ranges = ["172.17.0.0/24", "192.160.0.0/24"] + for route in exported_cidr_ranges: + client.create_transit_gateway_route( + DestinationCidrBlock=route, + TransitGatewayRouteTableId=transit_gateway_route_id, + TransitGatewayAttachmentId=transit_gateway_attachment_id, + ) + + for route in exported_cidr_ranges: + expected_route = client.search_transit_gateway_routes( + TransitGatewayRouteTableId=transit_gateway_route_id, + Filters=[{"Name": "route-search.exact-match", "Values": [route]}], + ) + + expected_route["Routes"][0]["DestinationCidrBlock"].should.equal(route) + + @mock_ec2 def test_delete_transit_gateway_route(): ec2 = boto3.client("ec2", region_name="us-west-1")