Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -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}.
*/
Expand All @@ -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}, <code>tcp</code>, <code>udp</code> or <code>sctp</code>
* @param port
* the {@link #getPort() port number}
* the {@link #getPortRangeFrom() port number}
* @deprecated use {@link #ExposedPort(int, InternetProtocol)}
*/
@Deprecated
Expand All @@ -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;
Expand All @@ -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;
}

/**
Expand Down Expand Up @@ -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();
}
Expand All @@ -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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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"));
Expand Down