--- .../hadoop/yarn/api/records/ContainerStatus.java | 18 ++++++++++++++++++ .../hadoop/yarn/service/api/records/Container.java | 13 +++++++++++++ .../component/instance/ComponentInstance.java | 14 ++++++++++++++ .../api/records/impl/pb/ContainerStatusPBImpl.java | 21 +++++++++++++++++++++ .../yarn/server/nodemanager/ContainerExecutor.java | 5 +++++ .../server/nodemanager/LinuxContainerExecutor.java | 5 +++++ .../containermanager/ContainerManagerImpl.java | 2 ++ .../containermanager/container/Container.java | 2 ++ .../containermanager/container/ContainerImpl.java | 7 +++++++ .../linux/runtime/DefaultLinuxContainerRuntime.java | 5 +++++ .../runtime/DelegatingLinuxContainerRuntime.java | 7 +++++++ .../linux/runtime/DockerLinuxContainerRuntime.java | 18 +++++++++++++++++- .../linux/runtime/docker/DockerInspectCommand.java | 7 +++++++ .../monitor/ContainersMonitorImpl.java | 2 ++ .../containermanager/runtime/ContainerRuntime.java | 12 +++++++++++- .../container-executor/impl/utils/docker-util.c | 8 +++++--- .../test/utils/test_docker_util.cc | 18 +++++++++++++++--- .../linux/runtime/MockLinuxContainerRuntime.java | 5 +++++ .../server/nodemanager/webapp/MockContainer.java | 4 ++++ 19 files changed, 165 insertions(+), 8 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java index edc62fc4867..10bd1ef5d79 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java @@ -223,4 +223,22 @@ public ContainerSubState getContainerSubState() { throw new UnsupportedOperationException( "subclass must implement this method"); } + + /** + * Get exposed ports of the container. + * @return List of exposed ports + */ + @Public + @Unstable + public String getExposedPorts() { + throw new UnsupportedOperationException( + "subclass must implement this method"); + } + + @Private + @Unstable + public void setExposedPorts(String ports) { + throw new UnsupportedOperationException( + "subclass must implement this method"); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/api/records/Container.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/api/records/Container.java index 2f9af7c1d14..0b96a8b61d3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/api/records/Container.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/api/records/Container.java @@ -21,6 +21,8 @@ import io.swagger.annotations.ApiModelProperty; import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.Objects; import javax.xml.bind.annotation.XmlElement; @@ -52,6 +54,7 @@ private Resource resource = null; private Artifact artifact = null; private Boolean privilegedContainer = null; + private Map>> exposedPorts = null; /** * Unique container id of a running service, e.g. @@ -244,6 +247,16 @@ public void setPrivilegedContainer(Boolean privilegedContainer) { this.privilegedContainer = privilegedContainer; } + @ApiModelProperty(example = "null", value = "Ports exposed for this container.") + @JsonProperty("exposed_ports") + public Map>> getExposedPorts() { + return exposedPorts; + } + + public void setExposedPorts(Map>> ports) { + this.exposedPorts = ports; + } + @Override public boolean equals(java.lang.Object o) { if (this == o) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/component/instance/ComponentInstance.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/component/instance/ComponentInstance.java index a49ad1c654e..82feff39397 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/component/instance/ComponentInstance.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/component/instance/ComponentInstance.java @@ -18,6 +18,8 @@ package org.apache.hadoop.yarn.service.component.instance; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -64,6 +66,9 @@ import java.text.MessageFormat; import java.util.Date; import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -711,6 +716,15 @@ public void updateContainerStatus(ContainerStatus status) { String newIP = StringUtils.join(",", status.getIPs()); container.setIp(newIP); container.setHostname(status.getHost()); + ObjectMapper mapper = new ObjectMapper(); + Map>> ports = new HashMap>>(); + try { + ports = mapper.readValue(status.getExposedPorts(), + new TypeReference>>>(){}); + container.setExposedPorts(ports); + } catch (IOException e) { + LOG.warn("Unable to process container ports mapping: {}", e); + } if (existingIP != null && newIP.equals(existingIP)) { doRegistryUpdate = false; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java index a6668dad7ba..8265c418411 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java @@ -52,6 +52,7 @@ private ContainerId containerId = null; private static final String HOST = "HOST"; private static final String IPS = "IPS"; + private static final String PORTS = "PORTS"; private Map containerAttributes = new HashMap<>(); @@ -98,6 +99,7 @@ public String toString() { sb.append("ExitStatus: ").append(getExitStatus()).append(", "); sb.append("IP: ").append(getIPs()).append(", "); sb.append("Host: ").append(getHost()).append(", "); + sb.append("ExposedPorts: ").append(getExposedPorts()).append(", "); sb.append("ContainerSubState: ").append(getContainerSubState()); sb.append("]"); return sb.toString(); @@ -318,6 +320,25 @@ public synchronized void setIPs(List ips) { containerAttributes.put(IPS, StringUtils.join(",", ips)); } + @Override + public synchronized String getExposedPorts() { + if (containerAttributes.get(PORTS) == null) { + initContainerAttributes(); + } + String ports = containerAttributes.get((PORTS)); + return ports == null ? "" : ports; + } + + @Override + public synchronized void setExposedPorts(String ports) { + maybeInitBuilder(); + if (ports == null) { + containerAttributes.remove(PORTS); + return; + } + containerAttributes.put(PORTS, ports); + } + @Override public synchronized String getHost() { if (containerAttributes.get(HOST) == null) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java index 2ef5725bee0..a87c494ddb5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java @@ -930,4 +930,9 @@ public void run() { } return symLinks; } + + public String getExposedPorts(Container container) + throws ContainerExecutionException { + return null; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java index 23498fe7ca9..f402419bb65 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java @@ -1037,4 +1037,9 @@ public synchronized void updateYarnSysFS(Context ctx, String user, } } + @Override + public String getExposedPorts(Container container) + throws ContainerExecutionException { + return linuxContainerRuntime.getExposedPorts(container); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java index 8a12c3c5105..560db8f7835 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java @@ -1509,6 +1509,8 @@ private void logContainerStatus(String prefix, ContainerStatus status) { sb.append(status.getIPs()).append(", "); sb.append("Host: "); sb.append(status.getHost()).append(", "); + sb.append("ExposedPorts: "); + sb.append(status.getExposedPorts()).append(", "); sb.append("ContainerSubState: "); sb.append(status.getContainerSubState()); sb.append("]"); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java index 4912d02758d..faa695cf009 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java @@ -81,6 +81,8 @@ void setIpAndHost(String[] ipAndHost); + void setExposedPorts(String ports); + String toString(); Priority getPriority(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java index 6716dbb02e9..0c27aeb56f7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java @@ -176,6 +176,7 @@ private ReInitializationContext createContextForRollback() { private String logDir; private String host; private String ips; + private String exposedPorts; private volatile ReInitializationContext reInitContext; private volatile boolean isReInitializing = false; private volatile boolean isMarkeForKilling = false; @@ -857,6 +858,7 @@ public ContainerStatus cloneAndGetContainerStatus() { Arrays.asList(ips.split(","))); status.setHost(host); status.setContainerSubState(getContainerSubState()); + status.setExposedPorts(exposedPorts); return status; } finally { this.readLock.unlock(); @@ -2255,4 +2257,9 @@ public boolean isContainerInFinalStates() { || state == ContainerState.EXITED_WITH_FAILURE || state == ContainerState.EXITED_WITH_SUCCESS; } + + @Override + public void setExposedPorts(String ports) { + this.exposedPorts = ports; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DefaultLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DefaultLinuxContainerRuntime.java index 837db62e231..c74a59d7ec1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DefaultLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DefaultLinuxContainerRuntime.java @@ -197,6 +197,11 @@ public void reapContainer(ContainerRuntimeContext ctx) return ContainerExecutor.getLocalIpAndHost(container); } + @Override + public String getExposedPorts(Container container) { + return null; + } + @Override public IOStreamPair execContainer(ContainerExecContext containerExecContext) throws ContainerExecutionException { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java index 28b2039ae1e..9842c380b02 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java @@ -202,6 +202,13 @@ public void reapContainer(ContainerRuntimeContext ctx) return runtime.getIpAndHost(container); } + @Override + public String getExposedPorts(Container container) + throws ContainerExecutionException { + LinuxContainerRuntime runtime = pickContainerRuntime(container); + return runtime.getExposedPorts(container); + } + private boolean isPluggableRuntime(String runtimeType) { for (LinuxContainerRuntimeConstants.RuntimeType type : LinuxContainerRuntimeConstants.RuntimeType.values()) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java index 83460fc265e..54d194c1392 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java @@ -1248,7 +1248,23 @@ public IOStreamPair execContainer(ContainerExecContext ctx) return null; } - + @Override + public String getExposedPorts(Container container) + throws ContainerExecutionException { + ContainerId containerId = container.getContainerId(); + String containerIdStr = containerId.toString(); + DockerInspectCommand inspectCommand = + new DockerInspectCommand(containerIdStr).getExposedPorts(); + try { + String output = executeDockerInspect(containerId, inspectCommand); + return output; + } catch (ContainerExecutionException e) { + LOG.error("Error when writing command to temp file", e); + } catch (PrivilegedOperationException e) { + LOG.error("Error when executing command.", e); + } + return null; + } private PrivilegedOperation buildLaunchOp(ContainerRuntimeContext ctx, String commandFile, DockerCommand command) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerInspectCommand.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerInspectCommand.java index f457e12a376..809339316ea 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerInspectCommand.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerInspectCommand.java @@ -75,4 +75,11 @@ public PrivilegedOperation preparePrivilegedOperation( public static final String STATUS_TEMPLATE = "{{.State.Status}}"; public static final String STOPSIGNAL_TEMPLATE = "{{.Config.StopSignal}}"; + + public DockerInspectCommand getExposedPorts() { + super.addCommandArguments("format", "{{json .NetworkSettings.Ports}}"); + this.commandArguments = "--format={{json .NetworkSettings.Ports}}"; + return this; + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java index b9e2c68abed..0efbb89ccab 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java @@ -616,6 +616,8 @@ private void initializeProcessTrees( LOG.info("Can not get both ip and hostname: " + Arrays.toString(ipAndHost)); } + String exposedPorts = containerExecutor.getExposedPorts(container); + container.setExposedPorts(exposedPorts); } else { LOG.info(containerId + " is missing. Not setting ip and hostname"); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/runtime/ContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/runtime/ContainerRuntime.java index 91f9aa45865..92fd86d1514 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/runtime/ContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/runtime/ContainerRuntime.java @@ -105,4 +105,14 @@ IOStreamPair execContainer(ContainerExecContext ctx) * and hostname */ String[] getIpAndHost(Container container) throws ContainerExecutionException; -} \ No newline at end of file + + /** + * Return the exposed ports of the container. + * @param container the {@link Container} + * @return List of exposed ports + * @throws ContainerExecutionException if an error occurs while getting + * the exposed ports + */ + String getExposedPorts(Container container) + throws ContainerExecutionException; +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/utils/docker-util.c b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/utils/docker-util.c index c0aa80bf81b..986df240f22 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/utils/docker-util.c +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/utils/docker-util.c @@ -559,9 +559,10 @@ cleanup: } int get_docker_inspect_command(const char *command_file, const struct configuration *conf, args *args) { - const char *valid_format_strings[] = { "{{.State.Status}}", + const char *valid_format_strings[] = {"{{.State.Status}}", "{{range(.NetworkSettings.Networks)}}{{.IPAddress}},{{end}}{{.Config.Hostname}}", - "{{.State.Status}},{{.Config.StopSignal}}"}; + "{{json .NetworkSettings.Ports}}", + "{{.State.Status}},{{.Config.StopSignal}}"}; int ret = 0, i = 0, valid_format = 0; char *format = NULL, *container_name = NULL, *tmp_buffer = NULL; struct configuration command_config = {0, NULL}; @@ -581,7 +582,8 @@ int get_docker_inspect_command(const char *command_file, const struct configurat ret = INVALID_DOCKER_INSPECT_FORMAT; goto free_and_exit; } - for (i = 0; i < 3; ++i) { + + for (i = 0; i < 4; ++i) { if (strcmp(format, valid_format_strings[i]) == 0) { valid_format = 1; break; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/utils/test_docker_util.cc b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/utils/test_docker_util.cc index 2817e0ca5c0..a3cdf51d3e0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/utils/test_docker_util.cc +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/utils/test_docker_util.cc @@ -171,14 +171,20 @@ namespace ContainerExecutor { " format={{range(.NetworkSettings.Networks)}}{{.IPAddress}},{{end}}{{.Config.Hostname}}\n" " name=container_e1_12312_11111_02_000001", "inspect --format={{range(.NetworkSettings.Networks)}}{{.IPAddress}},{{end}}{{.Config.Hostname}} container_e1_12312_11111_02_000001")); + file_cmd_vec.push_back(std::make_pair( + "[docker-command-execution]\n docker-command=inspect\n format={{json .NetworkSettings.Ports}}\n name=container_e1_12312_11111_02_000001", + "inspect --format={{json .NetworkSettings.Ports}} container_e1_12312_11111_02_000001")); + file_cmd_vec.push_back(std::make_pair( + "[docker-command-execution]\n docker-command=inspect\n format={{.State.Status}},{{.Config.StopSignal}}\n name=container_e1_12312_11111_02_000001", + "inspect --format={{.State.Status}},{{.Config.StopSignal}} container_e1_12312_11111_02_000001")); std::vector > bad_file_cmd_vec; bad_file_cmd_vec.push_back(std::make_pair( "[docker-command-execution]\n docker-command=run\n format='{{.State.Status}}'", static_cast(INCORRECT_COMMAND))); - bad_file_cmd_vec.push_back( - std::make_pair("docker-command=inspect\n format='{{.State.Status}}'", - static_cast(INCORRECT_COMMAND))); + bad_file_cmd_vec.push_back(std::make_pair( + "docker-command=inspect\n format='{{.State.Status}}'", + static_cast(INCORRECT_COMMAND))); bad_file_cmd_vec.push_back(std::make_pair( "[docker-command-execution]\n docker-command=inspect\n format={{.State.Status}}\n name=", static_cast(INVALID_DOCKER_CONTAINER_NAME))); @@ -194,6 +200,12 @@ namespace ContainerExecutor { bad_file_cmd_vec.push_back(std::make_pair( "[docker-command-execution]\n docker-command=inspect\n format={{.IPAddress}}\n name=container_e1_12312_11111_02_000001", static_cast(INVALID_DOCKER_INSPECT_FORMAT))); + bad_file_cmd_vec.push_back(std::make_pair( + "[docker-command-execution]\n docker-command=inspect\n format={{.NetworkSettings.Ports}}\n name=container_e1_12312_11111_02_000001", + static_cast(INVALID_DOCKER_INSPECT_FORMAT))); + bad_file_cmd_vec.push_back(std::make_pair( + "[docker-command-execution]\n docker-command=inspect\n format={{.Config.StopSignal}}\n name=container_e1_12312_11111_02_000001", + static_cast(INVALID_DOCKER_INSPECT_FORMAT))); run_docker_command_test(file_cmd_vec, bad_file_cmd_vec, get_docker_inspect_command); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/MockLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/MockLinuxContainerRuntime.java index 37c6eeab951..ff449e797a8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/MockLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/MockLinuxContainerRuntime.java @@ -62,6 +62,11 @@ public void reapContainer(ContainerRuntimeContext ctx) {} return new String[0]; } + @Override + public String getExposedPorts(Container container) { + return ""; + } + @Override public IOStreamPair execContainer(ContainerExecContext ctx) throws ContainerExecutionException { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java index 67dfef259df..c6860001f6a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java @@ -192,6 +192,10 @@ public void setIpAndHost(String[] ipAndHost) { } + @Override + public void setExposedPorts(String ports) { + } + @Override public boolean isRunning() { return false; -- 2.16.2