package core.aws.plan.vpc;
import com.amazonaws.services.ec2.model.Subnet;
import core.aws.plan.Planner;
import core.aws.task.vpc.CreateRouteTableTask;
import core.aws.task.vpc.CreateSubnetTask;
import core.aws.task.vpc.CreateVPCTask;
import core.aws.task.vpc.DeleteRouteTableTask;
import core.aws.task.vpc.DeleteSubnetTask;
import core.aws.task.vpc.DeleteVPCTask;
import core.aws.workflow.Tasks;
/**
* @author neo
*/
public class SubnetTaskPlanner extends Planner {
public SubnetTaskPlanner(Tasks tasks) {
super(tasks);
}
@Override
public void plan() {
linkCreateTasks();
linkDeleteTasks();
}
private void linkDeleteTasks() {
for (DeleteSubnetTask subnetTask : all(DeleteSubnetTask.class)) {
find(DeleteVPCTask.class)
.ifPresent(task -> task.dependsOn(subnetTask));
for (Subnet remoteSubnet : subnetTask.resource.remoteSubnets) {
linkDeleteSubnetTasks(subnetTask, remoteSubnet);
}
}
}
private void linkDeleteSubnetTasks(DeleteSubnetTask subnetTask, Subnet remoteSubnet) {
for (DeleteRouteTableTask routeTableTask : all(DeleteRouteTableTask.class)) {
routeTableTask.resource.remoteRouteTable.getAssociations().stream()
.filter(association -> association.getSubnetId().equals(remoteSubnet.getSubnetId()))
.forEach(association -> subnetTask.dependsOn(routeTableTask));
}
}
private void linkCreateTasks() {
for (final CreateSubnetTask subnetTask : all(CreateSubnetTask.class)) {
find(CreateVPCTask.class)
.ifPresent(subnetTask::dependsOn);
find(CreateRouteTableTask.class, subnetTask.resource.routeTable)
.ifPresent(subnetTask::dependsOn);
}
}
}