package org.arquillian.cube.docker.impl.client; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.UUID; import java.util.logging.Logger; import org.arquillian.cube.HostIpContext; 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.Link; import org.arquillian.cube.docker.impl.client.config.PortBinding; import org.arquillian.cube.docker.impl.client.config.StarOperator; import org.arquillian.cube.docker.impl.util.Boot2Docker; import org.arquillian.cube.docker.impl.util.DockerMachine; import org.arquillian.cube.docker.impl.util.OperatingSystemFamily; import org.arquillian.cube.docker.impl.util.OperatingSystemResolver; import org.arquillian.cube.docker.impl.util.Top; import org.arquillian.cube.spi.CubeConfiguration; import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor; import org.jboss.arquillian.core.api.Injector; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.InstanceProducer; import org.jboss.arquillian.core.api.annotation.ApplicationScoped; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.core.api.annotation.Observes; public class CubeDockerConfigurator { public static final String DOCKER_HOST = "DOCKER_HOST"; private static final String EXTENSION_NAME = "docker"; private static Random random = new Random(); private static Logger log = Logger.getLogger(CubeDockerConfigurator.class.getName()); @Inject @ApplicationScoped private InstanceProducer<CubeDockerConfiguration> configurationProducer; @Inject @ApplicationScoped private InstanceProducer<HostIpContext> hostUriContextInstanceProducer; @Inject private Instance<Boot2Docker> boot2DockerInstance; @Inject private Instance<DockerMachine> dockerMachineInstance; @Inject private Instance<Top> topInstance; @Inject private Instance<Injector> injectorInstance; @Inject @ApplicationScoped private InstanceProducer<OperatingSystemFamily> operatingSystemFamilyInstanceProducer; public void configure(@Observes CubeConfiguration event, ArquillianDescriptor arquillianDescriptor) { configure(arquillianDescriptor); } private void configure(ArquillianDescriptor arquillianDescriptor) { operatingSystemFamilyInstanceProducer.set(new OperatingSystemResolver().currentOperatingSystem().getFamily()); Map<String, String> config = arquillianDescriptor.extension(EXTENSION_NAME).getExtensionProperties(); CubeDockerConfigurationResolver resolver = new CubeDockerConfigurationResolver(topInstance.get(), dockerMachineInstance.get(), boot2DockerInstance.get(), operatingSystemFamilyInstanceProducer.get()); resolver.resolve(config); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(config, injectorInstance.get()); cubeConfiguration = resolveDynamicNames(cubeConfiguration); System.out.println(cubeConfiguration); hostUriContextInstanceProducer.set(new HostIpContext(cubeConfiguration.getDockerServerIp())); configurationProducer.set(cubeConfiguration); } CubeDockerConfiguration resolveDynamicNames(CubeDockerConfiguration cubeConfiguration) { final Map<String, CubeContainer> resolvedContainers = new HashMap<>(); final DockerCompositions dockerContainersContent = cubeConfiguration.getDockerContainersContent(); final Map<String, CubeContainer> containers = dockerContainersContent.getContainers(); final UUID uuid = UUID.randomUUID(); for (Map.Entry<String, CubeContainer> container : containers.entrySet()) { // If it is a dynamic definition final String containerId = container.getKey(); if (containerId.endsWith("*")) { String templateName = containerId.substring(0, containerId.lastIndexOf('*')); CubeContainer cubeContainer = container.getValue(); StarOperator.adaptPortBindingToParallelRun(cubeContainer); StarOperator.adaptLinksToParallelRun(uuid, cubeContainer); String newId = StarOperator.generateNewName(templateName, uuid); resolvedContainers.put(newId, cubeContainer); } else { resolvedContainers.put(containerId, container.getValue()); } } dockerContainersContent.setContainers(resolvedContainers); return cubeConfiguration; } }