Search in sources :

Example 1 with LineConsumer

use of org.eclipse.che.api.core.util.LineConsumer in project che by eclipse.

the class AbstractAgentLauncher method launch.

@Override
public void launch(Instance machine, Agent agent) throws ServerException {
    if (isNullOrEmpty(agent.getScript())) {
        return;
    }
    ListLineConsumer agentLogger = new ListLineConsumer();
    LineConsumer lineConsumer = new AbstractLineConsumer() {

        @Override
        public void writeLine(String line) throws IOException {
            machine.getLogger().writeLine(line);
            agentLogger.writeLine(line);
        }
    };
    try {
        final InstanceProcess process = start(machine, agent, lineConsumer);
        LOG.debug("Waiting for agent {} is launched. Workspace ID:{}", agent.getId(), machine.getWorkspaceId());
        final long pingStartTimestamp = System.currentTimeMillis();
        while (System.currentTimeMillis() - pingStartTimestamp < agentMaxStartTimeMs) {
            if (agentLaunchingChecker.isLaunched(agent, process, machine)) {
                return;
            } else {
                Thread.sleep(agentPingDelayMs);
            }
        }
        process.kill();
    } catch (MachineException e) {
        logAsErrorAgentStartLogs(agent.getName(), agentLogger.getText());
        throw new ServerException(e.getServiceError());
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new ServerException(format("Launching agent %s is interrupted", agent.getName()));
    } finally {
        try {
            lineConsumer.close();
        } catch (IOException ignored) {
        }
        agentLogger.close();
    }
    logAsErrorAgentStartLogs(agent.getName(), agentLogger.getText());
    throw new ServerException(format("Fail launching agent %s. Workspace ID:%s", agent.getName(), machine.getWorkspaceId()));
}
Also used : ListLineConsumer(org.eclipse.che.api.core.util.ListLineConsumer) ListLineConsumer(org.eclipse.che.api.core.util.ListLineConsumer) LineConsumer(org.eclipse.che.api.core.util.LineConsumer) AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) ServerException(org.eclipse.che.api.core.ServerException) AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) MachineException(org.eclipse.che.api.machine.server.exception.MachineException) InstanceProcess(org.eclipse.che.api.machine.server.spi.InstanceProcess) IOException(java.io.IOException)

Example 2 with LineConsumer

use of org.eclipse.che.api.core.util.LineConsumer in project che by eclipse.

the class DefaultAgentLauncher method launch.

@Override
public void launch(Instance machine, Agent agent) throws ServerException {
    if (isNullOrEmpty(agent.getScript())) {
        return;
    }
    final Command command = new CommandImpl(agent.getId(), agent.getScript(), "agent");
    final InstanceProcess process = machine.createProcess(command, null);
    final LineConsumer lineConsumer = new AbstractLineConsumer() {

        @Override
        public void writeLine(String line) throws IOException {
            machine.getLogger().writeLine(line);
        }
    };
    try {
        process.start(lineConsumer);
    } catch (ConflictException e) {
        try {
            machine.getLogger().writeLine(format("[ERROR] %s", e.getMessage()));
        } catch (IOException ignored) {
        }
    } finally {
        try {
            lineConsumer.close();
        } catch (IOException ignored) {
        }
    }
}
Also used : CommandImpl(org.eclipse.che.api.machine.server.model.impl.CommandImpl) LineConsumer(org.eclipse.che.api.core.util.LineConsumer) AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) Command(org.eclipse.che.api.core.model.machine.Command) AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) ConflictException(org.eclipse.che.api.core.ConflictException) InstanceProcess(org.eclipse.che.api.machine.server.spi.InstanceProcess) IOException(java.io.IOException)

Example 3 with LineConsumer

use of org.eclipse.che.api.core.util.LineConsumer in project che by eclipse.

the class ConcurrentCompositeLineConsumerTest method shouldCloseSubConsumerOnException.

@Test(dataProvider = "subConsumersExceptions")
public void shouldCloseSubConsumerOnException(Throwable exception) throws Exception {
    // given
    final String message = "Test line";
    final String message2 = "Test line2";
    LineConsumer closedConsumer = mock(LineConsumer.class);
    doThrow(exception).when(closedConsumer).writeLine(anyString());
    concurrentCompositeLineConsumer = new ConcurrentCompositeLineConsumer(appendTo(subConsumers, closedConsumer));
    // when
    concurrentCompositeLineConsumer.writeLine(message);
    concurrentCompositeLineConsumer.writeLine(message2);
    // then
    verify(closedConsumer, never()).writeLine(eq(message2));
    for (LineConsumer consumer : subConsumers) {
        verify(consumer).writeLine(eq(message2));
    }
}
Also used : LineConsumer(org.eclipse.che.api.core.util.LineConsumer) Matchers.anyString(org.mockito.Matchers.anyString) Test(org.testng.annotations.Test)

Example 4 with LineConsumer

use of org.eclipse.che.api.core.util.LineConsumer in project che by eclipse.

the class ConcurrentCompositeLineConsumerTest method shouldDoNothingOnWriteLineIfAllSubConsumersAreClosed.

