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 @@ -56,6 +56,7 @@
import com.github.dockerjava.api.command.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
import com.github.dockerjava.api.command.StatsCmd;
Expand Down Expand Up @@ -137,6 +138,12 @@ public interface DockerClient extends Closeable {
*/
SaveImageCmd saveImageCmd(@Nonnull String name);

/**
* Command to download multiple images at once.
* @return command (builder)
*/
SaveImagesCmd saveImagesCmd();

/**
* * CONTAINER API *
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public interface DockerCmdExecFactory extends Closeable {

SaveImageCmd.Exec createSaveImageCmdExec();

SaveImagesCmd.Exec createSaveImagesCmdExec();

CreateImageCmd.Exec createCreateImageCmdExec();

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

import com.github.dockerjava.api.exception.NotFoundException;

import javax.annotation.Nonnull;
import java.io.InputStream;
import java.util.List;

/** Command for downloading multiple images at once. */
public interface SaveImagesCmd extends SyncDockerCmd<InputStream> {

/** Image name and tag. */
interface TaggedImage {

/**
* The (tagged) image name.
* @return "name:tag" if a tag was specified, otherwise "name"
*/
String asString();
}

/**
* Adds an image to the list of images to download.
* @param name image name (not null)
* @param tag tag
* @return this
*/
SaveImagesCmd withImage(@Nonnull String name, @Nonnull String tag);


/**
* Gets the images that were added by {@link #withImage(String, String)}.
* @return images to be downloaded
*/
List<TaggedImage> getImages();

/**
* Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks.
*
* @throws NotFoundException no such image
*/
InputStream exec() throws NotFoundException;

interface Exec extends DockerCmdSyncExec<SaveImagesCmd, InputStream> {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import com.github.dockerjava.api.command.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
import com.github.dockerjava.api.command.StatsCmd;
Expand Down Expand Up @@ -130,6 +131,7 @@
import com.github.dockerjava.core.exec.RenameContainerCmdExec;
import com.github.dockerjava.core.exec.RestartContainerCmdExec;
import com.github.dockerjava.core.exec.SaveImageCmdExec;
import com.github.dockerjava.core.exec.SaveImagesCmdExec;
import com.github.dockerjava.core.exec.SearchImagesCmdExec;
import com.github.dockerjava.core.exec.StartContainerCmdExec;
import com.github.dockerjava.core.exec.StatsCmdExec;
Expand Down Expand Up @@ -207,6 +209,11 @@ public SaveImageCmd.Exec createSaveImageCmdExec() {
return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public SaveImagesCmd.Exec createSaveImagesCmdExec() {
return new SaveImagesCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import com.github.dockerjava.api.command.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
import com.github.dockerjava.api.command.StatsCmd;
Expand Down Expand Up @@ -133,6 +134,7 @@
import com.github.dockerjava.core.command.RenameContainerCmdImpl;
import com.github.dockerjava.core.command.RestartContainerCmdImpl;
import com.github.dockerjava.core.command.SaveImageCmdImpl;
import com.github.dockerjava.core.command.SaveImagesCmdImpl;
import com.github.dockerjava.core.command.SearchImagesCmdImpl;
import com.github.dockerjava.core.command.StartContainerCmdImpl;
import com.github.dockerjava.core.command.StatsCmdImpl;
Expand Down Expand Up @@ -283,6 +285,11 @@ public SaveImageCmd saveImageCmd(String name) {
return new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name);
}

@Override
public SaveImagesCmd saveImagesCmd() {
return new SaveImagesCmdImpl(getDockerCmdExecFactory().createSaveImagesCmdExec());
}

@Override
public CreateImageCmd createImageCmd(String repository, InputStream imageStream) {
return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.github.dockerjava.core.command;

import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.exception.NotFoundException;
import com.google.common.collect.ImmutableList;

import javax.annotation.Nonnull;
import java.io.InputStream;
import java.util.List;

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

public class SaveImagesCmdImpl extends AbstrDockerCmd<SaveImagesCmd, InputStream> implements SaveImagesCmd {

private static class TaggedImageImpl implements TaggedImage {
private final String name;
private final String tag;

private TaggedImageImpl(String name, String tag) {
checkNotNull(name, "image name was not specified");
checkNotNull(tag, "image tag was not specified");
this.name = name;
this.tag = tag;
}

@Override
public String asString() {
return name + ":" + tag;
}

@Override
public String toString() {
return asString();
}
}

private final ImmutableList.Builder<TaggedImage> taggedImages = ImmutableList.builder();

public SaveImagesCmdImpl(final SaveImagesCmd.Exec exec) {
super(exec);
}

@Override
public SaveImagesCmd withImage(@Nonnull final String name, @Nonnull final String tag) {
taggedImages.add(new TaggedImageImpl(name, tag));
return this;
}



@Override
public List<TaggedImage> getImages() {
return taggedImages.build();
}

/**
* @throws NotFoundException No such images
*/
@Override
public InputStream exec() throws NotFoundException {
return super.exec();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.dockerjava.core.exec;

import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.MediaType;
import com.github.dockerjava.core.WebTarget;
import com.google.common.collect.ImmutableSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.List;

public class SaveImagesCmdExec extends AbstrSyncDockerCmdExec<SaveImagesCmd, InputStream> implements SaveImagesCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(SaveImagesCmdExec.class);

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

@Override
protected InputStream execute(SaveImagesCmd command) {

final List<SaveImagesCmd.TaggedImage> images = command.getImages();
if (images.isEmpty()) {
LOGGER.warn("No images specified for " + SaveImagesCmd.class.getName() + ".");
}
final ImmutableSet.Builder<String> queryParamSet = ImmutableSet.builder();
for (SaveImagesCmd.TaggedImage image : images) {
queryParamSet.add(image.asString());
}
final WebTarget webResource = getBaseResource()
.path("/images/get")
.queryParamsSet("names", queryParamSet.build());

LOGGER.trace("GET: {}", webResource);
return webResource.request().accept(MediaType.APPLICATION_JSON).get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.github.dockerjava.cmd;

import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.not;

public class SaveImagesCmdIT extends CmdIT {
public static final Logger LOG = LoggerFactory.getLogger(SaveImagesCmdIT.class);

@Test
public void saveNoImages() throws Exception {
try(final InputStream image = IOUtils.toBufferedInputStream(dockerRule.getClient().saveImagesCmd().exec())){
assertThat(image.read(), not(-1));
}

}

@Test
public void saveImagesWithNameAndTag() throws Exception {

try(final InputStream image = IOUtils.toBufferedInputStream(dockerRule.getClient().saveImagesCmd().withImage("busybox", "latest").exec())) {
assertThat(image.read(), not(-1));
}

}

@Test
public void saveMultipleImages() throws Exception {

try(final InputStream image = IOUtils.toBufferedInputStream(dockerRule.getClient().saveImagesCmd()
// Not a real life use-case but "busybox" is the only one I dare to assume is really there.
.withImage("busybox", "latest")
.withImage("busybox", "latest")
.exec())) {
assertThat(image.read(), not(-1));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import com.github.dockerjava.api.command.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
import com.github.dockerjava.api.command.StatsCmd;
Expand Down Expand Up @@ -215,6 +216,11 @@ public SaveImageCmd.Exec createSaveImageCmdExec() {
return delegate.createSaveImageCmdExec();
}

@Override
public SaveImagesCmd.Exec createSaveImagesCmdExec() {
return delegate.createSaveImagesCmdExec();
}

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return delegate.createSearchImagesCmdExec();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import com.github.dockerjava.api.command.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SaveImagesCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
import com.github.dockerjava.api.command.StatsCmd;
Expand Down Expand Up @@ -133,6 +134,11 @@ public SaveImageCmd.Exec createSaveImageCmdExec() {
return delegate.createSaveImageCmdExec();
}

@Override
public SaveImagesCmd.Exec createSaveImagesCmdExec() {
return delegate.createSaveImagesCmdExec();
}

@Override
public CreateImageCmd.Exec createCreateImageCmdExec() {
return delegate.createCreateImageCmdExec();
Expand Down