EC2ComputerLauncher.java 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package hudson.plugins.ec2;
  2. import hudson.model.TaskListener;
  3. import hudson.slaves.ComputerLauncher;
  4. import hudson.slaves.SlaveComputer;
  5. import java.io.IOException;
  6. import java.io.PrintStream;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import com.amazonaws.AmazonClientException;
  10. import com.amazonaws.services.ec2.AmazonEC2;
  11. import com.amazonaws.services.ec2.model.Instance;
  12. import com.amazonaws.services.ec2.model.StartInstancesRequest;
  13. import com.amazonaws.services.ec2.model.StartInstancesResult;
  14. /**
  15. * {@link ComputerLauncher} for EC2 that waits for the instance to really come up before proceeding to
  16. * the real user-specified {@link ComputerLauncher}.
  17. *
  18. * @author Kohsuke Kawaguchi
  19. */
  20. public abstract class EC2ComputerLauncher extends ComputerLauncher {
  21. @Override
  22. public void launch(SlaveComputer _computer, TaskListener listener) {
  23. try {
  24. EC2Computer computer = (EC2Computer)_computer;
  25. PrintStream logger = listener.getLogger();
  26. OUTER:
  27. while(true) {
  28. switch (computer.getState()) {
  29. case PENDING:
  30. case STOPPING:
  31. Thread.sleep(5000); // check every 5 secs
  32. continue OUTER;
  33. case RUNNING:
  34. break OUTER;
  35. case STOPPED:
  36. AmazonEC2 ec2 = EC2Cloud.get().connect();
  37. List<String> instances = new ArrayList<String>();
  38. instances.add(computer.getInstanceId());
  39. StartInstancesRequest siRequest = new StartInstancesRequest(instances);
  40. StartInstancesResult siResult = ec2.startInstances(siRequest);
  41. logger.println("Starting existing instance: "+computer.getInstanceId()+ " result:"+siResult);
  42. continue OUTER;
  43. case SHUTTING_DOWN:
  44. case TERMINATED:
  45. // abort
  46. logger.println("The instance "+computer.getInstanceId()+" appears to be shut down. Aborting launch.");
  47. return;
  48. }
  49. }
  50. launch(computer, logger, computer.describeInstance());
  51. } catch (AmazonClientException e) {
  52. e.printStackTrace(listener.error(e.getMessage()));
  53. } catch (IOException e) {
  54. e.printStackTrace(listener.error(e.getMessage()));
  55. } catch (InterruptedException e) {
  56. e.printStackTrace(listener.error(e.getMessage()));
  57. }
  58. }
  59. /**
  60. * Stage 2 of the launch. Called after the EC2 instance comes up.
  61. */
  62. protected abstract void launch(EC2Computer computer, PrintStream logger, Instance inst)
  63. throws AmazonClientException, IOException, InterruptedException;
  64. }