package vpc2vpc;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeRegionsResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Region;
import com.amazonaws.services.ec2.model.Reservation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
/**
* InstanceHelper
*
* @author Vinay Selvaraj
*/
public class EC2Helper {
private Logger LOG = Logger.getLogger(EC2Helper.class);
private static EC2Helper instance;
private EC2Helper() {
}
public static EC2Helper getInstance() {
if (instance == null) {
instance = new EC2Helper();
}
return instance;
}
public HashMap<Region, List> listRegionInstances(AWSCredentials awsCreds) {
AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds);
List<Region> regions = new ArrayList();
DescribeRegionsResult descRegionsResult = ec2Client.describeRegions();
if (descRegionsResult != null) {
regions = descRegionsResult.getRegions();
}
HashMap<Region, List> regionInstances = new HashMap();
ExecutorService listInstanceExecutor = Executors.newFixedThreadPool(8);
for (Region region : regions) {
List<Instance> instances = new ArrayList();
regionInstances.put(region, instances);
Runnable worker = new ListInstanceRunnable(awsCreds, region, instances);
listInstanceExecutor.execute(worker);
}
listInstanceExecutor.shutdown();
try {
listInstanceExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
LOG.error("Caught InterruptedException: " + e.getMessage());
}
return regionInstances;
}
}
class ListInstanceRunnable implements Runnable {
private Logger LOG = Logger.getLogger(ListInstanceRunnable.class);
private AmazonEC2Client ec2Client;
private Region region;
private List<Instance> instances;
public ListInstanceRunnable(AWSCredentials awsCreds, Region region, List<Instance> instances) {
this.region = region;
this.instances = instances;
ec2Client = new AmazonEC2Client(awsCreds);
ec2Client.setEndpoint(region.getEndpoint());
LOG.debug("Set endpoint to " + region.getEndpoint());
}
public void run() {
LOG.debug("Running describeInstances() in " + region.getRegionName());
List<Reservation> reservations = ec2Client.describeInstances().getReservations();
for(Reservation reservation : reservations) {
instances.addAll(reservation.getInstances());
}
LOG.debug("Completed describeInstances() in " + region.getRegionName());
}
}