Skip to content

Commit 61bcaa7

Browse files
author
Marcus Linke
committed
Introduce InspectContainerResponse.Mounts Fix issue docker-java#388
1 parent 6bea0f5 commit 61bcaa7

File tree

7 files changed

+146
-43
lines changed

7 files changed

+146
-43
lines changed

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

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Map;
55

66
import com.github.dockerjava.core.RemoteApiVersion;
7+
78
import org.apache.commons.lang.builder.EqualsBuilder;
89
import org.apache.commons.lang.builder.HashCodeBuilder;
910
import org.apache.commons.lang.builder.ToStringBuilder;
@@ -14,6 +15,7 @@
1415
import com.github.dockerjava.api.model.ContainerConfig;
1516
import com.github.dockerjava.api.model.HostConfig;
1617
import com.github.dockerjava.api.model.Ports;
18+
import com.github.dockerjava.api.model.Volume;
1719
import com.github.dockerjava.api.model.VolumeBind;
1820
import com.github.dockerjava.api.model.VolumeBinds;
1921
import com.github.dockerjava.api.model.VolumeRW;
@@ -89,6 +91,9 @@ public class InspectContainerResponse {
8991
@JsonProperty("VolumesRW")
9092
private VolumesRW volumesRW;
9193

94+
@JsonProperty("Mounts")
95+
private List<Mount> mounts;
96+
9297
public String getId() {
9398
return id;
9499
}
@@ -134,7 +139,12 @@ public VolumeBind[] getVolumes() {
134139
return volumes == null ? null : volumes.getBinds();
135140
}
136141

142+
/**
143+
* @deprecated As of {@link RemoteApiVersion#VERSION_1_20}
144+
* use {@link #getMounts()} instead
145+
*/
137146
@JsonIgnore
147+
@Deprecated
138148
public VolumeRW[] getVolumesRW() {
139149
return volumesRW == null ? null : volumesRW.getVolumesRW();
140150
}
@@ -167,6 +177,10 @@ public String getMountLabel() {
167177
return mountLabel;
168178
}
169179

180+
public List<Mount> getMounts() {
181+
return mounts;
182+
}
183+
170184
public List<String> getExecIds() {
171185
return execIds;
172186
}
@@ -413,4 +427,81 @@ public String toString() {
413427
}
414428
}
415429

430+
@JsonIgnoreProperties(ignoreUnknown = true)
431+
public static class Mount {
432+
433+
/**
434+
* @since {@link RemoteApiVersion#VERSION_1_20}
435+
*/
436+
@CheckForNull
437+
@JsonProperty("Name")
438+
private String name;
439+
440+
/**
441+
* @since {@link RemoteApiVersion#VERSION_1_20}
442+
*/
443+
@CheckForNull
444+
@JsonProperty("Source")
445+
private String source;
446+
447+
/**
448+
* @since {@link RemoteApiVersion#VERSION_1_20}
449+
*/
450+
@CheckForNull
451+
@JsonProperty("Destination")
452+
private Volume destination;
453+
454+
/**
455+
* @since {@link RemoteApiVersion#VERSION_1_20}
456+
*/
457+
@CheckForNull
458+
@JsonProperty("Driver")
459+
private String driver;
460+
461+
/**
462+
* @since {@link RemoteApiVersion#VERSION_1_20}
463+
*/
464+
@CheckForNull
465+
@JsonProperty("Mode")
466+
private String mode;
467+
468+
/**
469+
* @since {@link RemoteApiVersion#VERSION_1_20}
470+
*/
471+
@CheckForNull
472+
@JsonProperty("RW")
473+
private Boolean rw;
474+
475+
@CheckForNull
476+
public String getName() {
477+
return name;
478+
}
479+
480+
@CheckForNull
481+
public String getSource() {
482+
return source;
483+
}
484+
485+
@CheckForNull
486+
public Volume getDestination() {
487+
return destination;
488+
}
489+
490+
@CheckForNull
491+
public String getDriver() {
492+
return driver;
493+
}
494+
495+
@CheckForNull
496+
public String getMode() {
497+
return mode;
498+
}
499+
500+
@CheckForNull
501+
public Boolean getRW() {
502+
return rw;
503+
}
504+
505+
}
506+
416507
}

src/main/java/com/github/dockerjava/api/model/Binds.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.ArrayList;
55
import java.util.Iterator;
66
import java.util.List;
7-
import java.util.Map;
87

