private List<Integer> staticPorts(final Job job) { final List<Integer> staticPorts = Lists.newArrayList(); for (final PortMapping portMapping : job.getPorts().values()) { if (portMapping.getExternalPort() != null) { staticPorts.add(portMapping.getExternalPort()); } } return staticPorts; }
private Map<String, Integer> allocate0(final Map<String, PortMapping> mappings, final Set<Integer> used) { final ImmutableMap.Builder<String, Integer> allocation = ImmutableMap.builder(); for (final Map.Entry<String, PortMapping> entry : mappings.entrySet()) { final String name = entry.getKey(); final PortMapping portMapping = entry.getValue(); final Integer externalPort = portMapping.getExternalPort(); if (externalPort == null) { if (!allocateDynamic(allocation, used, name)) { return null; } } else { if (!allocateStatic(allocation, used, name, externalPort)) { return null; } } } return allocation.build(); }
@Override public String apply(final PortMapping input) { final StringBuilder builder = new StringBuilder(); if (input.getIp() != null) { builder.append(input.getIp()); } builder.append(":").append(input.getInternalPort()); if (input.getExternalPort() != null) { builder.append(":").append(input.getExternalPort()); } if (input.getProtocol() != null) { builder.append("/").append(input.getProtocol()); } return builder.toString(); } };
@Override public Object call() throws Exception { final JobStatus jobStatus = getOrNull(client.jobStatus(jobId)); final TaskStatus taskStatus = jobStatus.getTaskStatuses().get(host); if (taskStatus.getThrottled() == FLAPPING) { return true; } final PortMapping port = taskStatus.getPorts().get("poke"); assert port.getExternalPort() != null; poke(port.getExternalPort()); return null; } });
@Override public boolean check(final String containerId) throws InterruptedException, DockerException { final Integer port = taskConfig.ports().get(healthCheck.getPort()).getExternalPort(); InetSocketAddress address = new InetSocketAddress(dockerHost.address(), port); if (address.getAddress().isLoopbackAddress()) { // tcp connections to a container-mapped port on loopback always succeed, // regardless of if the container is listening or not. use the bridge address instead. address = new InetSocketAddress(getBridgeAddress(containerId), port); } log.info("about to tcp healthcheck containerId={} with address={} for task={}", containerId, address, taskConfig); try (final Socket s = new Socket()) { s.connect(address, CONNECT_TIMEOUT_MILLIS); } catch (Exception e) { log.warn("tcp healthcheck failed for containerId={} due to exception={}", containerId, e.toString()); return false; } return true; } }
@Override public Object call() throws Exception { final JobStatus jobStatus = getOrNull(client.jobStatus(jobId)); final TaskStatus taskStatus = jobStatus.getTaskStatuses().get(testHost()); final PortMapping port = taskStatus.getPorts().get("poke"); assert port.getExternalPort() != null; if (poke(port.getExternalPort())) { return true; } else { return null; } } });
/** * Create a port binding configuration for the job. * * @return The port bindings. */ private Map<String, List<PortBinding>> portBindings() { final Map<String, List<PortBinding>> bindings = Maps.newHashMap(); for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) { final PortMapping mapping = e.getValue(); final Integer jobDefinedExtPort = mapping.getExternalPort(); // If the job didn't specify an external port, use dynamically allocated ports final String externalPort = jobDefinedExtPort == null ? ports.get(e.getKey()).toString() : jobDefinedExtPort.toString(); final PortBinding binding = PortBinding.of(mapping.getIp(), externalPort); final String entry = containerPort(mapping.getInternalPort(), mapping.getProtocol()); bindings.put(entry, Collections.singletonList(binding)); } return bindings; }
final Integer port = taskConfig.ports().get(healthCheck.getPort()).getExternalPort(); try { url = new URL("http", host, port, healthCheck.getPath());
if (mapping.getExternalPort() != null) { externalPort = mapping.getExternalPort(); } else {
public void task(final JobId jobId, final String host, final TaskStatus ts, final Deployment deployment) { final String goal = (deployment == null) ? "" : deployment.getGoal().toString(); final int maxContainerId = full ? Integer.MAX_VALUE : 7; final String jobIdString = full ? jobId.toString() : jobId.toShortString(); if (ts == null) { table.row(jobIdString, host, goal, "", "", ""); } else { final List<String> portMappings = new ArrayList<>(); for (final Map.Entry<String, PortMapping> entry : ts.getPorts().entrySet()) { final PortMapping portMapping = entry.getValue(); portMappings.add(String.format("%s=%d:%d", entry.getKey(), portMapping.getInternalPort(), portMapping.getExternalPort())); } String state = ts.getState().toString(); if (ts.getThrottled() != ThrottleState.NO) { state += " (" + ts.getThrottled() + ")"; } final String ports = Joiner.on(" ").join(portMappings); final String cid = truncate(fromNullable(ts.getContainerId()).or(""), maxContainerId, ""); table.row(jobIdString, host, goal, state, cid, ports); } }
final Integer externalMappedPort = mapping.getExternalPort(); if (externalPorts.contains(externalMappedPort) && externalMappedPort != null) { errors.add(format("Duplicate external port mapping: %s", externalMappedPort)); errors.add(format("Invalid internal port: %d", mapping.getInternalPort())); if (mapping.getExternalPort() != null && !legalPort(mapping.getExternalPort())) { errors.add(format("Invalid external port: %d", mapping.getExternalPort()));
public void assertVolumes(final JobId jobId) throws Exception { // Wait for agent to come up awaitHostRegistered(client, testHost(), LONG_WAIT_SECONDS, SECONDS); awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // Deploy the job on the agent final Deployment deployment = Deployment.of(jobId, START); final JobDeployResponse deployed = client.deploy(deployment, testHost()).get(); assertEquals(JobDeployResponse.Status.OK, deployed.getStatus()); // Wait for the job to run final TaskStatus taskStatus = awaitJobState( client, testHost(), jobId, RUNNING, LONG_WAIT_SECONDS, SECONDS); assertJobEquals(job, taskStatus.getJob()); final Integer randomVolPort = taskStatus.getPorts().get("random").getExternalPort(); final Integer namedVolPort = taskStatus.getPorts().get("named").getExternalPort(); final Integer hostnamePort = taskStatus.getPorts().get("hostname").getExternalPort(); assert randomVolPort != null; assert namedVolPort != null; assert hostnamePort != null; // Read "foo" from /volume/bar and /mnt/my-volume/bar assertEquals("foo", recvUtf8(randomVolPort, 3)); assertEquals("foo", recvUtf8(namedVolPort, 3)); // Read hostname from /hostname final String hostname = getNewDockerClient().info().name(); final String mountedHostname = recvUtf8(hostnamePort, hostname.length()); assertEquals(hostname, mountedHostname); }
public void assertRamdisk(final JobId jobId) throws Exception { // Wait for agent to come up awaitHostRegistered(client, testHost(), LONG_WAIT_SECONDS, SECONDS); awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // Deploy the job on the agent final Deployment deployment = Deployment.of(jobId, START); final JobDeployResponse deployed = client.deploy(deployment, testHost()).get(); assertEquals(JobDeployResponse.Status.OK, deployed.getStatus()); // Wait for the job to run final TaskStatus taskStatus = awaitJobState( client, testHost(), jobId, RUNNING, LONG_WAIT_SECONDS, SECONDS); assertJobEquals(job, taskStatus.getJob()); final Integer dfPort = taskStatus.getPorts().get("df").getExternalPort(); assert dfPort != null; // If "/much-volatile" mount is present a line starting with tmpfs should be returned final String dfOutput = recvUtf8(dfPort, 5); assertEquals("tmpfs", dfOutput); }
assertTrue(portRange.contains(firstTaskStatus1.getPorts().get("foo").getExternalPort())); assertTrue(portRange.contains(firstTaskStatus2.getPorts().get("foo").getExternalPort()));
private List<Integer> staticPorts(final Job job) { final List<Integer> staticPorts = Lists.newArrayList(); for (final PortMapping portMapping : job.getPorts().values()) { if (portMapping.getExternalPort() != null) { staticPorts.add(portMapping.getExternalPort()); } } return staticPorts; }
@Override public String apply(final PortMapping input) { String s = String.valueOf(input.getInternalPort()); if (input.getExternalPort() != null) { s += ":" + input.getExternalPort(); } if (input.getProtocol() != null) { s += "/" + input.getProtocol(); } return s; } };
/** * Returns a {@link com.google.common.net.HostAndPort} object for a registered port, for each * host the job has been deployed to. This is useful for discovering the value of dynamically * allocated ports. * @param port the name of the registered port * @return a HostAndPort describing where the registered port can be reached. Null if * no ports have been registered. */ public List<HostAndPort> addresses(final String port) { checkArgument(job.getPorts().containsKey(port), "port %s not found", port); final List<HostAndPort> addresses = Lists.newArrayList(); for (Map.Entry<String, TaskStatus> entry : statuses.entrySet()) { final Integer externalPort = entry.getValue().getPorts().get(port).getExternalPort(); assert externalPort != null; final String host = endpointFromHost(entry.getKey()); addresses.add(HostAndPort.fromParts(host, externalPort)); } return addresses; }
@Override public boolean check(final String containerId) throws InterruptedException, DockerException { final Integer port = taskConfig.ports().get(healthCheck.getPort()).getExternalPort(); try { final URL url = new URL("http", dockerHost.address(), port, healthCheck.getPath()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(CONNECT_TIMEOUT_MILLIS); conn.setReadTimeout((int) READ_TIMEOUT_MILLIS); final int response = conn.getResponseCode(); return response >= 200 && response <= 399; } catch (Exception e) { return false; } } }
private void awaitPort(final String port, final String host) throws TimeoutException { final String endpoint = endpointFromHost(host); final TaskStatus taskStatus = statuses.get(host); assert taskStatus != null; final Integer externalPort = taskStatus.getPorts().get(port).getExternalPort(); assert externalPort != null; Polling.awaitUnchecked(TIMEOUT_MILLIS, MILLISECONDS, new Callable<Boolean>() { @Override public Boolean call() throws Exception { log.info("Probing: {} @ {}:{}", port, endpoint, externalPort); final boolean up = prober.probe(endpoint, externalPort); if (up) { log.info("Up: {} @ {}:{}", port, endpoint, externalPort); return true; } else { return null; } } }); }
/** * Create a port binding configuration for the job. * @return The port bindings. */ private Map<String, List<PortBinding>> portBindings() { final Map<String, List<PortBinding>> bindings = Maps.newHashMap(); for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) { final PortMapping mapping = e.getValue(); final PortBinding binding = new PortBinding(); final Integer externalPort = mapping.getExternalPort(); if (externalPort == null) { binding.hostPort(ports.get(e.getKey()).toString()); } else { binding.hostPort(externalPort.toString()); } final String entry = containerPort(mapping.getInternalPort(), mapping.getProtocol()); bindings.put(entry, Collections.singletonList(binding)); } return bindings; }