package core.aws.resource.as;
import core.aws.resource.Resource;
import core.aws.resource.ServerResource;
import core.aws.resource.elb.ELB;
import core.aws.resource.vpc.Subnet;
import core.aws.task.as.CreateASGroupTask;
import core.aws.task.as.DeleteASGroupTask;
import core.aws.task.as.DeployASGroupTask;
import core.aws.task.as.DescribeASGroupTask;
import core.aws.task.as.RunCommandTask;
import core.aws.task.as.StartASGroupTask;
import core.aws.task.as.StopASGroupTask;
import core.aws.task.as.UpdateASGroupTask;
import core.aws.task.as.UploadTask;
import core.aws.util.ToStringHelper;
import core.aws.workflow.Tasks;
import java.util.List;
/**
* @author neo
*/
public class ASGroup extends Resource implements ServerResource {
public static final String TERMINATE_POLICY_OLDEST_INSTANCE = "OldestInstance";
public com.amazonaws.services.autoscaling.model.AutoScalingGroup remoteASGroup;
public LaunchConfig launchConfig = new LaunchConfig();
public ELB elb;
public int minSize;
public int maxSize;
public int desiredSize;
public Subnet subnet;
public ASGroup(String id) {
super(id);
}
@Override
protected void createTasks(Tasks tasks) {
tasks.add(new CreateASGroupTask(this));
}
@Override
protected void deleteTasks(Tasks tasks) {
tasks.add(new DeleteASGroupTask(this));
}
@Override
protected void updateTasks(Tasks tasks) {
if (changed() || launchConfig.changed()) {
tasks.add(new UpdateASGroupTask(this));
}
}
public boolean changed() {
if (remoteASGroup.getMinSize() != minSize) return true;
if (remoteASGroup.getMaxSize() != maxSize) return true;
if (remoteASGroup.getDesiredCapacity() != desiredSize) return true;
List<String> terminationPolicies = remoteASGroup.getTerminationPolicies();
return terminationPolicies.size() != 1
|| !TERMINATE_POLICY_OLDEST_INSTANCE.equals(terminationPolicies.get(0));
}
@Override
protected void describeTasks(Tasks tasks) {
tasks.add(new DescribeASGroupTask(this));
}
@Override
public void startTasks(Tasks tasks) {
if (changed())
tasks.add(new StartASGroupTask(this));
}
@Override
public void stopTasks(Tasks tasks) {
if (remoteASGroup.getDesiredCapacity() > 0)
tasks.add(new StopASGroupTask(this));
}
@Override
public void commandTasks(Tasks tasks) {
tasks.add(new RunCommandTask(this));
}
@Override
public void uploadTasks(Tasks tasks) {
tasks.add(new UploadTask(this));
}
@Override
public void deployTasks(Tasks tasks) {
tasks.add(new DeployASGroupTask(this));
}
@Override
public void provisionTasks(Tasks tasks) {
//TODO: impl provision for as group even if it's transient?
}
@Override
public String toString() {
return new ToStringHelper(this)
.add(id)
.add(status)
.add("min", minSize)
.add("max", maxSize)
.add("desired", desiredSize)
.add("ami", launchConfig.ami)
.add("instanceType", launchConfig.instanceType)
.toString();
}
}