X Tutup
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
45 changes: 28 additions & 17 deletions src/main/java/com/github/dockerjava/api/model/Ports.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
Expand All @@ -23,8 +25,6 @@
import com.github.dockerjava.api.command.InspectContainerResponse.HostConfig;
import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings;

import org.apache.commons.lang.builder.ToStringBuilder;

/**
* A container for port bindings, made available as a {@link Map} via its
* {@link #getBindings()} method.
Expand All @@ -36,7 +36,7 @@
@JsonSerialize(using = Ports.Serializer.class)
public class Ports {

private final Map<ExposedPort, Binding> ports = new HashMap<ExposedPort, Binding>();
private final Map<ExposedPort, Binding[]> ports = new HashMap<ExposedPort, Binding[]>();

public Ports() { }

Expand All @@ -45,7 +45,12 @@ public Ports(ExposedPort exposedPort, Binding host) {
}

public void bind(ExposedPort exposedPort, Binding host) {
ports.put(exposedPort, host);
if (ports.containsKey(exposedPort)) {
Binding[] bindings = ports.get(exposedPort);
ports.put(exposedPort, (Binding[]) ArrayUtils.add(bindings, host));
} else {
ports.put(exposedPort, new Binding[]{host});
}
}

@Override
Expand All @@ -54,10 +59,10 @@ public String toString(){
}

/**
* @return the port bindings as a {@link Map} that contains one
* {@link Binding} per {@link ExposedPort}.
* @return the port bindings as a {@link Map} that contains one or more
* {@link Binding}s per {@link ExposedPort}.
*/
public Map<ExposedPort, Binding> getBindings(){
public Map<ExposedPort, Binding[]> getBindings(){
return ports;
}

Expand Down Expand Up @@ -132,11 +137,15 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali
JsonNode node = oc.readTree(jsonParser);
for (Iterator<Map.Entry<String, JsonNode>> it = node.fields(); it.hasNext();) {

Map.Entry<String, JsonNode> field = it.next();
if (!field.getValue().equals(NullNode.getInstance())) {
String hostIp = field.getValue().get(0).get("HostIp").textValue();
int hostPort = field.getValue().get(0).get("HostPort").asInt();
out.bind(ExposedPort.parse(field.getKey()), new Binding(hostIp, hostPort));
Map.Entry<String, JsonNode> portNode = it.next();
JsonNode bindingsArray = portNode.getValue();
for (int i = 0; i < bindingsArray.size(); i++) {
JsonNode bindingNode = bindingsArray.get(i);
if (!bindingNode.equals(NullNode.getInstance())) {
String hostIp = bindingNode.get("HostIp").textValue();
int hostPort = bindingNode.get("HostPort").asInt();
out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort));
}
}
}
return out;
Expand All @@ -150,13 +159,15 @@ public void serialize(Ports portBindings, JsonGenerator jsonGen,
SerializerProvider serProvider) throws IOException, JsonProcessingException {

jsonGen.writeStartObject();
for(Entry<ExposedPort, Binding> entry : portBindings.getBindings().entrySet()){
for(Entry<ExposedPort, Binding[]> entry : portBindings.getBindings().entrySet()){
jsonGen.writeFieldName(entry.getKey().toString());
jsonGen.writeStartArray();
jsonGen.writeStartObject();
jsonGen.writeStringField("HostIp", entry.getValue().getHostIp());
jsonGen.writeStringField("HostPort", "" + entry.getValue().getHostPort());
jsonGen.writeEndObject();
for (Binding binding : entry.getValue()) {
jsonGen.writeStartObject();
jsonGen.writeStringField("HostIp", binding.getHostIp());
jsonGen.writeStringField("HostPort", "" + binding.getHostPort());
jsonGen.writeEndObject();
}
jsonGen.writeEndArray();
}
jsonGen.writeEndObject();
Expand Down
37 changes: 37 additions & 0 deletions src/test/java/com/github/dockerjava/api/model/PortsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.github.dockerjava.api.model;

import static org.testng.Assert.assertEquals;

import java.util.Map;

import org.testng.annotations.Test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.model.Ports.Binding;

public class PortsTest {
private final ObjectMapper objectMapper = new ObjectMapper();
private final String jsonWithDoubleBindingForOnePort =
"{\"80/tcp\":[{\"HostIp\":\"10.0.0.1\",\"HostPort\":\"80\"},{\"HostIp\":\"10.0.0.2\",\"HostPort\":\"80\"}]}";

@Test
public void deserializingPortWithMultipleBindings() throws Exception {
Ports ports = objectMapper.readValue(jsonWithDoubleBindingForOnePort, Ports.class);
Map<ExposedPort, Binding[]> map = ports.getBindings();
assertEquals(map.size(), 1);

Binding[] bindings = map.get(ExposedPort.tcp(80));
assertEquals(bindings.length, 2);
assertEquals(bindings[0], new Binding("10.0.0.1", 80));
assertEquals(bindings[1], new Binding("10.0.0.2", 80));
}

@Test
public void serializingPortWithMultipleBindings() throws Exception {
Ports ports = new Ports();
ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", 80));
ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", 80));
assertEquals(objectMapper.writeValueAsString(ports), jsonWithDoubleBindingForOnePort);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ public void startContainerWithPortBindings() throws DockerException {
Ports portBindings = new Ports();
portBindings.bind(tcp22, Ports.Binding(11022));
portBindings.bind(tcp23, Ports.Binding(11023));
portBindings.bind(tcp23, Ports.Binding(11024));

dockerClient.startContainerCmd(container.getId()).withPortBindings(portBindings).exec();

Expand All @@ -172,12 +173,15 @@ public void startContainerWithPortBindings() throws DockerException {
assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()),
contains(tcp22, tcp23));

assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22),
assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0],
is(equalTo(Ports.Binding(11022))));

assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23),
assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0],
is(equalTo(Ports.Binding(11023))));

assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1],
is(equalTo(Ports.Binding(11024))));

}

@Test
Expand Down
X Tutup