Skip to content

Commit d803c46

Browse files
leonsabrKostyaSha
authored andcommitted
Implement POST /images/load endpoint (docker-java#627)
1 parent 2f50240 commit d803c46

File tree

15 files changed

+338
-0
lines changed

15 files changed

+338
-0
lines changed

src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.github.dockerjava.api.command.ListImagesCmd;
3636
import com.github.dockerjava.api.command.ListNetworksCmd;
3737
import com.github.dockerjava.api.command.ListVolumesCmd;
38+
import com.github.dockerjava.api.command.LoadImageCmd;
3839
import com.github.dockerjava.api.command.LogContainerCmd;
3940
import com.github.dockerjava.api.command.PauseContainerCmd;
4041
import com.github.dockerjava.api.command.PingCmd;
@@ -90,6 +91,18 @@ public interface DockerClient extends Closeable {
9091

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

94+
/**
95+
* Loads a tarball with a set of images and tags into a Docker repository.
96+
*
97+
* Corresponds to POST /images/load API endpoint.
98+
*
99+
* @param imageStream
100+
* stream of the tarball file
101+
* @return created command
102+
* @since {@link RemoteApiVersion#VERSION_1_7}
103+
*/
104+
LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);
105+
93106
SearchImagesCmd searchImagesCmd(@Nonnull String term);
94107

95108
RemoveImageCmd removeImageCmd(@Nonnull String imageId);

src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public interface DockerCmdExecFactory extends Closeable {
2828

2929
CreateImageCmd.Exec createCreateImageCmdExec();
3030

31+
LoadImageCmd.Exec createLoadImageCmdExec();
32+
3133
SearchImagesCmd.Exec createSearchImagesCmdExec();
3234

3335
RemoveImageCmd.Exec createRemoveImageCmdExec();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import java.io.InputStream;
4+
5+
import javax.annotation.CheckForNull;
6+
import javax.annotation.Nonnull;
7+
8+
public interface LoadImageCmd extends SyncDockerCmd<Void> {
9+
10+
@CheckForNull
11+
InputStream getImageStream();
12+
13+
/**
14+
* @param imageStream
15+
* the InputStream of the tar file
16+
*/
17+
LoadImageCmd withImageStream(@Nonnull InputStream imageStream);
18+
19+
interface Exec extends DockerCmdSyncExec<LoadImageCmd, Void> {
20+
}
21+
}

src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.github.dockerjava.api.command.ListImagesCmd;
3838
import com.github.dockerjava.api.command.ListNetworksCmd;
3939
import com.github.dockerjava.api.command.ListVolumesCmd;
40+
import com.github.dockerjava.api.command.LoadImageCmd;
4041
import com.github.dockerjava.api.command.LogContainerCmd;
4142
import com.github.dockerjava.api.command.PauseContainerCmd;
4243
import com.github.dockerjava.api.command.PingCmd;
@@ -89,6 +90,7 @@
8990
import com.github.dockerjava.core.command.ListImagesCmdImpl;
9091
import com.github.dockerjava.core.command.ListNetworksCmdImpl;
9192
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
93+
import com.github.dockerjava.core.command.LoadImageCmdImpl;
9294
import com.github.dockerjava.core.command.LogContainerCmdImpl;
9395
import com.github.dockerjava.core.command.PauseContainerCmdImpl;
9496
import com.github.dockerjava.core.command.PingCmdImpl;
@@ -249,6 +251,11 @@ public CreateImageCmd createImageCmd(String repository, InputStream imageStream)
249251
return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream);
250252
}
251253

254+
@Override
255+
public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
256+
return new LoadImageCmdImpl(getDockerCmdExecFactory().createLoadImageCmdExec(), imageStream);
257+
}
258+
252259
@Override
253260
public SearchImagesCmd searchImagesCmd(String term) {
254261
return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term);

