package com.ontology2.haruhi.launchInstance; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.ec2.model.*; import com.ontology2.centipede.shell.CommandLineApplication; import net.schmizz.sshj.SSHClient; import net.schmizz.sshj.common.IOUtils; import net.schmizz.sshj.connection.channel.direct.Session; import net.schmizz.sshj.transport.verification.PromiscuousVerifier; import net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; import java.util.List; import java.util.concurrent.TimeUnit; @Component("launchInstance") public class LaunchInstance extends CommandLineApplication { @Autowired AmazonEC2Client ec2Client; @Override protected void _run(String[] strings) throws Exception { RunInstancesRequest rir = getBigRunInstancesRequest(); RunInstancesResult response=ec2Client.runInstances(rir); Reservation r=response.getReservation(); List<Instance> instances=r.getInstances(); String instanceId=instances.get(0).getInstanceId(); while(instanceStarting(instanceId)) { Thread.sleep(10*1000); System.out.println("testing status"); } String ipAddress=findIpAddress(instanceId); System.out.println("instance "+instanceId+" is up and running at IP address: "+ipAddress); Thread.sleep(2*60*1000); // primitive, ssh will take a little while to be ready final SSHClient ssh = new SSHClient(); String $HOME=System.getProperty("user.home"); OpenSSHKeyFile k=new OpenSSHKeyFile(); k.init(new File($HOME+"/.haruhi/o2key.pem")); ssh.addHostKeyVerifier(new PromiscuousVerifier()); ssh.connect(ipAddress); ssh.authPublickey("ubuntu",k); final Session session = ssh.startSession(); try { final Session.Command cmd = session.exec("ls -a"); System.out.println(IOUtils.readFully(cmd.getInputStream()).toString()); cmd.join(5, TimeUnit.SECONDS); System.out.println("\n** exit status: " + cmd.getExitStatus()); } finally { session.close(); ssh.disconnect(); } } private boolean instanceStarting(String instanceId) { DescribeInstancesResult result=ec2Client.describeInstances(new DescribeInstancesRequest().withInstanceIds(instanceId)); return result.getReservations().get(0).getInstances().get(0).getState().getName().equals(InstanceStateName.Pending.toString()); }; private String findIpAddress(String instanceId) { DescribeInstancesResult result=ec2Client.describeInstances(new DescribeInstancesRequest().withInstanceIds(instanceId)); return result.getReservations().get(0).getInstances().get(0).getPublicIpAddress(); }; private RunInstancesRequest getTinyRunInstancesRequest() { String theAmi="ami-018c9568"; // Stock Ubuntu 14.04 LTS for now return new RunInstancesRequest(theAmi,1,1) .withInstanceType("t1.micro") .withKeyName("o2key") .withSecurityGroups("launch-wizard-21") .withMonitoring(true); } private RunInstancesRequest getBigRunInstancesRequest() { String theAmi="ami-fccd2d94"; return new RunInstancesRequest(theAmi,1,1) .withInstanceType("r3.xlarge") .withKeyName("o2key") .withSecurityGroups("launch-wizard-21") .withMonitoring(true) .withPlacement(new Placement("us-east-1e")); } private RunInstancesRequest getEmptyVirtuosoInstancesRequest() { String theAmi="ami-f0a54298"; return new RunInstancesRequest(theAmi,1,1) .withInstanceType("r3.large") .withKeyName("o2key") .withSecurityGroups("launch-wizard-21") .withMonitoring(true); } }