Skip to content

Commit df60310

Browse files
committed
Merge pull request #49 from pnuz3n/master
Allow user to check where volume is binded on host
2 parents 2895f26 + 229e082 commit df60310

5 files changed

Lines changed: 117 additions & 17 deletions

File tree

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33

44
import java.util.Map;
55

6+
import com.github.dockerjava.api.model.*;
67
import org.apache.commons.lang.builder.ToStringBuilder;
78

89
import com.fasterxml.jackson.annotation.JsonIgnore;
910
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
1011
import com.fasterxml.jackson.annotation.JsonProperty;
11-
import com.github.dockerjava.api.model.ContainerConfig;
12-
import com.github.dockerjava.api.model.LxcConf;
13-
import com.github.dockerjava.api.model.Ports;
14-
import com.github.dockerjava.api.model.Volume;
15-
import com.github.dockerjava.api.model.Volumes;
1612

1713
/**
1814
*
@@ -74,7 +70,7 @@ public class InspectContainerResponse {
7470
private ContainerState state;
7571

7672
@JsonProperty("Volumes")
77-
private Volumes volumes;
73+
private VolumeBinds volumes;
7874

7975
@JsonProperty("VolumesRW")
8076
private Volumes volumesRW;
@@ -120,8 +116,8 @@ public String getResolvConfPath() {
120116
}
121117

122118
@JsonIgnore
123-
public Volume[] getVolumes() {
124-
return volumes.getVolumes();
119+
public VolumeBind[] getVolumes() {
120+
return volumes.getBinds();
125121
}
126122

127123
@JsonIgnore
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.github.dockerjava.api.model;
2+
3+
public class VolumeBind {
4+
private final String hostPath;
5+
private final String containerPath;
6+
7+
public VolumeBind(String hostPath, String containerPath){
8+
this.hostPath = hostPath;
9+
this.containerPath = containerPath;
10+
}
11+
12+
public String getContainerPath() {
13+
return containerPath;
14+
}
15+
16+
public String getHostPath() {
17+
return hostPath;
18+
}
19+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonProcessingException;
6+
import com.fasterxml.jackson.core.ObjectCodec;
7+
import com.fasterxml.jackson.databind.*;
8+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
9+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
10+
import com.fasterxml.jackson.databind.node.NullNode;
11+
12+
import java.io.IOException;
13+
import java.util.ArrayList;
14+
import java.util.Iterator;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
// This is not going to be serialized
19+
@JsonDeserialize(using = VolumeBinds.Deserializer.class)
20+
public class VolumeBinds {
21+
private final VolumeBind[] binds;
22+
23+
public VolumeBinds(VolumeBind... binds) {
24+
this.binds = binds;
25+
}
26+
27+
public VolumeBind[] getBinds() {
28+
return binds;
29+
}
30+
31+
public static final class Deserializer extends JsonDeserializer<VolumeBinds> {
32+
@Override
33+
public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
34+
35+
List<VolumeBind> binds = new ArrayList<VolumeBind>();
36+
ObjectCodec oc = jsonParser.getCodec();
37+
JsonNode node = oc.readTree(jsonParser);
38+
for (Iterator<Map.Entry<String, JsonNode>> it = node.fields(); it.hasNext();) {
39+
Map.Entry<String, JsonNode> field = it.next();
40+
JsonNode value = field.getValue();
41+
if (!value.equals(NullNode.getInstance())) {
42+
if (!value.isTextual()){
43+
throw deserializationContext.mappingException("Expected path for '"+field.getKey()+"'in host but got '"+ value+"'.");
44+
}
45+
VolumeBind bind = new VolumeBind(value.asText(),field.getKey());
46+
binds.add(bind);
47+
}
48+
}
49+
return new VolumeBinds(binds.toArray(new VolumeBind[binds.size()]));
50+
}
51+
}
52+
53+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.core.JsonParseException;
4+
import com.fasterxml.jackson.databind.JsonMappingException;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import jdk.nashorn.internal.parser.JSONParser;
7+
import org.testng.annotations.Test;
8+
9+
import java.io.IOException;
10+
11+
import static org.testng.Assert.*;
12+
13+
public class VolumeBindsTest {
14+
@Test
15+
public void t() throws IOException {
16+
String s = "{\"/data\":\"/some/path\"}";
17+
ObjectMapper objectMapper = new ObjectMapper();
18+
VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class);
19+
VolumeBind[] binds = volumeBinds.getBinds();
20+
assertEquals(binds.length,1);
21+
assertEquals(binds[0].getHostPath(),"/some/path");
22+
assertEquals(binds[0].getContainerPath(), "/data");
23+
}
24+
25+
@Test(expectedExceptions = JsonMappingException.class)
26+
public void t1() throws IOException {
27+
String s = "{\"/data\": {} }";
28+
ObjectMapper objectMapper = new ObjectMapper();
29+
VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class);
30+
}
31+
32+
33+
}

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,12 @@
1010
import static org.hamcrest.Matchers.startsWith;
1111

1212
import java.lang.reflect.Method;
13-
import java.util.Arrays;
13+
import java.util.*;
1414

1515
import com.github.dockerjava.api.DockerException;
1616
import com.github.dockerjava.api.command.CreateContainerResponse;
1717
import com.github.dockerjava.api.command.InspectContainerResponse;
18-
import com.github.dockerjava.api.model.Bind;
19-
import com.github.dockerjava.api.model.ExposedPort;
20-
import com.github.dockerjava.api.model.Link;
21-
import com.github.dockerjava.api.model.Ports;
22-
import com.github.dockerjava.api.model.Volume;
18+
import com.github.dockerjava.api.model.*;
2319

2420
import org.testng.ITestResult;
2521
import org.testng.annotations.AfterMethod;
@@ -82,9 +78,12 @@ public void startContainerWithVolumes() throws DockerException {
8278
inspectContainerResponse = dockerClient.inspectContainerCmd(container
8379
.getId()).exec();
8480

85-
86-
assertThat(Arrays.asList(inspectContainerResponse.getVolumes()),
87-
contains(volume1, volume2));
81+
VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes();
82+
List<String> volumes = new ArrayList<String>();
83+
for(VolumeBind bind :volumeBinds){
84+
volumes.add(bind.getContainerPath());
85+
}
86+
assertThat(volumes, contains(volume1.getPath(), volume2.getPath()));
8887

8988
assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
9089
contains(volume1, volume2));

0 commit comments

Comments
 (0)