package org.testcontainers.utility; import lombok.NonNull; import org.apache.commons.lang.SystemUtils; import org.slf4j.Logger; import java.util.List; import java.util.Optional; import static java.util.Arrays.asList; import static org.slf4j.LoggerFactory.getLogger; import static org.testcontainers.utility.CommandLine.executableExists; import static org.testcontainers.utility.CommandLine.runShellCommand; /** * Created by rnorth on 27/10/2015. */ public class DockerMachineClient { private static DockerMachineClient instance; private static final Logger LOGGER = getLogger(DockerMachineClient.class); private static final String executableName; static { if(SystemUtils.IS_OS_WINDOWS) { executableName = "docker-machine.exe"; } else { executableName = "docker-machine"; } } /** * Private constructor */ private DockerMachineClient() { } /** * Obtain an instance of the DockerMachineClient wrapper. * * @return the singleton instance of DockerMachineClient */ public synchronized static DockerMachineClient instance() { if (instance == null) { instance = new DockerMachineClient(); } return instance; } public boolean isInstalled() { return executableExists(executableName); } public Optional<String> getDefaultMachine() { String ls = runShellCommand(executableName, "ls", "-q"); List<String> machineNames = asList(ls.split("\n")); String envMachineName = System.getenv("DOCKER_MACHINE_NAME"); if (machineNames.contains(envMachineName)) { LOGGER.debug("Using docker-machine set in DOCKER_MACHINE_NAME: {}", envMachineName); return Optional.of(envMachineName); } else if (machineNames.contains("default")) { LOGGER.debug("DOCKER_MACHINE_NAME is not set; Using 'default' docker-machine", envMachineName); return Optional.of("default"); } else if (machineNames.size() > 0) { LOGGER.debug("DOCKER_MACHINE_NAME is not set and no machine named 'default' found; Using first machine found with `docker-machine ls`: {}", machineNames.get(0)); return Optional.of(machineNames.get(0)); } else { return Optional.empty(); } } public void ensureMachineRunning(@NonNull String machineName) { if (!isMachineRunning(machineName)) { LOGGER.info("Docker-machine '{}' is not running. Will start it now", machineName); runShellCommand("docker-machine", "start", machineName); } } public String getDockerDaemonIpAddress(@NonNull String machineName) { return runShellCommand(executableName, "ip", machineName); } public boolean isMachineRunning(String machineName) { String status = runShellCommand("docker-machine", "status", machineName); return status.trim().equalsIgnoreCase("running"); } public boolean isDefaultMachineRunning() { return isMachineRunning(getDefaultMachine().orElse("default")); } }