diff --git a/ass3-elastic/src/main/java/dst/ass3/elastic/impl/ContainerService.java b/ass3-elastic/src/main/java/dst/ass3/elastic/impl/ContainerService.java new file mode 100644 index 0000000..f275d72 --- /dev/null +++ b/ass3-elastic/src/main/java/dst/ass3/elastic/impl/ContainerService.java @@ -0,0 +1,59 @@ +package dst.ass3.elastic.impl; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DockerClientBuilder; +import dst.ass3.elastic.ContainerException; +import dst.ass3.elastic.ContainerInfo; +import dst.ass3.elastic.ContainerNotFoundException; +import dst.ass3.elastic.IContainerService; +import dst.ass3.messaging.Region; + +import java.util.ArrayList; +import java.util.List; + +public class ContainerService implements IContainerService { + private List containers = new ArrayList<>(); + private DockerClient dockerClient; + + public ContainerService() { + dockerClient = DockerClientBuilder.getInstance("tcp://192.168.99.99:2375").build(); + } + + @Override + public List listContainers() throws ContainerException { + return containers; + } + + @Override + public void stopContainer(String containerId) throws ContainerException { + containers.forEach(containerInfo -> { + if (containerInfo.getContainerId().equals(containerId)) { + containers.remove(containerInfo); + dockerClient.stopContainerCmd(containerId).exec(); + dockerClient.removeContainerCmd(containerId).exec(); + return; + } + }); + throw new ContainerNotFoundException("Container with id " + containerId + " not found"); + } + + @Override + public ContainerInfo startWorker(Region region) throws ContainerException { + ContainerInfo containerInfo = new ContainerInfo(); + containerInfo.setWorkerRegion(region); + containerInfo.setImage("dst/ass3-worker"); + containerInfo.setRunning(true); + + String containerId = dockerClient.createContainerCmd("dst/ass3-worker") + .withCmd(region.toString().toLowerCase()) + .withAttachStdout(true) + .withAttachStderr(true) + .exec().getId(); + + dockerClient.startContainerCmd(containerId).exec(); + + containerInfo.setContainerId(containerId); + containers.add(containerInfo); + return containerInfo; + } +}