|
@@ -20,9 +20,11 @@
|
|
|
|
|
|
package org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime;
|
|
package org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime;
|
|
|
|
|
|
|
|
+import com.google.common.annotations.VisibleForTesting;
|
|
import org.apache.hadoop.classification.InterfaceAudience;
|
|
import org.apache.hadoop.classification.InterfaceAudience;
|
|
import org.apache.hadoop.classification.InterfaceStability;
|
|
import org.apache.hadoop.classification.InterfaceStability;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
|
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerExecutionException;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerExecutionException;
|
|
@@ -31,6 +33,7 @@ import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.Contai
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
+import java.util.EnumSet;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -50,34 +53,62 @@ public class DelegatingLinuxContainerRuntime implements LinuxContainerRuntime {
|
|
private DefaultLinuxContainerRuntime defaultLinuxContainerRuntime;
|
|
private DefaultLinuxContainerRuntime defaultLinuxContainerRuntime;
|
|
private DockerLinuxContainerRuntime dockerLinuxContainerRuntime;
|
|
private DockerLinuxContainerRuntime dockerLinuxContainerRuntime;
|
|
private JavaSandboxLinuxContainerRuntime javaSandboxLinuxContainerRuntime;
|
|
private JavaSandboxLinuxContainerRuntime javaSandboxLinuxContainerRuntime;
|
|
|
|
+ private EnumSet<LinuxContainerRuntimeConstants.RuntimeType> allowedRuntimes =
|
|
|
|
+ EnumSet.noneOf(LinuxContainerRuntimeConstants.RuntimeType.class);
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void initialize(Configuration conf)
|
|
public void initialize(Configuration conf)
|
|
throws ContainerExecutionException {
|
|
throws ContainerExecutionException {
|
|
- PrivilegedOperationExecutor privilegedOperationExecutor =
|
|
|
|
- PrivilegedOperationExecutor.getInstance(conf);
|
|
|
|
- defaultLinuxContainerRuntime = new DefaultLinuxContainerRuntime(
|
|
|
|
- privilegedOperationExecutor);
|
|
|
|
- defaultLinuxContainerRuntime.initialize(conf);
|
|
|
|
- dockerLinuxContainerRuntime = new DockerLinuxContainerRuntime(
|
|
|
|
- privilegedOperationExecutor);
|
|
|
|
- dockerLinuxContainerRuntime.initialize(conf);
|
|
|
|
- javaSandboxLinuxContainerRuntime = new JavaSandboxLinuxContainerRuntime(
|
|
|
|
- privilegedOperationExecutor);
|
|
|
|
- javaSandboxLinuxContainerRuntime.initialize(conf);
|
|
|
|
|
|
+ String[] configuredRuntimes = conf.getTrimmedStrings(
|
|
|
|
+ YarnConfiguration.LINUX_CONTAINER_RUNTIME_ALLOWED_RUNTIMES,
|
|
|
|
+ YarnConfiguration.DEFAULT_LINUX_CONTAINER_RUNTIME_ALLOWED_RUNTIMES);
|
|
|
|
+ for (String configuredRuntime : configuredRuntimes) {
|
|
|
|
+ try {
|
|
|
|
+ allowedRuntimes.add(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType.valueOf(
|
|
|
|
+ configuredRuntime.toUpperCase()));
|
|
|
|
+ } catch (IllegalArgumentException e) {
|
|
|
|
+ throw new ContainerExecutionException("Invalid runtime set in "
|
|
|
|
+ + YarnConfiguration.LINUX_CONTAINER_RUNTIME_ALLOWED_RUNTIMES + " : "
|
|
|
|
+ + configuredRuntime);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (isRuntimeAllowed(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType.JAVASANDBOX)) {
|
|
|
|
+ javaSandboxLinuxContainerRuntime = new JavaSandboxLinuxContainerRuntime(
|
|
|
|
+ PrivilegedOperationExecutor.getInstance(conf));
|
|
|
|
+ javaSandboxLinuxContainerRuntime.initialize(conf);
|
|
|
|
+ }
|
|
|
|
+ if (isRuntimeAllowed(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType.DOCKER)) {
|
|
|
|
+ dockerLinuxContainerRuntime = new DockerLinuxContainerRuntime(
|
|
|
|
+ PrivilegedOperationExecutor.getInstance(conf));
|
|
|
|
+ dockerLinuxContainerRuntime.initialize(conf);
|
|
|
|
+ }
|
|
|
|
+ if (isRuntimeAllowed(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType.DEFAULT)) {
|
|
|
|
+ defaultLinuxContainerRuntime = new DefaultLinuxContainerRuntime(
|
|
|
|
+ PrivilegedOperationExecutor.getInstance(conf));
|
|
|
|
+ defaultLinuxContainerRuntime.initialize(conf);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- private LinuxContainerRuntime pickContainerRuntime(
|
|
|
|
- Map<String, String> environment){
|
|
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ LinuxContainerRuntime pickContainerRuntime(
|
|
|
|
+ Map<String, String> environment) throws ContainerExecutionException {
|
|
LinuxContainerRuntime runtime;
|
|
LinuxContainerRuntime runtime;
|
|
//Sandbox checked first to ensure DockerRuntime doesn't circumvent controls
|
|
//Sandbox checked first to ensure DockerRuntime doesn't circumvent controls
|
|
- if (javaSandboxLinuxContainerRuntime.isSandboxContainerRequested()){
|
|
|
|
- runtime = javaSandboxLinuxContainerRuntime;
|
|
|
|
- } else if (DockerLinuxContainerRuntime
|
|
|
|
- .isDockerContainerRequested(environment)){
|
|
|
|
|
|
+ if (javaSandboxLinuxContainerRuntime != null &&
|
|
|
|
+ javaSandboxLinuxContainerRuntime.isSandboxContainerRequested()){
|
|
|
|
+ runtime = javaSandboxLinuxContainerRuntime;
|
|
|
|
+ } else if (dockerLinuxContainerRuntime != null &&
|
|
|
|
+ DockerLinuxContainerRuntime.isDockerContainerRequested(environment)){
|
|
runtime = dockerLinuxContainerRuntime;
|
|
runtime = dockerLinuxContainerRuntime;
|
|
- } else {
|
|
|
|
|
|
+ } else if (defaultLinuxContainerRuntime != null &&
|
|
|
|
+ !DockerLinuxContainerRuntime.isDockerContainerRequested(environment)) {
|
|
runtime = defaultLinuxContainerRuntime;
|
|
runtime = defaultLinuxContainerRuntime;
|
|
|
|
+ } else {
|
|
|
|
+ throw new ContainerExecutionException("Requested runtime not allowed.");
|
|
}
|
|
}
|
|
|
|
|
|
if (LOG.isDebugEnabled()) {
|
|
if (LOG.isDebugEnabled()) {
|
|
@@ -88,7 +119,8 @@ public class DelegatingLinuxContainerRuntime implements LinuxContainerRuntime {
|
|
return runtime;
|
|
return runtime;
|
|
}
|
|
}
|
|
|
|
|
|
- private LinuxContainerRuntime pickContainerRuntime(Container container) {
|
|
|
|
|
|
+ private LinuxContainerRuntime pickContainerRuntime(Container container)
|
|
|
|
+ throws ContainerExecutionException {
|
|
return pickContainerRuntime(container.getLaunchContext().getEnvironment());
|
|
return pickContainerRuntime(container.getLaunchContext().getEnvironment());
|
|
}
|
|
}
|
|
|
|
|
|
@@ -127,8 +159,15 @@ public class DelegatingLinuxContainerRuntime implements LinuxContainerRuntime {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public String[] getIpAndHost(Container container) {
|
|
|
|
|
|
+ public String[] getIpAndHost(Container container)
|
|
|
|
+ throws ContainerExecutionException {
|
|
LinuxContainerRuntime runtime = pickContainerRuntime(container);
|
|
LinuxContainerRuntime runtime = pickContainerRuntime(container);
|
|
return runtime.getIpAndHost(container);
|
|
return runtime.getIpAndHost(container);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ boolean isRuntimeAllowed(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType runtimeType) {
|
|
|
|
+ return allowedRuntimes.contains(runtimeType);
|
|
|
|
+ }
|
|
}
|
|
}
|