98
import com.fasterxml.jackson.core.JsonGenerator;
109
import com.fasterxml.jackson.core.JsonParser;
@@ -17,7 +16,6 @@
1716
import com.fasterxml.jackson.databind.SerializerProvider;
1817
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1918
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
20-
import com.fasterxml.jackson.databind.node.NullNode;
2119

2220
@JsonSerialize(using = Binds.Serializer.class)
2321
@JsonDeserialize(using = Binds.Deserializer.class)
@@ -58,12 +56,11 @@ public Binds deserialize(JsonParser jsonParser, DeserializationContext deseriali
5856
List<Bind> binds = new ArrayList<Bind>();
5957
ObjectCodec oc = jsonParser.getCodec();
6058
JsonNode node = oc.readTree(jsonParser);
61-
for (Iterator<Map.Entry<String, JsonNode>> it = node.fields(); it.hasNext();) {
59+
for (Iterator<JsonNode> it = node.elements(); it.hasNext();) {
60+
61+
JsonNode field = it.next();
62+
binds.add(Bind.parse(field.asText()));
6263

63-
Map.Entry<String, JsonNode> field = it.next();
64-
if (!field.getValue().equals(NullNode.getInstance())) {
65-
binds.add(Bind.parse(field.getKey()));
66-
}
6764
}
6865
return new Binds(binds.toArray(new Bind[0]));
6966
}

src/main/java/com/github/dockerjava/api/model/VolumeRW.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1919
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
2020
import com.fasterxml.jackson.databind.node.NullNode;
21+
import com.github.dockerjava.core.RemoteApiVersion;
2122

2223
/**
2324
* Represents a bind mounted volume in a Docker container.
2425
*
2526
* @see Bind
27+
* @deprecated since {@link RemoteApiVersion#VERSION_1_20}
2628
*/
2729
@JsonDeserialize(using = VolumeRW.Deserializer.class)
2830
@JsonSerialize(using = VolumeRW.Serializer.class)
31+
@Deprecated
2932
public class VolumeRW {
3033

3134
private Volume volume;

src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.hamcrest.MatcherAssert.assertThat;
44
import static org.hamcrest.Matchers.contains;
5+
import static org.hamcrest.Matchers.containsInAnyOrder;
56

67
import java.io.File;
78
import java.io.IOException;
@@ -23,6 +24,8 @@
2324
import com.github.dockerjava.api.DockerClient;
2425
import com.github.dockerjava.api.exception.DockerException;
2526
import com.github.dockerjava.api.command.InspectContainerResponse;
27+
import com.github.dockerjava.api.command.InspectContainerResponse.Mount;
28+
import com.github.dockerjava.api.model.Bind;
2629
import com.github.dockerjava.api.model.Frame;
2730
import com.github.dockerjava.api.model.Volume;
2831
import com.github.dockerjava.api.model.VolumeBind;
@@ -38,7 +41,7 @@ public abstract class AbstractDockerClientTest extends Assert {
3841

3942
public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class);
4043

41-
private String apiVersion = "1.19";
44+
private String apiVersion = "1.21";
4245

4346
protected DockerClient dockerClient;
4447

@@ -180,13 +183,13 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon
180183
Volume... expectedVolumes) {
181184

182185
List<Volume> volumes = new ArrayList<Volume>();
183-
VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes();
184-
if (volumeBinds != null) {
185-
for (VolumeBind bind : volumeBinds) {
186-
volumes.add(new Volume(bind.getContainerPath()));
186+
List<Mount> mounts = inspectContainerResponse.getMounts();
187+
if (mounts != null) {
188+
for (Mount mount : mounts) {
189+
volumes.add(mount.getDestination());
187190
}
188191
}
189-
assertThat(volumes, contains(expectedVolumes));
192+
assertThat(volumes, containsInAnyOrder(expectedVolumes));
190193
}
191194

192195
protected String containerLog(String containerId) throws Exception {

src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,5 @@
11
package com.github.dockerjava.core.command;
22

3-
import com.github.dockerjava.api.exception.ConflictException;
4-
import com.github.dockerjava.api.exception.DockerException;
5-
import com.github.dockerjava.api.command.CreateContainerResponse;
6-
import com.github.dockerjava.api.command.InspectContainerResponse;
7-
import com.github.dockerjava.api.model.AccessMode;
8-
import com.github.dockerjava.api.model.Bind;
9-
import com.github.dockerjava.api.model.Device;
10-
import com.github.dockerjava.api.model.ExposedPort;
11-
import com.github.dockerjava.api.model.Link;
12-
import com.github.dockerjava.api.model.LogConfig;
13-
import com.github.dockerjava.api.model.Ports;
14-
import com.github.dockerjava.api.model.RestartPolicy;
15-
import com.github.dockerjava.api.model.Ulimit;
16-
import com.github.dockerjava.api.model.Volume;
17-
import com.github.dockerjava.api.model.VolumeRW;
18-
import com.github.dockerjava.api.model.VolumesFrom;
19-
import com.github.dockerjava.client.AbstractDockerClientTest;
20-
import org.testng.ITestResult;
21-
import org.testng.annotations.AfterMethod;
22-
import org.testng.annotations.AfterTest;
23-
import org.testng.annotations.BeforeMethod;
24-
import org.testng.annotations.BeforeTest;
25-
import org.testng.annotations.Test;
26-
273
import static com.github.dockerjava.api.model.Capability.MKNOD;
284
import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
295
import static org.hamcrest.MatcherAssert.assertThat;
@@ -45,7 +21,29 @@
4521
import java.util.Map;
4622
import java.util.UUID;
4723

48-
import static org.hamcrest.MatcherAssert.assertThat;
24+
import org.testng.ITestResult;
25+
import org.testng.annotations.AfterMethod;
26+
import org.testng.annotations.AfterTest;
27+
import org.testng.annotations.BeforeMethod;
28+
import org.testng.annotations.BeforeTest;
29+
import org.testng.annotations.Test;
30+
31+
import com.github.dockerjava.api.command.CreateContainerResponse;
32+
import com.github.dockerjava.api.command.InspectContainerResponse;
33+
import com.github.dockerjava.api.exception.ConflictException;
34+
import com.github.dockerjava.api.exception.DockerException;
35+
import com.github.dockerjava.api.model.AccessMode;
36+
import com.github.dockerjava.api.model.Bind;
37+
import com.github.dockerjava.api.model.Device;
38+
import com.github.dockerjava.api.model.ExposedPort;
39+
import com.github.dockerjava.api.model.Link;
40+
import com.github.dockerjava.api.model.LogConfig;
41+
import com.github.dockerjava.api.model.Ports;
42+
import com.github.dockerjava.api.model.RestartPolicy;
43+
import com.github.dockerjava.api.model.Ulimit;
44+
import com.github.dockerjava.api.model.Volume;
45+
import com.github.dockerjava.api.model.VolumesFrom;
46+
import com.github.dockerjava.client.AbstractDockerClientTest;
4947

5048
@Test(groups = "integration")
5149
public class CreateContainerCmdImplTest extends AbstractDockerClientTest {
@@ -107,9 +105,12 @@ public void createContainerWithVolume() throws DockerException {
107105

108106
assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log"));
109107

110-
assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw)));
108+
assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume);
109+
assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), AccessMode.rw);
110+
assertTrue(inspectContainerResponse.getMounts().get(0).getRW());
111111
}
112112

