package org.arquillian.cube.docker.impl.client.containerobject.dsl;
import org.arquillian.cube.HostIpContext;
import org.arquillian.cube.containerobject.ConnectionMode;
import org.arquillian.cube.docker.impl.client.config.CubeContainer;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.spi.Cube;
import org.arquillian.cube.spi.CubeOutput;
import org.arquillian.cube.spi.CubeRegistry;
import org.arquillian.cube.spi.metadata.HasPortBindings;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
/**
* Base class representing a container.
*/
public class Container {
@Inject
Instance<HostIpContext> hostIpContextInstance;
@Inject
Instance<CubeRegistry> cubeRegistryInstance;
@Inject
Instance<DockerClientExecutor> dockerClientExecutorInstance;
private String containerName;
private CubeContainer cubeContainer;
private ConnectionMode connectionMode;
protected Container(String containerName, CubeContainer cubeContainer, ConnectionMode connectionMode) {
this.containerName = containerName;
this.cubeContainer = cubeContainer;
this.connectionMode = connectionMode;
}
public static ContainerBuilder withContainerName(String containerName) {
return ContainerBuilder.newContainer(containerName);
}
public String getContainerName() {
return containerName;
}
public CubeContainer getCubeContainer() {
return cubeContainer;
}
public ConnectionMode getConnectionMode() {
return connectionMode;
}
/**
* Returns the ip where this container can be reachable from outside docker host.
* @return Ip.
*/
public String getIpAddress() {
return hostIpContextInstance.get().getHost();
}
/**
* Returns binding port for given exposed port.
* @param exposedPort to resolve.
* @return Binding port.
*/
public int getBindPort(int exposedPort) {
return getBindingPort(this.containerName, exposedPort);
}
/**
* Executes given command inside this container.
* @param commands to execute.
* @return Output of the execution.
*/
public CubeOutput exec(String...commands) {
return this.dockerClientExecutorInstance.get().execStart(this.containerName, commands);
}
/**
* Gets current logs of this container.
* @return Current logs.
*/
public String getLog() {
return this.dockerClientExecutorInstance.get().containerLog(this.containerName);
}
private int getBindingPort(String cubeId, int exposedPort) {
int bindPort = -1;
final Cube cube = getCube(cubeId);
if (cube != null) {
final HasPortBindings portBindings = (HasPortBindings) cube.getMetadata(HasPortBindings.class);
final HasPortBindings.PortAddress mappedAddress = portBindings.getMappedAddress(exposedPort);
if (mappedAddress != null) {
bindPort = mappedAddress.getPort();
}
}
return bindPort;
}
private Cube getCube(String cubeId) {
return cubeRegistryInstance.get().getCube(cubeId);
}
}