package tw.com; import com.amazonaws.services.ec2.model.*; import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerDescription; import com.amazonaws.services.rds.model.DBInstance; import com.amazonaws.services.rds.model.DBSecurityGroupMembership; import com.amazonaws.services.rds.model.DBSubnetGroup; import org.easymock.EasyMock; import tw.com.exceptions.CfnAssistException; import tw.com.pictures.AmazonVPCFacade; import java.util.Collection; import java.util.LinkedList; import java.util.List; public class VpcTestBuilder { private List<Subnet> subnets; private List<RouteTable> routeTables; private List<Address> eips; private List<LoadBalancerDescription> loadBalancers; private List<DBInstance> databases; private List<Instance> instances; private String vpcId; private List<NetworkAcl> acls; private List<SecurityGroup> securityGroups; private List<Route> routes; // private Vpc vpc; private Subnet insSubnet; private String subnetId; private Subnet dbSubnet; private Instance instance; private RouteTable routeTable; private Address eip; private LoadBalancerDescription elb; private DBInstance dbInstance; private NetworkAclEntry outboundAclEntry; private NetworkAclEntry inboundAclEntry; private NetworkAcl acl; private IpPermission ipPermsInbound; private IpPermission ipPermsOutbound; private SecurityGroup instSecurityGroup; private SecurityGroup dbSecurityGroup; private IpPermission ipDbPermsInbound; private IpPermission ipDbPermsOutbound; private IpPermission ipElbPermsInbound; private IpPermission ipElbPermsOutbound; private SecurityGroup elbSecurityGroup; IpRange range = new IpRange().withCidrIp("ipRanges"); public VpcTestBuilder(String vpcId) { this.vpcId = vpcId; subnets = new LinkedList<>(); instances = new LinkedList<>(); routeTables = new LinkedList<>(); eips = new LinkedList<>(); loadBalancers = new LinkedList<>(); databases = new LinkedList<>(); acls = new LinkedList<>(); securityGroups = new LinkedList<>(); routes = new LinkedList<>(); // createVPC(); } private void createVPC() { vpc = new Vpc().withVpcId(vpcId); insSubnet = new Subnet(). withSubnetId("subnetIdA"). withCidrBlock("10.1.0.0/16"); dbSubnet = new Subnet(). withSubnetId("subnetIdDB"). withCidrBlock("10.2.0.0/16"); subnetId = insSubnet.getSubnetId(); instance = new Instance(). withInstanceId("instanceId"). withTags(CreateNameTag("instanceName")). withPrivateIpAddress("privateIp"); String instanceId = instance.getInstanceId(); RouteTableAssociation routeTableAssociationA = new RouteTableAssociation(). withRouteTableAssociationId("assocId"). withSubnetId(subnetId); RouteTableAssociation routeTableAssociationB = new RouteTableAssociation(). withRouteTableAssociationId("assocId"). withSubnetId(dbSubnet.getSubnetId()); add(new Route().withDestinationCidrBlock("10.1.0.11/32").withGatewayId("igwId").withState(RouteState.Active)); add(new Route().withDestinationCidrBlock("10.1.0.12/32").withInstanceId("instanceId").withState(RouteState.Active)); add(new Route().withDestinationCidrBlock("10.1.0.13/32").withState(RouteState.Blackhole)); routeTable = new RouteTable(). withRouteTableId("routeTableId"). withAssociations(routeTableAssociationA, routeTableAssociationB). withRoutes(routes); eip = new Address(). withAllocationId("eipAllocId"). withInstanceId(instanceId). withPublicIp("publicIP"); ipElbPermsInbound = new IpPermission().withFromPort(20).withToPort(29).withIpProtocol("tcp").withIpv4Ranges(range); ipElbPermsOutbound = new IpPermission().withFromPort(200).withToPort(300).withIpProtocol("tcp").withIpv4Ranges(range); elbSecurityGroup = new SecurityGroup(). withGroupId("secElbGroupId"). withGroupName("secElbGroupName"). withIpPermissions(ipElbPermsInbound). withIpPermissionsEgress(ipElbPermsOutbound); elb = new LoadBalancerDescription(). withLoadBalancerName("loadBalancerName"). withDNSName("lbDNSName"). withSecurityGroups(elbSecurityGroup.getGroupId()); dbInstance = new DBInstance(). withDBInstanceIdentifier("dbInstanceId"). withDBName("dbName"); NetworkAclAssociation aclAssoc = new NetworkAclAssociation(). withSubnetId(subnetId); PortRange portRange = new PortRange(). withFrom(1024). withTo(2048); outboundAclEntry = new NetworkAclEntry(). withEgress(true). withCidrBlock("cidrBlockOut"). withPortRange(portRange). withRuleAction("allow"). withProtocol("6"). withRuleNumber(42); inboundAclEntry = new NetworkAclEntry(). withEgress(false). withCidrBlock("cidrBlockIn"). withPortRange(portRange). withRuleAction("allow"). withProtocol("6"). withRuleNumber(43); acl = new NetworkAcl().withAssociations(aclAssoc). withEntries(outboundAclEntry, inboundAclEntry). withNetworkAclId("aclId"); ipPermsInbound = new IpPermission().withFromPort(80).withToPort(89).withIpProtocol("tcp").withIpv4Ranges(range); ipPermsOutbound = new IpPermission().withFromPort(600).withToPort(700).withIpProtocol("tcp").withIpv4Ranges(range); instSecurityGroup = new SecurityGroup(). withGroupId("secGroupId"). withGroupName("secGroupName"). withIpPermissions(ipPermsInbound). withIpPermissionsEgress(ipPermsOutbound); ipDbPermsInbound = new IpPermission().withFromPort(90).withToPort(99).withIpProtocol("tcp").withIpv4Ranges(range); ipDbPermsOutbound = new IpPermission().withFromPort(700).withToPort(800).withIpProtocol("tcp").withIpv4Ranges(range); dbSecurityGroup = new SecurityGroup(). withGroupId("secDbGroupId"). withGroupName("secDbGroupName"). withIpPermissions(ipDbPermsInbound). withIpPermissionsEgress(ipDbPermsOutbound); AddItemsToVpc(); } private void AddItemsToVpc() { add(insSubnet); add(dbSubnet); add(instance); add(routeTable); add(eip); addAndAssociate(elb); addAndAssociate(dbInstance); add(acl); addAndAssociateWithInstances(instSecurityGroup); addAndAssociateWithDBs(dbSecurityGroup); } private void add(Route route) { routes.add(route); } public Vpc getVpc() { return vpc; } private void addAndAssociateWithDBs(SecurityGroup securityGroup) { for(DBInstance db : databases) { DBSecurityGroupMembership groupMembership = new DBSecurityGroupMembership().withDBSecurityGroupName(securityGroup.getGroupName()); db.withDBSecurityGroups(groupMembership); } } private void add(Subnet subnet) { subnets.add(subnet); } private void add(Instance instance) { instances.add(instance); } private void add(RouteTable routeTable) { routeTables.add(routeTable); } private void add(Address address) { eips.add(address); } private void addAndAssociate(LoadBalancerDescription elb) { loadBalancers.add(elb); // instances Collection<com.amazonaws.services.elasticloadbalancing.model.Instance> list = new LinkedList<>(); for(Instance i : instances) { list.add(new com.amazonaws.services.elasticloadbalancing.model.Instance().withInstanceId(i.getInstanceId())); } elb.setInstances(list); // subnets List<String> subnetIds = new LinkedList<>(); for(Subnet s : subnets) { subnetIds.add(s.getSubnetId()); } elb.setSubnets(subnetIds); } private void addAndAssociate(DBInstance dbInstance) { databases.add(dbInstance); List<com.amazonaws.services.rds.model.Subnet> rdsSubnets = new LinkedList<>(); rdsSubnets.add(new com.amazonaws.services.rds.model.Subnet().withSubnetIdentifier(dbSubnet.getSubnetId())); DBSubnetGroup dBSubnetGroup = new DBSubnetGroup(); dBSubnetGroup.setSubnets(rdsSubnets); dbInstance.withDBSubnetGroup(dBSubnetGroup); } private void add(NetworkAcl acl) { acls.add(acl); } private void addAndAssociateWithInstances(SecurityGroup securityGroup) { securityGroups.add(securityGroup); GroupIdentifier groupId = new GroupIdentifier().withGroupId(securityGroup.getGroupId()).withGroupName(securityGroup.getGroupName()); for(Instance i : instances) { i.withSecurityGroups(groupId); } } public Vpc setFacadeVisitExpections(AmazonVPCFacade awsFacade) throws CfnAssistException { EasyMock.expect(awsFacade.getSubnetFors(vpcId)).andStubReturn(subnets); EasyMock.expect(awsFacade.getInstancesFor(subnetId)).andStubReturn(instances); EasyMock.expect(awsFacade.getInstancesFor(dbSubnet.getSubnetId())).andStubReturn(new LinkedList<>()); EasyMock.expect(awsFacade.getRouteTablesFor(vpcId)).andReturn(routeTables); EasyMock.expect(awsFacade.getEIPFor(vpcId)).andReturn(eips); EasyMock.expect(awsFacade.getLBsFor(vpcId)).andReturn(loadBalancers); EasyMock.expect(awsFacade.getSecurityGroupDetailsById(elbSecurityGroup.getGroupId())).andReturn(elbSecurityGroup); EasyMock.expect(awsFacade.getRDSFor(vpcId)).andReturn(databases); EasyMock.expect(awsFacade.getSecurityGroupDetailsByName(dbSecurityGroup.getGroupName())).andReturn(dbSecurityGroup); EasyMock.expect(awsFacade.getACLs(vpcId)).andReturn(acls); SecurityGroup instanceSecurityGroup = securityGroups.get(0); // TODO more than one EasyMock.expect(awsFacade.getSecurityGroupDetailsById(instanceSecurityGroup.getGroupId())).andReturn(instanceSecurityGroup); return vpc; } public void setGetVpcsExpectations(AmazonVPCFacade awsFacade) { List<Vpc> vpcs = new LinkedList<>(); vpcs.add(vpc); EasyMock.expect(awsFacade.getVpcs()).andReturn(vpcs); } public static Tag CreateNameTag(String name) { return new Tag().withKey("Name").withValue(name); } public Subnet getSubnet() { return insSubnet; } public String getSubnetId() { return subnetId; } public Instance getInstance() { return instance; } public RouteTable getRouteTable() { return routeTable; } public Address getEip() { return eip; } public LoadBalancerDescription getElb() { return elb; } public DBInstance getDbInstance() { return dbInstance; } public NetworkAclEntry getOutboundEntry() { return outboundAclEntry; } public NetworkAclEntry getInboundEntry() { return inboundAclEntry; } public NetworkAcl getAcl() { return acl; } public IpPermission getInstanceIpPermsInbound() { return ipPermsInbound; } public IpPermission getInstanceIpPermsOutbound() { return ipPermsOutbound; } public SecurityGroup getInstanceSecurityGroup() { return instSecurityGroup; } public SecurityGroup getDBSecurityGroup() { return dbSecurityGroup; } public String getDbSubnetId() { return dbSubnet.getSubnetId(); } public IpPermission getDbIpPermsInbound() { return ipDbPermsInbound; } public IpPermission getDbIpPermsOutbound() { return ipDbPermsOutbound; } public Subnet getDbSubnet() { return dbSubnet; } public SecurityGroup getElbSecurityGroup() { return elbSecurityGroup; } public IpPermission getElbIpPermsInbound() { return ipElbPermsInbound; } public IpPermission getElbIpPermsOutbound() { return ipElbPermsOutbound; } public Route getRouteA() { return routes.get(0); } public Route getRouteB() { return routes.get(1); } public Route getRouteC() { return routes.get(2); } }