|
@@ -20,16 +20,19 @@
|
|
|
|
|
|
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.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
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;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerRuntimeContext;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerRuntimeContext;
|
|
|
|
|
|
|
|
+import java.util.EnumSet;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
@InterfaceAudience.Private
|
|
@InterfaceAudience.Private
|
|
@@ -39,39 +42,65 @@ public class DelegatingLinuxContainerRuntime implements LinuxContainerRuntime {
|
|
.getLog(DelegatingLinuxContainerRuntime.class);
|
|
.getLog(DelegatingLinuxContainerRuntime.class);
|
|
private DefaultLinuxContainerRuntime defaultLinuxContainerRuntime;
|
|
private DefaultLinuxContainerRuntime defaultLinuxContainerRuntime;
|
|
private DockerLinuxContainerRuntime dockerLinuxContainerRuntime;
|
|
private DockerLinuxContainerRuntime dockerLinuxContainerRuntime;
|
|
|
|
+ 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);
|
|
|
|
|
|
+ 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.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(Container container) {
|
|
|
|
- Map<String, String> env = container.getLaunchContext().getEnvironment();
|
|
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ LinuxContainerRuntime pickContainerRuntime(
|
|
|
|
+ Map<String, String> environment) throws ContainerExecutionException {
|
|
LinuxContainerRuntime runtime;
|
|
LinuxContainerRuntime runtime;
|
|
-
|
|
|
|
- if (DockerLinuxContainerRuntime.isDockerContainerRequested(env)){
|
|
|
|
|
|
+ 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.isInfoEnabled()) {
|
|
|
|
- LOG.info("Using container runtime: " + runtime.getClass()
|
|
|
|
|
|
+ if (LOG.isDebugEnabled()) {
|
|
|
|
+ LOG.debug("Using container runtime: " + runtime.getClass()
|
|
.getSimpleName());
|
|
.getSimpleName());
|
|
}
|
|
}
|
|
|
|
|
|
return runtime;
|
|
return runtime;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private LinuxContainerRuntime pickContainerRuntime(Container container)
|
|
|
|
+ throws ContainerExecutionException {
|
|
|
|
+ return pickContainerRuntime(container.getLaunchContext().getEnvironment());
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void prepareContainer(ContainerRuntimeContext ctx)
|
|
public void prepareContainer(ContainerRuntimeContext ctx)
|
|
throws ContainerExecutionException {
|
|
throws ContainerExecutionException {
|
|
@@ -107,4 +136,10 @@ public class DelegatingLinuxContainerRuntime implements LinuxContainerRuntime {
|
|
|
|
|
|
runtime.reapContainer(ctx);
|
|
runtime.reapContainer(ctx);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ boolean isRuntimeAllowed(
|
|
|
|
+ LinuxContainerRuntimeConstants.RuntimeType runtimeType) {
|
|
|
|
+ return allowedRuntimes.contains(runtimeType);
|
|
|
|
+ }
|
|
}
|
|
}
|