package org.arquillian.cube.openshift.impl.client.metadata; import io.fabric8.kubernetes.clnt.v2_2.dsl.ExecWatch; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.arquillian.cube.impl.util.IOUtil; import org.arquillian.cube.openshift.impl.client.OpenShiftClient; import org.arquillian.cube.spi.metadata.CanCopyFromContainer; public class CopyFromContainer implements CanCopyFromContainer { private final String cubeId; private final OpenShiftClient client; public CopyFromContainer(String cubeId, OpenShiftClient client) { this.cubeId = cubeId; this.client = client; } @Override public void copyDirectory(String from, String to) { 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())); } try { Files.createDirectories(toPath); final String fileOrDir; if (from.endsWith("/")) { fileOrDir = "."; } else { Path fromPath = FileSystems.getDefault().getPath(from); fileOrDir = fromPath.getFileName().toString(); from = fromPath.getParent().toString(); } try (ExecWatch watch = client.getClient().inNamespace(client.getClient().getNamespace()).pods().withName(cubeId).exec("tar", "-C", from, "-c", fileOrDir)) { IOUtil.untar(watch.getOutput(), toPathFile); } } catch (IOException e) { throw new IllegalStateException(e); } } @Override public void copyLog(boolean follow, boolean stdout, boolean stderr, boolean timestamps, int tail, OutputStream outputStream) { if (!follow) { String log = client.getClient().inNamespace(client.getClient().getNamespace()).pods().withName(cubeId).getLog(); try { outputStream.write(log.getBytes()); } catch (IOException e) { throw new IllegalStateException(e); } } else { throw new IllegalArgumentException("log following not supported for pods"); } } }