private static PortBinding[] fromDockerPortsToCompositePortBindings(String[] ports) { if (isNullOrEmpty(ports)) { return null; } PortBinding[] portBindings = new PortBinding[ports.length]; for (int i = 0; i < ports.length; i++) { portBindings[i] = fromDockerPortMapping(DockerPortMapping.fromString(ports[i])); } return portBindings; }
/** * Convert a map generated by the toMap() method back to a DockerPortMapping * * @param map * @return */ public static List<DockerPortMapping> fromMap(Map<String, List<Map<String, String>>> map) { return map.entrySet().stream() .map((e) -> fromMap(e)) .filter((m) -> m != null) .collect(Collectors.toList()); }
public static PortBinding fromDockerPortMapping(DockerPortMapping mapping) { PortBinding portBinding = new PortBinding(); portBinding.protocol = mapping.getProtocol().toString(); portBinding.containerPort = mapping.getContainerPort(); portBinding.hostIp = mapping.getHostIp(); portBinding.hostPort = mapping.getHostPort(); return portBinding; }
/** * Map port binding to ExposedPorts and PortBinding * * ExposedPorts are only used by the API adapter, as the docker CLI will add that itself * * @param input * @param portBindings */ private void addPortBindings(CommandInput input, List<PortBinding> portBindings) { Map<String, Map<String, String>> exposedPortsMap = new HashMap<>(); input.withProperty(DOCKER_CONTAINER_EXPOSED_PORTS_PROP_NAME, exposedPortsMap); Map<String, Object> hostConfig = getOrAddMap(input, DOCKER_CONTAINER_HOST_CONFIG_PROP_NAME); Map<String, List<Map<String, String>>> portBindingsMap = new HashMap<>(); hostConfig.put(DOCKER_CONTAINER_PORT_BINDINGS_PROP_NAME, portBindingsMap); for (PortBinding portBinding : portBindings) { DockerPortMapping mapping = DockerPortMapping.fromString(portBinding.toString()); Map<String, List<Map<String, String>>> portDetails = mapping.toMap(); portBindingsMap.putAll(portDetails); exposedPortsMap.put(mapping.getContainerPortAndProtocol(), Collections.emptyMap()); } }
@Test public void testToString() { DockerPortMapping portMapping = DockerPortMapping.fromString(portBinding); assertEquals(description, portBinding, portMapping.toString()); } }
/** * Convert the port mapping to the format expected by the API * * <pre> * "8282/tcp": [ * { * "HostIp": "0.0.0.0", * "HostPort": "8282" * } * ] * </pre> * * @return */ public Map<String, List<Map<String, String>>> toMap() { Map<String, String> portDetails = new HashMap<>(); if (hostIp != null) { portDetails.put(HOST_IP, hostIp); } if (hostPort != null) { portDetails.put(HOST_PORT, hostPort); } List<Map<String, String>> list = new ArrayList<>(1); list.add(portDetails); Map<String, List<Map<String, String>>> portMap = new HashMap<>(); portMap.put(getContainerPortAndProtocol(), list); return portMap; }
@Test public void testDockerPortStringParsing() { DockerPortMapping portMapping = DockerPortMapping.fromString(fullPortString); assertEquals(description + ": hostIp", expectedHostIp, portMapping.getHostIp()); assertEquals(description + ": hostPort", expectedHostPort, portMapping.getHostPort()); assertEquals(description + ": containerPort", expectedContainerPort, portMapping.getContainerPort()); assertEquals(description + ": protocol", expectedProtocol, portMapping.getProtocol()); }
public static ContainerDescription createContainerDescriptionWithPortBindingsHostPortSet() { ContainerDescription containerDesc = createContainerDescription("admiral-test"); containerDesc.portBindings = Arrays.stream(new String[] { "5000:5000", "127.0.0.1::20080", "127.0.0.1:20080:80", "1234:1234/tcp" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()) .toArray(new PortBinding[0]); return containerDesc; }
/** * Process port binding properties * * @param containerState * @param networkSettings */ private static void mapPortBindingProperties(ContainerState containerState, Map<String, Object> networkSettings) { if (networkSettings == null) { return; } Map<String, List<Map<String, String>>> portMap = getMap(networkSettings, DOCKER_CONTAINER_NETWORK_SETTINGS_PORTS_PROP_NAME); if (containerState.ports == null) { containerState.ports = new ArrayList<PortBinding>(); } if (portMap != null) { List<DockerPortMapping> portMappings = DockerPortMapping.fromMap(portMap); containerState.ports = portMappings.stream() .map((m) -> PortBinding.fromDockerPortMapping(m)) .collect(Collectors.toList()); } }
"127.0.0.1:20080:80", "1234:1234/tcp" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()) .toArray(new PortBinding[0]);
"127.0.0.1::80", "1234/tcp" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()) .toArray(new PortBinding[0]);
"5000:5000", "20080:80" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()); String configValue = String.format(
desc1.portBindings = Arrays.stream(new String[] { "80" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()) .toArray(new PortBinding[0]); "5008:80", "443" }) .map((s) -> PortBinding.fromDockerPortMapping(DockerPortMapping.fromString(s))) .collect(Collectors.toList()) .toArray(new PortBinding[0]);