package com.rmn.qa.task; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.amazonaws.services.ec2.model.Filter; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.ec2.model.Reservation; import com.google.common.annotations.VisibleForTesting; import com.rmn.qa.AutomationContext; import com.rmn.qa.AutomationUtils; import com.rmn.qa.RegistryRetriever; import com.rmn.qa.aws.VmManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Calendar; import java.util.Date; import java.util.List; public class AutomationReaperTask extends AbstractAutomationCleanupTask { private static final Logger log = LoggerFactory.getLogger(AutomationReaperTask.class); @VisibleForTesting static final String NAME = "VM Reaper Task"; private VmManager ec2; /** * Constructs a registry task with the specified context retrieval mechanism * @param registryRetriever Represents the retrieval mechanism you wish to use */ public AutomationReaperTask(RegistryRetriever registryRetriever,VmManager ec2) { super(registryRetriever); this.ec2 = ec2; } @Override public void doWork() { log.info("Running " + AutomationReaperTask.NAME); DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest(); Filter filter = new Filter("tag:LaunchSource"); filter.withValues("SeleniumGridScalerPlugin"); describeInstancesRequest.withFilters(filter); List<Reservation> reservations = ec2.describeInstances(describeInstancesRequest); for(Reservation reservation : reservations) { for(Instance instance : reservation.getInstances()) { // Look for orphaned nodes Date threshold = AutomationUtils.modifyDate(new Date(),-30, Calendar.MINUTE); String instanceId = instance.getInstanceId(); // If we found a node old enough AND we're not internally tracking it, this means this is an orphaned node and we should terminate it if(threshold.after(instance.getLaunchTime()) && !AutomationContext.getContext().nodeExists(instanceId)) { log.info("Terminating orphaned node: " + instanceId); ec2.terminateInstance(instanceId); } } } } @Override public String getDescription() { return AutomationReaperTask.NAME; } }