/******************************************************************************* * 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.core; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.linuxtools.docker.core.DockerException; import org.eclipse.linuxtools.docker.core.IDockerConnection; /** * A utility class to run the {@code docker-compose} command line. */ public class DockerCompose { private static DockerCompose instance = new DockerCompose(); private ProcessLauncher processLauncher = new ProcessLauncher(); public static DockerCompose getInstance() { return instance; } private DockerCompose() { } /** * Replace the default {@link ProcessLauncher} with another instance. Used * to testing by injecting a mock instance here. * * @param processLauncher * the new {@link ProcessLauncher}. */ public void setProcessLauncher(final ProcessLauncher processLauncher) { this.processLauncher = processLauncher; } /** * Checks that the given {@code dockerMachineInstallDir} contains the * {@code docker-compose} command * * @param dockerComposeInstallDir * the directory to check * @return <code>true</code> if the system-specific command was found, * <code>false</code> otherwise. */ public boolean checkPathToDockerCompose( final String dockerComposeInstallDir) { return this.processLauncher.checkPathToCommand(dockerComposeInstallDir, getDockerComposeCommandName()); } /** * Runs the {@code docker-compose up} command from the specified * {@code baseDir} * * @param dockerComposeInstallDir * the directory in which the {@code docker-compose} command is * located * @param baseDir * the base directory in which the {@code docker-compose} command * should be ran. This directory should contain a * {@code docker-compose.yml} file. * @throws DockerException * if something wrong happened */ public Process up(final IDockerConnection connection, final String dockerComposeInstallDir, final String baseDir) throws DockerException { return this.processLauncher.processBuilder(dockerComposeInstallDir, getDockerComposeCommandName(), getArguments(connection, "up")) //$NON-NLS-1$ .workingDir(baseDir).start(); } public Process stop(final IDockerConnection connection, final String dockerComposeInstallDir, final String baseDir) throws DockerException { return this.processLauncher .processBuilder(dockerComposeInstallDir, getDockerComposeCommandName(), getArguments(connection, "stop")) //$NON-NLS-1$ .workingDir(baseDir).start(); } private static String[] getArguments(final IDockerConnection connection, final String commandName) { switch (connection.getSettings().getType()) { case UNIX_SOCKET_CONNECTION: return new String[] { commandName }; case TCP_CONNECTION: final TCPConnectionSettings connectionSettings = (TCPConnectionSettings) connection .getSettings(); // include the flags to connect to the host final List<String> args = new ArrayList<>(); args.add("-H"); args.add(connectionSettings.getHost()); if (connectionSettings.isTlsVerify() && connectionSettings.getPathToCertificates() != null) { args.add("--tlsverify"); //$NON-NLS-1$ args.add("--tlscacert"); //$NON-NLS-1$ args.add(getFilePath(connectionSettings.getPathToCertificates(), "ca.pem")); //$NON-NLS-1$ args.add("--tlscert"); //$NON-NLS-1$ args.add(getFilePath(connectionSettings.getPathToCertificates(), "cert.pem")); //$NON-NLS-1$ args.add("--tlskey"); //$NON-NLS-1$ args.add(getFilePath(connectionSettings.getPathToCertificates(), "key.pem")); //$NON-NLS-1$ } args.add(commandName); return args.toArray(new String[0]); } return null; } private static String getFilePath(final String pathToCertificates, final String certificateFileName) { if (pathToCertificates.endsWith(File.separator)) { return pathToCertificates + certificateFileName; } return pathToCertificates + File.separator + certificateFileName; } public static String getDockerComposeCommandName() { if (SystemUtils.isWindows()) { return "docker-compose.exe"; //$NON-NLS-1$ } return "docker-compose"; //$NON-NLS-1$ } }