From b3ff6ad34d8e8106943ed47186da48f649c172c9 Mon Sep 17 00:00:00 2001 From: Madh93 Date: Sat, 23 Jan 2021 15:00:11 +0000 Subject: [PATCH 1/3] extend docker port binding support --- .../java/cloud/localstack/docker/command/RunCommand.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/cloud/localstack/docker/command/RunCommand.java b/src/main/java/cloud/localstack/docker/command/RunCommand.java index e75873e..7b588db 100644 --- a/src/main/java/cloud/localstack/docker/command/RunCommand.java +++ b/src/main/java/cloud/localstack/docker/command/RunCommand.java @@ -36,7 +36,10 @@ public String execute() { } public RunCommand withExposedPorts(String portsToExpose, boolean randomize) { - String portsOption = String.format("%s:%s", randomize ? "" : portsToExpose, portsToExpose ); + String[] parts = portsToExpose.split(":"); + String hostPort = randomize ? "" : parts.length > 1 ? parts[0] : portsToExpose; + String containerPort = parts.length > 1 ? parts[1] : portsToExpose; + String portsOption = String.format("%s:%s", hostPort, containerPort); addOptions("-p", portsOption); return this; } From 59738f93504d390217770701b9395ceba99769f7 Mon Sep 17 00:00:00 2001 From: Madh93 Date: Sat, 23 Jan 2021 17:15:55 +0000 Subject: [PATCH 2/3] add 'portEdge' and 'portElasticSearch' properties --- README.md | 2 ++ src/main/java/cloud/localstack/Localstack.java | 2 ++ src/main/java/cloud/localstack/docker/Container.java | 12 ++++++++---- .../LocalstackDockerAnnotationProcessor.java | 2 ++ .../annotation/LocalstackDockerConfiguration.java | 6 ++++++ .../annotation/LocalstackDockerProperties.java | 10 ++++++++++ .../cloud/localstack/deprecated/PortBindingTest.java | 4 ++-- .../java/cloud/localstack/docker/ContainerTest.java | 2 +- 8 files changed, 33 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 52ff8f4..e51e7e5 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ You can configure the Docker behaviour using the `@LocalstackDockerProperties` a | `pullNewImage` | Determines if a new image is pulled from the docker repo before the tests are run. | boolean | `false` | | `services` | Determines which services should be run when the localstack starts. | String[] | All | | `imageTag` | Use a specific image tag for docker container | String | `latest` | +| `portEdge` | Port number for the edge service, the main entry point for all API invocations | String | `4566` | +| `portElasticSearch` | Port number for the elasticsearch service | String | `4571` | | `hostNameResolver` | Used for determining the host name of the machine running the docker containers so that the containers can be addressed. | IHostNameResolver | `localhost` | | `environmentVariableProvider` | Used for injecting environment variables into the container. | IEnvironmentVariableProvider | Empty Map | | `useSingleDockerContainer` | Whether a singleton container should be used by all test classes. | boolean | `false` | diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index ee264e0..bea6c02 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -67,6 +67,8 @@ public void startup(LocalstackDockerConfiguration dockerConfiguration) { dockerConfiguration.isPullNewImage(), dockerConfiguration.isRandomizePorts(), dockerConfiguration.getImageTag(), + dockerConfiguration.getPortEdge(), + dockerConfiguration.getPortElasticSearch(), dockerConfiguration.getEnvironmentVariables(), dockerConfiguration.getPortMappings() ); diff --git a/src/main/java/cloud/localstack/docker/Container.java b/src/main/java/cloud/localstack/docker/Container.java index 759fc6a..9bffc10 100644 --- a/src/main/java/cloud/localstack/docker/Container.java +++ b/src/main/java/cloud/localstack/docker/Container.java @@ -50,8 +50,8 @@ public class Container { * @param environmentVariables map of environment variables to be passed to the docker container */ public static Container createLocalstackContainer( - String externalHostName, boolean pullNewImage, boolean randomizePorts, String imageTag, - Map environmentVariables, Map portMappings) { + String externalHostName, boolean pullNewImage, boolean randomizePorts, String imageTag, String portEdge, + String portElasticSearch, Map environmentVariables, Map portMappings) { environmentVariables = environmentVariables == null ? Collections.emptyMap() : environmentVariables; portMappings = portMappings == null ? Collections.emptyMap() : portMappings; @@ -59,14 +59,18 @@ public static Container createLocalstackContainer( String fullImageName = LOCALSTACK_NAME + ":" + (imageTag == null ? "latest" : imageTag); boolean imageExists = new ListImagesCommand().execute().contains(fullImageName); + String fullPortEdge = (portEdge == null ? LOCALSTACK_PORT_EDGE : portEdge) + ":" + LOCALSTACK_PORT_EDGE; + String fullPortElasticSearch = (portElasticSearch == null ? LOCALSTACK_PORT_ELASTICSEARCH : portElasticSearch) + + ":" + LOCALSTACK_PORT_ELASTICSEARCH; + if(pullNewImage || !imageExists) { LOG.info("Pulling latest image..."); new PullCommand(LOCALSTACK_NAME, imageTag).execute(); } RunCommand runCommand = new RunCommand(LOCALSTACK_NAME, imageTag) - .withExposedPorts(LOCALSTACK_PORT_EDGE, randomizePorts) - .withExposedPorts(LOCALSTACK_PORT_ELASTICSEARCH, randomizePorts) + .withExposedPorts(fullPortEdge, randomizePorts) + .withExposedPorts(fullPortElasticSearch, randomizePorts) .withEnvironmentVariable(LOCALSTACK_EXTERNAL_HOSTNAME, externalHostName) .withEnvironmentVariable(ENV_DEBUG, ENV_DEBUG_DEFAULT) .withEnvironmentVariable(ENV_USE_SSL, Localstack.INSTANCE.useSSL() ? "1" : "0") diff --git a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerAnnotationProcessor.java b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerAnnotationProcessor.java index e0c01c7..d904f9f 100644 --- a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerAnnotationProcessor.java +++ b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerAnnotationProcessor.java @@ -36,6 +36,8 @@ private LocalstackDockerConfiguration processDockerPropertiesAnnotation(Localsta .ignoreDockerRunErrors(properties.ignoreDockerRunErrors()) .randomizePorts(properties.randomizePorts()) .imageTag(StringUtils.isEmpty(properties.imageTag()) ? null : properties.imageTag()) + .portEdge(properties.portEdge()) + .portElasticSearch(properties.portElasticSearch()) .useSingleDockerContainer(properties.useSingleDockerContainer()) .build(); } diff --git a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerConfiguration.java b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerConfiguration.java index 100460e..ca9937a 100644 --- a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerConfiguration.java +++ b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerConfiguration.java @@ -25,6 +25,12 @@ public class LocalstackDockerConfiguration { private final String imageTag; + @Builder.Default + private final String portEdge = "4566"; + + @Builder.Default + private final String portElasticSearch = "4571"; + @Builder.Default private final String externalHostName = "localhost"; diff --git a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerProperties.java b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerProperties.java index d816ca4..1094ae7 100644 --- a/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerProperties.java +++ b/src/main/java/cloud/localstack/docker/annotation/LocalstackDockerProperties.java @@ -51,6 +51,16 @@ */ String imageTag() default ""; + /** + * Port number for the edge service, the main entry point for all API invocations + */ + String portEdge() default "4566"; + + /** + * Port number for the elasticsearch service + */ + String portElasticSearch() default "4571"; + /** * Determines if the singleton container should be used by all test classes */ diff --git a/src/test/java/cloud/localstack/deprecated/PortBindingTest.java b/src/test/java/cloud/localstack/deprecated/PortBindingTest.java index 0c017d2..796b69c 100644 --- a/src/test/java/cloud/localstack/deprecated/PortBindingTest.java +++ b/src/test/java/cloud/localstack/deprecated/PortBindingTest.java @@ -35,7 +35,7 @@ public void testAccessPredefinedPort() { @Test public void createLocalstackContainerWithRandomPorts() throws Exception { Container container = Container.createLocalstackContainer( - EXTERNAL_HOST_NAME, pullNewImage, true, null, null, null); + EXTERNAL_HOST_NAME, pullNewImage, true, null, null, null, null, null); try { container.waitForAllPorts(EXTERNAL_HOST_NAME); @@ -53,7 +53,7 @@ public void createLocalstackContainerWithRandomPorts() throws Exception { @Test public void createLocalstackContainerWithStaticPorts() throws Exception { Container container = Container.createLocalstackContainer( - EXTERNAL_HOST_NAME, pullNewImage, false, null, null, null); + EXTERNAL_HOST_NAME, pullNewImage, false, null, null, null, null, null); try { container.waitForAllPorts(EXTERNAL_HOST_NAME); diff --git a/src/test/java/cloud/localstack/docker/ContainerTest.java b/src/test/java/cloud/localstack/docker/ContainerTest.java index b26d338..a2e7445 100644 --- a/src/test/java/cloud/localstack/docker/ContainerTest.java +++ b/src/test/java/cloud/localstack/docker/ContainerTest.java @@ -21,7 +21,7 @@ public void createLocalstackContainer() throws Exception { HashMap environmentVariables = new HashMap<>(); environmentVariables.put(MY_PROPERTY, MY_VALUE); Container localStackContainer = Container.createLocalstackContainer( - EXTERNAL_HOST_NAME, pullNewImage, true, null, environmentVariables, null); + EXTERNAL_HOST_NAME, pullNewImage, true, null, null, null, environmentVariables, null); try { localStackContainer.waitForAllPorts(EXTERNAL_HOST_NAME); From 3917ade94f3d4b5bff8874bb69636d6cc8eb94eb Mon Sep 17 00:00:00 2001 From: Madh93 Date: Sat, 23 Jan 2021 17:52:21 +0000 Subject: [PATCH 3/3] add tests for docker port binding --- .../localstack/docker/ContainerTest.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/test/java/cloud/localstack/docker/ContainerTest.java b/src/test/java/cloud/localstack/docker/ContainerTest.java index a2e7445..e3ea92f 100644 --- a/src/test/java/cloud/localstack/docker/ContainerTest.java +++ b/src/test/java/cloud/localstack/docker/ContainerTest.java @@ -6,6 +6,7 @@ import java.util.HashMap; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; public class ContainerTest { @@ -21,7 +22,7 @@ public void createLocalstackContainer() throws Exception { HashMap environmentVariables = new HashMap<>(); environmentVariables.put(MY_PROPERTY, MY_VALUE); Container localStackContainer = Container.createLocalstackContainer( - EXTERNAL_HOST_NAME, pullNewImage, true, null, null, null, environmentVariables, null); + EXTERNAL_HOST_NAME, pullNewImage, false, null, null, null, environmentVariables, null); try { localStackContainer.waitForAllPorts(EXTERNAL_HOST_NAME); @@ -32,6 +33,43 @@ public void createLocalstackContainer() throws Exception { ArrayList echoExternalEnv = buildEchoStatement(MY_PROPERTY); assertEquals(EXTERNAL_HOST_NAME, localStackContainer.executeCommand(echoDefaultEnv)); assertEquals(MY_VALUE, localStackContainer.executeCommand(echoExternalEnv)); + + // Test Edge and ElasticSearch ports + + assertEquals(4566, localStackContainer.getExternalPortFor(4566)); + assertEquals(4571, localStackContainer.getExternalPortFor(4571)); + } + finally { + localStackContainer.stop(); + } + } + + @Test + public void createLocalstackContainerWithCustomPorts() throws Exception { + Container localStackContainer = Container.createLocalstackContainer( + EXTERNAL_HOST_NAME, pullNewImage, false, null, "45660", "45710", null, null); + + try { + localStackContainer.waitForAllPorts(EXTERNAL_HOST_NAME); + + assertEquals(45660, localStackContainer.getExternalPortFor(4566)); + assertEquals(45710, localStackContainer.getExternalPortFor(4571)); + } + finally { + localStackContainer.stop(); + } + } + + @Test + public void createLocalstackContainerWithRandomPorts() throws Exception { + Container localStackContainer = Container.createLocalstackContainer( + EXTERNAL_HOST_NAME, pullNewImage, false, null, ":4566", ":4571", null, null); + + try { + localStackContainer.waitForAllPorts(EXTERNAL_HOST_NAME); + + assertNotEquals(4566, localStackContainer.getExternalPortFor(4566)); + assertNotEquals(4571, localStackContainer.getExternalPortFor(4571)); } finally { localStackContainer.stop();