private void dumpEnvironmentVariables(EnvironmentVariableContext environmentVariableContext) { Set<String> processLevelEnvVariables = ProcessManager.getInstance().environmentVariableNames(); List<String> report = environmentVariableContext.report(processLevelEnvVariables); ConsoleOutputStreamConsumer safeOutput = new LabeledOutputStreamConsumer(DefaultGoPublisher.PREP, DefaultGoPublisher.PREP_ERR, safeOutputStreamConsumer(environmentVariableContext)); for (int i = 0; i < report.size(); i++) { String line = report.get(i); safeOutput.stdOutput((i == report.size() - 1) ? line + "\n" : line); } }
private ProcessWrapper createProcess(EnvironmentVariableContext environmentVariableContext, ConsoleOutputStreamConsumer consumer, String processTag, String errorPrefix) { return ProcessManager.getInstance().createProcess(getCommandLine(), toString(getCommandLineForDisplay(), true), workingDir, env, environmentVariableContext, consumer, processTag, encoding, errorPrefix); }
public void close() { close(process); ProcessManager.getInstance().processKilled(process); }
@Test public void shouldGetIdleTimeForGivenProcess() { processManager = new ProcessManager(); ProcessWrapper processWrapperOne = mock(ProcessWrapper.class); Process processOne = mock(Process.class); ProcessWrapper processWrapperTwo = mock(ProcessWrapper.class); Process processTwo = mock(Process.class); ConcurrentMap<Process, ProcessWrapper> processMap = processManager.getProcessMap(); processMap.put(processOne, processWrapperOne); processMap.put(processTwo, processWrapperTwo); when(processWrapperOne.getProcessTag()).thenReturn("tag1"); when(processWrapperOne.getIdleTime()).thenReturn(200L); when(processWrapperTwo.getProcessTag()).thenReturn("tag2"); when(processWrapperTwo.getIdleTime()).thenReturn(100L); long timeout = processManager.getIdleTimeFor("tag2"); assertThat(timeout, is(100L)); }
ProcessManager getProcessManager() { return ProcessManager.getInstance(); }
@Test public void processListForDisplayShouldBeSameAsTheCurrentProcessList() throws Exception { processManager = new ProcessManager(); ProcessWrapper processWrapperOne = mock(ProcessWrapper.class); Process processOne = mock(Process.class); ProcessWrapper processWrapperTwo = mock(ProcessWrapper.class); Process processTwo = mock(Process.class); ConcurrentMap<Process, ProcessWrapper> processMap = processManager.getProcessMap(); processMap.put(processOne, processWrapperOne); processMap.put(processTwo, processWrapperTwo); Collection<ProcessWrapper> processWrappersForDisplay = processManager.currentProcessListForDisplay(); assertThat(processWrappersForDisplay, is(processMap.values())); }
@Test public void shouldRemoveKilledProcessFromList() { processManager.processKilled(processTwo); assertThat(processManager.getProcessMap().size(), is(1)); assertThat(processManager.getProcessMap().containsKey(processOne), is(true)); }
@Test public void shouldAddToProcessListWhenNewProcessCreated() { processManager.createProcess(new String[]{"echo", "message"}, "echo 'message'", null, new HashMap<>(), new EnvironmentVariableContext(), inMemoryConsumer(), "test-tag", "utf-8", "ERROR: "); assertThat(processManager.getProcessMap().size(), is(3)); }
@Test public void canGetProcessLevelEnvironmentVariableNames() { processManager.environmentVariableNames().stream().filter(new Predicate<String>() { @Override public boolean test(String item) { return item.equalsIgnoreCase("path"); } }).findFirst().orElse(null); } }
public boolean updateMaterial(Material material) { Date inProgressSince = inProgress.putIfAbsent(material, new Date()); if (inProgressSince == null || !material.isAutoUpdate()) { LOGGER.debug("[Material Update] Starting update of material {}", material); try { long trackingId = mduPerformanceLogger.materialSentToUpdateQueue(material); queueFor(material).post(new MaterialUpdateMessage(material, trackingId)); return true; } catch (RuntimeException e) { inProgress.remove(material); throw e; } } else { LOGGER.warn("[Material Update] Skipping update of material {} which has been in-progress since {}", material, inProgressSince); long idleTime = getProcessManager().getIdleTimeFor(material.getFingerprint()); if (idleTime > getMaterialUpdateInActiveTimeoutInMillis()) { HealthStateScope scope = HealthStateScope.forMaterialUpdate(material); serverHealthService.removeByScope(scope); serverHealthService.update(warning("Material update for " + material.getUriForDisplay() + " hung:", "Material update is currently running but has not shown any activity in the last " + idleTime / 60000 + " minute(s). This may be hung. Details - " + material.getLongDescription(), general(scope))); } return false; } }
public ProcessWrapper createProcess(String[] commandLine, String commandLineForDisplay, File workingDir, Map<String, String> envMap, EnvironmentVariableContext environmentVariableContext, ConsoleOutputStreamConsumer consumer, String processTag, String encoding, String errorPrefix) { ProcessBuilder processBuilder = new ProcessBuilder(commandLine); LOG.debug("Executing: {}", commandLineForDisplay); if (workingDir != null) { LOG.debug("[Command Line] Using working directory {} to start the process.", workingDir.getAbsolutePath()); processBuilder.directory(workingDir); } processBuilder.environment().putAll(environmentVariableContext.getProperties()); processBuilder.environment().putAll(envMap); Process process = startProcess(processBuilder, commandLineForDisplay); ProcessWrapper processWrapper = new ProcessWrapper(process, processTag, commandLineForDisplay, consumer, encoding, errorPrefix); processMap.putIfAbsent(process, processWrapper); return processWrapper; }
@Before public void setUp() { processManager = new ProcessManager() { @Override Process startProcess(ProcessBuilder processBuilder, String msgCommandInfo) { return processStartedByManager; } }; processStartedByManager = mock(Process.class); when(processStartedByManager.getInputStream()).thenReturn(mock(InputStream.class)); when(processStartedByManager.getErrorStream()).thenReturn(mock(InputStream.class)); when(processStartedByManager.getOutputStream()).thenReturn(mock(OutputStream.class)); processOne = mock(Process.class); processTwo = mock(Process.class); when(processOne.getInputStream()).thenReturn(mock(InputStream.class)); when(processOne.getErrorStream()).thenReturn(mock(InputStream.class)); when(processOne.getOutputStream()).thenReturn(mock(OutputStream.class)); when(processOne.exitValue()).thenThrow(new IllegalStateException()); when(processTwo.exitValue()).thenThrow(new IllegalStateException()); when(processTwo.getInputStream()).thenReturn(mock(InputStream.class)); when(processTwo.getErrorStream()).thenReturn(mock(InputStream.class)); when(processTwo.getOutputStream()).thenReturn(mock(OutputStream.class)); ConcurrentMap<Process, ProcessWrapper> processMap = processManager.getProcessMap(); wrapperForProcessOne = new ProcessWrapper(processOne, "tag1", null, inMemoryConsumer(), "utf-8", "ERROR: "); processMap.put(processOne, wrapperForProcessOne); wrapperForProcessTwo = new ProcessWrapper(processTwo, "tag2", null, inMemoryConsumer(), "utf-8", "ERROR: "); processMap.put(processTwo, wrapperForProcessTwo); }
@Override public boolean execute(BuildCommand command, BuildSession buildSession) { String name = command.getStringArg("name"); if (!command.hasArg("value")) { String displayValue = buildSession.getEnvs().get(name); buildSession.printlnSafely(format("[%s] setting environment variable '%s' to value '%s'", GoConstants.PRODUCT_NAME, name, displayValue)); return true; } String value = command.getStringArg("value"); boolean secure = command.getBooleanArg("secure"); String displayValue = secure ? EnvironmentVariableContext.EnvironmentVariable.MASK_VALUE : value; Set<String> processLevelEnvs = ProcessManager.getInstance().environmentVariableNames(); if (buildSession.getEnvs().containsKey(name) || processLevelEnvs.contains(name)) { buildSession.printlnSafely(format("[%s] overriding environment variable '%s' with value '%s'", GoConstants.PRODUCT_NAME, name, displayValue)); } else { buildSession.printlnSafely(format("[%s] setting environment variable '%s' to value '%s'", GoConstants.PRODUCT_NAME, name, displayValue)); } buildSession.setEnv(name, value); return true; } }