diff --git a/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml b/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml index 3a59db8cda7..650839777ac 100644 --- a/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml +++ b/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml @@ -36,7 +36,7 @@ com.github.docker-java docker-java - 3.0.0-RC1 + 2.2.2 test diff --git a/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java b/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java index eeea6246e7c..89df5ce4c4a 100644 --- a/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java +++ b/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java @@ -17,20 +17,30 @@ package org.springframework.boot.launchscript; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; + import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.CompressArchiveUtil; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; import com.github.dockerjava.core.command.AttachContainerResultCallback; import com.github.dockerjava.core.command.BuildImageResultCallback; -import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.jaxrs.AbstrSyncDockerCmdExec; +import com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl; import org.assertj.core.api.Condition; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,6 +63,8 @@ import static org.junit.Assume.assumeThat; @RunWith(Parameterized.class) public class SysVinitLaunchScriptIT { + private final SpringBootDockerCmdExecFactory commandExecFactory = new SpringBootDockerCmdExecFactory(); + private static final char ESC = 27; private final String os; @@ -211,8 +223,7 @@ public class SysVinitLaunchScriptIT { }); resultCallback.awaitCompletion(60, TimeUnit.SECONDS).close(); - docker.waitContainerCmd(container).exec(new WaitContainerResultCallback()) - .awaitCompletion(60, TimeUnit.SECONDS); + docker.waitContainerCmd(container).exec(); return output.toString(); } finally { @@ -221,16 +232,11 @@ public class SysVinitLaunchScriptIT { } private DockerClient createClient() { - DockerClientConfigBuilder builder = DockerClientConfig - .createDefaultConfigBuilder(); - DockerClientConfig config; - try { - config = builder.build(); - } - catch (DockerClientException ex) { - config = builder.withDockerTlsVerify(false).build(); - } - return DockerClientBuilder.getInstance(config).build(); + DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() + .build(); + DockerClient docker = DockerClientBuilder.getInstance(config) + .withDockerCmdExecFactory(this.commandExecFactory).build(); + return docker; } private String buildImage(DockerClient docker) { @@ -258,9 +264,10 @@ public class SysVinitLaunchScriptIT { new File("src/test/resources/scripts/" + script)); } - private void copyToContainer(DockerClient docker, String container, File file) { - docker.copyArchiveToContainerCmd(container) - .withHostResource(file.getAbsolutePath()).exec(); + private void copyToContainer(DockerClient docker, final String container, + final File file) { + this.commandExecFactory.createCopyToContainerCmdExec() + .exec(new CopyToContainerCmd(container, file)); } private File findApplication() { @@ -302,4 +309,81 @@ public class SysVinitLaunchScriptIT { "Failed to extract " + label + " from output: " + output); } + private static final class CopyToContainerCmdExec + extends AbstrSyncDockerCmdExec { + + private CopyToContainerCmdExec(WebTarget baseResource, + DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(CopyToContainerCmd command) { + try { + InputStream streamToUpload = new FileInputStream(CompressArchiveUtil + .archiveTARFiles(command.getFile().getParentFile(), + Arrays.asList(command.getFile()), + command.getFile().getName())); + WebTarget webResource = getBaseResource().path("/containers/{id}/archive") + .resolveTemplate("id", command.getContainer()); + webResource.queryParam("path", ".") + .queryParam("noOverwriteDirNonDir", false).request() + .put(Entity.entity(streamToUpload, "application/x-tar")).close(); + return null; + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + } + + private static final class CopyToContainerCmd implements DockerCmd { + + private final String container; + + private final File file; + + private CopyToContainerCmd(String container, File file) { + this.container = container; + this.file = file; + } + + public String getContainer() { + return this.container; + } + + public File getFile() { + return this.file; + } + + @Override + public void close() { + + } + + } + + private static final class SpringBootDockerCmdExecFactory + extends DockerCmdExecFactoryImpl { + + private SpringBootDockerCmdExecFactory() { + withClientRequestFilters(new ClientRequestFilter() { + + @Override + public void filter(ClientRequestContext requestContext) + throws IOException { + // Workaround for https://go-review.googlesource.com/#/c/3821/ + requestContext.getHeaders().add("Connection", "close"); + } + + }); + } + + private CopyToContainerCmdExec createCopyToContainerCmdExec() { + return new CopyToContainerCmdExec(getBaseResource(), getDockerClientConfig()); + } + + } + }