EC2RetentionStrategy.java 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package hudson.plugins.ec2;
  2. import hudson.model.Descriptor;
  3. import hudson.slaves.RetentionStrategy;
  4. import hudson.util.TimeUnit2;
  5. import java.util.logging.Logger;
  6. import org.kohsuke.stapler.DataBoundConstructor;
  7. /**
  8. * {@link RetentionStrategy} for EC2.
  9. *
  10. * @author Kohsuke Kawaguchi
  11. */
  12. public class EC2RetentionStrategy extends RetentionStrategy<EC2Computer> {
  13. /** Number of minutes of idleness before an instance should be terminated.
  14. A value of zero indicates that the instance should never be automatically terminated */
  15. public final int idleTerminationMinutes;
  16. @DataBoundConstructor
  17. public EC2RetentionStrategy(String idleTerminationMinutes) {
  18. if (idleTerminationMinutes == null || idleTerminationMinutes.trim() == "") {
  19. this.idleTerminationMinutes = 0;
  20. } else {
  21. int value = 30;
  22. try {
  23. value = Integer.parseInt(idleTerminationMinutes);
  24. } catch (NumberFormatException nfe) {
  25. LOGGER.info("Malformed default idleTermination value: " + idleTerminationMinutes);
  26. }
  27. this.idleTerminationMinutes = value;
  28. }
  29. }
  30. @Override
  31. public synchronized long check(EC2Computer c) {
  32. /* If we've been told never to terminate, then we're done. */
  33. if (idleTerminationMinutes == 0) return 1;
  34. final long idleMilliseconds1 = System.currentTimeMillis() - c.getIdleStartMilliseconds();
  35. System.out.println(c.getName() + " idle: " + idleMilliseconds1);
  36. if (c.isIdle() && c.isOnline() && !disabled) {
  37. // TODO: really think about the right strategy here
  38. final long idleMilliseconds = System.currentTimeMillis() - c.getIdleStartMilliseconds();
  39. if (idleMilliseconds > TimeUnit2.MINUTES.toMillis(idleTerminationMinutes)) {
  40. LOGGER.info("Idle timeout: "+c.getName());
  41. c.getNode().idleTimeout();
  42. }
  43. }
  44. return 1;
  45. }
  46. /**
  47. * Try to connect to it ASAP.
  48. */
  49. @Override
  50. public void start(EC2Computer c) {
  51. c.connect(false);
  52. }
  53. // no registration since this retention strategy is used only for EC2 nodes that we provision automatically.
  54. // @Extension
  55. public static class DescriptorImpl extends Descriptor<RetentionStrategy<?>> {
  56. @Override
  57. public String getDisplayName() {
  58. return "EC2";
  59. }
  60. }
  61. private static final Logger LOGGER = Logger.getLogger(EC2RetentionStrategy.class.getName());
  62. public static boolean disabled = Boolean.getBoolean(EC2RetentionStrategy.class.getName()+".disabled");
  63. }