diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index d3375ffc4..34bc15af5 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -3,16 +3,12 @@ import java.util.Map; +import com.github.dockerjava.api.model.*; import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.dockerjava.api.model.ContainerConfig; -import com.github.dockerjava.api.model.LxcConf; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.Volumes; /** * @@ -74,7 +70,7 @@ public class InspectContainerResponse { private ContainerState state; @JsonProperty("Volumes") - private Volumes volumes; + private VolumeBinds volumes; @JsonProperty("VolumesRW") private Volumes volumesRW; @@ -120,8 +116,8 @@ public String getResolvConfPath() { } @JsonIgnore - public Volume[] getVolumes() { - return volumes.getVolumes(); + public VolumeBind[] getVolumes() { + return volumes.getBinds(); } @JsonIgnore diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java new file mode 100644 index 000000000..d662f2b8f --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.api.model; + +public class VolumeBind { + private final String hostPath; + private final String containerPath; + + public VolumeBind(String hostPath, String containerPath){ + this.hostPath = hostPath; + this.containerPath = containerPath; + } + + public String getContainerPath() { + return containerPath; + } + + public String getHostPath() { + return hostPath; + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java new file mode 100644 index 000000000..fd0223ca0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.node.NullNode; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +// This is not going to be serialized +@JsonDeserialize(using = VolumeBinds.Deserializer.class) +public class VolumeBinds { + private final VolumeBind[] binds; + + public VolumeBinds(VolumeBind... binds) { + this.binds = binds; + } + + public VolumeBind[] getBinds() { + return binds; + } + + public static final class Deserializer extends JsonDeserializer { + @Override + public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + + List binds = new ArrayList(); + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + for (Iterator> it = node.fields(); it.hasNext();) { + Map.Entry field = it.next(); + JsonNode value = field.getValue(); + if (!value.equals(NullNode.getInstance())) { + if (!value.isTextual()){ + throw deserializationContext.mappingException("Expected path for '"+field.getKey()+"'in host but got '"+ value+"'."); + } + VolumeBind bind = new VolumeBind(value.asText(),field.getKey()); + binds.add(bind); + } + } + return new VolumeBinds(binds.toArray(new VolumeBind[binds.size()])); + } + } + +} diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java new file mode 100644 index 000000000..182f4e051 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jdk.nashorn.internal.parser.JSONParser; +import org.testng.annotations.Test; + +import java.io.IOException; + +import static org.testng.Assert.*; + +public class VolumeBindsTest { + @Test + public void t() throws IOException { + String s = "{\"/data\":\"/some/path\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class); + VolumeBind[] binds = volumeBinds.getBinds(); + assertEquals(binds.length,1); + assertEquals(binds[0].getHostPath(),"/some/path"); + assertEquals(binds[0].getContainerPath(), "/data"); + } + + @Test(expectedExceptions = JsonMappingException.class) + public void t1() throws IOException { + String s = "{\"/data\": {} }"; + ObjectMapper objectMapper = new ObjectMapper(); + VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 41ea89733..79bc3488f 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -10,16 +10,12 @@ import static org.hamcrest.Matchers.startsWith; import java.lang.reflect.Method; -import java.util.Arrays; +import java.util.*; import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.*; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -82,9 +78,12 @@ public void startContainerWithVolumes() throws DockerException { inspectContainerResponse = dockerClient.inspectContainerCmd(container .getId()).exec(); - - assertThat(Arrays.asList(inspectContainerResponse.getVolumes()), - contains(volume1, volume2)); + VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); + List volumes = new ArrayList(); + for(VolumeBind bind :volumeBinds){ + volumes.add(bind.getContainerPath()); + } + assertThat(volumes, contains(volume1.getPath(), volume2.getPath())); assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(volume1, volume2));