|
@@ -20,15 +20,18 @@
|
|
|
|
|
|
package org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime;
|
|
|
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.fs.FileUtil;
|
|
|
import org.apache.hadoop.fs.Path;
|
|
|
import org.apache.hadoop.registry.client.binding.RegistryPathUtils;
|
|
|
import org.apache.hadoop.util.Shell;
|
|
|
+import org.apache.hadoop.util.StringUtils;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.Context;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperation;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationException;
|
|
@@ -36,6 +39,10 @@ import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileg
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.CGroupsHandler;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.ResourceHandlerModule;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.docker.DockerRunCommand;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.docker.DockerVolumeCommand;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.DockerCommandPlugin;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePlugin;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePluginManager;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerExecutionException;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerRuntimeConstants;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerRuntimeContext;
|
|
@@ -48,22 +55,48 @@ import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
import java.io.IOException;
|
|
|
import java.nio.charset.Charset;
|
|
|
import java.nio.file.Files;
|
|
|
import java.nio.file.Paths;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Random;
|
|
|
import java.util.Set;
|
|
|
|
|
|
-import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.*;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.APPID;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.CONTAINER_ID_STR;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.CONTAINER_LOCAL_DIRS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.CONTAINER_LOG_DIRS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.CONTAINER_WORK_DIR;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.FILECACHE_DIRS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.LOCALIZED_RESOURCES;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.LOCAL_DIRS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.LOG_DIRS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.NM_PRIVATE_CONTAINER_SCRIPT_PATH;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.NM_PRIVATE_TOKENS_PATH;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.PID;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.PID_FILE_PATH;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.RESOURCES_OPTIONS;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.RUN_AS_USER;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.SIGNAL;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.USER;
|
|
|
+import static org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntimeConstants.USER_LOCAL_DIRS;
|
|
|
import static org.mockito.Matchers.eq;
|
|
|
-import static org.mockito.Mockito.*;
|
|
|
+import static org.mockito.Mockito.any;
|
|
|
+import static org.mockito.Mockito.anyBoolean;
|
|
|
+import static org.mockito.Mockito.anyList;
|
|
|
+import static org.mockito.Mockito.anyMap;
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
+import static org.mockito.Mockito.times;
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
+import static org.mockito.Mockito.when;
|
|
|
|
|
|
public class TestDockerContainerRuntime {
|
|
|
private static final Logger LOG =
|
|
@@ -217,7 +250,7 @@ public class TestDockerContainerRuntime {
|
|
|
return opCaptor.getValue();
|
|
|
}
|
|
|
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
private PrivilegedOperation capturePrivilegedOperationAndVerifyArgs()
|
|
|
throws PrivilegedOperationException {
|
|
|
|
|
@@ -288,7 +321,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException {
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
runtime.launchContainer(builder.build());
|
|
|
|
|
|
PrivilegedOperation op = capturePrivilegedOperationAndVerifyArgs();
|
|
@@ -343,7 +376,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
runtime.launchContainer(builder.build());
|
|
|
|
|
|
PrivilegedOperation op = capturePrivilegedOperationAndVerifyArgs();
|
|
@@ -425,7 +458,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime =
|
|
|
new DockerLinuxContainerRuntime(mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
//invalid default network configuration - sdn2 is included in allowed
|
|
|
// networks
|
|
@@ -441,7 +474,7 @@ public class TestDockerContainerRuntime {
|
|
|
try {
|
|
|
runtime =
|
|
|
new DockerLinuxContainerRuntime(mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
Assert.fail("Invalid default network configuration should did not "
|
|
|
+ "trigger initialization failure.");
|
|
|
} catch (ContainerExecutionException e) {
|
|
@@ -457,7 +490,7 @@ public class TestDockerContainerRuntime {
|
|
|
validDefaultNetwork);
|
|
|
runtime =
|
|
|
new DockerLinuxContainerRuntime(mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
@@ -467,7 +500,7 @@ public class TestDockerContainerRuntime {
|
|
|
PrivilegedOperationException {
|
|
|
DockerLinuxContainerRuntime runtime =
|
|
|
new DockerLinuxContainerRuntime(mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
Random randEngine = new Random();
|
|
|
String disallowedNetwork = "sdn" + Integer.toString(randEngine.nextInt());
|
|
@@ -557,7 +590,7 @@ public class TestDockerContainerRuntime {
|
|
|
customNetwork1);
|
|
|
|
|
|
//this should cause no failures.
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
runtime.launchContainer(builder.build());
|
|
|
PrivilegedOperation op = capturePrivilegedOperationAndVerifyArgs();
|
|
|
List<String> args = op.getArguments();
|
|
@@ -661,7 +694,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(DockerLinuxContainerRuntime
|
|
|
.ENV_DOCKER_CONTAINER_RUN_PRIVILEGED_CONTAINER, "invalid-value");
|
|
@@ -690,7 +723,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(DockerLinuxContainerRuntime
|
|
|
.ENV_DOCKER_CONTAINER_RUN_PRIVILEGED_CONTAINER, "true");
|
|
@@ -713,7 +746,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(DockerLinuxContainerRuntime
|
|
|
.ENV_DOCKER_CONTAINER_RUN_PRIVILEGED_CONTAINER, "true");
|
|
@@ -743,7 +776,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(DockerLinuxContainerRuntime
|
|
|
.ENV_DOCKER_CONTAINER_RUN_PRIVILEGED_CONTAINER, "true");
|
|
@@ -770,7 +803,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(DockerLinuxContainerRuntime
|
|
|
.ENV_DOCKER_CONTAINER_RUN_PRIVILEGED_CONTAINER, "true");
|
|
@@ -822,7 +855,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime
|
|
|
(mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
String resourceOptionsNone = "cgroups=none";
|
|
|
DockerRunCommand command = Mockito.mock(DockerRunCommand.class);
|
|
@@ -849,7 +882,7 @@ public class TestDockerContainerRuntime {
|
|
|
|
|
|
runtime = new DockerLinuxContainerRuntime
|
|
|
(mockExecutor, null);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
runtime.addCGroupParentIfRequired(resourceOptionsNone, containerIdStr,
|
|
|
command);
|
|
@@ -866,7 +899,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(
|
|
|
DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_LOCAL_RESOURCE_MOUNTS,
|
|
@@ -886,7 +919,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(
|
|
|
DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_LOCAL_RESOURCE_MOUNTS,
|
|
@@ -935,7 +968,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(
|
|
|
DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_LOCAL_RESOURCE_MOUNTS,
|
|
@@ -955,7 +988,7 @@ public class TestDockerContainerRuntime {
|
|
|
IOException{
|
|
|
DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime(
|
|
|
mockExecutor, mockCGroupsHandler);
|
|
|
- runtime.initialize(conf);
|
|
|
+ runtime.initialize(conf, null);
|
|
|
|
|
|
env.put(
|
|
|
DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_LOCAL_RESOURCE_MOUNTS,
|
|
@@ -1011,7 +1044,7 @@ public class TestDockerContainerRuntime {
|
|
|
.setExecutionAttribute(USER, user)
|
|
|
.setExecutionAttribute(PID, signalPid)
|
|
|
.setExecutionAttribute(SIGNAL, ContainerExecutor.Signal.NULL);
|
|
|
- runtime.initialize(enableMockContainerExecutor(conf));
|
|
|
+ runtime.initialize(enableMockContainerExecutor(conf), null);
|
|
|
runtime.signalContainer(builder.build());
|
|
|
|
|
|
PrivilegedOperation op = capturePrivilegedOperation();
|
|
@@ -1071,7 +1104,7 @@ public class TestDockerContainerRuntime {
|
|
|
.setExecutionAttribute(USER, user)
|
|
|
.setExecutionAttribute(PID, signalPid)
|
|
|
.setExecutionAttribute(SIGNAL, signal);
|
|
|
- runtime.initialize(enableMockContainerExecutor(conf));
|
|
|
+ runtime.initialize(enableMockContainerExecutor(conf), null);
|
|
|
runtime.signalContainer(builder.build());
|
|
|
|
|
|
PrivilegedOperation op = capturePrivilegedOperation();
|
|
@@ -1148,4 +1181,127 @@ public class TestDockerContainerRuntime {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private void checkVolumeCreateCommand()
|
|
|
+ throws PrivilegedOperationException, IOException {
|
|
|
+ ArgumentCaptor<PrivilegedOperation> opCaptor = ArgumentCaptor.forClass(
|
|
|
+ PrivilegedOperation.class);
|
|
|
+
|
|
|
+ //single invocation expected
|
|
|
+ //due to type erasure + mocking, this verification requires a suppress
|
|
|
+ // warning annotation on the entire method
|
|
|
+ verify(mockExecutor, times(1))
|
|
|
+ .executePrivilegedOperation(anyList(), opCaptor.capture(), any(
|
|
|
+ File.class), anyMap(), anyBoolean(), anyBoolean());
|
|
|
+
|
|
|
+ //verification completed. we need to isolate specific invications.
|
|
|
+ // hence, reset mock here
|
|
|
+ Mockito.reset(mockExecutor);
|
|
|
+
|
|
|
+ PrivilegedOperation op = opCaptor.getValue();
|
|
|
+ Assert.assertEquals(PrivilegedOperation.OperationType
|
|
|
+ .RUN_DOCKER_CMD, op.getOperationType());
|
|
|
+
|
|
|
+ File commandFile = new File(StringUtils.join(",", op.getArguments()));
|
|
|
+ FileInputStream fileInputStream = new FileInputStream(commandFile);
|
|
|
+ String fileContent = new String(IOUtils.toByteArray(fileInputStream));
|
|
|
+ Assert.assertEquals("[docker-command-execution]\n"
|
|
|
+ + " docker-command=volume\n" + " sub-command=create\n"
|
|
|
+ + " volume=volume1\n", fileContent);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testDockerCommandPlugin() throws Exception {
|
|
|
+ DockerLinuxContainerRuntime runtime =
|
|
|
+ new DockerLinuxContainerRuntime(mockExecutor, mockCGroupsHandler);
|
|
|
+
|
|
|
+ Context nmContext = mock(Context.class);
|
|
|
+ ResourcePluginManager rpm = mock(ResourcePluginManager.class);
|
|
|
+ Map<String, ResourcePlugin> pluginsMap = new HashMap<>();
|
|
|
+ ResourcePlugin plugin1 = mock(ResourcePlugin.class);
|
|
|
+
|
|
|
+ // Create the docker command plugin logic, which will set volume driver
|
|
|
+ DockerCommandPlugin dockerCommandPlugin = new DockerCommandPlugin() {
|
|
|
+ @Override
|
|
|
+ public void updateDockerRunCommand(DockerRunCommand dockerRunCommand,
|
|
|
+ Container container) throws ContainerExecutionException {
|
|
|
+ dockerRunCommand.setVolumeDriver("driver-1");
|
|
|
+ dockerRunCommand.addReadOnlyMountLocation("/source/path",
|
|
|
+ "/destination/path", true);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DockerVolumeCommand getCreateDockerVolumeCommand(Container container)
|
|
|
+ throws ContainerExecutionException {
|
|
|
+ return new DockerVolumeCommand("create").setVolumeName("volume1");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DockerVolumeCommand getCleanupDockerVolumesCommand(Container container)
|
|
|
+ throws ContainerExecutionException {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ when(plugin1.getDockerCommandPluginInstance()).thenReturn(
|
|
|
+ dockerCommandPlugin);
|
|
|
+ ResourcePlugin plugin2 = mock(ResourcePlugin.class);
|
|
|
+ pluginsMap.put("plugin1", plugin1);
|
|
|
+ pluginsMap.put("plugin2", plugin2);
|
|
|
+
|
|
|
+ when(rpm.getNameToPlugins()).thenReturn(pluginsMap);
|
|
|
+
|
|
|
+ when(nmContext.getResourcePluginManager()).thenReturn(rpm);
|
|
|
+
|
|
|
+ runtime.initialize(conf, nmContext);
|
|
|
+
|
|
|
+ ContainerRuntimeContext containerRuntimeContext = builder.build();
|
|
|
+
|
|
|
+ runtime.prepareContainer(containerRuntimeContext);
|
|
|
+ checkVolumeCreateCommand();
|
|
|
+
|
|
|
+ runtime.launchContainer(containerRuntimeContext);
|
|
|
+ PrivilegedOperation op = capturePrivilegedOperationAndVerifyArgs();
|
|
|
+ List<String> args = op.getArguments();
|
|
|
+ String dockerCommandFile = args.get(11);
|
|
|
+
|
|
|
+ List<String> dockerCommands = Files.readAllLines(Paths.get
|
|
|
+ (dockerCommandFile), Charset.forName("UTF-8"));
|
|
|
+
|
|
|
+ int expected = 15;
|
|
|
+ int counter = 0;
|
|
|
+ Assert.assertEquals(expected, dockerCommands.size());
|
|
|
+ Assert.assertEquals("[docker-command-execution]",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" cap-add=SYS_CHROOT,NET_BIND_SERVICE",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" cap-drop=ALL", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" detach=true", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" docker-command=run", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" hostname=ctr-id", dockerCommands.get(counter++));
|
|
|
+ Assert
|
|
|
+ .assertEquals(" image=busybox:latest", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(
|
|
|
+ " launch-command=bash,/test_container_work_dir/launch_container.sh",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" name=container_id", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" net=host", dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" ro-mounts=/source/path:/destination/path",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(
|
|
|
+ " rw-mounts=/test_container_local_dir:/test_container_local_dir,"
|
|
|
+ + "/test_filecache_dir:/test_filecache_dir,"
|
|
|
+ + "/test_container_work_dir:/test_container_work_dir,"
|
|
|
+ + "/test_container_log_dir:/test_container_log_dir,"
|
|
|
+ + "/test_user_local_dir:/test_user_local_dir",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" user=run_as_user", dockerCommands.get(counter++));
|
|
|
+
|
|
|
+ // Verify volume-driver is set to expected value.
|
|
|
+ Assert.assertEquals(" volume-driver=driver-1",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ Assert.assertEquals(" workdir=/test_container_work_dir",
|
|
|
+ dockerCommands.get(counter++));
|
|
|
+ }
|
|
|
}
|