package hudson.plugins.ec2; import hudson.Extension; import hudson.model.AsyncPeriodicWork; import hudson.model.TaskListener; import hudson.model.Node; import java.io.IOException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.Jenkins; import com.amazonaws.AmazonClientException; /** * @author Bruno Meneguello */ @Extension public class EC2SlaveMonitor extends AsyncPeriodicWork { private static final Logger LOGGER = Logger.getLogger(EC2SlaveMonitor.class.getName()); private final Long recurrencePeriod; public EC2SlaveMonitor() { super("EC2 alive slaves monitor"); recurrencePeriod = Long.getLong("jenkins.ec2.checkAlivePeriod", TimeUnit.MINUTES.toMillis(10)); LOGGER.log(Level.FINE, "EC2 check alive period is {0}ms", recurrencePeriod); } @Override public long getRecurrencePeriod() { return recurrencePeriod; } @Override protected void execute(TaskListener listener) throws IOException, InterruptedException { for (Node node : Jenkins.getInstance().getNodes()) { if (node instanceof EC2AbstractSlave) { final EC2AbstractSlave ec2Slave = (EC2AbstractSlave) node; try { if (!ec2Slave.isAlive(true)) { LOGGER.info("EC2 instance is dead: " + ec2Slave.getInstanceId()); ec2Slave.terminate(); } } catch (AmazonClientException e) { LOGGER.info("EC2 instance is dead and failed to terminate: " + ec2Slave.getInstanceId()); removeNode(ec2Slave); } } } } private void removeNode(EC2AbstractSlave ec2Slave) { try { Jenkins.getInstance().removeNode(ec2Slave); } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to remove node: " + ec2Slave.getInstanceId()); } } }