113+
113114
@Test
114115
public void createContainerWithReadOnlyVolume() throws DockerException {
115116

@@ -128,7 +129,9 @@ public void createContainerWithReadOnlyVolume() throws DockerException {
128129

129130
assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test"));
130131

131-
assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume)));
132+
assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume);
133+
// TODO: Create a read-only volume and test like this
134+
// assertFalse(inspectContainerResponse.getMounts().get(0).getRW());
132135
}
133136

134137
@Test

src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,15 @@ public void startContainerWithVolumes() throws DockerException {
9393

9494
assertContainerHasVolumes(inspectContainerResponse, volume1, volume2);
9595

96-
assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
97-
contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2)));
96+
assertEquals(inspectContainerResponse.getMounts().size(), 2);
9897

98+
assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume1);
99+
assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), "ro");
100+
assertEquals(inspectContainerResponse.getMounts().get(0).getRW(), Boolean.FALSE);
101+
102+
assertEquals(inspectContainerResponse.getMounts().get(1).getDestination(), volume2);
103+
assertEquals(inspectContainerResponse.getMounts().get(1).getMode(), "rw");
104+
assertEquals(inspectContainerResponse.getMounts().get(1).getRW(), Boolean.TRUE);
99105
}
100106

101107
@Test

src/test/resources/testAddUrl/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM ubuntu:latest
22

33
# Copy testrun.sh files into the container
44

5-
ADD http://www.docker.io /tmp/docker_home.html
5+
ADD https://hub.docker.com/r/marcuslinke/busybox/ /tmp/docker_home.html
66
ADD ./testrun.sh /tmp/
77

88
RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh

0 commit comments

Comments
 (0)