diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 9e275eb35..0e1411767 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -21,7 +21,7 @@ public interface DockerClient extends Closeable { public PingCmd pingCmd(); public VersionCmd versionCmd(); - + /** * * IMAGE API * */ @@ -96,6 +96,8 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public RestartContainerCmd restartContainerCmd(String containerId); + public StatsCmd statsCmd(String containerId); + public CommitCmd commitCmd(String containerId); public BuildImageCmd buildImageCmd(); @@ -114,7 +116,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public EventsCmd eventsCmd(EventCallback eventCallback); - @Override public void close() throws IOException; + } diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 8b9880747..8d54a394f 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -79,7 +79,9 @@ public interface DockerCmdExecFactory extends Closeable { public EventsCmd.Exec createEventsCmdExec(); - @Override public void close() throws IOException; + // add + public StatsCmd.Exec createStatsCmdExec(); + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java new file mode 100644 index 000000000..dc57196e0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -0,0 +1,15 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Stats; + +/** + * @author Heng WU(wuheng09@otcaix.iscas.ac.cn) + * + */ +public interface StatsCmd extends DockerCmd { + + public static interface Exec extends DockerCmdExec { + } + + public String getContainerId(); +} diff --git a/src/main/java/com/github/dockerjava/api/model/Stats.java b/src/main/java/com/github/dockerjava/api/model/Stats.java new file mode 100644 index 000000000..8c47c3d32 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Stats.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Heng WU(wuheng09@otcaix.iscas.ac.cn) + * + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Stats { + + @JsonProperty("read") + private String read; + + @JsonProperty("network") + private Object network; + + @JsonProperty("cpu_stats") + private Object cpu_stats; + + @JsonProperty("memory_stats") + private Object memory_stats; + + public String getRead() { + return read; + } + + public Object getNetwork() { + return network; + } + + public Object getCpu_stats() { + return cpu_stats; + } + + public Object getMemory_stats() { + return memory_stats; + } +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 7e96225f8..c4b8aef16 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -72,7 +72,6 @@ private DockerCmdExecFactory getDockerCmdExecFactory() { return dockerCmdExecFactory; } - @Override public AuthConfig authConfig() { checkNotNull(dockerClientConfig.getUsername(), "Configured username is null."); @@ -95,23 +94,21 @@ public AuthConfig authConfig() { /** * Authenticate with the server, useful for checking authentication. */ - @Override public AuthCmd authCmd() { return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), authConfig()); } - @Override public InfoCmd infoCmd() { return new InfoCmdImpl(getDockerCmdExecFactory().createInfoCmdExec()); } - @Override + + public PingCmd pingCmd() { return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec()); } - @Override public VersionCmd versionCmd() { return new VersionCmdImpl(getDockerCmdExecFactory() .createVersionCmdExec()); @@ -120,13 +117,11 @@ public VersionCmd versionCmd() { /** * * IMAGE API * */ - @Override public PullImageCmd pullImageCmd(String repository) { return new PullImageCmdImpl(getDockerCmdExecFactory() .createPullImageCmdExec(), dockerClientConfig.effectiveAuthConfig(repository), repository); } - @Override public PushImageCmd pushImageCmd(String name) { PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory() .createPushImageCmdExec(), name); @@ -137,7 +132,6 @@ public PushImageCmd pushImageCmd(String name) { return cmd; } - @Override public PushImageCmd pushImageCmd(Identifier identifier) { PushImageCmd cmd = pushImageCmd(identifier.repository.name); if( identifier.tag.isPresent() ) @@ -150,37 +144,31 @@ public PushImageCmd pushImageCmd(Identifier identifier) { return cmd; } - @Override public SaveImageCmd saveImageCmd(String name) { return new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name); } - @Override public CreateImageCmd createImageCmd(String repository, InputStream imageStream) { return new CreateImageCmdImpl(getDockerCmdExecFactory() .createCreateImageCmdExec(), repository, imageStream); } - @Override public SearchImagesCmd searchImagesCmd(String term) { return new SearchImagesCmdImpl(getDockerCmdExecFactory() .createSearchImagesCmdExec(), term); } - @Override public RemoveImageCmd removeImageCmd(String imageId) { return new RemoveImageCmdImpl(getDockerCmdExecFactory() .createRemoveImageCmdExec(), imageId); } - @Override public ListImagesCmd listImagesCmd() { return new ListImagesCmdImpl(getDockerCmdExecFactory() .createListImagesCmdExec()); } - @Override public InspectImageCmd inspectImageCmd(String imageId) { return new InspectImageCmdImpl(getDockerCmdExecFactory() .createInspectImageCmdExec(), imageId); @@ -189,120 +177,101 @@ public InspectImageCmd inspectImageCmd(String imageId) { /** * * CONTAINER API * */ - - @Override public ListContainersCmd listContainersCmd() { return new ListContainersCmdImpl(getDockerCmdExecFactory() .createListContainersCmdExec()); } - @Override public CreateContainerCmd createContainerCmd(String image) { return new CreateContainerCmdImpl(getDockerCmdExecFactory() .createCreateContainerCmdExec(), image); } - @Override public StartContainerCmd startContainerCmd(String containerId) { return new StartContainerCmdImpl(getDockerCmdExecFactory() .createStartContainerCmdExec(), containerId); } - @Override public InspectContainerCmd inspectContainerCmd(String containerId) { return new InspectContainerCmdImpl(getDockerCmdExecFactory() .createInspectContainerCmdExec(), containerId); } - @Override public ExecCreateCmd execCreateCmd(String containerId) { return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); } - @Override public RemoveContainerCmd removeContainerCmd(String containerId) { return new RemoveContainerCmdImpl(getDockerCmdExecFactory() .createRemoveContainerCmdExec(), containerId); } - @Override public WaitContainerCmd waitContainerCmd(String containerId) { return new WaitContainerCmdImpl(getDockerCmdExecFactory() .createWaitContainerCmdExec(), containerId); } - @Override public AttachContainerCmd attachContainerCmd(String containerId) { return new AttachContainerCmdImpl(getDockerCmdExecFactory() .createAttachContainerCmdExec(), containerId); } - @Override public ExecStartCmd execStartCmd(String containerId) { return new ExecStartCmdImpl(getDockerCmdExecFactory().createExecStartCmdExec(), containerId); } - @Override public InspectExecCmd inspectExecCmd(String execId) { return new InspectExecCmdImpl(getDockerCmdExecFactory().createInspectExecCmdExec(), execId); } - @Override public LogContainerCmd logContainerCmd(String containerId) { return new LogContainerCmdImpl(getDockerCmdExecFactory() .createLogContainerCmdExec(), containerId); } + + - @Override public CopyFileFromContainerCmd copyFileFromContainerCmd( String containerId, String resource) { return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory() .createCopyFileFromContainerCmdExec(), containerId, resource); } - @Override public ContainerDiffCmd containerDiffCmd(String containerId) { return new ContainerDiffCmdImpl(getDockerCmdExecFactory() .createContainerDiffCmdExec(), containerId); } - @Override public StopContainerCmd stopContainerCmd(String containerId) { return new StopContainerCmdImpl(getDockerCmdExecFactory() .createStopContainerCmdExec(), containerId); } - @Override public KillContainerCmd killContainerCmd(String containerId) { return new KillContainerCmdImpl(getDockerCmdExecFactory() .createKillContainerCmdExec(), containerId); } - @Override public RestartContainerCmd restartContainerCmd(String containerId) { return new RestartContainerCmdImpl(getDockerCmdExecFactory() .createRestartContainerCmdExec(), containerId); } - @Override public CommitCmd commitCmd(String containerId) { return new CommitCmdImpl(getDockerCmdExecFactory() .createCommitCmdExec(), containerId); } - @Override public BuildImageCmd buildImageCmd() { return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() .createBuildImageCmdExec())); } - @Override public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() .createBuildImageCmdExec(), dockerFileOrFolder)); } - @Override public BuildImageCmd buildImageCmd(InputStream tarInputStream) { return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() .createBuildImageCmdExec(), tarInputStream)); @@ -317,39 +286,40 @@ private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) { return buildImageCmd; } - @Override + public TopContainerCmd topContainerCmd(String containerId) { return new TopContainerCmdImpl(getDockerCmdExecFactory() .createTopContainerCmdExec(), containerId); } - @Override public TagImageCmd tagImageCmd(String imageId, String repository, String tag) { return new TagImageCmdImpl(getDockerCmdExecFactory() .createTagImageCmdExec(), imageId, repository, tag); } - @Override public PauseContainerCmd pauseContainerCmd(String containerId) { return new PauseContainerCmdImpl(getDockerCmdExecFactory() .createPauseContainerCmdExec(), containerId); } - @Override + public UnpauseContainerCmd unpauseContainerCmd(String containerId) { return new UnpauseContainerCmdImpl(getDockerCmdExecFactory() .createUnpauseContainerCmdExec(), containerId); } - @Override + public StatsCmd statsCmd(String containerId) { + return new StatsCmdImpl(getDockerCmdExecFactory() + .createStatsCmdExec(), containerId); + } + public EventsCmd eventsCmd(EventCallback eventCallback) { return new EventsCmdImpl(getDockerCmdExecFactory() .createEventsCmdExec(), eventCallback); } - @Override public void close() throws IOException { getDockerCmdExecFactory().close(); } - + } diff --git a/src/main/java/com/github/dockerjava/core/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/StatsCmdImpl.java new file mode 100644 index 000000000..215825e33 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/StatsCmdImpl.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.core; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Stats; +import com.github.dockerjava.core.command.AbstrDockerCmd; + +/** + * @author Heng WU(wuheng09@otcaix.iscas.ac.cn) + * + */ +public class StatsCmdImpl extends AbstrDockerCmd implements + StatsCmd { + + private String containerId; + + public StatsCmdImpl(StatsCmd.Exec exec, String containerId) { + super(exec); + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + } + + public String getContainerId() { + return containerId; + } + + @Override + public String toString() { + return "stats"; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 3636bfd06..ccacb1f79 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -5,11 +5,6 @@ import java.io.IOException; import java.net.URI; -import com.github.dockerjava.api.command.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; @@ -22,20 +17,59 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.apache.connector.ApacheClientProperties; -//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; -// see https://github.com/docker-java/docker-java/issues/196 -import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.HttpUrlConnectorProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd.Exec; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.util.FollowRedirectsFilter; import com.github.dockerjava.core.util.JsonClientFilter; import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; import com.github.dockerjava.core.util.SelectiveLoggingFilter; - +//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +// see https://github.com/docker-java/docker-java/issues/196 +import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -44,12 +78,18 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private Client client; private WebTarget baseResource; - @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); + // clientConfig.connectorProvider(new ApacheConnectorProvider()); + // see #226 + // StatsCmd could create a live stream for one container. + // Unfortunately, ApacheConnector would perform a ChunkedInputStream call that results in the application blocking. + // The reason is org.apache.http.impl.io.ChunkedInputStream would NEVER closes the underlying stream, even when close + // gets called. Instead, it will read until the "end" of its chunking on close. + // see com.github.dockerjava.api.command.StatsCmdTest + clientConfig.connectorProvider(new HttpUrlConnectorProvider()); clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); @@ -141,182 +181,150 @@ protected WebTarget getBaseResource() { return baseResource; } - @Override public AuthCmd.Exec createAuthCmdExec() { return new AuthCmdExec(getBaseResource()); } - @Override public InfoCmd.Exec createInfoCmdExec() { return new InfoCmdExec(getBaseResource()); } - @Override public PingCmd.Exec createPingCmdExec() { return new PingCmdExec(getBaseResource()); } - @Override public VersionCmd.Exec createVersionCmdExec() { return new VersionCmdExec(getBaseResource()); } - @Override public PullImageCmd.Exec createPullImageCmdExec() { return new PullImageCmdExec(getBaseResource()); } - @Override public PushImageCmd.Exec createPushImageCmdExec() { return new PushImageCmdExec(getBaseResource()); } - @Override public SaveImageCmd.Exec createSaveImageCmdExec() { return new SaveImageCmdExec(getBaseResource()); } - @Override public CreateImageCmd.Exec createCreateImageCmdExec() { return new CreateImageCmdExec(getBaseResource()); } - @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { return new SearchImagesCmdExec(getBaseResource()); } - @Override public RemoveImageCmd.Exec createRemoveImageCmdExec() { return new RemoveImageCmdExec(getBaseResource()); } - @Override public ListImagesCmd.Exec createListImagesCmdExec() { return new ListImagesCmdExec(getBaseResource()); } - @Override public InspectImageCmd.Exec createInspectImageCmdExec() { return new InspectImageCmdExec(getBaseResource()); } - @Override public ListContainersCmd.Exec createListContainersCmdExec() { return new ListContainersCmdExec(getBaseResource()); } - @Override public CreateContainerCmd.Exec createCreateContainerCmdExec() { return new CreateContainerCmdExec(getBaseResource()); } - @Override public StartContainerCmd.Exec createStartContainerCmdExec() { return new StartContainerCmdExec(getBaseResource()); } - @Override public InspectContainerCmd.Exec createInspectContainerCmdExec() { return new InspectContainerCmdExec(getBaseResource()); } - @Override public ExecCreateCmd.Exec createExecCmdExec() { return new ExecCreateCmdExec(getBaseResource()); } - @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { return new RemoveContainerCmdExec(getBaseResource()); } - @Override public WaitContainerCmd.Exec createWaitContainerCmdExec() { return new WaitContainerCmdExec(getBaseResource()); } - @Override public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource()); } - @Override public ExecStartCmd.Exec createExecStartCmdExec() { return new ExecStartCmdExec(getBaseResource()); } - @Override public InspectExecCmd.Exec createInspectExecCmdExec() { return new InspectExecCmdExec(getBaseResource()); } - @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return new LogContainerCmdExec(getBaseResource()); } - @Override public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { return new CopyFileFromContainerCmdExec(getBaseResource()); } - @Override public StopContainerCmd.Exec createStopContainerCmdExec() { return new StopContainerCmdExec(getBaseResource()); } - @Override public ContainerDiffCmd.Exec createContainerDiffCmdExec() { return new ContainerDiffCmdExec(getBaseResource()); } - @Override public KillContainerCmd.Exec createKillContainerCmdExec() { return new KillContainerCmdExec(getBaseResource()); } - @Override public RestartContainerCmd.Exec createRestartContainerCmdExec() { return new RestartContainerCmdExec(getBaseResource()); } - @Override public CommitCmd.Exec createCommitCmdExec() { return new CommitCmdExec(getBaseResource()); } - @Override public BuildImageCmd.Exec createBuildImageCmdExec() { return new BuildImageCmdExec(getBaseResource()); } - @Override public TopContainerCmd.Exec createTopContainerCmdExec() { return new TopContainerCmdExec(getBaseResource()); } - @Override public TagImageCmd.Exec createTagImageCmdExec() { return new TagImageCmdExec(getBaseResource()); } - @Override public PauseContainerCmd.Exec createPauseContainerCmdExec() { return new PauseContainerCmdExec(getBaseResource()); } - @Override public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { return new UnpauseContainerCmdExec(baseResource); } - @Override public EventsCmd.Exec createEventsCmdExec() { return new EventsCmdExec(getBaseResource()); } - @Override + public Exec createStatsCmdExec() { + return new StatsCmdExec(getBaseResource()); + } + public void close() throws IOException { checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java new file mode 100644 index 000000000..64bcaceda --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -0,0 +1,45 @@ +package com.github.dockerjava.jaxrs; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.JerseyInvocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Stats; + +/** + * @author Heng WU(wuheng09@otcaix.iscas.ac.cn) + * + */ +public class StatsCmdExec extends AbstrDockerCmdExec implements + StatsCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(StatsCmdExec.class); + + public StatsCmdExec(WebTarget baseResource) { + super(baseResource); + } + + protected Stats execute(StatsCmd command) { + WebTarget webResource = getBaseResource() + .path("/containers/{id}/stats").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + JerseyInvocation.Builder request = (JerseyInvocation.Builder) webResource.request(); + // see #221 + // This call would results in the application blocking if container is shutdown. + // So we need timeout settings + // see com.github.dockerjava.api.command.StatsCmdTest + request.property(ClientProperties.READ_TIMEOUT, 5000); + return request.accept(MediaType.APPLICATION_JSON) + .get(Stats.class); + } + + +} diff --git a/src/test/java/com/github/dockerjava/api/command/StatsCmdTest.java b/src/test/java/com/github/dockerjava/api/command/StatsCmdTest.java new file mode 100644 index 000000000..d5caeb9a6 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/command/StatsCmdTest.java @@ -0,0 +1,67 @@ +package com.github.dockerjava.api.command; + +import java.io.IOException; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.glassfish.jersey.client.JerseyClient; +import org.glassfish.jersey.client.JerseyClientBuilder; + +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Stats; +import com.github.dockerjava.core.DockerClientBuilder; + +/** + * @author Heng WU(wuheng09@otcaix.iscas.ac.cn) + * + * if container is not exist, throws com.github.dockerjava.api.NotFoundException + * if container is shutdown, throws java.net.SocketTimeoutException + * if container is startup, return Object Stats + */ +public class StatsCmdTest { + + final static String DOCKER_SERVER = "http://127.0.0.1:2375"; + + final static String STARTUP_CONTAINER_ID = "4b4fb43779bcc2cb4d5aad954dac99224ff1c2ea623cd95322ef657a5c2f2c36"; + + final static String SHUTDOWN_CONTAINER_ID = "c571b02e26d30e03dfc21829de618df440275c303fbddb384679a5949d0de5d0"; + + final static String NOT_EXIST_CONTAINER_ID = "test1234"; + + /** + * @param args + * @throws IOException + */ + public static void main(String[] args) throws IOException { + noramlStatsImplWithContainer(); +// simpleStatsImplWithContainer(); + } + + + private static void noramlStatsImplWithContainer() throws IOException { + DockerClient client = DockerClientBuilder.getInstance(DOCKER_SERVER) + .build(); + Stats stats = client.statsCmd(SHUTDOWN_CONTAINER_ID).exec(); + System.out.println("Read:" + stats.getRead()); + System.out.println("Cpu_stats:" + stats.getCpu_stats()); + System.out.println("Memory_stats:" + stats.getMemory_stats()); + client.close(); + } + + private static void simpleStatsImplWithContainer() { + JerseyClient jcli = new JerseyClientBuilder().build(); + jcli.register(JacksonJsonProvider.class); + WebTarget baseTar = jcli.target(DOCKER_SERVER); + WebTarget target = baseTar.path("/containers/" + SHUTDOWN_CONTAINER_ID + + "/stats"); + Stats stats = target.request().accept(MediaType.APPLICATION_JSON) + .get(Stats.class); + System.out.println("Read:" + stats.getRead()); + System.out.println("Cpu_stats:" + stats.getCpu_stats()); + System.out.println("Memory_stats:" + stats.getMemory_stats()); + jcli.close(); + } + +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 869a12fcf..82297cd26 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -30,20 +30,16 @@ public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { this.delegate = delegate; } - @Override public void init(DockerClientConfig dockerClientConfig) { delegate.init(dockerClientConfig); } - @Override public void close() throws IOException { delegate.close(); } - @Override public CreateContainerCmd.Exec createCreateContainerCmdExec() { return new CreateContainerCmd.Exec() { - @Override public CreateContainerResponse exec(CreateContainerCmd command) { CreateContainerResponse createContainerResponse = delegate .createCreateContainerCmdExec().exec(command); @@ -53,10 +49,8 @@ public CreateContainerResponse exec(CreateContainerCmd command) { }; } - @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { return new RemoveContainerCmd.Exec() { - @Override public Void exec(RemoveContainerCmd command) { delegate.createRemoveContainerCmdExec().exec(command); containerNames.remove(command.getContainerId()); @@ -65,10 +59,8 @@ public Void exec(RemoveContainerCmd command) { }; } - @Override public CreateImageCmd.Exec createCreateImageCmdExec() { return new CreateImageCmd.Exec() { - @Override public CreateImageResponse exec(CreateImageCmd command) { CreateImageResponse createImageResponse = delegate .createCreateImageCmdExec().exec(command); @@ -78,10 +70,8 @@ public CreateImageResponse exec(CreateImageCmd command) { }; } - @Override public RemoveImageCmd.Exec createRemoveImageCmdExec() { return new RemoveImageCmd.Exec() { - @Override public Void exec(RemoveImageCmd command) { delegate.createRemoveImageCmdExec().exec(command); imageNames.remove(command.getImageId()); @@ -90,10 +80,8 @@ public Void exec(RemoveImageCmd command) { }; } - @Override public BuildImageCmd.Exec createBuildImageCmdExec() { return new BuildImageCmd.Exec() { - @Override public BuildImageCmd.Response exec(BuildImageCmd command) { // can't detect image id here so tagging it String tag = command.getTag(); @@ -109,152 +97,122 @@ public BuildImageCmd.Response exec(BuildImageCmd command) { }; } - @Override public Exec createAuthCmdExec() { return delegate.createAuthCmdExec(); } - @Override public InfoCmd.Exec createInfoCmdExec() { return delegate.createInfoCmdExec(); } - @Override public PingCmd.Exec createPingCmdExec() { return delegate.createPingCmdExec(); } - @Override public ExecCreateCmd.Exec createExecCmdExec() { return delegate.createExecCmdExec(); } - @Override public VersionCmd.Exec createVersionCmdExec() { return delegate.createVersionCmdExec(); } - @Override public PullImageCmd.Exec createPullImageCmdExec() { return delegate.createPullImageCmdExec(); } - @Override public PushImageCmd.Exec createPushImageCmdExec() { return delegate.createPushImageCmdExec(); } - @Override public SaveImageCmd.Exec createSaveImageCmdExec() { return delegate.createSaveImageCmdExec(); } - @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { return delegate.createSearchImagesCmdExec(); } - @Override public ListImagesCmd.Exec createListImagesCmdExec() { return delegate.createListImagesCmdExec(); } - @Override public InspectImageCmd.Exec createInspectImageCmdExec() { return delegate.createInspectImageCmdExec(); } - @Override public ListContainersCmd.Exec createListContainersCmdExec() { return delegate.createListContainersCmdExec(); } - @Override public StartContainerCmd.Exec createStartContainerCmdExec() { return delegate.createStartContainerCmdExec(); } - @Override public InspectContainerCmd.Exec createInspectContainerCmdExec() { return delegate.createInspectContainerCmdExec(); } - @Override public WaitContainerCmd.Exec createWaitContainerCmdExec() { return delegate.createWaitContainerCmdExec(); } - @Override public AttachContainerCmd.Exec createAttachContainerCmdExec() { return delegate.createAttachContainerCmdExec(); } - @Override public ExecStartCmd.Exec createExecStartCmdExec() { return delegate.createExecStartCmdExec(); } - @Override public InspectExecCmd.Exec createInspectExecCmdExec() { return delegate.createInspectExecCmdExec(); } - @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } - @Override public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { return delegate.createCopyFileFromContainerCmdExec(); } - @Override public StopContainerCmd.Exec createStopContainerCmdExec() { return delegate.createStopContainerCmdExec(); } - @Override public ContainerDiffCmd.Exec createContainerDiffCmdExec() { return delegate.createContainerDiffCmdExec(); } - @Override public KillContainerCmd.Exec createKillContainerCmdExec() { return delegate.createKillContainerCmdExec(); } - @Override public RestartContainerCmd.Exec createRestartContainerCmdExec() { return delegate.createRestartContainerCmdExec(); } - @Override public CommitCmd.Exec createCommitCmdExec() { return delegate.createCommitCmdExec(); } - @Override public TopContainerCmd.Exec createTopContainerCmdExec() { return delegate.createTopContainerCmdExec(); } - @Override public TagImageCmd.Exec createTagImageCmdExec() { return delegate.createTagImageCmdExec(); } - @Override public PauseContainerCmd.Exec createPauseContainerCmdExec() { return delegate.createPauseContainerCmdExec(); } - @Override public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { return delegate.createUnpauseContainerCmdExec(); } - @Override public EventsCmd.Exec createEventsCmdExec() { return delegate.createEventsCmdExec(); } @@ -267,4 +225,8 @@ public List getImageNames() { return new ArrayList(imageNames); } + public StatsCmd.Exec createStatsCmdExec() { + return delegate.createStatsCmdExec(); + } + }