package core.aws.plan.as;
import core.aws.plan.Planner;
import core.aws.resource.as.ASGroup;
import core.aws.task.as.CreateASGroupTask;
import core.aws.task.as.CreatePolicyTask;
import core.aws.task.as.DeleteASGroupTask;
import core.aws.task.as.DeletePolicyTask;
import core.aws.task.ec2.CreateInstanceProfileTask;
import core.aws.task.ec2.CreateKeyPairTask;
import core.aws.task.ec2.CreateSGTask;
import core.aws.task.ec2.DeleteSGTask;
import core.aws.task.elb.CreateELBTask;
import core.aws.task.elb.DeleteELBTask;
import core.aws.task.vpc.CreateSubnetTask;
import core.aws.task.vpc.DeleteSubnetTask;
import core.aws.workflow.Tasks;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
/**
* @author neo
*/
public class ASGroupTaskPlanner extends Planner {
public ASGroupTaskPlanner(Tasks tasks) {
super(tasks);
}
@Override
public void plan() {
linkCreateTasks();
linkDeleteTasks();
removeUnnecessaryDeletePolicyTasks();
}
private void removeUnnecessaryDeletePolicyTasks() {
Set<DeletePolicyTask> removedTasks = new HashSet<>();
for (DeletePolicyTask deletePolicyTask : all(DeletePolicyTask.class)) {
if (all(DeleteASGroupTask.class).stream().anyMatch(agNameEquals(deletePolicyTask))) {
removedTasks.add(deletePolicyTask); // delete auto scaling group will remove all policies automatically
}
}
tasks.removeAll(removedTasks);
}
private Predicate<DeleteASGroupTask> agNameEquals(DeletePolicyTask deletePolicyTask) {
return asGroupTask -> deletePolicyTask.resource.remotePolicy.getAutoScalingGroupName()
.equals(asGroupTask.resource.remoteASGroup.getAutoScalingGroupName());
}
private void linkDeleteTasks() {
for (DeleteASGroupTask asGroupTask : all(DeleteASGroupTask.class)) {
ASGroup asGroup = asGroupTask.resource;
List<String> elbNames = asGroup.remoteASGroup.getLoadBalancerNames();
if (!elbNames.isEmpty()) {
all(DeleteELBTask.class).stream()
.filter(task -> elbNames.contains(task.resource.remoteELB.getLoadBalancerName()))
.findAny().ifPresent(task -> task.dependsOn(asGroupTask));
}
String subnetIds = asGroup.remoteASGroup.getVPCZoneIdentifier();
all(DeleteSubnetTask.class).stream()
.filter(task -> subnetIds.contains(task.resource.firstRemoteSubnet().getSubnetId()))
.findAny().ifPresent(task -> task.dependsOn(asGroupTask));
List<String> sgIds = asGroup.launchConfig.remoteLaunchConfig.getSecurityGroups();
all(DeleteSGTask.class).stream()
.filter(task -> sgIds.contains(task.resource.remoteSecurityGroup.getGroupId()))
.findAny().ifPresent(task -> task.dependsOn(asGroupTask));
}
}
private void linkCreateTasks() {
all(CreateASGroupTask.class).forEach(asGroupTask -> {
ASGroup asGroup = asGroupTask.resource;
find(CreateSGTask.class, asGroup.launchConfig.securityGroup)
.ifPresent(asGroupTask::dependsOn);
if (asGroup.launchConfig.instanceProfile != null) {
find(CreateInstanceProfileTask.class, asGroup.launchConfig.instanceProfile)
.ifPresent(asGroupTask::dependsOn);
}
find(CreateKeyPairTask.class, asGroup.launchConfig.keyPair)
.ifPresent(asGroupTask::dependsOn);
if (asGroup.elb != null) {
find(CreateELBTask.class, asGroup.elb)
.ifPresent(asGroupTask::dependsOn);
}
find(CreateSubnetTask.class, asGroup.subnet)
.ifPresent(asGroupTask::dependsOn);
});
all(CreatePolicyTask.class).forEach(policyTask ->
find(CreateASGroupTask.class, policyTask.resource.asGroup)
.ifPresent(policyTask::dependsOn));
}
}