public static Ports parseFromDockerComposePs(String psOutput, String dockerMachineIp) { Preconditions.checkArgument(!Strings.isNullOrEmpty(psOutput), "No container found"); Matcher matcher = PORT_PATTERN.matcher(psOutput); List<DockerPort> ports = new ArrayList<>(); while (matcher.find()) { String matchedIpAddress = matcher.group(IP_ADDRESS); String ip = matchedIpAddress.equals(NO_IP_ADDRESS) ? dockerMachineIp : matchedIpAddress; int externalPort = Integer.parseInt(matcher.group(EXTERNAL_PORT)); int internalPort = Integer.parseInt(matcher.group(INTERNAL_PORT)); ports.add(new DockerPort(ip, externalPort, internalPort)); } return new Ports(ports); }
public DockerPort portMappedExternallyTo(int externalPort) { return portMappings.get() .stream() .filter(port -> port.getExternalPort() == externalPort) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No port mapped externally to '" + externalPort + "' for container '" + containerName + "'")); }
@Test public void result_in_no_ports_when_there_are_no_ports_in_ps_output() { String psOutput = "------"; Ports ports = Ports.parseFromDockerComposePs(psOutput, null); Ports expected = new Ports(emptyList()); assertThat(ports, is(expected)); }
@Override public Ports ports(String service) throws IOException, InterruptedException { return Ports.parseFromDockerComposePs(psOutput(service), dockerMachine.getIp()); }
@Test public void result_in_no_ports_when_there_is_a_non_mapped_exposed_port() { String psOutput = "5432/tcp"; Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); Ports expected = new Ports(emptyList()); assertThat(ports, is(expected)); }
@Override public Ports ports(String service) throws IOException, InterruptedException { return Ports.parseFromDockerComposePs(psOutput(service), dockerMachine.getIp()); }
@Test public void parse_actual_docker_compose_output() { String psOutput = " Name Command State Ports \n" + "-------------------------------------------------------------------------------------------------------------------------------------------------\n" + "postgres_postgres_1 /bin/sh -c /usr/local/bin/ ... Up 0.0.0.0:8880->8880/tcp, 8881/tcp, 8882/tcp, 8883/tcp, 8884/tcp, 8885/tcp, 8886/tcp \n" + ""; Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); Ports expected = new Ports(newArrayList(new DockerPort(LOCALHOST_IP, 8880, 8880))); assertThat(ports, is(expected)); }
public DockerPort port(int internalPort) { return portMappings.get() .stream() .filter(port -> port.getInternalPort() == internalPort) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No internal port '" + internalPort + "' for container '" + containerName + "': " + portMappings)); }
public static Ports parseFromDockerComposePs(String psOutput, String dockerMachineIp) { Preconditions.checkArgument(!Strings.isNullOrEmpty(psOutput), "No container found"); Matcher matcher = PORT_PATTERN.matcher(psOutput); List<DockerPort> ports = new ArrayList<>(); while (matcher.find()) { String matchedIpAddress = matcher.group(IP_ADDRESS); String ip = matchedIpAddress.equals(NO_IP_ADDRESS) ? dockerMachineIp : matchedIpAddress; int externalPort = Integer.parseInt(matcher.group(EXTERNAL_PORT)); int internalPort = Integer.parseInt(matcher.group(INTERNAL_PORT)); ports.add(new DockerPort(ip, externalPort, internalPort)); } return new Ports(ports); }
@Override public Ports ports(String service) throws IOException, InterruptedException { return Ports.parseFromDockerComposePs(psOutput(service), dockerMachine.getIp()); }
@Test public void result_in_single_port_when_there_is_single_tcp_port_mapping() { String psOutput = "0.0.0.0:5432->5432/tcp"; Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); Ports expected = new Ports(newArrayList(new DockerPort(LOCALHOST_IP, 5432, 5432))); assertThat(ports, is(expected)); }
public DockerPort port(int internalPort) { return portMappings.get() .stream() .filter(port -> port.getInternalPort() == internalPort) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No internal port '" + internalPort + "' for container '" + containerName + "'")); }
public static Ports parseFromDockerComposePs(String psOutput, String dockerMachineIp) { Preconditions.checkArgument(!Strings.isNullOrEmpty(psOutput), "No container found"); Matcher matcher = PORT_PATTERN.matcher(psOutput); List<DockerPort> ports = new ArrayList<>(); while (matcher.find()) { String matchedIpAddress = matcher.group(IP_ADDRESS); String ip = matchedIpAddress.equals(NO_IP_ADDRESS) ? dockerMachineIp : matchedIpAddress; int externalPort = Integer.parseInt(matcher.group(EXTERNAL_PORT)); int internalPort = Integer.parseInt(matcher.group(INTERNAL_PORT)); ports.add(new DockerPort(ip, externalPort, internalPort)); } return new Ports(ports); }
@Test public void throw_illegal_state_exception_when_no_running_container_found_for_service() { exception.expect(IllegalArgumentException.class); exception.expectMessage("No container found"); Ports.parseFromDockerComposePs("", ""); } }
@Test public void result_in_single_port_with_ip_other_than_localhost_when_there_is_single_tcp_port_mapping() { String psOutput = "10.0.1.2:1234->2345/tcp"; Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); Ports expected = new Ports(newArrayList(new DockerPort("10.0.1.2", 1234, 2345))); assertThat(ports, is(expected)); }
public DockerPort portMappedExternallyTo(int externalPort) { return portMappings.get() .stream() .filter(port -> port.getExternalPort() == externalPort) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No port mapped externally to '" + externalPort + "' for container '" + containerName + "'")); }
public void ports(String service, String ip, Integer... portNumbers) throws IOException, InterruptedException { List<DockerPort> ports = Arrays.asList(portNumbers) .stream() .map(portNumber -> dockerPortSpy(ip, portNumber, portNumber)) .collect(Collectors.toList()); when(dockerComposeProcess.ports(service)).thenReturn(new Ports(ports)); }
@Test public void result_in_two_ports_when_there_are_two_tcp_port_mappings() { String psOutput = "0.0.0.0:5432->5432/tcp, 0.0.0.0:5433->5432/tcp"; Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); Ports expected = new Ports(newArrayList(new DockerPort(LOCALHOST_IP, 5432, 5432), new DockerPort(LOCALHOST_IP, 5433, 5432))); assertThat(ports, is(expected)); }
public DockerPort port(int internalPort) { return portMappings.get() .stream() .filter(port -> port.getInternalPort() == internalPort) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No internal port '" + internalPort + "' for container '" + containerName + "'")); }
public void ephemeralPort(String service, String ip, int internalPortNumber) throws IOException, InterruptedException { AtomicInteger currentExternalPort = new AtomicInteger(33700); when(dockerComposeProcess.ports(service)).then(a -> { DockerPort port = dockerPortSpy(ip, currentExternalPort.incrementAndGet(), internalPortNumber); return new Ports(port); }); }