package org.arquillian.cube.docker.impl.requirement;
import java.util.HashMap;
import java.util.Map;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.model.Version;
import com.github.dockerjava.core.DockerClientBuilder;
import com.google.common.base.Strings;
import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration;
import org.arquillian.cube.docker.impl.client.CubeDockerConfigurationResolver;
import org.arquillian.cube.docker.impl.util.Boot2Docker;
import org.arquillian.cube.docker.impl.util.CommandLineExecutor;
import org.arquillian.cube.docker.impl.util.DockerMachine;
import org.arquillian.cube.docker.impl.util.OperatingSystemResolver;
import org.arquillian.cube.docker.impl.util.Top;
import org.arquillian.cube.spi.requirement.Requirement;
import org.arquillian.cube.spi.requirement.UnsatisfiedRequirementException;
import org.arquillian.spacelift.execution.ExecutionException;
public class DockerRequirement implements Requirement<RequiresDocker> {
private final CommandLineExecutor commandLineExecutor;
private final CubeDockerConfigurationResolver resolver;
public DockerRequirement() {
this.commandLineExecutor = new CommandLineExecutor();
this.resolver = new CubeDockerConfigurationResolver(new Top(),
new DockerMachine(commandLineExecutor),
new Boot2Docker(commandLineExecutor),
new OperatingSystemResolver().currentOperatingSystem().getFamily()
);
}
public DockerRequirement(CommandLineExecutor commandLineExecutor, CubeDockerConfigurationResolver resolver) {
this.commandLineExecutor = commandLineExecutor;
this.resolver = resolver;
}
/**
* @param serverUrl
* The url to check if docker is running on.
*
* @return True if docker is running on the url.
*/
private static boolean isDockerRunning(String serverUrl) {
return getDockerVersion(serverUrl) != null;
}
/**
* Returns the docker version.
*
* @param serverUrl
* The serverUrl to use.
*/
private static Version getDockerVersion(String serverUrl) {
try {
DockerClient client = DockerClientBuilder.getInstance(serverUrl).build();
return client.versionCmd().exec();
} catch (Exception e) {
return null;
}
}
@Override
public void check(RequiresDocker context) throws UnsatisfiedRequirementException {
try {
Map<String, String> config = resolver.resolve(new HashMap<String, String>());
String serverUrl = config.get(CubeDockerConfiguration.DOCKER_URI);
if (Strings.isNullOrEmpty(serverUrl)) {
throw new UnsatisfiedRequirementException("Could not resolve the docker server url.");
} else if (!isDockerRunning(serverUrl)) {
throw new UnsatisfiedRequirementException("No server is running on url:[" + serverUrl + "].");
}
} catch (ExecutionException e) {
throw new UnsatisfiedRequirementException("Cannot execute docker command.");
}
}
}