src/main/java/com/github/dockerjava/core/RemoteApiVersion.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ public class RemoteApiVersion implements Serializable {
2222

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

25+
/**
26+
* Online documentation is not available anymore.
27+
*/
28+
public static final RemoteApiVersion VERSION_1_7 = RemoteApiVersion.create(1, 7);
29+
2530
/**
2631
* @see <a href="http://docs.docker.com/engine/reference/api/docker_remote_api_v1.16/">Docker API 1.16</a>
2732
*/
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import static com.google.common.base.Preconditions.checkNotNull;
4+
5+
import java.io.InputStream;
6+
7+
import com.github.dockerjava.api.command.LoadImageCmd;
8+
9+
import javax.annotation.Nonnull;
10+
11+
public class LoadImageCmdImpl extends AbstrDockerCmd<LoadImageCmd, Void> implements LoadImageCmd {
12+
13+
private InputStream imageStream;
14+
15+
/**
16+
* @param imageStream
17+
* the InputStream of the tar file
18+
*/
19+
public LoadImageCmdImpl(LoadImageCmd.Exec exec, InputStream imageStream) {
20+
super(exec);
21+
withImageStream(imageStream);
22+
}
23+
24+
@Override
25+
public InputStream getImageStream() {
26+
return imageStream;
27+
}
28+
29+
/**
30+
* @param imageStream
31+
* the InputStream of the tar file
32+
*/
33+
@Override
34+
public LoadImageCmdImpl withImageStream(@Nonnull InputStream imageStream) {
35+
checkNotNull(imageStream, "imageStream was not specified");
36+
this.imageStream = imageStream;
37+
return this;
38+
}
39+
}

src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import com.github.dockerjava.api.command.ListImagesCmd;
6464
import com.github.dockerjava.api.command.ListNetworksCmd;
6565
import com.github.dockerjava.api.command.ListVolumesCmd;
66+
import com.github.dockerjava.api.command.LoadImageCmd;
6667
import com.github.dockerjava.api.command.LogContainerCmd;
6768
import com.github.dockerjava.api.command.PauseContainerCmd;
6869
import com.github.dockerjava.api.command.PingCmd;
@@ -322,6 +323,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
322323
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
323324
}
324325

326+
@Override
327+
public LoadImageCmd.Exec createLoadImageCmdExec() {
328+
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
329+
}
330+
325331
@Override
326332
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
327333
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.dockerjava.jaxrs;
2+
3+
import static javax.ws.rs.client.Entity.entity;
4+
5+
import javax.ws.rs.client.WebTarget;
6+
import javax.ws.rs.core.MediaType;
7+
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import com.github.dockerjava.api.command.LoadImageCmd;
12+
import com.github.dockerjava.core.DockerClientConfig;
13+
14+
public class LoadImageCmdExec extends AbstrSyncDockerCmdExec<LoadImageCmd, Void> implements LoadImageCmd.Exec {
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCmdExec.class);
17+
18+
public LoadImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
19+
super(baseResource, dockerClientConfig);
20+
}
21+
22+
@Override
23+
protected Void execute(LoadImageCmd command) {
24+
WebTarget webTarget = getBaseResource().path("/images/load");
25+
26+
LOGGER.trace("POST: {}", webTarget);
27+
webTarget.request().post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM));
28+
29+
return null;
30+
}
31+
}

src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.github.dockerjava.api.command.ListImagesCmd;
3030
import com.github.dockerjava.api.command.ListNetworksCmd;
3131
import com.github.dockerjava.api.command.ListVolumesCmd;
32+
import com.github.dockerjava.api.command.LoadImageCmd;
3233
import com.github.dockerjava.api.command.LogContainerCmd;
3334
import com.github.dockerjava.api.command.PauseContainerCmd;
3435
import com.github.dockerjava.api.command.PingCmd;
@@ -82,6 +83,7 @@
8283
import com.github.dockerjava.netty.exec.ListImagesCmdExec;
8384
import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
8485
import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
86+
import com.github.dockerjava.netty.exec.LoadImageCmdExec;
8587
import com.github.dockerjava.netty.exec.LogContainerCmdExec;
8688
import com.github.dockerjava.netty.exec.PauseContainerCmdExec;
8789
import com.github.dockerjava.netty.exec.PingCmdExec;
@@ -366,6 +368,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
366368
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
367369
}
368370

371+
@Override
372+
public LoadImageCmd.Exec createLoadImageCmdExec() {
373+
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
374+
}
375+
369376
@Override
370377
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
371378
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.dockerjava.netty.exec;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import com.fasterxml.jackson.core.type.TypeReference;
7+
import com.github.dockerjava.api.command.LoadImageCmd;
8+
import com.github.dockerjava.core.DockerClientConfig;
9+
import com.github.dockerjava.netty.WebTarget;
10+
11+
public class LoadImageCmdExec extends AbstrSyncDockerCmdExec<LoadImageCmd, Void> implements
12+
LoadImageCmd.Exec {
13+
14+
private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCmdExec.class);
15+
16+
public LoadImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
17+
super(baseResource, dockerClientConfig);
18+
}
19+
20+
@Override
21+
protected Void execute(LoadImageCmd command) {
22+
WebTarget webResource = getBaseResource().path("/images/load");
23+
24+
LOGGER.trace("POST: {}", webResource);
25+
return webResource.request()
26+
.post(new TypeReference<Void>() {
27+
}, command.getImageStream());
28+
}
29+
}

0 commit comments

Comments
 (0)