final Integer externalMappedPort = mapping.getExternalPort(); if (externalPorts.contains(externalMappedPort) && externalMappedPort != null) { errors.add(format("Duplicate external port mapping: %s", externalMappedPort)); final String name = entry.getKey(); final PortMapping mapping = entry.getValue(); if (!PORT_MAPPING_PROTO_PATTERN.matcher(mapping.getProtocol()).matches()) { errors.add(format("Invalid port mapping protocol: %s", mapping.getProtocol())); if (!legalPort(mapping.getInternalPort())) { 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 PortMapping withExternalPort(final Integer externalPort) { return PortMapping.of(internalPort, externalPort, protocol); }
/** * Get final port mappings using allocated ports. * * @return The port mapping. */ public Map<String, PortMapping> ports() { final ImmutableMap.Builder<String, PortMapping> builder = ImmutableMap.builder(); for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) { final PortMapping mapping = e.getValue(); builder.put(e.getKey(), mapping.hasExternalPort() ? mapping : mapping.withExternalPort(checkNotNull(ports.get(e.getKey())))); } return builder.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(); } };
/** * Create container port exposure configuration for a job. * * @return The exposed ports. */ private Set<String> containerExposedPorts() { final Set<String> ports = Sets.newHashSet(); for (final Map.Entry<String, PortMapping> entry : job.getPorts().entrySet()) { final PortMapping mapping = entry.getValue(); ports.add(containerPort(mapping.getInternalPort(), mapping.getProtocol())); } return ports; }
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; }
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 Map<String, PortMapping> ports1 = ImmutableMap.of("foo", PortMapping.of(4711), "bar", staticMapping1); final Map<String, PortMapping> ports2 = ImmutableMap.of("foo", PortMapping.of(4711), "bar", staticMapping2); assertTrue(portRange.contains(firstTaskStatus1.getPorts().get("foo").getExternalPort())); assertTrue(portRange.contains(firstTaskStatus2.getPorts().get("foo").getExternalPort()));
"foo", PortMapping.of(4711), "bar", PortMapping.of(5000, externalPort)); final Map<ServiceEndpoint, ServicePorts> registration = ImmutableMap.of( ServiceEndpoint.of("foo-service", "tcp"), ServicePorts.of("foo"), assertEquals(ServicePorts.of("bar"), job.getRegistration().get(ServiceEndpoint.of("bar-service", "http"))); assertEquals(4711, job.getPorts().get("foo").getInternalPort()); assertEquals(PortMapping.of(5000, externalPort), job.getPorts().get("bar")); assertEquals("f00d", job.getEnv().get("BAD"));
/** * Returns true if any of the Job's {@link PortMapping}s has an external port. */ public boolean hasExternalPorts() { for (final PortMapping pm : ports.values()) { if (pm.hasExternalPort()) { return true; } } return false; }
static PortMappingWithName parsePortMapping(final String portSpec) { final Matcher matcher = PATTERN.matcher(portSpec); if (!matcher.matches()) { throw new IllegalArgumentException("Bad port mapping: " + portSpec); } final String name = matcher.group("n"); final String ip = matcher.group("ip"); final int internal = Integer.parseInt(matcher.group("i")); final Integer external = nullOrInteger(matcher.group("e")); final String protocol = fromNullable(matcher.group("p")).or(TCP); return PortMappingWithName.create(name, PortMapping.builder() .ip(ip) .internalPort(internal) .externalPort(external) .protocol(protocol) .build()); }
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(); }
/** * 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; }
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 (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); } }
/** * Create container port exposure configuration for a job. * @return The exposed ports. */ private Set<String> containerExposedPorts() { final Set<String> ports = Sets.newHashSet(); for (final Map.Entry<String, PortMapping> entry : job.getPorts().entrySet()) { final PortMapping mapping = entry.getValue(); ports.add(containerPort(mapping.getInternalPort(), mapping.getProtocol())); } return ports; }
@Test public void testPortMappingWithIp() throws Exception { startDefaultMaster(); startDefaultAgent(testHost()); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // Create job with a portmapping that has an IP. Check it doesn't throw. createJobRawOutput(Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setImage(BUSYBOX) .setPorts(Collections.singletonMap("foo", PortMapping.builder() .ip("127.0.0.1") .internalPort(80) .externalPort(80) .build() )).build()); }
@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; } };
@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; } });
/** * Starts a container that listens on a poke port, and once poked listens on the healthcheck * port. */ private Job pokeJob(final HealthCheck healthCheck) { return Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setImage(ALPINE) .setCommand(asList("sh", "-c", "nc -l -p 4711 && nc -lk -p 4712 -e hostname")) .addPort("poke", PortMapping.of(4711)) .addPort("health", PortMapping.of(4712)) .addRegistration(ServiceEndpoint.of("foo_service", "foo_proto"), ServicePorts.of("health")) .setHealthCheck(healthCheck) .build(); }
/** * Get final port mappings using allocated ports. * @return The port mapping. */ public Map<String, PortMapping> ports() { final ImmutableMap.Builder<String, PortMapping> builder = ImmutableMap.builder(); for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) { final PortMapping mapping = e.getValue(); builder.put(e.getKey(), mapping.hasExternalPort() ? mapping : mapping.withExternalPort(checkNotNull(ports.get(e.getKey())))); } return builder.build(); }