package core.aws.plan.elb;
import core.aws.plan.Planner;
import core.aws.task.ec2.CreateSGTask;
import core.aws.task.ec2.DeleteSGTask;
import core.aws.task.elb.CreateELBListenerTask;
import core.aws.task.elb.CreateELBTask;
import core.aws.task.elb.CreateServerCertTask;
import core.aws.task.elb.DeleteELBListenerTask;
import core.aws.task.elb.DeleteELBTask;
import core.aws.task.elb.DeleteServerCertTask;
import core.aws.task.elb.UpdateELBSGTask;
import core.aws.task.s3.CreateBucketTask;
import core.aws.task.vpc.CreateSubnetTask;
import core.aws.task.vpc.DeleteSubnetTask;
import core.aws.workflow.Tasks;
import java.util.List;
/**
* @author neo
*/
public class ELBTaskPlanner extends Planner {
public ELBTaskPlanner(Tasks tasks) {
super(tasks);
}
@Override
public void plan() {
linkCreateTasks();
linkDeleteTasks();
linkUpdateTasks();
}
private void linkUpdateTasks() {
for (UpdateELBSGTask updateELBSGTask : all(UpdateELBSGTask.class)) {
find(CreateSGTask.class, updateELBSGTask.resource.securityGroup)
.ifPresent(updateELBSGTask::dependsOn);
}
for (CreateELBListenerTask listenerTask : all(CreateELBListenerTask.class)) {
if (listenerTask.resource.cert != null) {
find(CreateServerCertTask.class, listenerTask.resource.cert)
.ifPresent(listenerTask::dependsOn);
}
}
for (DeleteELBListenerTask listenerTask : all(DeleteELBListenerTask.class)) {
if (listenerTask.resource.cert != null) {
find(DeleteServerCertTask.class, listenerTask.resource.cert)
.ifPresent(task -> task.dependsOn(listenerTask));
}
}
}
private void linkDeleteTasks() {
for (DeleteELBTask elbTask : all(DeleteELBTask.class)) {
final List<String> subnets = elbTask.resource.remoteELB.getSubnets();
if (!subnets.isEmpty()) {
all(DeleteSubnetTask.class).stream()
.filter(task -> task.resource.remoteSubnets.stream().anyMatch(remoteSubnet -> subnets.contains(remoteSubnet.getSubnetId())))
.findAny().ifPresent(task -> task.dependsOn(elbTask));
}
final List<String> sgIds = elbTask.resource.remoteELB.getSecurityGroups();
if (!sgIds.isEmpty()) {
all(DeleteSGTask.class).stream()
.filter(sgTask -> sgIds.contains(sgTask.resource.remoteSecurityGroup.getGroupId()))
.findAny().ifPresent(task -> task.dependsOn(elbTask));
}
if (elbTask.resource.cert != null) {
find(DeleteServerCertTask.class, elbTask.resource.cert)
.ifPresent(task -> task.dependsOn(elbTask));
}
}
}
private void linkCreateTasks() {
for (CreateELBTask elbTask : all(CreateELBTask.class)) {
if (elbTask.resource.subnet != null) {
find(CreateSubnetTask.class, elbTask.resource.subnet)
.ifPresent(elbTask::dependsOn);
}
if (elbTask.resource.securityGroup != null) {
find(CreateSGTask.class, elbTask.resource.securityGroup)
.ifPresent(elbTask::dependsOn);
}
if (elbTask.resource.cert != null) {
find(CreateServerCertTask.class, elbTask.resource.cert)
.ifPresent(elbTask::dependsOn);
}
if (elbTask.resource.accessLogBucket != null) {
find(CreateBucketTask.class, elbTask.resource.accessLogBucket)
.ifPresent(elbTask::dependsOn);
}
}
}
}