@Override public WaitResult wait(DockerFacade dockerClient, Container container) { return new PortWait().wait(port, dockerClient, container, (ipAddress, externalPort) -> { try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(ipAddress, externalPort), 500); return WaitResult.success(); } catch (IOException e) { return WaitResult.failure("Port not available: %s", port); } }); } }
private Binding[] getPortBindings(int containerPort, Container container, DockerFacade dockerClient) { NetworkSettings networkSettings = getNetworkSettings(container, dockerClient); return networkSettings.getPorts().getBindings().get(ExposedPort.tcp(containerPort)); }
/** * Queries Docker to find the port bindings for the specified port and then performs the provided * {@code waitFunction}. * * @param containerPort the container port to decode and test against. * @param dockerClient the docker client to use. * @param container the container to test against. * @param waitFunction the wait function to use. * @return a {@link WaitResult}. */ public WaitResult wait(int containerPort, DockerFacade dockerClient, Container container, BiFunction<String, Integer, WaitResult> waitFunction) { for (Binding portBinding : getPortBindings(containerPort, container, dockerClient)) { String ipAddress = portBinding.getHostIp(); if (ipAddress.equals(DEFAULT_BINDING)) { ipAddress = dockerClient.hostInfo().getIpAddress(); } int externalPort = Integer.valueOf(portBinding.getHostPortSpec()); LOG.info("Running wait against: [{}:{}]: [{}]: [{}]", ipAddress, externalPort, container.getName(), waitFunction.getClass().getName()); return waitFunction.apply(ipAddress, externalPort); } return WaitResult.success(); }
@Override public WaitResult wait(DockerFacade dockerClient, Container container) { return new PortWait().wait(port, dockerClient, container, (ipAddress, externalPort) -> { try { String uri = String.format("http://%s:%s", ipAddress, externalPort); HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection(); connection.setRequestMethod("GET"); connection.connect(); if (expectedStatus != connection.getResponseCode()) { return WaitResult.failure("Status on [%s] not expected [%s]", port, expectedStatus); } return WaitResult.success(); } catch (IOException e) { return WaitResult.failure(e.getMessage()); } }); } }
@Override public WaitResult wait(DockerFacade dockerClient, Container container) { return new PortWait().wait(port, dockerClient, container, (ipAddress, externalPort) -> { try { String uri = String.format("http://%s:%s/%s", ipAddress, externalPort, context); HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection(); connection.setRequestMethod("GET"); connection.connect(); if (expectedStatus != connection.getResponseCode()) { return WaitResult.failure("Status on [%s] not expected [%s]", port, expectedStatus); } return WaitResult.success(); } catch (IOException e) { return WaitResult.failure(e.getMessage()); } }); } }