/******************************************************************************* * Copyright (c) 2015, 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 org.eclipse.linuxtools.docker.core.DockerException; import org.eclipse.linuxtools.internal.docker.core.ProcessLauncher.FluentProcessBuilder; /** * Utility class to discover Docker machines using the 'docker-machine' command * line in a process. */ public class DockerMachine { private static DockerMachine instance = new DockerMachine(); public static DockerMachine getInstance() { return instance; } private ProcessLauncher processLauncher = new ProcessLauncher(); private DockerMachine() { } /** * 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-machine} command * * @param dockerMachineInstallDir * the directory to check * @return <code>true</code> if the system-specific command was found, * <code>false</code> otherwise. */ public boolean checkPathToDockerMachine( final String dockerMachineInstallDir) { return processLauncher.checkPathToCommand(dockerMachineInstallDir, getDockerMachineExecutableName()); } /** * @param pathToDockerMachine * the path to 'docker-machine' stored in the preferences * @return the names of the existing Docker Machines * @throws DockerException * if something went wrong */ public String[] getNames(final String pathToDockerMachine) throws DockerException { return processLauncher.processBuilder(pathToDockerMachine, getDockerMachineExecutableName(), new String[] { "ls", "-q" }) //$NON-NLS-1$ //$NON-NLS-2$ .startAndGetResult(); } /** * @param name * the name of the Docker Machine to inspect * @param dockerMachineInstallDir * the installation directory for Docker Machine * @param vmDriverInstallDir * the installation directory for the underlying VM driver used * by Docker Machine * @return the host URI to use to connect to it * @throws DockerException * if something went wrong */ public String getHost(final String name, final String dockerMachineInstallDir, final String vmDriverInstallDir) throws DockerException { final String[] res = processLauncher .processBuilder(dockerMachineInstallDir, getDockerMachineExecutableName(), new String[] { "url", name }) //$NON-NLS-1$ .extraPath(vmDriverInstallDir).startAndGetResult(); return res.length == 1 ? res[0] : null; } /** * @param name * the name of the Docker Machine to inspect * @param pathToDockerMachine * the path to 'docker-machine' stored in the preferences * @param vmDriverInstallDir * the installation directory for the underlying VM driver used * by Docker Machine * @return the path to the directory containing the certificates * @throws DockerException * if something went wrong */ public String getCertPath(final String name, final String pathToDockerMachine, final String vmDriverInstallDir) throws DockerException { final FluentProcessBuilder processBuilder = processLauncher .processBuilder(pathToDockerMachine, getDockerMachineExecutableName(), new String[] { "env", name }) //$NON-NLS-1$ .extraPath(vmDriverInstallDir); final String[] envVariables = processBuilder.startAndGetResult(); for (String envVariable : envVariables) { if (envVariable.contains("DOCKER_CERT_PATH")) { //$NON-NLS-1$ // DOCKER_CERT_PATH="/path/to/cert-folder" return envVariable.split("=")[1].replace("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } return null; } /** * @return the name of the Docker Machine executable, depending on the * current operating system. */ private static String getDockerMachineExecutableName() { if (SystemUtils.isWindows()) { return "docker-machine.exe"; //$NON-NLS-1$ } return "docker-machine"; //$NON-NLS-1$ } }