package vpc2vpc; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.ec2.model.Address; import com.amazonaws.services.ec2.model.DescribeAddressesResult; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.ec2.model.Region; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Tag; import com.amazonaws.services.ec2.model.Vpc; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.log4j.Logger; /** * VPC2VPCHelper * * @author Vinay Selvaraj */ public class VPC2VPCHelper { private Logger LOG = Logger.getLogger(VPC2VPCHelper.class); private static VPC2VPCHelper instance; private VPC2VPCHelper() { } public static VPC2VPCHelper getInstance() { if (instance == null) { instance = new VPC2VPCHelper(); } return instance; } public HashMap<String, VPC2VPCConnection> getVPC2VPCConnections(AWSCredentials awsCreds) { HashMap<Region, List> regionVpcs = VPCHelper.getInstance().listRegionVpcs(awsCreds); HashMap<Region, List> regionInstances = EC2Helper.getInstance().listRegionInstances(awsCreds); HashMap<String, Vpc> vpcIdVpc = new HashMap(); for (Region region : regionVpcs.keySet()) { List<Vpc> vpcs = regionVpcs.get(region); for (Vpc vpc : vpcs) { vpcIdVpc.put(vpc.getVpcId(), vpc); } } HashMap<String, VPC2VPCConnection> vpc2vpcIdConnections = new HashMap(); for (Region region : regionInstances.keySet()) { AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds); ec2Client.setEndpoint(region.getEndpoint()); List<Instance> instances = regionInstances.get(region); for (Instance ec2Instance : instances) { LOG.debug("instance: " + instance); if (ec2Instance.getState().getName().equals("running")) { String vpcId = ec2Instance.getVpcId(); List<Tag> tags = ec2Instance.getTags(); HashMap<String, String> vpc2vpcTags = new HashMap(); for (Tag tag : tags) { String key = tag.getKey(); String value = tag.getValue(); vpc2vpcTags.put(key, value); } String vpc2vpcId = vpc2vpcTags.get("vpc2vpc:id"); String vpc2vpcCreatedOnStr = vpc2vpcTags.get("vpc2vpc:created_on"); String vpc2vpcPublicIp = vpc2vpcTags.get("vpc2vpc:public_ip"); if (vpc2vpcId != null) { VPC2VPCConnection connection = vpc2vpcIdConnections.get(vpc2vpcId); if (connection == null) { Date createdOn = null; if (vpc2vpcCreatedOnStr != null) { try { createdOn = new Date(Long.parseLong(vpc2vpcCreatedOnStr)); } catch (Exception e) { // Eat it LOG.debug("Ignoring exception caught while parsing date string: " + e.getMessage()); } } connection = new VPC2VPCConnection(vpc2vpcId, createdOn); vpc2vpcIdConnections.put(vpc2vpcId, connection); } VPNEndpoint vpnEndpoint = new VPNEndpoint(); vpnEndpoint.setRegion(region); vpnEndpoint.setVpc(vpcIdVpc.get(vpcId)); vpnEndpoint.setInstance(ec2Instance); vpnEndpoint.setElasticIPAddress(vpc2vpcPublicIp); // Get the id of the security group ec2Client.describeSecurityGroups(); DescribeSecurityGroupsResult descSecGrpResult = ec2Client.describeSecurityGroups(); for(SecurityGroup sg : descSecGrpResult.getSecurityGroups()) { if(sg.getGroupName().equals(vpc2vpcId)) { vpnEndpoint.setSecurityGroupId(sg.getGroupId()); break; } } // Get the EIP allocation ID DescribeAddressesResult descAddressesResult = ec2Client.describeAddresses(); List<Address> addresses = descAddressesResult.getAddresses(); for(Address address : addresses) { if(address.getPublicIp().equals(vpc2vpcPublicIp)) { vpnEndpoint.setElasticIPAddress(address.getPublicIp()); vpnEndpoint.setElasticIPAllocationId(address.getAllocationId()); LOG.debug("Found EIP: " + address); break; } } HashMap<String, VPNEndpoint> vpcIdVpnEndpoint = connection.getVpcIdVpnEndpoint(); vpcIdVpnEndpoint.put(vpcId, vpnEndpoint); } } } } return vpc2vpcIdConnections; } }