Index: 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 IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- 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 (date 1504905381000) +++ 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 (date 1502950953000) @@ -65,7 +65,6 @@ @Override public void launchContainer(ContainerRuntimeContext ctx) throws ContainerExecutionException { - Container container = ctx.getContainer(); PrivilegedOperation launchOp = new PrivilegedOperation( PrivilegedOperation.OperationType.LAUNCH_CONTAINER); @@ -101,8 +100,7 @@ try { privilegedOperationExecutor.executePrivilegedOperation(prefixCommands, - launchOp, null, container.getLaunchContext().getEnvironment(), - false, false); + launchOp, null, null,false, false); } catch (PrivilegedOperationException e) { LOG.warn("Launch container failed. Exception: ", e); @@ -114,7 +112,6 @@ @Override public void signalContainer(ContainerRuntimeContext ctx) throws ContainerExecutionException { - Container container = ctx.getContainer(); PrivilegedOperation signalOp = new PrivilegedOperation( PrivilegedOperation.OperationType.SIGNAL_CONTAINER); @@ -133,8 +130,7 @@ .getInstance(conf); executor.executePrivilegedOperation(null, - signalOp, null, container.getLaunchContext().getEnvironment(), - false, true); + signalOp, null, null,false, false); } catch (PrivilegedOperationException e) { //Don't log the failure here. Some kinds of signaling failures are // acceptable. Let the calling executor decide what to do. Index: 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 IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- 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 (date 1504905381000) +++ 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 (date 1502950953000) @@ -314,8 +314,7 @@ try { privilegedOperationExecutor.executePrivilegedOperation(null, - launchOp, null, container.getLaunchContext().getEnvironment(), - false, false); + launchOp, null, null,false, false); } catch (PrivilegedOperationException e) { LOG.warn("Launch container failed. Exception: ", e); @@ -343,8 +342,7 @@ .getInstance(conf); executor.executePrivilegedOperation(null, - signalOp, null, container.getLaunchContext().getEnvironment(), - false, true); + signalOp, null, null, false, false); } catch (PrivilegedOperationException e) { LOG.warn("Signal container failed. Exception: ", e); Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java (date 1504905381000) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java (date 1502950953000) @@ -70,10 +70,16 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; +import static org.mockito.Matchers.anyListOf; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; public class TestLinuxContainerExecutorWithMocks { @@ -87,6 +93,8 @@ private String tmpMockExecutor; private LinuxContainerExecutor mockExec = null; + private LinuxContainerExecutor mockExecMockRuntime = null; + private PrivilegedOperationExecutor mockPriviligedExec; private final File mockParamFile = new File("./params.txt"); private LocalDirsHandlerService dirsHandler; @@ -136,22 +144,28 @@ Configuration conf = new Configuration(); LinuxContainerRuntime linuxContainerRuntime; + LinuxContainerRuntime mockLinuxContainerRuntime; setupMockExecutor(MOCK_EXECUTOR, conf); linuxContainerRuntime = new DefaultLinuxContainerRuntime( PrivilegedOperationExecutor.getInstance(conf)); + mockPriviligedExec = Mockito.mock(PrivilegedOperationExecutor.class); + mockLinuxContainerRuntime = new DefaultLinuxContainerRuntime( + mockPriviligedExec); dirsHandler = new LocalDirsHandlerService(); dirsHandler.init(conf); linuxContainerRuntime.initialize(conf); mockExec = new LinuxContainerExecutor(linuxContainerRuntime); mockExec.setConf(conf); + mockExecMockRuntime = new LinuxContainerExecutor(mockLinuxContainerRuntime); + mockExecMockRuntime.setConf(conf); } @After public void tearDown() { deleteMockParamFile(); } - + @Test public void testContainerLaunch() throws IOException { String appSubmitter = "nobody"; @@ -163,7 +177,6 @@ ContainerId cId = mock(ContainerId.class); ContainerLaunchContext context = mock(ContainerLaunchContext.class); HashMap env = new HashMap(); - when(container.getContainerId()).thenReturn(cId); when(container.getLaunchContext()).thenReturn(context); @@ -565,4 +578,50 @@ e.getMessage().contains("exit code")); } } + + @Test + public void testContainerLaunchEnvironment() + throws IOException, + PrivilegedOperationException { + String appSubmitter = "nobody"; + String appId = "APP_ID"; + String containerId = "CONTAINER_ID"; + Container container = mock(Container.class); + ContainerId cId = mock(ContainerId.class); + ContainerLaunchContext context = mock(ContainerLaunchContext.class); + HashMap env = new HashMap(); + env.put("FROM_CLIENT", "1"); + + when(container.getContainerId()).thenReturn(cId); + when(container.getLaunchContext()).thenReturn(context); + + when(cId.toString()).thenReturn(containerId); + + when(context.getEnvironment()).thenReturn(env); + + Path scriptPath = new Path("file:///bin/echo"); + Path tokensPath = new Path("file:///dev/null"); + Path workDir = new Path("/tmp"); + Path pidFile = new Path(workDir, "pid.txt"); + + mockExecMockRuntime.activateContainer(cId, pidFile); + mockExecMockRuntime.launchContainer(new ContainerStartContext.Builder() + .setContainer(container) + .setNmPrivateContainerScriptPath(scriptPath) + .setNmPrivateTokensPath(tokensPath) + .setUser(appSubmitter) + .setAppId(appId) + .setContainerWorkDir(workDir) + .setLocalDirs(dirsHandler.getLocalDirs()) + .setLogDirs(dirsHandler.getLogDirs()) + .build()); + ArgumentCaptor opCaptor = ArgumentCaptor.forClass( + PrivilegedOperation.class); + // Verify that + verify(mockPriviligedExec, times(1)) + .executePrivilegedOperation(anyListOf( + String.class), opCaptor.capture(), any( + File.class), eq((Map)null), + eq(false), eq(false)); + } } Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java (date 1504905381000) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java (date 1502950953000) @@ -99,6 +99,7 @@ cId = mock(ContainerId.class); context = mock(ContainerLaunchContext.class); env = new HashMap(); + env.put("FROM_CLIENT", "1"); image = "busybox:latest"; env.put(DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_IMAGE, image); @@ -167,7 +168,8 @@ // warning annotation on the entire method verify(mockExecutor, times(1)) .executePrivilegedOperation(anyList(), opCaptor.capture(), any( - File.class), any(Map.class), eq(false), eq(false)); + File.class), eq((Map)null), + eq(false), eq(false)); PrivilegedOperation op = opCaptor.getValue();