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)
Example #4
0
    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)
Example #6
0
    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)
Example #7
0
    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))
Example #8
0
    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)
Example #9
0
    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()
Example #10
0
    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)
            ])
Example #11
0
    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)
Example #12
0
    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")
Example #16
0
    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")
Example #21
0
    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)
Example #25
0
    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)
Example #28
0
    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]])
            })
Example #29
0
    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)
Example #30
0
    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))