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
2 changes: 2 additions & 0 deletions src/main/java/com/github/dockerjava/api/DockerClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public CreateImageCmd createImageCmd(String repository,
public ListImagesCmd listImagesCmd();

public InspectImageCmd inspectImageCmd(String imageId);

public SaveImageCmd saveImageCmd(String name);

/**
* * CONTAINER API *
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public interface DockerCmdExecFactory extends Closeable {
public PullImageCmd.Exec createPullImageCmdExec();

public PushImageCmd.Exec createPushImageCmdExec();

public SaveImageCmd.Exec createSaveImageCmdExec();

public CreateImageCmd.Exec createCreateImageCmdExec();

Expand Down
39 changes: 39 additions & 0 deletions src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.dockerjava.api.command;

import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.PushEventStreamItem;

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

public interface SaveImageCmd extends DockerCmd<InputStream>{

public String getName();

public String getTag();

/**
* @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
*/
public SaveImageCmd withName(String name);

/**
* @param tag The image's tag. Not null.
*/
public SaveImageCmd withTag(String tag);

public AuthConfig getAuthConfig();

public SaveImageCmd withAuthConfig(AuthConfig authConfig);

/**
* @throws com.github.dockerjava.api.NotFoundException No such image
*/
public InputStream exec() throws NotFoundException;

public static interface Exec extends DockerCmdExec<SaveImageCmd, InputStream> {
}


}
77 changes: 9 additions & 68 deletions src/main/java/com/github/dockerjava/core/DockerClientImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,75 +8,9 @@
import java.io.InputStream;

import com.github.dockerjava.api.DockerClient;
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.EventCallback;
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.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.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
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.api.command.*;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.core.command.AttachContainerCmdImpl;
import com.github.dockerjava.core.command.AuthCmdImpl;
import com.github.dockerjava.core.command.BuildImageCmdImpl;
import com.github.dockerjava.core.command.CommitCmdImpl;
import com.github.dockerjava.core.command.ContainerDiffCmdImpl;
import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl;
import com.github.dockerjava.core.command.CreateContainerCmdImpl;
import com.github.dockerjava.core.command.CreateImageCmdImpl;
import com.github.dockerjava.core.command.EventsCmdImpl;
import com.github.dockerjava.core.command.ExecCreateCmdImpl;
import com.github.dockerjava.core.command.ExecStartCmdImpl;
import com.github.dockerjava.core.command.InfoCmdImpl;
import com.github.dockerjava.core.command.InspectContainerCmdImpl;
import com.github.dockerjava.core.command.InspectImageCmdImpl;
import com.github.dockerjava.core.command.KillContainerCmdImpl;
import com.github.dockerjava.core.command.ListContainersCmdImpl;
import com.github.dockerjava.core.command.ListImagesCmdImpl;
import com.github.dockerjava.core.command.LogContainerCmdImpl;
import com.github.dockerjava.core.command.PauseContainerCmdImpl;
import com.github.dockerjava.core.command.PingCmdImpl;
import com.github.dockerjava.core.command.PullImageCmdImpl;
import com.github.dockerjava.core.command.PushImageCmdImpl;
import com.github.dockerjava.core.command.RemoveContainerCmdImpl;
import com.github.dockerjava.core.command.RemoveImageCmdImpl;
import com.github.dockerjava.core.command.RestartContainerCmdImpl;
import com.github.dockerjava.core.command.SearchImagesCmdImpl;
import com.github.dockerjava.core.command.StartContainerCmdImpl;
import com.github.dockerjava.core.command.StopContainerCmdImpl;
import com.github.dockerjava.core.command.TagImageCmdImpl;
import com.github.dockerjava.core.command.TopContainerCmdImpl;
import com.github.dockerjava.core.command.UnpauseContainerCmdImpl;
import com.github.dockerjava.core.command.VersionCmdImpl;
import com.github.dockerjava.core.command.WaitContainerCmdImpl;
import com.github.dockerjava.core.command.*;

