From 1e7b6611f1225bac31b5c45e1f25bed6d74c64d6 Mon Sep 17 00:00:00 2001 From: Alban Fonrouge Date: Fri, 2 Dec 2022 09:08:03 +0100 Subject: [PATCH] Fix parsing of docker-compose < 1.25.2 output on narrow terminals --- .../docker/compose/connection/Ports.java | 12 +++++++++--- .../docker/compose/connection/PortsShould.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/connection/Ports.java b/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/connection/Ports.java index 227f98801..a11556a49 100644 --- a/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/connection/Ports.java +++ b/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/connection/Ports.java @@ -18,11 +18,13 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.stream.Stream; public final class Ports { @@ -55,8 +57,12 @@ public Stream stream() { } public static Ports parseFromDockerComposePs(String psOutput, String dockerMachineIp) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(psOutput), "No container found"); - Matcher matcher = PORT_PATTERN.matcher(psOutput); + // Clean the ps output to remove line breaks and unneeded spaces + String cleanOutput = Arrays.stream(psOutput.split("\\R")) + .map(String::trim) + .collect(Collectors.joining("")); + Preconditions.checkArgument(!Strings.isNullOrEmpty(cleanOutput), "No container found"); + Matcher matcher = PORT_PATTERN.matcher(cleanOutput); List ports = new ArrayList<>(); while (matcher.find()) { String matchedIpAddress = matcher.group(IP_ADDRESS); @@ -66,7 +72,7 @@ public static Ports parseFromDockerComposePs(String psOutput, String dockerMachi ports.add(new DockerPort(ip, externalPort, internalPort)); } - Matcher rangeMatcher = PORT_RANGE_PATTERN.matcher(psOutput); + Matcher rangeMatcher = PORT_RANGE_PATTERN.matcher(cleanOutput); while (rangeMatcher.find()) { String matchedIpAddress = rangeMatcher.group(IP_ADDRESS); String ip = matchedIpAddress.equals(NO_IP_ADDRESS) ? dockerMachineIp : matchedIpAddress; diff --git a/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/connection/PortsShould.java b/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/connection/PortsShould.java index a7a936504..4ae4a9c8e 100644 --- a/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/connection/PortsShould.java +++ b/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/connection/PortsShould.java @@ -95,6 +95,23 @@ public void parse_actual_docker_compose_output() { assertThat(ports, is(expected)); } + @Test + public void parse_docker_compose_output_on_narrow_terminal() { + String psOutput = + " Name Command State Ports \n" + + "--------------------------------------------------------------------------------\n" + + "projectnamemyserv docker-entrypoint.sh Up (healthy) 4510/tcp, 4511/tcp,\n" + + "ice_localstack_1 4512/tcp, 4513/tcp,\n" + + " 4514/tcp, 4515/tcp,\n" + + " 4558/tcp, 4559/tcp,\n" + + " 0.0.0.0:49153->4566\n" + + " /tcp,:::49153->4566\n" + + " /tcp, 5678/tcp "; + Ports ports = Ports.parseFromDockerComposePs(psOutput, LOCALHOST_IP); + Ports expected = new Ports(newArrayList(new DockerPort(LOCALHOST_IP, 49153, 4566))); + assertThat(ports, is(expected)); + } + @Test public void throw_illegal_state_exception_when_no_running_container_found_for_service() { exception.expect(IllegalArgumentException.class);