public List<String> getDockerParameters() { List<String> args = new ArrayList<>(); for (Parameter parameter : taskInfo.getContainer().getDocker().getParametersList()) { args.add(toCmdLineArg(parameter)); } return args; }
boolean isDocker = task.getTaskInfo().hasContainer() && task.getTaskInfo().getContainer().hasDocker(); if (isDocker) { command.addAll(Arrays.asList("docker", "exec", String.format("%s%s", executorConfiguration.getDockerPrefix(), task.getTaskId())));
private int getNumUsedThreads(SingularityExecutorTaskProcessCallable taskProcess) throws InterruptedException, ProcessFailedException { Optional<Integer> dockerPid = Optional.absent(); if (taskProcess.getTask().getTaskInfo().hasContainer() && taskProcess.getTask().getTaskInfo().getContainer().hasDocker()) { try { String containerName = String.format("%s%s", configuration.getDockerPrefix(), taskProcess.getTask().getTaskId()); int possiblePid = dockerUtils.getPid(containerName); if (possiblePid == 0) { LOG.warn(String.format("Container %s has pid %s (running: %s). Defaulting to 0 threads running.", containerName, possiblePid, dockerUtils.isContainerRunning(containerName))); return 0; } else { dockerPid = Optional.of(possiblePid); } } catch (DockerException e) { throw new ProcessFailedException("Could not get docker root pid due to error", e); } } try { Optional<Integer> numThreads = getNumThreads(configuration.getThreadCheckerType(), taskProcess, dockerPid); if (numThreads.isPresent()) { return numThreads.get(); } else { LOG.warn("Could not get num threads using {} thread checker", configuration.getThreadCheckerType()); return 0; } } catch (IOException e) { throw Throwables.propagate(e); } }
assertEquals(Protos.DiscoveryInfo.Visibility.EXTERNAL, taskInfo.getDiscovery().getVisibility()); assertEquals(2, taskInfo.getContainer().getVolumesCount()); assertEquals(Configuration.CONTAINER_PATH_DATA, taskInfo.getContainer().getVolumes(0).getContainerPath()); assertEquals(Configuration.DEFAULT_HOST_DATA_DIR + "/" + configuration.getElasticsearchClusterName() + "/" + offer.getSlaveId().getValue(), taskInfo.getContainer().getVolumes(0).getHostPath()); assertEquals(Protos.Volume.Mode.RW, taskInfo.getContainer().getVolumes(0).getMode()); assertEquals(Configuration.CONTAINER_PATH_CONF_YML, taskInfo.getContainer().getVolumes(1).getContainerPath()); assertEquals(Configuration.HOST_PATH_CONF, taskInfo.getContainer().getVolumes(1).getHostPath()); assertEquals(Protos.Volume.Mode.RO, taskInfo.getContainer().getVolumes(1).getMode());
@Test public void shouldAddJarInfoAndRemoveContainerInfo() { when(configuration.isFrameworkUseDocker()).thenReturn(false); String address = "http://localhost:1234"; when(configuration.getFrameworkFileServerAddress()).thenReturn(address); when(configuration.nativeCommand(any())).thenReturn("ls"); TaskInfoFactory factory = new TaskInfoFactory(clusterState); Date now = new DateTime().withDayOfMonth(1).withDayOfYear(1).withYear(1970).withHourOfDay(1).withMinuteOfHour(2).withSecondOfMinute(3).withMillisOfSecond(400).toDate(); when(clock.now()).thenReturn(now); when(clock.nowUTC()).thenReturn(ZonedDateTime.now(ZoneOffset.UTC)); Protos.TaskInfo taskInfo = factory.createTask(configuration, frameworkState, getOffer(frameworkState.getFrameworkID()), clock); assertFalse(taskInfo.getContainer().isInitialized()); assertTrue(taskInfo.getExecutor().getCommand().isInitialized()); assertEquals(2, taskInfo.getCommand().getUrisCount()); assertTrue(taskInfo.getCommand().getUris(0).getValue().contains(address)); }
@Test public void shouldUseMesosProvidedPorts() { TaskInfoFactory factory = new TaskInfoFactory(clusterState); Protos.TaskInfo taskInfo = factory.createTask(configuration, frameworkState, getOffer(frameworkState.getFrameworkID()), new Clock()); assertTrue(taskInfo.getContainer().isInitialized()); assertTrue(taskInfo.isInitialized()); assertTrue(taskInfo.toString().contains("9200")); assertTrue(taskInfo.toString().contains("9300")); }
private ProcessBuilder buildProcessBuilder(TaskInfo taskInfo, SingularityTaskExecutorData executorData, String serviceLog) { final String cmd = getCommand(executorData); boolean isDocker = taskInfo.hasContainer() && taskInfo.getContainer().hasDocker(); task.getLog().info("Writing a runner script to execute {} in docker container", cmd); templateManager.writeDockerScript(getPath("runner.sh"), new DockerContext(environmentContext, runnerContext, configuration.getDockerPrefix(), configuration.getDockerStopTimeout(), taskInfo.getContainer().getDocker().getPrivileged())); } else { templateManager.writeEnvironmentScript(getPath("deploy.env"), environmentContext);
@Override public ProcessBuilder call() throws Exception { if (task.getTaskInfo().hasContainer() && task.getTaskInfo().getContainer().hasDocker()) { executorUtils.sendStatusUpdate(task.getDriver(), task.getTaskInfo().getTaskId(), TaskState.TASK_STARTING, String.format("Pulling image... (executor pid: %s)", executorPid), task.getLog()); try { dockerUtils.pull(task.getTaskInfo().getContainer().getDocker().getImage()); } catch (DockerException e) { throw new ProcessFailedException("Could not pull docker image", e);
public Protos.ContainerInfo.DockerInfo getDockerInfo() { return taskInfo.getContainer().getDocker(); }
public List<Protos.Volume> getContainerVolumes() { return taskInfo.getContainer().getVolumesList(); }
public boolean isDockerWorkdirOverriden() { for (Parameter parameter : taskInfo.getContainer().getDocker().getParametersList()) { if (parameter.hasKey() && (parameter.getKey().equals("w") || parameter.getKey().equals("workdir"))) { return true; } } return false; }
public void cleanup(TaskState state) { ExtendedTaskState extendedTaskState = MesosUtils.fromTaskState(org.apache.mesos.v1.Protos.TaskState.valueOf(state.toString())); boolean cleanupAppTaskDirectory = !extendedTaskState.isFailed() && !taskDefinition.getExecutorData().getPreserveTaskSandboxAfterFinish().or(Boolean.FALSE); boolean isDocker = (taskInfo.hasContainer() && taskInfo.getContainer().hasDocker()); taskCleanup.cleanup(cleanupAppTaskDirectory, isDocker); }