@Test
public void shouldDoNothingOnWriteLineIfAllSubConsumersAreClosed() throws Exception {
    // given
    final String message = "Test line";
    LineConsumer[] closedConsumers = subConsumers;
    for (LineConsumer consumer : closedConsumers) {
        doThrow(ConsumerAlreadyClosedException.class).when(consumer).writeLine(anyString());
    }
    concurrentCompositeLineConsumer = new ConcurrentCompositeLineConsumer(closedConsumers);
    // when
    concurrentCompositeLineConsumer.writeLine("Error");
    concurrentCompositeLineConsumer.writeLine(message);
    // then
    for (LineConsumer subConsumer : closedConsumers) {
        verify(subConsumer, never()).writeLine(eq(message));
    }
}
Also used : LineConsumer(org.eclipse.che.api.core.util.LineConsumer) Matchers.anyString(org.mockito.Matchers.anyString) Test(org.testng.annotations.Test)

Example 5 with LineConsumer

use of org.eclipse.che.api.core.util.LineConsumer in project che by eclipse.

the class Gdb method suspend.

public Location suspend(final String file, boolean isRemoteConnection) throws IOException, InterruptedException, DebuggerException {
    if (pid < 0) {
        throw new DebuggerException("Gdb process not found.");
    }
    if (isRemoteConnection) {
        Runtime.getRuntime().exec("kill -SIGINT " + pid).waitFor();
        sendCommand("signal SIGSTOP ");
    } else {
        final List<String> outputs = new ArrayList<>();
        final ProcessBuilder processBuilder = new ProcessBuilder().command("ps", "-o", "pid,cmd", "--ppid", String.valueOf(pid));
        final Process process = processBuilder.start();
        LineConsumer stdout = new AbstractLineConsumer() {

            @Override
            public void writeLine(String line) throws IOException {
                outputs.add(line);
            }
        };
        ProcessUtil.process(process, stdout);
        int processId = -1;
        for (String output : outputs) {
            try {
                final ProcessInfo processInfo = ProcessInfo.parse(output);
                if (file.equals(processInfo.getProcessName())) {
                    processId = processInfo.getProcessId();
                }
            } catch (Exception e) {
            //we can't get info about current process, but we are trying to get info about another processes
            }
        }
        if (processId == -1) {
            throw new DebuggerException(format("Process %s not found.", file));
        }
        Runtime.getRuntime().exec("kill -SIGINT " + processId).waitFor();
    }
    final GdbOutput gdbOutput = sendCommand("backtrace");
    final GdbBacktrace backtrace = GdbBacktrace.parse(gdbOutput);
    final Map<Integer, Location> frames = backtrace.getFrames();
    if (frames.containsKey(0)) {
        return frames.get(0);
    }
    throw new DebuggerException("Unable recognize current location for debugger session. ");
}
Also used : AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) DebuggerException(org.eclipse.che.api.debugger.server.exceptions.DebuggerException) ArrayList(java.util.ArrayList) ProcessInfo(org.eclipse.che.plugin.gdb.server.parser.ProcessInfo) GdbPrint(org.eclipse.che.plugin.gdb.server.parser.GdbPrint) DebuggerException(org.eclipse.che.api.debugger.server.exceptions.DebuggerException) IOException(java.io.IOException) GdbException(org.eclipse.che.plugin.gdb.server.exception.GdbException) GdbTerminatedException(org.eclipse.che.plugin.gdb.server.exception.GdbTerminatedException) GdbOutput(org.eclipse.che.plugin.gdb.server.parser.GdbOutput) LineConsumer(org.eclipse.che.api.core.util.LineConsumer) AbstractLineConsumer(org.eclipse.che.api.core.util.AbstractLineConsumer) GdbBacktrace(org.eclipse.che.plugin.gdb.server.parser.GdbBacktrace) Location(org.eclipse.che.api.debug.shared.model.Location)

Aggregations

LineConsumer (org.eclipse.che.api.core.util.LineConsumer)21 IOException (java.io.IOException)11 AbstractLineConsumer (org.eclipse.che.api.core.util.AbstractLineConsumer)8 Test (org.testng.annotations.Test)8 Matchers.anyString (org.mockito.Matchers.anyString)6 HashMap (java.util.HashMap)3 ServerException (org.eclipse.che.api.core.ServerException)3 MachineException (org.eclipse.che.api.machine.server.exception.MachineException)3 InstanceProcess (org.eclipse.che.api.machine.server.spi.InstanceProcess)3 File (java.io.File)2 ArrayList (java.util.ArrayList)2 TimeoutException (java.util.concurrent.TimeoutException)2 ConflictException (org.eclipse.che.api.core.ConflictException)2 NotFoundException (org.eclipse.che.api.core.NotFoundException)2 Command (org.eclipse.che.api.core.model.machine.Command)2 ConcurrentCompositeLineConsumer (org.eclipse.che.api.core.util.lineconsumer.ConcurrentCompositeLineConsumer)2 ConcurrentFileLineConsumer (org.eclipse.che.api.core.util.lineconsumer.ConcurrentFileLineConsumer)2 Instance (org.eclipse.che.api.machine.server.spi.Instance)2 WaitingAnswer (org.eclipse.che.commons.test.mockito.answer.WaitingAnswer)2 MoreObjects (com.google.common.base.MoreObjects)1