Skip to content

Commit

Permalink
Clean up terminated mock instances after a pre-defined period (#34)
Browse files Browse the repository at this point in the history
* Clean up terminated mock instances after a pre-defined period

* Clean up terminated mock instances after a pre-defined period

* Clean up terminated mock instances after a pre-defined period

* Clean up terminated mock instances after a pre-defined period
  • Loading branch information
cjqhenry14 authored and maxiaohao committed Jul 21, 2016
1 parent e41baf8 commit 92990b8
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Dockerfile
@@ -1,6 +1,6 @@
FROM java:8

RUN apt-get update
RUN apt-get clean && apt-get update
RUN apt-get install -y gradle

WORKDIR /project
Expand Down
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -15,6 +15,10 @@ Aws-mock currently features the following implemented interfaces of Amazon EC2:
- startInstances
- terminateInstances
- describeInstances
- describeVpcs
- describeSecurityGroups
- describeInternetGateways
- describeRouteTables

This mock can manage a huge amount of EC2 instances, making it super easy for you to test your applications.

Expand Down
Expand Up @@ -34,6 +34,16 @@ public class AppServletContextListener implements ServletContextListener {
private static boolean persistenceEnabled = Boolean
.parseBoolean(PropertiesUtils.getProperty(Constants.PROP_NAME_PERSISTENCE_ENABLED));

/**
* Period of cleaning up terminated mock ec2 instances.
*/
private static int cleanupTerminatedInstancesPeriod = PropertiesUtils.
getIntFromProperty(Constants.PROP_NAME_EC2_CLEANUP_TERMINATED_INSTANCES_TIME_SECONDS);

/**
* Millisecs in a second.
*/
private static final long MILLISECS_IN_A_SECOND = 1000L;

/**
* Default constructor.
Expand All @@ -59,6 +69,10 @@ public final void contextInitialized(final ServletContextEvent sce) {
MockEc2Controller.getInstance().restoreAllMockEc2Instances(Arrays.asList(instanceArray));
}
}

// start a timer for cleaning up terminated instances
MockEc2Controller.getInstance().
cleanupTerminatedInstances(cleanupTerminatedInstancesPeriod);
}


Expand All @@ -84,6 +98,9 @@ public final void contextDestroyed(final ServletContextEvent sce) {
instances.toArray(array);
PersistenceUtils.saveAll(array);
}

MockEc2Controller.getInstance().destroyCleanupTerminatedInstanceTimer();

log.info("aws-mock stopped...");
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/tlswe/awsmock/common/util/Constants.java
Expand Up @@ -48,6 +48,11 @@ public interface Constants {
*/
String PROP_NAME_XMLNS_CURRENT = "xmlns.current";

/**
* Property name for min boot time of a mock EC2 instance in seconds.
*/
String PROP_NAME_EC2_CLEANUP_TERMINATED_INSTANCES_TIME_SECONDS = "ec2.cleanupTerminatedInstances.time.seconds";

/**
* Property name for max shutdown time of a mock EC2 instance in milliseconds.
*/
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/com/tlswe/awsmock/ec2/control/MockEc2Controller.java
Expand Up @@ -6,6 +6,10 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import com.tlswe.awsmock.common.exception.AwsMockException;
import com.tlswe.awsmock.ec2.cxf_generated.InstanceStateChangeType;
Expand Down Expand Up @@ -49,6 +53,15 @@ public final class MockEc2Controller {
private final Map<String, AbstractMockEc2Instance> allMockEc2Instances =
new ConcurrentHashMap<String, AbstractMockEc2Instance>();

/**
* Internal timer for cleaning up terminated mock ec2 instances.
*/
private ScheduledExecutorService cleanupTerminatedInstancesTimer = null;

/**
* The result of scheduling a task with a {@link ScheduledExecutorService}.
*/
private ScheduledFuture cleanupTerminatedInstancesScheduledFuture = null;

/**
* Constructor of MockEc2Controller is made private and only called once by {@link #getInstance()}.
Expand Down Expand Up @@ -350,4 +363,49 @@ public void restoreAllMockEc2Instances(final Collection<AbstractMockEc2Instance>
}
}


/**
* Clean up terminated mock instances after a pre-defined period.
* Period is defined in aws-mock.properties (or if not overridden, as defined in aws-mock-default.properties)
*
* @param period
* time period to clean up terminated instances
*/
public void cleanupTerminatedInstances(final long period) {

Runnable cleanupTerminatedInstancesTask = new Runnable() {

/**
* this method is triggered every pre-defined period
*/
private String terminatedState = AbstractMockEc2Instance.InstanceState.TERMINATED.getName();

@Override
public void run() {
// traverse the map allMockEc2Instances and clean up the terminated ones
for (AbstractMockEc2Instance instance : allMockEc2Instances.values()) {
if (terminatedState.equals(instance.getInstanceState().getName())) {
allMockEc2Instances.remove(instance.getInstanceID());
}
}
}

};

cleanupTerminatedInstancesTimer = Executors.newSingleThreadScheduledExecutor();
cleanupTerminatedInstancesScheduledFuture = cleanupTerminatedInstancesTimer.
scheduleAtFixedRate(cleanupTerminatedInstancesTask, 0L, period, TimeUnit.SECONDS);
}


/**
* Cancel the internal timer of cleaning up terminated mock ec2 instances.
*/
public void destroyCleanupTerminatedInstanceTimer() {
cleanupTerminatedInstancesScheduledFuture.cancel(true);
cleanupTerminatedInstancesScheduledFuture = null;
cleanupTerminatedInstancesTimer.shutdown();
cleanupTerminatedInstancesTimer = null;
}

}
3 changes: 3 additions & 0 deletions src/main/resources/aws-mock-default.properties
Expand Up @@ -13,6 +13,9 @@ ec2.api.version.current.impl=2013-02-01
elasticfox.compatible=true
ec2.api.version.elasticfox=2010-11-15

# period of cleaning up terminated mock ec2 instances
ec2.cleanupTerminatedInstances.time.seconds=1800

# predefined AMIs
predefined.mock.ami.1=ami-12345678
predefined.mock.ami.2=ami-00abcdef
Expand Down

0 comments on commit 92990b8

Please sign in to comment.