From 1061eb0e4862b0be99100de532a303ba4abb9baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Wed, 7 Feb 2024 11:08:58 +0100 Subject: [PATCH] Merge local changes for upstream --- .../swissquote/carnotzet/core/Carnotzet.java | 52 ++++-------- .../carnotzet/core/CarnotzetConfig.java | 11 +++ .../carnotzet/core/config/PropertyUtils.java | 3 +- .../core/maven/MavenDependencyResolver.java | 3 +- .../core/maven/TopologicalSorter.java | 4 +- .../core/runtime/log/LogListenerBase.java | 4 +- .../core/runtime/log/StdOutLogPrinter.java | 2 +- .../util/ContainerStartupWrapperUtils.java | 6 +- .../carnotzet/core/util/FileSystemCache.java | 4 +- core/src/main/resources/welcome/before.html | 2 +- .../core/maven/ResourcesManagerTest.java | 2 - .../example_welcome/expected/welcome.html | 2 +- docker-compose/pom.xml | 2 +- .../docker/compose/DockerComposeRuntime.java | 83 ++++++++++++++----- .../runtime/docker/compose/Network.java | 6 ++ maven-plugin/pom.xml | 6 +- .../maven/plugin/AbstractZetMojo.java | 10 +++ 17 files changed, 128 insertions(+), 74 deletions(-) diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/Carnotzet.java b/core/src/main/java/com/github/swissquote/carnotzet/core/Carnotzet.java index d8173fb2..0ab5b7fc 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/Carnotzet.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/Carnotzet.java @@ -26,7 +26,6 @@ import org.apache.commons.lang3.SystemUtils; import com.github.swissquote.carnotzet.core.maven.CarnotzetModuleCoordinates; -import com.github.swissquote.carnotzet.core.maven.ComparableVersion; import com.github.swissquote.carnotzet.core.maven.MavenDependencyResolver; import com.github.swissquote.carnotzet.core.maven.ResourcesManager; import com.google.common.base.Strings; @@ -71,6 +70,12 @@ public class Carnotzet { @Getter private final Boolean attachToCarnotzetNetwork; + @Getter + private final Boolean useExternalNetwork; + + @Getter + private final String externalNetworkName; + @Getter private final Boolean supportLegacyDnsNames; @@ -126,6 +131,18 @@ public Carnotzet(CarnotzetConfig config) { this.attachToCarnotzetNetwork = true; } + if (config.getUseExternalNetwork() != null) { + this.useExternalNetwork = config.getUseExternalNetwork(); + } else { + this.useExternalNetwork = false; + } + + if (config.getExternalNetworkName() != null) { + this.externalNetworkName = config.getExternalNetworkName(); + } else { + this.externalNetworkName = CarnotzetConfig.DEFAULT_EXTERNAL_NETWORK_NAME; + } + if (config.getSupportLegacyDnsNames() != null) { this.supportLegacyDnsNames = config.getSupportLegacyDnsNames(); } else { @@ -158,7 +175,6 @@ public List getModules() { } } assertNoDuplicateArtifactId(modules); - assertMinimalVersionOfCarnotzet(modules); modules = selectModulesForUniqueServiceId(modules); } return modules; @@ -210,38 +226,6 @@ private void assertNoDuplicateArtifactId(List modules) { }); } - private void assertMinimalVersionOfCarnotzet(List modules) { - ComparableVersion actualVersion = getCarnotzetVersion(); - log.debug("Version of carnotzet : {}", actualVersion); - for (CarnotzetModule module : modules) { - String minVersionForModuleStr = module.getProperties().get("carnotzet.min.version"); - if (minVersionForModuleStr == null) { - continue; - } - ComparableVersion minVersionForModule = new ComparableVersion(minVersionForModuleStr); - log.debug("Min version of carnotzet for [{}] : {}", module.getName(), minVersionForModule); - log.debug("Comparison result : {}", minVersionForModule.compareTo(actualVersion)); - if (minVersionForModule.compareTo(actualVersion) > 0) { - throw new CarnotzetDefinitionException("Module [" + module.getName() + "] requires features introduced " - + "in carnotzet version [" + minVersionForModule + "] and you seem to be using " - + "version [" + actualVersion + "]. Please upgrade your version of carnotzet and try again."); - } - } - - } - - private ComparableVersion getCarnotzetVersion() { - final Properties properties = new Properties(); - try { - properties.load(this.getClass().getClassLoader().getResourceAsStream("maven.properties")); - String versionString = properties.getProperty("carnotzet.version"); - return new ComparableVersion(versionString); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - } - public Optional getModule(@NonNull String moduleName) { return getModules().stream().filter(module -> moduleName.equals(module.getName())).findFirst(); } diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/CarnotzetConfig.java b/core/src/main/java/com/github/swissquote/carnotzet/core/CarnotzetConfig.java index 352325e9..45698278 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/CarnotzetConfig.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/CarnotzetConfig.java @@ -17,6 +17,7 @@ public class CarnotzetConfig { public final static String DEFAULT_MODULE_FILTER_PATTERN = "(.*)-carnotzet"; public final static String DEFAULT_CLASSIFIER_INCLUDE_PATTERN = ".*carnotzet"; public final static String DEFAULT_DOCKER_REGISTRY = "docker.io"; + public final static String DEFAULT_EXTERNAL_NETWORK_NAME = "docker-compose_jenkins-build-bridge"; public final static List DEFAULT_PROP_FILE_NAMES = Collections.singletonList("carnotzet.properties"); @NonNull @@ -81,6 +82,16 @@ public class CarnotzetConfig { */ private final Boolean attachToCarnotzetNetwork; + /** + * When running carnotzet inside a container, use existing external bridge network. + */ + private final Boolean useExternalNetwork; + + /** + * When running carnotzet inside a container, use existing external bridge network. + */ + private final String externalNetworkName; + /** * Enable or disable support for legacy DNS names (container_name.)image_name.docker
* Support is enabled by default (true) diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/config/PropertyUtils.java b/core/src/main/java/com/github/swissquote/carnotzet/core/config/PropertyUtils.java index 31860951..f3b126ea 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/config/PropertyUtils.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/config/PropertyUtils.java @@ -3,6 +3,7 @@ import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; @@ -18,7 +19,7 @@ private PropertyUtils() { // Inspired by java.utils.Properties#store0, but sorts lines in lexicographical order and doesn't output comments in the file public static void outputCleanPropFile(Properties props, Path path) throws IOException { - try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(path), "8859_1"))) { + try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(path), StandardCharsets.ISO_8859_1))) { synchronized (props) { List keys = Collections.list(props.keys()).stream().map(Object::toString).collect(Collectors.toList()); Collections.sort(keys); diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/maven/MavenDependencyResolver.java b/core/src/main/java/com/github/swissquote/carnotzet/core/maven/MavenDependencyResolver.java index 0b885716..61202561 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/maven/MavenDependencyResolver.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/maven/MavenDependencyResolver.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -188,7 +189,7 @@ private Node resolveDependencyTree(Path pomFile) { + " -DoutputType=text " + " -DoutputFile=" + treePath.toAbsolutePath().toString(); executeMavenBuild(Arrays.asList(command), null); - try (Reader r = new InputStreamReader(Files.newInputStream(treePath), "UTF-8")) { + try (Reader r = new InputStreamReader(Files.newInputStream(treePath), StandardCharsets.UTF_8)) { return new TreeTextParser().parse(r); } catch (ParseException | IOException e) { diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/maven/TopologicalSorter.java b/core/src/main/java/com/github/swissquote/carnotzet/core/maven/TopologicalSorter.java index 1eaaf97a..f9067278 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/maven/TopologicalSorter.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/maven/TopologicalSorter.java @@ -36,13 +36,13 @@ private static final class Sort { private final Map resolvedNodes = new HashMap<>(); // Only used to provide nice error messages in case of cycles - private Stack stack = new Stack<>(); + private final Stack stack = new Stack<>(); // for cycles detection private final Set temporaryMarkers = new HashSet<>(); private final Set permanentMarkers = new HashSet<>(); - private List result = new ArrayList<>(); + private final List result = new ArrayList<>(); private List compute() { // sorting the resolved tree is not enough because of omitted nodes, see unit tests for counter examples. diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/LogListenerBase.java b/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/LogListenerBase.java index 39c6dfbb..c4b06c61 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/LogListenerBase.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/LogListenerBase.java @@ -13,12 +13,12 @@ public abstract class LogListenerBase implements LogListener { /** * Indicates how many lines of logs to get at max */ - private Integer tail; + private final Integer tail; /** * Indicates if this listener should */ - private boolean follow; + private final boolean follow; @Setter private Predicate eventFilter; diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/StdOutLogPrinter.java b/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/StdOutLogPrinter.java index 4d7083ed..f3129d86 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/StdOutLogPrinter.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/runtime/log/StdOutLogPrinter.java @@ -24,7 +24,7 @@ public class StdOutLogPrinter extends LogListenerBase { private final static List UNICORN_RAINBOW_MAGIC = new ArrayList<>(); - private Map serviceColors = new HashMap<>(); + private final Map serviceColors = new HashMap<>(); private Integer longestServiceName = 0; diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/util/ContainerStartupWrapperUtils.java b/core/src/main/java/com/github/swissquote/carnotzet/core/util/ContainerStartupWrapperUtils.java index 38526d35..c820454f 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/util/ContainerStartupWrapperUtils.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/util/ContainerStartupWrapperUtils.java @@ -146,7 +146,7 @@ public static class StartupWrapper { private String wrapperName = "wrapper"; // Local images may not be available for target runtime environment (ie : cloud) - private Boolean ignoreLocalImages = false; + private final Boolean ignoreLocalImages = false; @SuppressFBWarnings("CT_CONSTRUCTOR_THROW") public StartupWrapper(@NonNull CarnotzetModule moduleToWrap) { @@ -183,7 +183,7 @@ public CarnotzetModule build() { if (!wrapperScript.toFile().setExecutable(true, false)) { throw new IOException("Could not make file executable : " + wrapperScript.toAbsolutePath()); } - allVolumes.add(wrapperScript.toString() + ":/" + scriptName); + allVolumes.add(wrapperScript + ":/" + scriptName); } catch (IOException e) { throw new UncheckedIOException(e); @@ -210,7 +210,7 @@ public enum DockerExecutionItem { ENTRYPOINT("Entrypoint"), CMD("Cmd"); @Getter - private String jsonField; + private final String jsonField; DockerExecutionItem(String fieldName) { this.jsonField = fieldName; diff --git a/core/src/main/java/com/github/swissquote/carnotzet/core/util/FileSystemCache.java b/core/src/main/java/com/github/swissquote/carnotzet/core/util/FileSystemCache.java index 241b135b..a1a32d14 100644 --- a/core/src/main/java/com/github/swissquote/carnotzet/core/util/FileSystemCache.java +++ b/core/src/main/java/com/github/swissquote/carnotzet/core/util/FileSystemCache.java @@ -5,7 +5,7 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Properties; @@ -52,7 +52,7 @@ public T computeIfAbsent(String key, Function mappingFunction) t if (value == null) { value = mappingFunction.apply(key); this.cache.put(key, value); - try (Writer out = new OutputStreamWriter(new FileOutputStream(this.cachePath.toFile()), Charset.forName("UTF-8"))) { + try (Writer out = new OutputStreamWriter(new FileOutputStream(this.cachePath.toFile()), StandardCharsets.UTF_8)) { this.cache.store(out, "Added value for key " + key); } } diff --git a/core/src/main/resources/welcome/before.html b/core/src/main/resources/welcome/before.html index 4d1d9412..e83a0937 100644 --- a/core/src/main/resources/welcome/before.html +++ b/core/src/main/resources/welcome/before.html @@ -26,4 +26,4 @@ -

Carnotzet Environment

\ No newline at end of file +

Sandbox Home

\ No newline at end of file diff --git a/core/src/test/java/com/github/swissquote/carnotzet/core/maven/ResourcesManagerTest.java b/core/src/test/java/com/github/swissquote/carnotzet/core/maven/ResourcesManagerTest.java index e579f683..a175cde9 100644 --- a/core/src/test/java/com/github/swissquote/carnotzet/core/maven/ResourcesManagerTest.java +++ b/core/src/test/java/com/github/swissquote/carnotzet/core/maven/ResourcesManagerTest.java @@ -19,8 +19,6 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.swissquote.carnotzet.core.CarnotzetModule; public class ResourcesManagerTest { diff --git a/core/src/test/resources/example_welcome/expected/welcome.html b/core/src/test/resources/example_welcome/expected/welcome.html index 9a4bb749..6f43c8d6 100644 --- a/core/src/test/resources/example_welcome/expected/welcome.html +++ b/core/src/test/resources/example_welcome/expected/welcome.html @@ -26,7 +26,7 @@ -

Carnotzet Environment

+

Sandbox Home

This is the documentation for module 1
diff --git a/docker-compose/pom.xml b/docker-compose/pom.xml index 0df4b960..f5bb5753 100644 --- a/docker-compose/pom.xml +++ b/docker-compose/pom.xml @@ -20,7 +20,7 @@ org.apache.commons commons-lang3 - 3.12.0 + 3.14.0 com.fasterxml.jackson.core diff --git a/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/DockerComposeRuntime.java b/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/DockerComposeRuntime.java index 7fd8f287..9fb208db 100644 --- a/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/DockerComposeRuntime.java +++ b/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/DockerComposeRuntime.java @@ -4,9 +4,9 @@ import java.io.IOException; import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -28,11 +28,13 @@ import java.util.stream.StreamSupport; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.ProcessResult; import com.github.swissquote.carnotzet.core.Carnotzet; +import com.github.swissquote.carnotzet.core.CarnotzetConfig; import com.github.swissquote.carnotzet.core.CarnotzetModule; import com.github.swissquote.carnotzet.core.docker.DockerUtils; import com.github.swissquote.carnotzet.core.docker.registry.DockerRegistry; @@ -54,10 +56,6 @@ @Slf4j public class DockerComposeRuntime implements ContainerOrchestrationRuntime { - - private static final Pattern IP_ADDRESS_PATTERN = Pattern.compile( - "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); - private Carnotzet carnotzet; private final String instanceId; @@ -70,6 +68,8 @@ public class DockerComposeRuntime implements ContainerOrchestrationRuntime { private final List extensions; + private final List dockerComposeCommand; + public DockerComposeRuntime(Carnotzet carnotzet) { this(carnotzet, carnotzet.getTopLevelModuleName()); } @@ -104,7 +104,8 @@ public DockerComposeRuntime(Carnotzet carnotzet, String instanceId, CommandRunne this.commandRunner = commandRunner; this.shouldExposePorts = shouldExposePorts; this.extensions = extensions; - + boolean hasNewDockerCompose = commandRunner.runCommand("/bin/bash", "-c", "docker compose version") == 0; + this.dockerComposeCommand = hasNewDockerCompose ? Arrays.asList("docker", "compose") : Arrays.asList("docker-compose"); } public DockerComposeRuntime(Carnotzet carnotzet, String instanceId) { @@ -178,7 +179,8 @@ private void computeDockerComposeFile() { services.put(serviceId, serviceBuilder.build()); } - Network network = Network.builder().driver("bridge").build(); + Network network = + carnotzet.getUseExternalNetwork() ? Network.builder().external(true).build() : Network.builder().driver("bridge").build(); Map networks = new HashMap<>(); networks.put(genNetworkName(), network); @@ -267,10 +269,11 @@ public void start() { invokeAllExtensions((e, m) -> e.beforeStart(m, this, this.carnotzet)); log.debug("Forcing update of docker-compose.yml before start"); computeDockerComposeFile(); - carnotzet.getModules().stream().filter(this::shouldStartByDefault).forEach(m -> - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "up", "-d", - "--scale", m.getServiceId() + "=" + m.getReplicas(), m.getServiceId()) - ); + + carnotzet.getModules().stream().filter(this::shouldStartByDefault).forEach(m -> { + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "up", "-d", + "--scale", m.getServiceId() + "=" + m.getReplicas(), m.getServiceId())); + }); ensureNetworkCommunicationIsPossible(); logManager.ensureCapturingLogs(start, getContainers()); invokeAllExtensions((e, m) -> e.afterStart(m, this, this.carnotzet)); @@ -307,7 +310,7 @@ public void start(String services) { for (CarnotzetModule carnotzetModule : resolvedModules) { String service = carnotzetModule.getServiceId(); Instant start = Instant.now(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "up", "-d", service); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "up", "-d", service)); ensureNetworkCommunicationIsPossible(); logManager.ensureCapturingLogs(start, Collections.singletonList(getContainer(service))); invokeAllExtensions((e, m) -> e.afterStart(m, this, this.carnotzet), carnotzetModule); @@ -320,6 +323,11 @@ private void ensureNetworkCommunicationIsPossible() { return; } + if (carnotzet.getUseExternalNetwork()) { + // No need to connect when already using the same default bridge network + return; + } + if (carnotzet.getAttachToCarnotzetNetwork()) { String buildContainerId = runCommandAndCaptureOutput("/bin/bash", "-c", "docker ps | grep $(hostname) | grep -v k8s_POD | cut -d ' ' -f 1"); @@ -339,13 +347,40 @@ private String getDockerComposeProjectName() { return normalizeDockerComposeProjectName(instanceId); } + private String findExternalNetworkName() { + // Carnotzet network name is defined, return it directly + if (!CarnotzetConfig.DEFAULT_EXTERNAL_NETWORK_NAME.equals(carnotzet.getExternalNetworkName())) { + return carnotzet.getExternalNetworkName(); + } + + // Try to find network name based on the current docker network setting of container + String buildContainerId = + runCommandAndCaptureOutput("/bin/sh", "-c", "docker ps | grep $(hostname) | grep -v k8s_POD | cut -d ' ' -f 1"); + + if (Strings.isNullOrEmpty(buildContainerId)) { + // we are probably not running inside a container, return default external network name + return carnotzet.getExternalNetworkName(); + } + + // print all networks links to this container line by line, take the first non-empty network name that is not default network bridge + String networkName = runCommandAndCaptureOutput("/bin/sh", "-c", + "docker container inspect -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf \"%s\\n\" $net}}{{end}}' " + + buildContainerId + " | grep -v \"\\bbridge\\b\" | grep -m 1 ."); + + log.debug("Running inside a container with network name [{}]", networkName); + + // return default external network name if cannot find the current external network name + return StringUtils.isBlank(networkName) ? carnotzet.getExternalNetworkName() : networkName; + } + private String getDockerNetworkName() { - return getDockerComposeProjectName() + "_" + genNetworkName(); + return carnotzet.getUseExternalNetwork() ? findExternalNetworkName() : getDockerComposeProjectName() + "_" + genNetworkName(); } private String genNetworkName() { // We use only first 12 characters of sha256 (48-bit) which has collision chance 1 of out of 10M - return "carnotzet_" + Sha256.getSHA(carnotzet.getResourcesFolder().toString()).substring(0, 12); + return carnotzet.getUseExternalNetwork() ? findExternalNetworkName() + : "carnotzet_" + Sha256.getSHA(carnotzet.getResourcesFolder().toString()).substring(0, 12); } // normalize docker compose project name the same way docker-compose does (see https://github.com/docker/compose/tree/master/compose) @@ -357,7 +392,7 @@ private String normalizeDockerComposeProjectName(String moduleName) { public void stop() { invokeAllExtensions((e, m) -> e.beforeStop(m, this, this.carnotzet)); ensureDockerComposeFileIsPresent(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "stop"); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "stop")); invokeAllExtensions((e, m) -> e.afterStop(m, this, this.carnotzet)); } @@ -367,7 +402,7 @@ public void stop(String services) { String service = carnotzetModule.getServiceId(); invokeAllExtensions((e, m) -> e.beforeStop(m, this, this.carnotzet), carnotzetModule); ensureDockerComposeFileIsPresent(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "stop", service); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "stop", service)); invokeAllExtensions((e, m) -> e.afterStop(m, this, this.carnotzet), carnotzetModule); } } @@ -375,14 +410,14 @@ public void stop(String services) { @Override public void status() { ensureDockerComposeFileIsPresent(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "ps"); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "ps")); } @Override public void clean() { invokeAllExtensions((e, m) -> e.beforeClean(m, this, this.carnotzet)); ensureDockerComposeFileIsPresent(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "rm", "-f"); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "rm", "-f")); // The resources folder cannot be deleted while the sandbox is running on windows. // So we do it here instead if (SystemUtils.IS_OS_WINDOWS) { @@ -440,8 +475,8 @@ public void pull(@NonNull String services, PullPolicy policy) { @Override public List getContainers() { - String commandOutput = runCommandAndCaptureOutput("docker-compose", "-p", getDockerComposeProjectName(), - "ps", "-q").replaceAll(System.lineSeparator(), " "); + String commandOutput = runCommandAndCaptureOutput(buildDockerComposeCommand("-p", getDockerComposeProjectName(), + "ps", "-q")).replaceAll(System.lineSeparator(), " "); log.debug("docker-compose ps output : " + commandOutput); if (commandOutput.trim().isEmpty()) { return Collections.emptyList(); @@ -546,7 +581,7 @@ public void clean(String services) { for (CarnotzetModule carnotzetModule : resolveModules(services)) { invokeAllExtensions((e, m) -> e.beforeClean(m, this, this.carnotzet), carnotzetModule); String service = carnotzetModule.getServiceId(); - runCommand("docker-compose", "-p", getDockerComposeProjectName(), "rm", "-f", service); + runCommand(buildDockerComposeCommand("-p", getDockerComposeProjectName(), "rm", "-f", service)); invokeAllExtensions((e, m) -> e.afterClean(m, this, this.carnotzet), carnotzetModule); } } @@ -612,6 +647,12 @@ private Set resolveModules(String services) { return myModules; } + private String[] buildDockerComposeCommand(String... args) { + List command = new ArrayList<>(dockerComposeCommand); + command.addAll(Arrays.asList(args)); + return command.toArray(new String[0]); + } + @Override public String getInstanceId() { return instanceId; diff --git a/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/Network.java b/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/Network.java index 05e9c95f..c3627612 100644 --- a/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/Network.java +++ b/docker-compose/src/main/java/com/github/swissquote/carnotzet/runtime/docker/compose/Network.java @@ -1,19 +1,25 @@ package com.github.swissquote.carnotzet.runtime.docker.compose; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + import lombok.Builder; import lombok.Value; @JsonDeserialize(builder = Network.NetworkBuilder.class) @Value @Builder +@JsonInclude(JsonInclude.Include.NON_NULL) public class Network { @JsonProperty private final String driver; + @JsonProperty + private final boolean external; + @JsonPOJOBuilder(withPrefix = "") public static final class NetworkBuilder { } diff --git a/maven-plugin/pom.xml b/maven-plugin/pom.xml index e6b3e960..aeb009ff 100644 --- a/maven-plugin/pom.xml +++ b/maven-plugin/pom.xml @@ -26,17 +26,19 @@ org.apache.maven maven-core + provided org.apache.maven maven-plugin-api + provided org.apache.commons commons-lang3 - 3.12.0 + 3.14.0 org.apache.maven.plugin-tools @@ -48,7 +50,7 @@ org.codehaus.plexus plexus-interactivity-api - 1.1 + 1.2 diff --git a/maven-plugin/src/main/java/com/github/swissquote/carnotzet/maven/plugin/AbstractZetMojo.java b/maven-plugin/src/main/java/com/github/swissquote/carnotzet/maven/plugin/AbstractZetMojo.java index 802eca45..7383bb36 100644 --- a/maven-plugin/src/main/java/com/github/swissquote/carnotzet/maven/plugin/AbstractZetMojo.java +++ b/maven-plugin/src/main/java/com/github/swissquote/carnotzet/maven/plugin/AbstractZetMojo.java @@ -76,6 +76,14 @@ public abstract class AbstractZetMojo extends AbstractMojo { @Getter private Boolean attachToCarnotzetNetwork; + @Parameter(property = "useExternalNetwork") + @Getter + private Boolean useExternalNetwork; + + @Parameter(property = "externalNetworkName") + @Getter + private String externalNetworkName; + @Parameter(property = "supportLegacyDnsNames") @Getter private Boolean supportLegacyDnsNames; @@ -139,6 +147,8 @@ public void execute() throws MojoFailureException, MojoExecutionException { .topLevelModuleResourcesPath(project.getBasedir().toPath().resolve("src/main/resources")) .failOnDependencyCycle(failOnDependencyCycle) .attachToCarnotzetNetwork(attachToCarnotzetNetwork) + .useExternalNetwork(useExternalNetwork) + .externalNetworkName(externalNetworkName) .supportLegacyDnsNames(supportLegacyDnsNames) .extensions(extensions) .build();