package org.arquillian.cube.docker.impl.client; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; import org.arquillian.cube.docker.impl.beforeStop.BeforeStopActionFactory; import org.arquillian.cube.docker.impl.client.config.BeforeStop; import org.arquillian.cube.docker.impl.client.config.Copy; import org.arquillian.cube.docker.impl.client.config.CubeContainer; import org.arquillian.cube.docker.impl.client.config.CustomBeforeStopAction; import org.arquillian.cube.docker.impl.client.config.Log; import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.docker.impl.model.DockerCube; import org.arquillian.cube.impl.model.DefaultCubeId; import org.arquillian.cube.impl.util.IOUtil; import org.arquillian.cube.spi.Cube; import org.arquillian.cube.spi.CubeRegistry; import org.jboss.arquillian.core.api.annotation.Observes; public class BeforeStopContainerObserver { public void processCommands(@Observes org.arquillian.cube.spi.event.lifecycle.BeforeStop beforeStop, CubeRegistry cubeRegistry, DockerClientExecutor dockerClientExecutor) throws IOException { Cube<CubeContainer> cube = cubeRegistry.getCube(beforeStop.getCubeId(), DockerCube.class); CubeContainer configuration = cube.configuration(); if (configuration.getBeforeStop() != null) { Collection<BeforeStop> beforeStopConfiguration = configuration.getBeforeStop(); for (BeforeStop map : beforeStopConfiguration) { if (map.getCopy() != null) { Copy copyConfiguration = map.getCopy(); executeCopyAction(dockerClientExecutor, beforeStop.getCubeId(), copyConfiguration); } else { if (map.getLog() != null) { Log logConfiguration = map.getLog(); executeLogAction(dockerClientExecutor, beforeStop.getCubeId(), logConfiguration); } } if (map.getCustomBeforeStopAction() != null) { CustomBeforeStopAction customBeforeStopAction = map.getCustomBeforeStopAction(); executeCustomBeforeStopAction(dockerClientExecutor, beforeStop.getCubeId(), customBeforeStopAction); } } } } private void executeCustomBeforeStopAction(DockerClientExecutor dockerClientExecutor, String containerId, CustomBeforeStopAction customBeforeStopAction) { BeforeStopActionFactory.create(dockerClientExecutor, new DefaultCubeId(containerId), customBeforeStopAction) .doBeforeStop(); } private void executeLogAction(DockerClientExecutor dockerClientExecutor, String containerId, Log configurationParameters) throws IOException { String to = null; if (configurationParameters.getTo() != null) { to = configurationParameters.getTo(); } else { throw new IllegalArgumentException( String.format("to property is mandatory when getting logs from container %s.", containerId)); } boolean follow = false; boolean stderr = false; boolean stdout = false; boolean timestamps = false; int tail = -1; if (configurationParameters.getFollow() != null) { follow = configurationParameters.getFollow(); } if (configurationParameters.getStdout() != null) { stdout = configurationParameters.getStdout(); } if (configurationParameters.getStderr() != null) { stderr = configurationParameters.getStderr(); } if (configurationParameters.getTimestamps() != null) { timestamps = configurationParameters.getTimestamps(); } if (configurationParameters.getTail() != null) { tail = configurationParameters.getTail(); } Path toPath = Paths.get(to); File toPathFile = toPath.toFile(); if (toPathFile.exists() && toPathFile.isDirectory()) { throw new IllegalArgumentException(String.format( "%s parameter should be a file in log operation but you set an already existing directory not a file.", "to")); } Path toDirectory = toPath.getParent(); Files.createDirectories(toDirectory); dockerClientExecutor.copyLog(containerId, follow, stdout, stderr, timestamps, tail, new FileOutputStream(toPathFile)); } private void executeCopyAction(DockerClientExecutor dockerClientExecutor, String containerId, Copy configurationParameters) throws IOException { String to = null; String from = null; if (configurationParameters.getTo() != null && configurationParameters.getFrom() != null) { to = configurationParameters.getTo(); from = configurationParameters.getFrom(); } else { throw new IllegalArgumentException( String.format("to and from property is mandatory when copying files from container %s.", containerId)); } InputStream response = dockerClientExecutor.getFileOrDirectoryFromContainerAsTar(containerId, from); Path toPath = Paths.get(to); File toPathFile = toPath.toFile(); if (toPathFile.exists() && toPathFile.isFile()) { throw new IllegalArgumentException(String.format( "%s parameter should be a directory in copy operation but you set an already existing file not a directory. Check %s in your local directory because currently is a file.", "to", toPath.normalize().toString())); } Files.createDirectories(toPath); IOUtil.untar(response, toPathFile); } }