def test_retains_routes_in_vpc1_for_vpc2_if_not_for_peering_connection(self): region_1 = randoms.region() region_2 = randoms.region() account_id = randoms.account_id() target_peering_connection_id = randoms.peering_connection_id() other_peering_connection_id = randoms.peering_connection_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") vpc1_route_table_2 = Mock(name="VPC 1 route table 2") vpc1_route_table_1.id = randoms.route_table_id() vpc1_route_table_2.id = randoms.route_table_id() vpc1_route_table_1_route = Mock(name="VPC 1 route table 1 route") vpc1_route_table_2_route = Mock(name="VPC 1 route table 2 route") vpc1_route_table_1_route.vpc_peering_connection_id = \ other_peering_connection_id vpc1_route_table_2_route.vpc_peering_connection_id = \ other_peering_connection_id ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=[vpc1_route_table_1, vpc1_route_table_2]) ec2_gateway_1.resource().Route = Mock( name="Route constructor", side_effect=mock_route_for( {'arguments': [vpc1_route_table_1.id, vpc2.cidr_block], 'return': vpc1_route_table_1_route}, {'arguments': [vpc1_route_table_2.id, vpc2.cidr_block], 'return': vpc1_route_table_2_route})) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_connection.id = target_peering_connection_id vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.destroy() vpc1_route_table_1_route.delete.assert_not_called() vpc1_route_table_2_route.delete.assert_not_called()
def test_logs_that_route_deletion_failed_and_continues_on_exception(self): account_id = randoms.account_id() region_1 = randoms.region() region_2 = randoms.region() peering_connection_id = randoms.peering_connection_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") vpc1_route_table_1_route = Mock(name="VPC 1 route table 1 route") vpc1_route_table_1_route.vpc_peering_connection_id = \ peering_connection_id ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=[vpc1_route_table_1]) ec2_gateway_1.resource().Route = Mock( name="Route constructor", side_effect=mock_route_for( {'arguments': [vpc1_route_table_1.id, vpc2.cidr_block], 'return': vpc1_route_table_1_route})) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_connection.id = peering_connection_id vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) delete_error = ClientError({'Error': {'Code': '123'}}, 'something') vpc1_route_table_1_route.delete = Mock( side_effect=delete_error) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.destroy() logger.warn.assert_any_call( "Route deletion failed for '%s'. Error was: %s", vpc1_route_table_1.id, delete_error)
def test_logs_that_route_deletion_skipped_when_not_for_vpc_peering_connection(self): region_1 = randoms.region() region_2 = randoms.region() account_id = randoms.account_id() target_peering_connection_id = randoms.peering_connection_id() other_peering_connection_id = randoms.peering_connection_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") vpc1_route_table_1_route = Mock(name="VPC 1 route table 1 route") vpc1_route_table_1_route.vpc_peering_connection_id = \ other_peering_connection_id ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=[vpc1_route_table_1]) ec2_gateway_1.resource().Route = Mock( name="Route constructor", side_effect=mock_route_for( {'arguments': [vpc1_route_table_1.id, vpc2.cidr_block], 'return': vpc1_route_table_1_route})) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_connection.id = target_peering_connection_id vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.destroy() logger.info.assert_any_call( "Route deletion skipped for '%s' as route does not pertain to " "VPC peering connection '%s'. Continuing.", vpc1_route_table_1.id, target_peering_connection_id)
def test_finds_peering_connection_between_second_and_first_vpc(self): account_id = randoms.account_id() region_1 = randoms.region() region_2 = randoms.region() vpc_1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc_2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc_peering_connections_1 = Mock( name='VPC peering connections for region: {}'.format(region_1)) vpc_peering_connections_2 = Mock( name='VPC peering connections for region: {}'.format(region_2)) matching_vpc_peering_connection = Mock( name='Matching VPC peering connection') ec2_gateway_1.resource( ).vpc_peering_connections = vpc_peering_connections_1 vpc_peering_connections_1.filter = Mock( name="Filter VPC peering connections for region: {}". \ format(region_1), return_value=iter([])) ec2_gateway_2.resource( ).vpc_peering_connections = vpc_peering_connections_2 vpc_peering_connections_2.filter = Mock( name="Filter VPC peering connections for region: {}". \ format(region_2), return_value=iter([matching_vpc_peering_connection])) vpc_peering_relationship = VPCPeeringRelationship( ec2_gateways, logger, between=[vpc_1, vpc_2]) found_peering_connection = vpc_peering_relationship.fetch() vpc_peering_connections_2.filter.assert_called_with( Filters=[{ 'Name': 'accepter-vpc-info.vpc-id', 'Values': [vpc_2.id] }, { 'Name': 'requester-vpc-info.vpc-id', 'Values': [vpc_1.id] }]) self.assertEqual(found_peering_connection, matching_vpc_peering_connection)
def test_logs_that_routes_are_being_deleted_for_a_vpc(self): region_1 = randoms.region() region_2 = randoms.region() account_id = randoms.account_id() peering_connection_id = randoms.peering_connection_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") vpc1_route_table_1_route = Mock(name="VPC 1 route table 1 route") vpc1_route_table_1_route.vpc_peering_connection_id = \ peering_connection_id ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=[vpc1_route_table_1]) ec2_gateway_1.resource().Route = Mock( name="Route constructor", side_effect=mock_route_for( {'arguments': [vpc1_route_table_1.id, vpc2.cidr_block], 'return': vpc1_route_table_1_route})) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_connection.id = peering_connection_id vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.destroy() logger.info.assert_any_call( "Removing routes from private subnets in: '%s' pointing at " "'%s:%s:%s'.", vpc1.id, vpc2.id, vpc2.cidr_block, vpc_peering_connection.id)
def test_logs_when_no_peering_connection_found(self): account_id = randoms.account_id() region = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock() vpc_peering_connections = Mock(name='VPC peering connections') ec2_gateway.resource( ).vpc_peering_connections = vpc_peering_connections vpc_peering_connections.filter = Mock( name="Filter VPC peering connections", return_value=iter([])) vpc_peering_relationship = VPCPeeringRelationship(ec2_gateways, logger, between=[vpc1, vpc2]) vpc_peering_relationship.destroy() logger.info.assert_any_call( "No peering connection to destroy between: '%s' and: '%s'.", vpc1.id, vpc2.id)
def test_does_not_throw_exception_when_no_peering_connection_found(self): account_id = randoms.account_id() region = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock() vpc_peering_connections = Mock(name='VPC peering connections') ec2_gateway.resource( ).vpc_peering_connections = vpc_peering_connections vpc_peering_connections.filter = Mock( name="Filter VPC peering connections", return_value=iter([])) vpc_peering_relationship = VPCPeeringRelationship(ec2_gateways, logger, between=[vpc1, vpc2]) try: vpc_peering_relationship.destroy() except Exception as exception: self.fail("Expected no exception but got: {0}".format(exception))
def test_logs_that_peering_connection_is_deleted(self): account_id = randoms.account_id() region = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock() vpc_peering_connections = Mock(name='VPC peering connections') matching_vpc_peering_connection = Mock( name='Matching VPC peering connection') ec2_gateway.resource( ).vpc_peering_connections = vpc_peering_connections vpc_peering_connections.filter = Mock( name="Filter VPC peering connections", return_value=iter([matching_vpc_peering_connection])) vpc_peering_relationship = VPCPeeringRelationship(ec2_gateways, logger, between=[vpc1, vpc2]) vpc_peering_relationship.destroy() logger.info.assert_any_call( "Destroying peering connection between: '%s' and: '%s'.", matching_vpc_peering_connection.requester_vpc.id, matching_vpc_peering_connection.accepter_vpc.id)
def test_destroys_peering_connection(self): account_id = randoms.account_id() region = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock() vpc_peering_connections = Mock(name='VPC peering connections') matching_vpc_peering_connection = Mock( name='Matching VPC peering connection') ec2_gateway.resource( ).vpc_peering_connections = vpc_peering_connections vpc_peering_connections.filter = Mock( name="Filter VPC peering connections", return_value=iter([matching_vpc_peering_connection])) vpc_peering_relationship = VPCPeeringRelationship(ec2_gateways, logger, between=[vpc1, vpc2]) vpc_peering_relationship.destroy() matching_vpc_peering_connection.delete.assert_called()
def test_constructs_peering_routes_for_peering_relationship_and_vpcs(self): vpc1 = mocks.build_vpc_response_mock(name="VPC 1") vpc2 = mocks.build_vpc_response_mock(name="VPC 2") account_id = randoms.account_id() region = randoms.region() ec2_gateways = mocks.EC2Gateways([mocks.EC2Gateway(account_id, region)]) logger = Mock(name="Logger") vpc_link = VPCLink( ec2_gateways, logger, between=[vpc1, vpc2], routes=[[vpc1, vpc2], [vpc2, vpc1]]) vpc_peering_relationship = vpc_link.peering_relationship self.assertEqual( vpc_link.peering_routes, [ VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship), VPCPeeringRoute( ec2_gateways, logger, between=[vpc2, vpc1], peering_relationship=vpc_peering_relationship) ])
def test_returns_none_when_no_peering_connection_exists(self): account_id = randoms.account_id() region = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock() vpc_peering_connections = Mock(name='VPC peering connections') ec2_gateway.resource( ).vpc_peering_connections = vpc_peering_connections vpc_peering_connections.filter = Mock( name="Filter VPC peering connections", return_value=iter([])) vpc_peering_relationship = VPCPeeringRelationship(ec2_gateways, logger, between=[vpc1, vpc2]) found_peering_connection = vpc_peering_relationship.fetch() self.assertIsNone(found_peering_connection)
def test_logs_found_target_vpc(self): account_id = randoms.account_id() region = randoms.region() vpc1_id = randoms.vpc_id() vpc1 = mocks.build_vpc_response_mock( name='VPC 1', id=vpc1_id, tags=builders.build_vpc_tags(component="thing1", deployment_identifier="gold", dependencies=["thing2-silver"])) vpc2 = mocks.build_vpc_response_mock( name='VPC 2', tags=builders.build_vpc_tags(component='thing2', deployment_identifier="silver", dependencies=[])) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock(name="Logger") ec2_gateway.resource().vpcs.all = Mock(name="All VPCs", return_value=[vpc1, vpc2]) vpc_links = VPCLinks(ec2_gateways, logger) vpc_links.resolve_for(account_id, vpc1_id) logger.info.assert_any_call( "Computing VPC links for VPC with ID: '%s' " "in account with ID: '%s'.", vpc1.id, account_id) logger.info.assert_any_call( "Found target VPC with ID: '%s', component: '%s', " "deployment identifier: '%s' and dependencies: '%s'.", vpc1.id, 'thing1', 'gold', ['thing2-silver'])
def test_exposes_region_passed_at_construction(self): region = randoms.region() account_id = randoms.account_id() vpc_response = mocks.build_vpc_response_mock() vpc = VPC(vpc_response, account_id, region) self.assertEqual(vpc.region, region)
def test_derives_deployment_identifier_from_vpc_tags(self): region = randoms.region() account_id = randoms.account_id() vpc_response = mocks.build_vpc_response_mock( tags=builders.build_vpc_tags(deployment_identifier="platinum")) vpc = VPC(vpc_response, account_id, region) self.assertEqual(vpc.deployment_identifier, "platinum")
def test_derives_component_from_vpc_tags(self): region = randoms.region() account_id = randoms.account_id() vpc_response = mocks.build_vpc_response_mock( tags=builders.build_vpc_tags(component="some-thing")) vpc = VPC(vpc_response, account_id, region) self.assertEqual(vpc.component, "some-thing")
def test_logs_dependency_vpcs(self): region = randoms.region() account_id = randoms.region() target_vpc_id = randoms.vpc_id() dependency_vpc1_id = randoms.vpc_id() dependency_vpc2_id = randoms.vpc_id() target_vpc = mocks.build_vpc_response_mock( name="Target VPC", id=target_vpc_id, tags=builders.build_vpc_tags( component="thing1", deployment_identifier="gold", dependencies=["thing2-silver", "thing3-bronze"])) dependency_vpc1 = mocks.build_vpc_response_mock( name="Dependency VPC 1", id=dependency_vpc1_id, tags=builders.build_vpc_tags(component="thing2", deployment_identifier="silver", dependencies=[])) dependency_vpc2 = mocks.build_vpc_response_mock( name="Dependency VPC 2", id=dependency_vpc2_id, tags=builders.build_vpc_tags(component="thing3", deployment_identifier="bronze", dependencies=[])) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock(name="Logger") ec2_gateway.resource().vpcs.all = Mock( name="All VPCs", return_value=[dependency_vpc1, target_vpc, dependency_vpc2]) vpc_links = VPCLinks(ec2_gateways, logger) vpc_links.resolve_for(account_id, target_vpc_id) logger.info.assert_any_call( "Found dependency VPCs: [%s]", "'thing2-silver':'%s', 'thing3-bronze':'%s'" % (dependency_vpc1_id, dependency_vpc2_id))
def test_logs_that_route_creation_failed_and_continues_on_exception(self): account_id = randoms.account_id() region_1 = randoms.region() region_2 = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=iter([vpc1_route_table_1])) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) create_route_error = \ ClientError({'Error': {'Code': '123'}}, 'something') vpc1_route_table_1.create_route = Mock( side_effect=create_route_error) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.provision() logger.warn.assert_any_call( "Route creation failed for '%s'. Error was: %s", vpc1_route_table_1.id, create_route_error)
def test_derives_dependencies_from_vpc_tags(self): region = randoms.region() account_id = randoms.account_id() dependencies = ["first-dependency", "second-dependency"] vpc_response = mocks.build_vpc_response_mock( tags=builders.build_vpc_tags(dependencies=dependencies)) vpc = VPC(vpc_response, account_id, region) self.assertEqual(vpc.dependencies, dependencies)
def test_creates_routes_in_vpc1_for_vpc2_via_peering_connection(self): account_id = randoms.account_id() region_1 = randoms.region() region_2 = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") vpc1_route_table_2 = Mock(name="VPC 1 route table 2") ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=iter([vpc1_route_table_1, vpc1_route_table_2])) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_route = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_route.provision() vpc1_route_table_1.create_route.assert_called_with( DestinationCidrBlock=vpc2.cidr_block, VpcPeeringConnectionId=vpc_peering_connection.id) vpc1_route_table_2.create_route.assert_called_with( DestinationCidrBlock=vpc2.cidr_block, VpcPeeringConnectionId=vpc_peering_connection.id)
def test_generates_correctly_formatted_identifier(self): region = randoms.region() account_id = randoms.account_id() vpc_response = mocks.build_vpc_response_mock( tags=builders.build_vpc_tags(component='some-thing', deployment_identifier='platinum')) vpc = VPC(vpc_response, account_id, region) self.assertEqual(vpc.component_instance_identifier, "some-thing-platinum")
def test_find_by_account_id_and_vpc_id(self): account_1_id = randoms.account_id() account_2_id = randoms.account_id() region_1_id = randoms.region() region_2_id = randoms.region() vpc_id = randoms.vpc_id() vpc_1_response = mocks.build_vpc_response_mock(name="VPC 1") vpc_2_response = mocks.build_vpc_response_mock(name="VPC 2") vpc_3_response = mocks.build_vpc_response_mock(name="VPC 3", id=vpc_id) vpc_4_response = mocks.build_vpc_response_mock(name="VPC 4") ec2_gateway_1_1 = mocks.EC2Gateway(account_1_id, region_1_id) ec2_gateway_1_2 = mocks.EC2Gateway(account_1_id, region_2_id) ec2_gateway_2_1 = mocks.EC2Gateway(account_2_id, region_1_id) ec2_gateway_2_2 = mocks.EC2Gateway(account_2_id, region_2_id) ec2_gateways = mocks.EC2Gateways([ ec2_gateway_1_1, ec2_gateway_1_2, ec2_gateway_2_1, ec2_gateway_2_2, ]) ec2_gateway_2_1.resource().vpcs.all = \ mock.Mock( name="Account 2 region 1 VPCs", return_value=[vpc_1_response, vpc_2_response]) ec2_gateway_2_2.resource().vpcs.all = \ mock.Mock( name="Account 2 region 2 VPCs", return_value=[vpc_3_response, vpc_4_response]) all_vpcs = AllVPCs(ec2_gateways) found_vpc = all_vpcs.find_by_account_id_and_vpc_id( account_2_id, vpc_id) self.assertEqual(found_vpc, VPC(vpc_3_response, account_2_id, region_2_id))
def test_handles_no_matching_route_tables(self): region_1 = randoms.region() region_2 = randoms.region() account_id = randoms.account_id() peering_connection_id = randoms.peering_connection_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=[]) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_connection.id = peering_connection_id vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) try: vpc_peering_routes.destroy() except Exception as exception: self.fail( 'Expected no exception but encountered: {0}'.format(exception))
def test_logs_that_route_creation_succeeded(self): account_id = randoms.account_id() region_1 = randoms.region() region_2 = randoms.region() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=iter([vpc1_route_table_1])) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.provision() logger.info.assert_any_call( "Route creation succeeded for '%s'. Continuing.", vpc1_route_table_1.id)
def test_logs_that_routes_are_being_added_for_a_vpc(self): region_1 = randoms.region() region_2 = randoms.region() account_id = randoms.account_id() vpc1 = VPC(mocks.build_vpc_response_mock(), account_id, region_1) vpc2 = VPC(mocks.build_vpc_response_mock(), account_id, region_2) ec2_gateway_1 = mocks.EC2Gateway(account_id, region_1) ec2_gateway_2 = mocks.EC2Gateway(account_id, region_2) ec2_gateways = mocks.EC2Gateways([ec2_gateway_1, ec2_gateway_2]) logger = Mock() vpc1_route_table_1 = Mock(name="VPC 1 route table 1") ec2_gateway_1.resource().route_tables = Mock( name="VPC route tables") ec2_gateway_1.resource().route_tables.filter = Mock( name="Filtered VPC route tables", return_value=iter([vpc1_route_table_1])) vpc_peering_connection = Mock(name="VPC peering connection") vpc_peering_relationship = Mock() vpc_peering_relationship.fetch = Mock( return_value=vpc_peering_connection) vpc_peering_routes = VPCPeeringRoute( ec2_gateways, logger, between=[vpc1, vpc2], peering_relationship=vpc_peering_relationship) vpc_peering_routes.provision() logger.info.assert_any_call( "Adding routes to private subnets in: '%s' pointing at '%s:%s:%s'.", vpc1.id, vpc2.id, vpc2.cidr_block, vpc_peering_connection.id)
def test_resolves_empty_set_for_missing_target_vpc(self): region = randoms.region() account_id = randoms.account_id() vpc1_id = randoms.vpc_id() ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock(name="Logger") ec2_gateway.resource().vpcs.all = Mock(name="All VPCs", return_value=[]) vpc_links = VPCLinks(ec2_gateways, logger) resolved_vpc_links = vpc_links.resolve_for(account_id, vpc1_id) self.assertEqual(resolved_vpc_links, set())
def test_returns_ec2_client_for_region_from_session(self): session = mock.Mock(name='Session') account_id = randoms.account_id() region = randoms.region() expected_client = mock.Mock(name='EC2 Client') session.client = mock.Mock(name='Client', return_value=expected_client) ec2_gateway = EC2Gateway(session, account_id, region) actual_client = ec2_gateway.client() session_client_calls = session.client.mock_calls self.assertEqual(len(session_client_calls), 1) session_client_call = session_client_calls[0] self.assertEqual(session_client_call, mock.call('ec2', region)) self.assertEqual(actual_client, expected_client)
def test_returns_ec2_resource_for_region_from_session(self): session = mock.Mock(name='Session') account_id = randoms.account_id() region = randoms.region() expected_resource = mock.Mock(name='EC2 Resource') session.resource = mock.Mock(name='Resource', return_value=expected_resource) ec2_gateway = EC2Gateway(session, account_id, region) actual_resource = ec2_gateway.resource() session_resource_calls = session.resource.mock_calls self.assertEqual(len(session_resource_calls), 1) session_resource_call = session_resource_calls[0] self.assertEqual(session_resource_call, mock.call('ec2', region)) self.assertEqual(actual_resource, expected_resource)
def test_ignores_missing_dependencies(self): account_id = randoms.account_id() region = randoms.region() vpc1_id = randoms.vpc_id() vpc_1_response = mocks.build_vpc_response_mock( name='VPC 1', id=vpc1_id, tags=builders.build_vpc_tags( component="thing1", deployment_identifier="gold", dependencies=["thing2-silver", "thing3-bronze"])) vpc_2_response = mocks.build_vpc_response_mock( name='VPC 2', tags=builders.build_vpc_tags(component="thing2", deployment_identifier="silver", dependencies=[])) vpc_1 = VPC(vpc_1_response, account_id, region) vpc_2 = VPC(vpc_2_response, account_id, region) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock(name="Logger") ec2_gateway.resource().vpcs.all = Mock( name="All VPCs", return_value=[vpc_1_response, vpc_2_response]) vpc_links = VPCLinks(ec2_gateways, logger) resolved_vpc_links = vpc_links.resolve_for(account_id, vpc1_id) self.assertEqual(len(resolved_vpc_links), 1) self.assertEqual( resolved_vpc_links, { VPCLink(ec2_gateways, logger, between=[vpc_1, vpc_2], routes=[[vpc_1, vpc_2]]) })
def test_logs_not_found_target_vpc(self): region = randoms.region() account_id = randoms.account_id() vpc1_id = randoms.vpc_id() vpc1 = mocks.build_vpc_response_mock( name='VPC 1', id=vpc1_id, tags=builders.build_vpc_tags(component="thing1", deployment_identifier="gold", dependencies=["thing2-silver"])) ec2_gateway = mocks.EC2Gateway(account_id, region) ec2_gateways = mocks.EC2Gateways([ec2_gateway]) logger = Mock(name="Logger") ec2_gateway.resource().vpcs.all = Mock(name="All VPCs", return_value=[]) vpc_links = VPCLinks(ec2_gateways, logger) vpc_links.resolve_for(account_id, vpc1_id) logger.info.assert_any_call("No VPC found with ID: '%s'. Aborting.", vpc1.id)
def test_find_by_identifier(self): account_1_id = randoms.account_id() account_2_id = randoms.account_id() region_1_id = randoms.region() region_2_id = randoms.region() vpc_identifier = "vpc-2-component-vpc-2-deployment-identifier" vpc_1_response = mocks.build_vpc_response_mock( name="VPC 1", tags=builders.build_vpc_tags( component="vpc-1-component", deployment_identifier="vpc-1-deployment-identifier")) vpc_2_response = mocks.build_vpc_response_mock( name="VPC 2", tags=builders.build_vpc_tags( component="vpc-2-component", deployment_identifier="vpc-2-deployment-identifier")) vpc_3_response = mocks.build_vpc_response_mock( name="VPC 3", tags=builders.build_vpc_tags( component="vpc-3-component", deployment_identifier="vpc-3-deployment-identifier")) vpc_4_response = mocks.build_vpc_response_mock( name="VPC 4", tags=builders.build_vpc_tags( component="vpc-4-component", deployment_identifier="vpc-4-deployment-identifier")) ec2_gateway_1_1 = mocks.EC2Gateway(account_1_id, region_1_id) ec2_gateway_1_2 = mocks.EC2Gateway(account_1_id, region_2_id) ec2_gateway_2_1 = mocks.EC2Gateway(account_2_id, region_1_id) ec2_gateway_2_2 = mocks.EC2Gateway(account_2_id, region_2_id) ec2_gateways = mocks.EC2Gateways([ ec2_gateway_1_1, ec2_gateway_1_2, ec2_gateway_2_1, ec2_gateway_2_2, ]) ec2_gateway_1_1.resource().vpcs.all = \ mock.Mock( name="Account 1 region 1 VPCs", return_value=[vpc_1_response]) ec2_gateway_1_2.resource().vpcs.all = \ mock.Mock( name="Account 1 region 2 VPCs", return_value=[vpc_2_response]) ec2_gateway_2_1.resource().vpcs.all = \ mock.Mock( name="Account 2 region 1 VPCs", return_value=[vpc_3_response, vpc_4_response]) ec2_gateway_2_2.resource().vpcs.all = \ mock.Mock( name="Account 2 region 2 VPCs", return_value=[]) all_vpcs = AllVPCs(ec2_gateways) found_vpc = all_vpcs.find_by_component_instance_identifier( vpc_identifier) self.assertEqual(found_vpc, VPC(vpc_2_response, account_1_id, region_2_id))