package core.aws.plan.vpc; import com.amazonaws.services.ec2.model.Route; import core.aws.plan.Planner; import core.aws.resource.vpc.RouteTable; import core.aws.task.vpc.CreateInternetGatewayTask; import core.aws.task.vpc.CreateNATGatewayTask; import core.aws.task.vpc.CreateRouteTableTask; import core.aws.task.vpc.CreateVPCTask; import core.aws.task.vpc.DeleteInternetGatewayTask; import core.aws.task.vpc.DeleteNATGatewayTask; import core.aws.task.vpc.DeleteRouteTableTask; import core.aws.task.vpc.DeleteVPCTask; import core.aws.workflow.Tasks; /** * @author neo */ public class RouteTableTaskPlanner extends Planner { public RouteTableTaskPlanner(Tasks tasks) { super(tasks); } @Override public void plan() { linkCreateTasks(); linkDeleteTasks(); } private void linkDeleteTasks() { for (DeleteRouteTableTask routeTableTask : all(DeleteRouteTableTask.class)) { RouteTable routeTable = routeTableTask.resource; find(DeleteVPCTask.class) .ifPresent(task -> task.dependsOn(routeTableTask)); for (final Route route : routeTable.remoteRouteTable.getRoutes()) { if (route.getGatewayId() != null) { all(DeleteInternetGatewayTask.class).stream() .filter(task -> task.resource.remoteInternetGatewayId.equals(route.getGatewayId())) .findAny().ifPresent(task -> task.dependsOn(routeTableTask)); } else if (route.getNatGatewayId() != null) { all(DeleteNATGatewayTask.class).stream() .filter(task -> task.resource.remoteNATGateway.getNatGatewayId().equals(route.getNatGatewayId())) .findAny().ifPresent(task -> task.dependsOn(routeTableTask)); } } } } private void linkCreateTasks() { for (final CreateRouteTableTask routeTableTask : all(CreateRouteTableTask.class)) { find(CreateVPCTask.class).ifPresent(routeTableTask::dependsOn); RouteTable routeTable = routeTableTask.resource; if (routeTable.nat != null) { find(CreateNATGatewayTask.class) .ifPresent(routeTableTask::dependsOn); } if (routeTable.internetGateway != null) { find(CreateInternetGatewayTask.class) .ifPresent(routeTableTask::dependsOn); } } } }