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
13 changes: 13 additions & 0 deletions src/main/java/com/github/dockerjava/api/DockerClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
Expand Down Expand Up @@ -90,6 +91,18 @@ public interface DockerClient extends Closeable {

CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream);

/**
* Loads a tarball with a set of images and tags into a Docker repository.
*
* Corresponds to POST /images/load API endpoint.
*
* @param imageStream
* stream of the tarball file
* @return created command
* @since {@link RemoteApiVersion#VERSION_1_7}
*/
LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When this feature appeared in docker API? Could you place javadoc with since (example could be found through search) ?


SearchImagesCmd searchImagesCmd(@Nonnull String term);

RemoveImageCmd removeImageCmd(@Nonnull String imageId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public interface DockerCmdExecFactory extends Closeable {

CreateImageCmd.Exec createCreateImageCmdExec();

LoadImageCmd.Exec createLoadImageCmdExec();

SearchImagesCmd.Exec createSearchImagesCmdExec();

RemoveImageCmd.Exec createRemoveImageCmdExec();
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.github.dockerjava.api.command;

import java.io.InputStream;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

public interface LoadImageCmd extends SyncDockerCmd<Void> {

@CheckForNull
InputStream getImageStream();

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

interface Exec extends DockerCmdSyncExec<LoadImageCmd, Void> {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
Expand Down Expand Up @@ -89,6 +90,7 @@
import com.github.dockerjava.core.command.ListImagesCmdImpl;
import com.github.dockerjava.core.command.ListNetworksCmdImpl;
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
import com.github.dockerjava.core.command.LoadImageCmdImpl;
import com.github.dockerjava.core.command.LogContainerCmdImpl;
import com.github.dockerjava.core.command.PauseContainerCmdImpl;
import com.github.dockerjava.core.command.PingCmdImpl;
Expand Down Expand Up @@ -249,6 +251,11 @@ public CreateImageCmd createImageCmd(String repository, InputStream imageStream)
return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream);
}

@Override
public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
return new LoadImageCmdImpl(getDockerCmdExecFactory().createLoadImageCmdExec(), 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
Expand Up @@ -22,6 +22,11 @@ public class RemoteApiVersion implements Serializable {

private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)");

/**
* Online documentation is not available anymore.
*/
public static final RemoteApiVersion VERSION_1_7 = RemoteApiVersion.create(1, 7);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sinde docker 1.7 or 1.7 API?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

found


/**
* @see <a href="http://docs.docker.com/engine/reference/api/docker_remote_api_v1.16/">Docker API 1.16</a>
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.dockerjava.core.command;

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

import java.io.InputStream;

import com.github.dockerjava.api.command.LoadImageCmd;

import javax.annotation.Nonnull;

public class LoadImageCmdImpl extends AbstrDockerCmd<LoadImageCmd, Void> implements LoadImageCmd {

private InputStream imageStream;

/**
* @param imageStream
* the InputStream of the tar file
*/
public LoadImageCmdImpl(LoadImageCmd.Exec exec, InputStream imageStream) {
super(exec);
withImageStream(imageStream);
}

@Override
public InputStream getImageStream() {
return imageStream;
}

/**
* @param imageStream
* the InputStream of the tar file
*/
@Override
public LoadImageCmdImpl withImageStream(@Nonnull InputStream imageStream) {
checkNotNull(imageStream, "imageStream was not specified");
this.imageStream = imageStream;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
Expand Down Expand Up @@ -322,6 +323,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public LoadImageCmd.Exec createLoadImageCmdExec() {
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/com/github/dockerjava/jaxrs/LoadImageCmdExec.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.github.dockerjava.jaxrs;

import static javax.ws.rs.client.Entity.entity;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.core.DockerClientConfig;

public class LoadImageCmdExec extends AbstrSyncDockerCmdExec<LoadImageCmd, Void> implements LoadImageCmd.Exec {

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

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

@Override
protected Void execute(LoadImageCmd command) {
WebTarget webTarget = getBaseResource().path("/images/load");

LOGGER.trace("POST: {}", webTarget);
webTarget.request().post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM));

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
Expand Down Expand Up @@ -82,6 +83,7 @@
import com.github.dockerjava.netty.exec.ListImagesCmdExec;
import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
import com.github.dockerjava.netty.exec.LoadImageCmdExec;
import com.github.dockerjava.netty.exec.LogContainerCmdExec;
import com.github.dockerjava.netty.exec.PauseContainerCmdExec;
import com.github.dockerjava.netty.exec.PingCmdExec;
Expand Down Expand Up @@ -366,6 +368,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public LoadImageCmd.Exec createLoadImageCmdExec() {
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.github.dockerjava.netty.exec;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.core.type.TypeReference;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.netty.WebTarget;

public class LoadImageCmdExec extends AbstrSyncDockerCmdExec<LoadImageCmd, Void> implements
LoadImageCmd.Exec {

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

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

@Override
protected Void execute(LoadImageCmd command) {
WebTarget webResource = getBaseResource().path("/images/load");

LOGGER.trace("POST: {}", webResource);
return webResource.request()
.post(new TypeReference<Void>() {
}, command.getImageStream());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
Expand Down Expand Up @@ -131,6 +132,17 @@ public CreateImageResponse exec(CreateImageCmd command) {
};
}

@Override
public LoadImageCmd.Exec createLoadImageCmdExec() {
return new LoadImageCmd.Exec() {
@Override
public Void exec(LoadImageCmd command) {
delegate.createLoadImageCmdExec().exec(command);
return null;
}
};
}

@Override
public RemoveImageCmd.Exec createRemoveImageCmdExec() {
return new RemoveImageCmd.Exec() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.github.dockerjava.core.command;

import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.client.AbstractDockerClientTest;

import com.github.dockerjava.utils.TestResources;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.util.List;

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.hamcrest.core.IsEqual.equalTo;

@Test(groups = "integration")
public class LoadImageCmdImplTest extends AbstractDockerClientTest {

private String expectedImageId;

@BeforeTest
public void beforeTest() throws Exception {
super.beforeTest();
}

@AfterTest
public void afterTest() {
super.afterTest();
}

@BeforeMethod
public void beforeMethod(Method method) {
super.beforeMethod(method);
expectedImageId = "sha256:56031f66eb0cef2e2e5cb2d1dabafaa0ebcd0a18a507d313b5bdb8c0472c5eba";
if (findImageWithId(expectedImageId, dockerClient.listImagesCmd().exec()) != null) {
dockerClient.removeImageCmd(expectedImageId).exec();
}
}

@AfterMethod
public void afterMethod(ITestResult result) {
dockerClient.removeImageCmd(expectedImageId).exec();
super.afterMethod(result);
}

@Test
public void loadImageFromTar() throws Exception {
try (InputStream uploadStream = Files.newInputStream(TestResources.getApiImagesLoadTestTarball())) {
dockerClient.loadImageCmd(uploadStream).exec();
}

final Image image = findImageWithId(expectedImageId, dockerClient.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())) {
return image;
}
}
return null;
}
}
Loading