diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
index 4226fd94b..edcd71d42 100644
--- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
@@ -12,7 +12,8 @@
import lombok.EqualsAndHashCode;
/**
- * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPort() port number} and an
+ * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPortRangeFrom() port number}
+ * or given a range {@link #getPortRangeFrom() port number from} - {@link #getPortRangeTo() port number to} and an
* {@link InternetProtocol}. It can be published by Docker by {@link Ports#bind(ExposedPort, Binding) binding} it to a host port,
* represented by a {@link Binding}.
*/
@@ -22,38 +23,70 @@ public class ExposedPort implements Serializable {
private final InternetProtocol protocol;
- private final int port;
+ private final int portRangeFrom;
+
+ private final int portRangeTo;
/**
* Creates an {@link ExposedPort} for the given parameters.
*
* @param port
- * the {@link #getPort() port number}
+ * the {@link #getPortRangeFrom() port number}
* @param protocol
* the {@link InternetProtocol}
*/
public ExposedPort(int port, InternetProtocol protocol) {
- this.port = port;
+ this.portRangeTo = port;
+ this.portRangeFrom = port;
+ this.protocol = protocol;
+ }
+
+ /**
+ * Creates an {@link ExposedPort} for the given parameters.
+ *
+ * @param portRangeFrom
+ * the {@link #getPortRangeFrom() port number}
+ * @param portRangeTo
+ * the {@link #getPortRangeTo() port number}
+ * @param protocol
+ * the {@link InternetProtocol}
+ */
+ public ExposedPort(int portRangeFrom, int portRangeTo, InternetProtocol protocol) {
+ this.portRangeTo = portRangeTo;
+ this.portRangeFrom = portRangeFrom;
this.protocol = protocol;
}
/**
- * Creates an {@link ExposedPort} for the given {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}.
+ * Creates an {@link ExposedPort} for the given {@link #getPortRangeFrom() port number} and {@link InternetProtocol#DEFAULT}.
*
* @param port
- * the {@link #getPort() port number}
+ * the {@link #getPortRangeFrom() port number}
*/
public ExposedPort(int port) {
this(port, InternetProtocol.DEFAULT);
}
+ /**
+ * Creates an {@link ExposedPort} for the given {@link #getPortRangeFrom() port number} and {@link InternetProtocol#DEFAULT}.
+ *
+ * @param portRangeFrom
+ * the {@link #getPortRangeFrom() port number}
+ * @param portRangeTo
+ * the {@link #getPortRangeTo() port number}
+ */
+ public ExposedPort(int portRangeFrom, int portRangeTo) {
+ this(portRangeFrom, portRangeTo, InternetProtocol.DEFAULT);
+ }
+
+
/**
* Creates an {@link ExposedPort} for the given parameters.
*
* @param scheme
* the {@link #getScheme() scheme}, tcp, udp or sctp
* @param port
- * the {@link #getPort() port number}
+ * the {@link #getPortRangeFrom() port number}
* @deprecated use {@link #ExposedPort(int, InternetProtocol)}
*/
@Deprecated
@@ -62,7 +95,7 @@ public ExposedPort(String scheme, int port) {
}
/**
- * @return the {@link InternetProtocol} of the {@link #getPort() port} that the container exposes
+ * @return the {@link InternetProtocol} of the {@link #getPortRangeFrom() port} that the container exposes
*/
public InternetProtocol getProtocol() {
return protocol;
@@ -77,9 +110,22 @@ public String getScheme() {
return protocol.toString();
}
- /** @return the port number that the container exposes */
+ /** @return the port number that the container exposes, if a range is exposed the port number from is returned.
+ * @deprecated use {@link #getPortRangeFrom()} and {@link #getPortRangeTo()}!
+ */
+ @Deprecated
public int getPort() {
- return port;
+ return portRangeFrom;
+ }
+
+ /** @return the port number from that the container exposes */
+ public int getPortRangeFrom() {
+ return portRangeFrom;
+ }
+
+ /** @return the port number from that the container exposes */
+ public int getPortRangeTo() {
+ return portRangeTo;
}
/**
@@ -120,10 +166,32 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti
try {
String[] parts = serialized.split("/");
switch (parts.length) {
- case 1:
- return new ExposedPort(Integer.parseInt(parts[0]));
- case 2:
- return new ExposedPort(Integer.parseInt(parts[0]), InternetProtocol.parse(parts[1]));
+ case 1: {
+ String[] ports = parts[0].split("-");
+ switch (ports.length) {
+ case 1:
+ return new ExposedPort(Integer.parseInt(ports[0]));
+ case 2:
+ return new ExposedPort(Integer.parseInt(ports[0]), Integer.parseInt(ports[1]));
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+ case 2: {
+ String[] ports = parts[0].split("-");
+ switch (ports.length) {
+ case 1:
+ return new ExposedPort(Integer.parseInt(ports[0]), InternetProtocol.parse(parts[1]));
+ case 2:
+ return new ExposedPort(
+ Integer.parseInt(ports[0]),
+ Integer.parseInt(ports[1]),
+ InternetProtocol.parse(parts[1])
+ );
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
default:
throw new IllegalArgumentException();
}
@@ -141,6 +209,10 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti
@Override
@JsonValue
public String toString() {
- return port + "/" + protocol.toString();
+ if (portRangeFrom == portRangeTo) {
+ return portRangeFrom + "/" + protocol.toString();
+ } else {
+ return portRangeFrom + "-" + portRangeTo + "/" + protocol.toString();
+ }
}
}
diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java
index 9190cfda4..923e022a8 100644
--- a/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java
+++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java
@@ -11,6 +11,7 @@
public class PortBindingTest {
private static final ExposedPort TCP_8080 = ExposedPort.tcp(8080);
+ private static final ExposedPort TCP_8080_8081 = new ExposedPort(8080, 8081, InternetProtocol.TCP);
@Rule
public ExpectedException expectedEx = ExpectedException.none();
@@ -21,6 +22,12 @@ public void fullDefinition() {
new PortBinding(Binding.bindIpAndPort("127.0.0.1", 80), TCP_8080));
}
+ @Test
+ public void portRange() {
+ assertEquals(PortBinding.parse("127.0.0.1:80-81:8080-8081/tcp"),
+ new PortBinding(Binding.bindIpAndPortRange("127.0.0.1", 80, 81), TCP_8080_8081));
+ }
+
@Test
public void noProtocol() {
assertEquals(new PortBinding(Binding.bindIpAndPort("127.0.0.1", 80), TCP_8080), PortBinding.parse("127.0.0.1:80:8080"));