/**
* @author Konstantin Pelykh ([email protected])
Expand Down Expand Up @@ -195,6 +129,13 @@ public PushImageCmd pushImageCmd(String name) {
return new PushImageCmdImpl(getDockerCmdExecFactory()
.createPushImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name));
}

@Override
public SaveImageCmd saveImageCmd(String name) {
return new SaveImageCmdImpl(getDockerCmdExecFactory()
.createSaveImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name));

}

@Override
public CreateImageCmd createImageCmd(String repository,
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.NotFoundException;
import com.github.dockerjava.api.command.SaveImageCmd;

import java.io.InputStream;

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

public class SaveImageCmdImpl extends AbstrAuthCfgDockerCmd<SaveImageCmd, InputStream> implements SaveImageCmd {
private String name;
private String tag;

public SaveImageCmdImpl(SaveImageCmd.Exec exec, String name) {
super(exec);
withName(name);
}

@Override
public String getName() {
return name;
}

@Override
public String getTag() {
return tag;
}

/**
* @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
*/
@Override
public SaveImageCmd withName(String name) {
checkNotNull(name, "name was not specified");
this.name = name;
return this;
}

/**
* @param tag The image's tag. Can be null or empty.
*/
@Override
public SaveImageCmd withTag(String tag) {
checkNotNull(tag, "tag was not specified");
this.tag = tag;
return this;
}

@Override
public String toString() {
return new StringBuilder("get ")
.append(name)
.toString();
}

/**
* @throws com.github.dockerjava.api.NotFoundException No such image
*/
@Override
public InputStream exec() throws NotFoundException {
return super.exec();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.io.IOException;
import java.net.URI;

import com.github.dockerjava.api.command.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -26,40 +27,6 @@

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.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.SearchImagesCmd;
import com.github.dockerjava.api.command.StartContainerCmd;
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.JsonClientFilter;
import com.github.dockerjava.core.util.ResponseStatusExceptionFilter;
Expand Down Expand Up @@ -170,6 +137,9 @@ public PullImageCmd.Exec createPullImageCmdExec() {
public PushImageCmd.Exec createPushImageCmdExec() {
return new PushImageCmdExec(getBaseResource());
}

@Override
public SaveImageCmd.Exec createSaveImageCmdExec() { return new SaveImageCmdExec(getBaseResource()); }

@Override
public CreateImageCmd.Exec createCreateImageCmdExec() {
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.github.dockerjava.jaxrs;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.github.dockerjava.api.command.PushImageCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.PushEventStreamItem;
import jersey.repackaged.com.google.common.collect.ImmutableList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

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

public class SaveImageCmdExec extends AbstrDockerCmdExec<SaveImageCmd, InputStream> implements SaveImageCmd.Exec {
private static final Logger LOGGER = LoggerFactory
.getLogger(PushImageCmdExec.class);

public SaveImageCmdExec(WebTarget baseResource) {
super(baseResource);
}

@Override
protected InputStream execute(SaveImageCmd command) {
WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get")
.queryParam("tag", command.getTag());

final String registryAuth = registryAuth(command.getAuthConfig());
LOGGER.trace("GET: {}", webResource);
InputStream is = webResource
.request()
.header("X-Registry-Auth", registryAuth)
.accept(MediaType.APPLICATION_JSON)
.get().readEntity(InputStream.class);

return is;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ public PullImageCmd.Exec createPullImageCmdExec() {
public PushImageCmd.Exec createPushImageCmdExec() {
return delegate.createPushImageCmdExec();
}

@Override
public SaveImageCmd.Exec createSaveImageCmdExec() { return delegate.createSaveImageCmdExec(); }

@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.github.dockerjava.core.command;

import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.client.AbstractDockerClientTest;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.BufferedInputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;

@Test(groups = "integration")
public class SaveImageCmdImplTest extends AbstractDockerClientTest {
public static final Logger LOG = LoggerFactory
.getLogger(PushImageCmdImplTest.class);

String username;

@BeforeTest
public void beforeTest() throws DockerException {
super.beforeTest();
}
@AfterTest
public void afterTest() {
super.afterTest();
}

@BeforeMethod
public void beforeMethod(Method method) {
super.beforeMethod(method);
}

@AfterMethod
public void afterMethod(ITestResult result) {
super.afterMethod(result);
}

@Test
public void saveImage() throws Exception {

InputStream image = IOUtils.toBufferedInputStream(dockerClient
.saveImageCmd("busybox").exec());
assertThat(image.available(), greaterThan(0));

}

}