package org.arquillian.cube.docker.impl.docker.compose; import java.util.Map; import java.util.LinkedHashMap; import java.util.List; import java.util.ArrayList; import java.util.Collection; import org.arquillian.cube.docker.impl.client.config.IPAM; import org.arquillian.cube.docker.impl.client.config.IPAMConfig; import org.arquillian.cube.docker.impl.client.config.Network; import static org.arquillian.cube.docker.impl.util.YamlUtil.asMap; import static org.arquillian.cube.docker.impl.util.YamlUtil.asMapOfStrings; import static org.arquillian.cube.docker.impl.util.YamlUtil.asString; import static org.arquillian.cube.docker.impl.util.YamlUtil.asListOfMap; public class NetworkBuilder { private static final String DRIVER = "driver"; private static final String DRIVER_OPTS = "driver_opts"; private static final String IPAM = "ipam"; private static final String DEFAULT_NETWORK_DRIVER = "bridge"; private static final String SUBNET = "subnet"; private static final String GATEWAY = "gateway"; private static final String IP_RANGE = "iprange"; private static final String CONFIG = "config"; private Network configuration; public NetworkBuilder() { this(new Network()); } protected NetworkBuilder(Network configuration) { this.configuration = configuration; } public Network build(Map<String, Object> dockerComposeContainerDefinition) { if (dockerComposeContainerDefinition != null && dockerComposeContainerDefinition.containsKey(DRIVER)) { addDriver(asString(dockerComposeContainerDefinition, DRIVER)); } else { addDriver(DEFAULT_NETWORK_DRIVER); } if (dockerComposeContainerDefinition != null) { if (dockerComposeContainerDefinition.containsKey(IPAM)) { addIpam(asMap(dockerComposeContainerDefinition, IPAM)); } if (dockerComposeContainerDefinition.containsKey(DRIVER_OPTS)) { this.configuration.setOptions(asMapOfStrings(dockerComposeContainerDefinition, DRIVER_OPTS)); } } return build(); } public NetworkBuilder addDriver(String driver) { this.configuration.setDriver(driver); return this; } public NetworkBuilder withDefaultDriver() { this.configuration.setDriver(DEFAULT_NETWORK_DRIVER); return this; } public NetworkBuilder addIpam(Map<String, Object> ipamConfig) { IPAM ipam = new IPAM(); if (ipamConfig != null) { if (ipamConfig.containsKey(DRIVER)) { ipam.setDriver(asString(ipamConfig, DRIVER)); } if (ipamConfig.containsKey(CONFIG)) { ipam.setIpamConfigs(createIpamConfig(asListOfMap(ipamConfig, CONFIG))); } } this.configuration.setIpam(ipam); return this; } private List<IPAMConfig> createIpamConfig(Collection<Map<String, Object>> configs) { List<IPAMConfig> ipamConfigs = new ArrayList<>(); for (Map<String, Object> ipam : configs) { if (ipam != null) { IPAMConfig ipamConfig = new IPAMConfig(); if (ipam.containsKey(SUBNET)) { ipamConfig.setSubnet(asString(ipam, SUBNET)); } if (ipam.containsKey(GATEWAY)) { ipamConfig.setGateway(asString(ipam, GATEWAY)); } if (ipam.containsKey(IP_RANGE)) { ipamConfig.setIpRange(asString(ipam, IP_RANGE)); } ipamConfigs.add(ipamConfig); } } return ipamConfigs; } public Network build() { return this.configuration; } }