package core.aws.task; import core.aws.env.Context; import core.aws.env.Goal; import core.aws.env.Param; import core.aws.resource.ResourceStatus; import core.aws.resource.Resources; import core.aws.resource.ServerResource; import core.aws.resource.image.Image; import core.aws.util.Exceptions; import core.aws.util.Lists; import core.aws.workflow.Tasks; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.Optional; /** * @author neo */ public class TaskBuilder { private final Logger logger = LoggerFactory.getLogger(getClass()); private final List<Goal> serverGoals = Lists.newArrayList(Goal.START, Goal.STOP, Goal.EXEC, Goal.PROVISION, Goal.UPLOAD, Goal.DEPLOY); private final Goal goal; private final Resources resources; private final Context context; public TaskBuilder(Goal goal, Resources resources, Context context) { this.goal = goal; this.resources = resources; this.context = context; } public Tasks build() { List<String> resourceIds = context.params(Param.RESOURCE_ID); Tasks tasks = new Tasks(); if (goal == Goal.BAKE) { bakeAMITasks(resourceIds, tasks); } else if (serverGoals.contains(goal)) { serverTasks(resourceIds, tasks); } else { resources.stream().forEach(resource -> resource.tasks(goal, tasks)); } return tasks; } private void serverTasks(List<String> resourceIds, Tasks tasks) { if (resourceIds != null) { Optional<String> invalidResourceId = resourceIds.stream().filter(resourceId -> resources.stream().noneMatch(resource -> resource.id.equals(resourceId))).findFirst(); if (invalidResourceId.isPresent()) throw Exceptions.error("resourceId is invalid, resourceId={}", invalidResourceId.get()); } resources.stream().filter(ServerResource.class::isInstance).forEach(resource -> { if (resourceIds == null || resourceIds.contains(resource.id)) { if (resource.status == ResourceStatus.LOCAL_REMOTE) { logger.info("build server task, goal={}, id={}", goal, resource.id); ((ServerResource) resource).serverTasks(goal, tasks); } else { logger.info("resource is skipped due to status, id={}, status={}", resource.id, resource.status); } } }); } private void bakeAMITasks(List<String> resourceIds, Tasks tasks) { for (String resourceId : resourceIds) { logger.info("build bake task, imageId={}", resourceId); Image image = resources.get(Image.class, resourceId); image.bakeTasks(tasks, "true".equals(context.param(Param.RESUME_BAKE))); } } }