YARN-7034. DefaultLinuxContainerRuntime and DockerLinuxContainerRuntime sends client environment variables to container-executor. Contributed by Miklos Szegedi.
This commit is contained in:
parent
b0b10fc94a
commit
1b3503e4b9
|
@ -65,7 +65,6 @@ public class DefaultLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
@Override
|
||||
public void launchContainer(ContainerRuntimeContext ctx)
|
||||
throws ContainerExecutionException {
|
||||
Container container = ctx.getContainer();
|
||||
PrivilegedOperation launchOp = new PrivilegedOperation(
|
||||
PrivilegedOperation.OperationType.LAUNCH_CONTAINER);
|
||||
|
||||
|
@ -101,8 +100,7 @@ public class DefaultLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
|
||||
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 @@ public class DefaultLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
@Override
|
||||
public void signalContainer(ContainerRuntimeContext ctx)
|
||||
throws ContainerExecutionException {
|
||||
Container container = ctx.getContainer();
|
||||
PrivilegedOperation signalOp = new PrivilegedOperation(
|
||||
PrivilegedOperation.OperationType.SIGNAL_CONTAINER);
|
||||
|
||||
|
@ -133,8 +130,7 @@ public class DefaultLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
.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.
|
||||
|
|
|
@ -314,8 +314,7 @@ public class DockerLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
|
||||
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 @@ public class DockerLinuxContainerRuntime implements LinuxContainerRuntime {
|
|||
.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);
|
||||
|
||||
|
|
|
@ -70,10 +70,16 @@ import org.junit.Assert;
|
|||
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 @@ public class TestLinuxContainerExecutorWithMocks {
|
|||
|
||||
private String tmpMockExecutor;
|
||||
private LinuxContainerExecutor mockExec = null;
|
||||
private LinuxContainerExecutor mockExecMockRuntime = null;
|
||||
private PrivilegedOperationExecutor mockPrivilegedExec;
|
||||
private final File mockParamFile = new File("./params.txt");
|
||||
private LocalDirsHandlerService dirsHandler;
|
||||
|
||||
|
@ -136,22 +144,28 @@ public class TestLinuxContainerExecutorWithMocks {
|
|||
|
||||
Configuration conf = new Configuration();
|
||||
LinuxContainerRuntime linuxContainerRuntime;
|
||||
LinuxContainerRuntime mockLinuxContainerRuntime;
|
||||
|
||||
setupMockExecutor(MOCK_EXECUTOR, conf);
|
||||
linuxContainerRuntime = new DefaultLinuxContainerRuntime(
|
||||
PrivilegedOperationExecutor.getInstance(conf));
|
||||
mockPrivilegedExec = Mockito.mock(PrivilegedOperationExecutor.class);
|
||||
mockLinuxContainerRuntime = new DefaultLinuxContainerRuntime(
|
||||
mockPrivilegedExec);
|
||||
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,7 @@ public class TestLinuxContainerExecutorWithMocks {
|
|||
ContainerId cId = mock(ContainerId.class);
|
||||
ContainerLaunchContext context = mock(ContainerLaunchContext.class);
|
||||
HashMap<String, String> env = new HashMap<String,String>();
|
||||
|
||||
|
||||
when(container.getContainerId()).thenReturn(cId);
|
||||
when(container.getLaunchContext()).thenReturn(context);
|
||||
|
||||
|
@ -565,4 +579,50 @@ public class TestLinuxContainerExecutorWithMocks {
|
|||
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<String, String> env = new HashMap<String,String>();
|
||||
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<PrivilegedOperation> opCaptor = ArgumentCaptor.forClass(
|
||||
PrivilegedOperation.class);
|
||||
// Verify that
|
||||
verify(mockPrivilegedExec, times(1))
|
||||
.executePrivilegedOperation(anyListOf(
|
||||
String.class), opCaptor.capture(), any(
|
||||
File.class), eq((Map<String, String>)null),
|
||||
eq(false), eq(false));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,6 +99,7 @@ public class TestDockerContainerRuntime {
|
|||
cId = mock(ContainerId.class);
|
||||
context = mock(ContainerLaunchContext.class);
|
||||
env = new HashMap<String, String>();
|
||||
env.put("FROM_CLIENT", "1");
|
||||
image = "busybox:latest";
|
||||
|
||||
env.put(DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_IMAGE, image);
|
||||
|
@ -167,7 +168,8 @@ public class TestDockerContainerRuntime {
|
|||
// 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<String, String>)null),
|
||||
eq(false), eq(false));
|
||||
|
||||
PrivilegedOperation op = opCaptor.getValue();
|
||||
|
||||
|
|
Loading…
Reference in New Issue