Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
Expand Down Expand Up @@ -131,6 +132,8 @@ public interface DockerClient extends Closeable {
*/
LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);

LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream);

SearchImagesCmd searchImagesCmd(@Nonnull String term);

RemoveImageCmd removeImageCmd(@Nonnull String imageId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
Expand Down Expand Up @@ -153,6 +154,11 @@ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
return getDockerClient().loadImageCmd(imageStream);
}

@Override
public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) {
return getDockerClient().loadImageAsyncCmd(imageStream);
}

@Override
public SearchImagesCmd searchImagesCmd(@Nonnull String term) {
return getDockerClient().searchImagesCmd(term);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() {
return getDockerCmdExecFactory().createLoadImageCmdExec();
}

@Override
public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() {
return getDockerCmdExecFactory().createLoadImageAsyncCmdExec();
}

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return getDockerCmdExecFactory().createSearchImagesCmdExec();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public interface DockerCmdExecFactory extends Closeable {

LoadImageCmd.Exec createLoadImageCmdExec();

LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec();

SearchImagesCmd.Exec createSearchImagesCmdExec();

RemoveImageCmd.Exec createRemoveImageCmdExec();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.github.dockerjava.api.command;

import com.github.dockerjava.api.model.LoadResponseItem;

import java.io.InputStream;

public interface LoadImageAsyncCmd extends AsyncDockerCmd<LoadImageAsyncCmd, LoadResponseItem> {
InputStream getImageStream();

/**
* @param imageStream the InputStream of the tar file
*/
LoadImageAsyncCmd withImageStream(InputStream imageStream);

@Override
default LoadImageCallback start() {
return exec(new LoadImageCallback());
}

interface Exec extends DockerCmdAsyncExec<LoadImageAsyncCmd, LoadResponseItem> {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.github.dockerjava.api.command;

import com.github.dockerjava.api.async.ResultCallbackTemplate;
import com.github.dockerjava.api.exception.DockerClientException;
import com.github.dockerjava.api.model.LoadResponseItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoadImageCallback extends ResultCallbackTemplate<LoadImageCallback, LoadResponseItem> {

private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCallback.class);

private String message;

private String error;

@Override
public void onNext(LoadResponseItem item) {
if (item.isBuildSuccessIndicated()) {
this.message = item.getMessage();
} else if (item.isErrorIndicated()) {
this.error = item.getError();
}

LOGGER.debug(item.toString());
}

public String awaitMessage() {
try {
awaitCompletion();
} catch (InterruptedException e) {
throw new DockerClientException("", e);
}

return getMessage();
}

private String getMessage() {
if (this.message != null) {
return this.message;
}

if (this.error == null) {
throw new DockerClientException("Could not build image");
}

throw new DockerClientException("Could not build image: " + this.error);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.github.dockerjava.api.model;

import com.fasterxml.jackson.annotation.JsonIgnore;

public class LoadResponseItem extends ResponseItem {

private static final long serialVersionUID = 1L;

private static final String IMPORT_SUCCESS = "Loaded image:";

/**
* Returns whether the stream field indicates a successful build operation
*/
@JsonIgnore
public boolean isBuildSuccessIndicated() {
if (isErrorIndicated() || getStream() == null) {
return false;
}

return getStream().contains(IMPORT_SUCCESS);
}

@JsonIgnore
public String getMessage() {
if (!isBuildSuccessIndicated()) {
return null;
} else if (getStream().contains(IMPORT_SUCCESS)) {
return getStream();
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
Expand Down Expand Up @@ -101,6 +102,7 @@
import com.github.dockerjava.core.exec.ExecStartCmdExec;
import com.github.dockerjava.core.exec.InspectConfigCmdExec;
import com.github.dockerjava.core.exec.ListConfigsCmdExec;
import com.github.dockerjava.core.exec.LoadImageAsyncCmdExec;
import com.github.dockerjava.core.exec.RemoveConfigCmdExec;
import com.github.dockerjava.core.exec.ResizeContainerCmdExec;
import com.github.dockerjava.core.exec.ResizeExecCmdExec;
Expand Down Expand Up @@ -255,6 +257,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() {
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() {
return new LoadImageAsyncCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
Expand Down Expand Up @@ -127,6 +128,7 @@
import com.github.dockerjava.core.command.ListSwarmNodesCmdImpl;
import com.github.dockerjava.core.command.ListTasksCmdImpl;
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
import com.github.dockerjava.core.command.LoadImageAsyncCmdImpl;
import com.github.dockerjava.core.command.LoadImageCmdImpl;
import com.github.dockerjava.core.command.LogContainerCmdImpl;
import com.github.dockerjava.core.command.LogSwarmObjectImpl;
Expand Down Expand Up @@ -350,6 +352,11 @@ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
return new LoadImageCmdImpl(getDockerCmdExecFactory().createLoadImageCmdExec(), imageStream);
}

@Override
public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) {
return new LoadImageAsyncCmdImpl(getDockerCmdExecFactory().createLoadImageAsyncCmdExec(), imageStream);
}

@Override
public SearchImagesCmd searchImagesCmd(String term) {
return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.github.dockerjava.core.command;

import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.model.LoadResponseItem;

import java.io.IOException;
import java.io.InputStream;

import static com.google.common.base.Preconditions.checkNotNull;

public class LoadImageAsyncCmdImpl extends AbstrAsyncDockerCmd<LoadImageAsyncCmd, LoadResponseItem> implements LoadImageAsyncCmd {

private InputStream inputStream;

public LoadImageAsyncCmdImpl(LoadImageAsyncCmd.Exec exec, InputStream inputStream) {
super(exec);
this.inputStream = inputStream;
}

@Override
public InputStream getImageStream() {
return this.inputStream;
}

@Override
public LoadImageAsyncCmd withImageStream(InputStream imageStream) {
checkNotNull(imageStream, "imageStream was not specified");
this.inputStream = imageStream;
return this;
}

@Override
public void close() {
super.close();

try {
this.inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.github.dockerjava.core.exec;

import com.fasterxml.jackson.core.type.TypeReference;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.model.LoadResponseItem;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.WebTarget;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoadImageAsyncCmdExec extends AbstrAsyncDockerCmdExec<LoadImageAsyncCmd, LoadResponseItem> implements LoadImageAsyncCmd.Exec {

private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageAsyncCmdExec.class);

public LoadImageAsyncCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}

@Override
protected Void execute0(LoadImageAsyncCmd command, ResultCallback<LoadResponseItem> resultCallback) {
WebTarget webTarget = getBaseResource().path("/images/load");

LOGGER.trace("POST: {}", webTarget);

webTarget.request().post(new TypeReference<LoadResponseItem>() { }, resultCallback, command.getImageStream());

return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.dockerjava.cmd;

import com.github.dockerjava.api.command.LoadImageCallback;
import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.utils.TestResources;
import net.jcip.annotations.NotThreadSafe;
Expand Down Expand Up @@ -53,6 +54,19 @@ public void loadImageFromTar() throws Exception {
asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0")));
}

@Test
public void loadImageFromTarAsync() throws Exception {
try (InputStream uploadStream = Files.newInputStream(TestResources.getApiImagesLoadTestTarball())) {
dockerRule.getClient().loadImageAsyncCmd(uploadStream).exec(new LoadImageCallback()).awaitMessage();
}

final Image image = findImageWithId(expectedImageId, dockerRule.getClient().listImagesCmd().exec());

assertThat("Can't find expected image after loading from a tar archive!", image, notNullValue());
assertThat("Image after loading from a tar archive has wrong tags!",
asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0")));
}

private Image findImageWithId(final String id, final List<Image> images) {
for (Image image : images) {
if (id.equals(image.getId())) {
Expand Down