package org.arquillian.cube.docker.impl.client;
import java.util.Map;
import java.util.Set;
import org.arquillian.cube.docker.impl.client.config.CubeContainer;
import org.arquillian.cube.docker.impl.client.config.DockerCompositions;
import org.arquillian.cube.docker.impl.client.config.Network;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.docker.impl.model.NetworkRegistry;
import org.arquillian.cube.spi.CubeConfiguration;
import org.arquillian.cube.spi.event.lifecycle.AfterCreate;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.test.spi.event.suite.AfterSuite;
import org.jboss.arquillian.test.spi.event.suite.BeforeSuite;
public class NetworkLifecycleController {
@Inject
private Instance<NetworkRegistry> networkRegistryInstance;
@Inject
private Instance<DockerClientExecutor> dockerClientExecutorInstance;
public void createNetworks(@Observes(precedence = 200) BeforeSuite event, CubeConfiguration cubeConfiguration,
CubeDockerConfiguration dockerConfiguration) {
final DockerCompositions dockerContainersContent = dockerConfiguration.getDockerContainersContent();
final Map<String, Network> networks = dockerContainersContent.getNetworks();
final NetworkRegistry networkRegistry = networkRegistryInstance.get();
final DockerClientExecutor dockerClientExecutor = dockerClientExecutorInstance.get();
for (Map.Entry<String, Network> network : networks.entrySet()) {
final String id = dockerClientExecutor.createNetwork(network.getKey(), network.getValue());
networkRegistry.addNetwork(id, network.getValue());
}
}
public void destroyNetworks(@Observes(precedence = -200) AfterSuite event, CubeDockerConfiguration configuration) {
final NetworkRegistry networkRegistry = networkRegistryInstance.get();
final DockerClientExecutor dockerClientExecutor = dockerClientExecutorInstance.get();
final Set<String> networkIds = networkRegistry.getNetworkIds();
for (String networkId : networkIds) {
dockerClientExecutor.removeNetwork(networkId);
}
}
public void connectToNetworks(@Observes AfterCreate event, CubeDockerConfiguration dockerConfiguration) {
final DockerCompositions dockerContainersContent = dockerConfiguration.getDockerContainersContent();
final DockerClientExecutor dockerClientExecutor = dockerClientExecutorInstance.get();
String cubeId = event.getCubeId();
CubeContainer container = dockerContainersContent.get(cubeId);
if (container != null && container.getNetworks() != null) {
for (String network : container.getNetworks()) {
if (!network.equals(container.getNetworkMode())) {
dockerClientExecutor.connectToNetwork(network, cubeId);
}
}
}
}
}