/*******************************************************************************
* Copyright (c) 2016 Red Hat.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.ui.jobs;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.Launch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.linuxtools.docker.core.DockerCommandNotFoundException;
import org.eclipse.linuxtools.docker.core.DockerException;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.docker.core.IDockerProgressHandler;
import org.eclipse.linuxtools.docker.ui.Activator;
import org.eclipse.linuxtools.internal.docker.core.DockerCompose;
import org.eclipse.linuxtools.internal.docker.ui.consoles.DockerComposeConsole;
import org.eclipse.linuxtools.internal.docker.ui.consoles.DockerComposeConsoleUtils;
import org.eclipse.linuxtools.internal.docker.ui.preferences.PreferenceConstants;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.console.ConsolePlugin;
/**
* An {@link IDockerProgressHandler} {@link Job} to run the
* {@code docker-compose up} commandline.
*/
public class DockerComposeUpJob extends Job {
/** The {@link IDockerConnection} to use. */
private final IDockerConnection connection;
/** The workingDir containing the {@code docker-compose.yml}. */
private final String workingDir;
/** The {@link ILaunchConfiguration} that was used to launch the job. */
private final ILaunchConfiguration launchConfiguration;
/** The dockerComposeConsole used to display output messages. */
private final DockerComposeConsole dockerComposeConsole;
/**
* Constructor
*
* @param connection
* the {@link IDockerConnection} to use
* @param workingDir
* the workingDir containing the {@code docker-compose.yml}
* @param launchConfiguration
*/
public DockerComposeUpJob(final IDockerConnection connection,
final String workingDir,
final ILaunchConfiguration launchConfiguration) {
super(JobMessages.getString("DockerComposeUp.title")); //$NON-NLS-1$
this.connection = connection;
this.workingDir = workingDir;
this.launchConfiguration = launchConfiguration;
this.dockerComposeConsole = DockerComposeConsoleUtils
.findConsole(connection, workingDir);
}
@Override
protected IStatus run(final IProgressMonitor monitor) {
final String dockerComposeInstallDir = Activator.getDefault()
.getPreferenceStore().getString(
PreferenceConstants.DOCKER_COMPOSE_INSTALLATION_DIRECTORY);
final Thread commandThread = new Thread(() -> {
// open console view
ConsolePlugin.getDefault().getConsoleManager()
.showConsoleView(dockerComposeConsole);
try {
// run the 'docker-compose up' command
final Process dockerComposeSystemProcess = DockerCompose
.getInstance()
.up(this.connection, dockerComposeInstallDir,
this.workingDir);
final ILaunch launch = new Launch(launchConfiguration,
ILaunchManager.RUN_MODE, null);
final IProcess dockerComposeProcess = DebugPlugin.newProcess(
launch, dockerComposeSystemProcess,
"docker-compose up"); //$NON-NLS-1$
dockerComposeConsole
.setDockerComposeProcess(dockerComposeProcess); // $NON-NLS-1$
final int exitCode = dockerComposeSystemProcess.waitFor();
if (exitCode != 0) {
Display.getDefault()
.asyncExec(() -> MessageDialog.openError(
Display.getDefault().getActiveShell(),
JobMessages.getString(
"DockerCompose.dialog.title"), //$NON-NLS-1$
JobMessages.getString(
"DockerComposeUp.start.error")) //$NON-NLS-1$
);
}
} catch (DockerCommandNotFoundException e) {
// just display the error to the user, there's no need to report
// an error in the log and in AERI for that.
Display.getDefault()
.asyncExec(() -> MessageDialog.openError(
Display.getCurrent().getActiveShell(),
JobMessages.getString(
"DockerCompose.dialog.title"), //$NON-NLS-1$
e.getMessage()));
} catch (DockerException | InterruptedException e) {
Display.getDefault()
.asyncExec(() -> MessageDialog.openError(
Display.getCurrent().getActiveShell(),
JobMessages.getString(
"DockerCompose.dialog.title"), //$NON-NLS-1$
e.getMessage()));
Activator.log(e);
}
});
commandThread.start();
return Status.OK_STATUS;
}
}