package core.aws.task.ec2; import core.aws.client.AWS; import core.aws.env.Context; import core.aws.resource.ec2.Instance; import core.aws.util.Threads; import core.aws.util.ToStringHelper; import core.aws.workflow.Action; import core.aws.workflow.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.time.Duration; import java.util.List; import java.util.stream.Collectors; /** * @author neo */ @Action("del-instance") public class DeleteInstanceTask extends Task<Instance> { private final Logger logger = LoggerFactory.getLogger(DeleteInstanceTask.class); public final List<com.amazonaws.services.ec2.model.Instance> deletedInstances; public DeleteInstanceTask(Instance instance, List<com.amazonaws.services.ec2.model.Instance> deletedInstances) { super(instance); this.deletedInstances = deletedInstances; } @Override public void execute(Context context) throws Exception { List<String> instanceIds = remoteInstanceIds(); if (resource.elb != null && resource.elb.remoteELB != null) { String elbName = resource.elb.remoteELB.getLoadBalancerName(); AWS.elb.detachInstances(elbName, instanceIds); // with ELB draining, wait a bit to finish all current request logger.info("sleep a bit to wait all existing requests to finish if any"); Threads.sleepRoughly(Duration.ofSeconds(5)); } AWS.ec2.terminateInstances(instanceIds); context.output("instance/" + resource.id, "deletedInstanceIds=" + instanceIds); } private List<String> remoteInstanceIds() { return deletedInstances.stream() .map(com.amazonaws.services.ec2.model.Instance::getInstanceId) .collect(Collectors.toList()); } @Override public String toString() { return new ToStringHelper(this) .add(resource.id) .add("remoteInstanceIds", remoteInstanceIds()) .toString(); } }