Repository: jclouds Updated Branches: refs/heads/master 06b69ffed -> c10540b04
[JCLOUDS-1162] DockerComputeServiceAdapter shouldn't remove container if it stops with non-zero exit code quickly after start. The commit also adds feature which prints container logs into JClouds Compute Log during Node destroy if the TRACE log level is enabled Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/c10540b0 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/c10540b0 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/c10540b0 Branch: refs/heads/master Commit: c10540b04dadd08ac1d4d397276c346e03f45e91 Parents: 06b69ff Author: Josef Cacek <[email protected]> Authored: Thu Sep 1 14:46:47 2016 +0200 Committer: Ignasi Barrera <[email protected]> Committed: Tue Oct 25 15:34:09 2016 +0200 ---------------------------------------------------------------------- .../strategy/DockerComputeServiceAdapter.java | 51 ++++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/c10540b0/apis/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/apis/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java b/apis/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java index 690b50e..08c5791 100644 --- a/apis/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java +++ b/apis/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java @@ -29,6 +29,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import com.google.common.base.Charsets; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -53,12 +54,16 @@ import org.jclouds.docker.domain.ContainerSummary; import org.jclouds.docker.domain.HostConfig; import org.jclouds.docker.domain.Image; import org.jclouds.docker.domain.ImageSummary; +import org.jclouds.docker.options.AttachOptions; import org.jclouds.docker.options.CreateImageOptions; import org.jclouds.docker.options.ListContainerOptions; import org.jclouds.docker.options.RemoveContainerOptions; +import org.jclouds.docker.util.DockerInputStream; +import org.jclouds.docker.util.StdStreamData; import org.jclouds.domain.Location; import org.jclouds.domain.LoginCredentials; import org.jclouds.logging.Logger; +import org.jclouds.util.Closeables2; /** * defines the connection between the {@link org.jclouds.docker.DockerApi} implementation and @@ -224,10 +229,6 @@ public class DockerComputeServiceAdapter implements logger.trace("<< started(%s)", container.id()); container = api.getContainerApi().inspectContainer(container.id()); - if (container.state().exitCode() != 0) { - destroyNode(container.id()); - throw new IllegalStateException(String.format("Container %s has not started correctly", container.id())); - } return new NodeAndInitialCredentials(container, container.id(), LoginCredentials.builder().user(loginUser).password(loginUserPassword).build()); } @@ -316,6 +317,7 @@ public class DockerComputeServiceAdapter implements @Override public void destroyNode(String id) { + traceContainerLogs(id); api.getContainerApi().removeContainer(id, RemoveContainerOptions.Builder.force(true)); } @@ -350,4 +352,45 @@ public class DockerComputeServiceAdapter implements } }; } + + /** + * If log level TRACE (or finer), then logs from the given container are + * written to JClouds log. + * + * @param containerId + * Id of the container to retrieve logs for. + */ + private void traceContainerLogs(final String containerId) { + if (logger.isTraceEnabled()) { + DockerInputStream dis = null; + try { + dis = new DockerInputStream(api.getContainerApi().attach(containerId, + AttachOptions.Builder.logs(true).stderr(true).stdout(true))); + String idToLog = containerId; + if (idToLog.length() > 8) { + idToLog = idToLog.substring(0, 8); + } + StdStreamData data = null; + while (null != (data = dis.readStdStreamData())) { + final byte[] bytePayload = data.getPayload(); + final String payload = bytePayload != null ? new String(bytePayload, Charsets.UTF_8) : ""; + switch (data.getType()) { + case OUT: + logger.trace("Container [%s] StdOut: %s", idToLog, payload); + break; + case ERR: + logger.trace("Container [%s] StdErr: %s", idToLog, payload); + break; + default: + logger.trace("Container [%s] - Unexpected STD stream type: %s", idToLog, data.getType()); + break; + } + } + } catch (Exception e) { + logger.trace("Retrieving container log failed", e); + } finally { + Closeables2.closeQuietly(dis); + } + } + } }
