From fbc804f26cd6de1649c9f4f20e646d02afee9bfd Mon Sep 17 00:00:00 2001 From: Cristopher Pinzon Date: Thu, 10 Jun 2021 18:14:58 -0500 Subject: [PATCH 1/5] read config file in different python versions --- src/main/java/cloud/localstack/Localstack.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index 6f77ddb..a994fd7 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -29,8 +29,12 @@ public class Localstack { private static final int DEFAULT_EDGE_PORT = 4566; - private static final String PORT_CONFIG_FILENAME = "/opt/code/localstack/" + - ".venv/lib/python3.8/site-packages/localstack_client/config.py"; + private static final String LOCALSTACK_FOLDER = "/opt/code/localstack/"; + + private static final String PYTHON_3_8_LIB = ".venv/lib/python3.8/"; + private static final String PYTHON_3_7_LIB = ".venv/lib/python3.7/"; + + private static final String PORT_CONFIG_FILENAME = "site-packages/localstack_client/config.py"; //Regular expression used to parse localstack config to determine default ports for services private static final Pattern DEFAULT_PORT_PATTERN = Pattern.compile("'(\\w+)'\\Q: '{proto}://{host}:\\E(\\d+)'"); @@ -110,7 +114,14 @@ public boolean isRunning() { } private void loadServiceToPortMap() { - String localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", PORT_CONFIG_FILENAME)); + String localStackPortConfig; + try { + String completePath = LOCALSTACK_FOLDER + PYTHON_3_8_LIB + PORT_CONFIG_FILENAME; + localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", completePath)); + } catch (Exception e) { + String completePath = LOCALSTACK_FOLDER + PYTHON_3_7_LIB + PORT_CONFIG_FILENAME; + localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", completePath)); + } int edgePort = getEdgePort(); Map ports = new RegexStream(DEFAULT_PORT_PATTERN.matcher(localStackPortConfig)).stream() From c2d0cf451ea79498e502d319b4d80250dca2e00e Mon Sep 17 00:00:00 2001 From: Cristopher Pinzon Date: Tue, 15 Jun 2021 12:05:50 -0500 Subject: [PATCH 2/5] refactor code to try search in for loop --- .../java/cloud/localstack/Localstack.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index a994fd7..becbd4a 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -29,21 +29,21 @@ public class Localstack { private static final int DEFAULT_EDGE_PORT = 4566; - private static final String LOCALSTACK_FOLDER = "/opt/code/localstack/"; + private static final String[] PYTHON_VERSIONS_FOLDERS = { "python3.8", "python3.7" }; - private static final String PYTHON_3_8_LIB = ".venv/lib/python3.8/"; - private static final String PYTHON_3_7_LIB = ".venv/lib/python3.7/"; + private static final String PORT_CONFIG_FILENAME = "/opt/code/localstack/" + + ".venv/lib/%s/site-packages/localstack_client/config.py"; - private static final String PORT_CONFIG_FILENAME = "site-packages/localstack_client/config.py"; - - //Regular expression used to parse localstack config to determine default ports for services + // Regular expression used to parse localstack config to determine default ports + // for services private static final Pattern DEFAULT_PORT_PATTERN = Pattern.compile("'(\\w+)'\\Q: '{proto}://{host}:\\E(\\d+)'"); private Container localStackContainer; /** - * This is a mapping from service name to internal ports. In order to use them, the - * internal port must be resolved to an external docker port via Container.getExternalPortFor() + * This is a mapping from service name to internal ports. In order to use them, + * the internal port must be resolved to an external docker port via + * Container.getExternalPortFor() */ private static Map serviceToPortMap; @@ -58,7 +58,8 @@ public class Localstack { CommonUtils.disableSslCertChecking(); } - private Localstack() { } + private Localstack() { + } public void startup(LocalstackDockerConfiguration dockerConfiguration) { if (locked) { @@ -68,19 +69,12 @@ public void startup(LocalstackDockerConfiguration dockerConfiguration) { this.externalHostName = dockerConfiguration.getExternalHostName(); try { - localStackContainer = Container.createLocalstackContainer( - dockerConfiguration.getExternalHostName(), - dockerConfiguration.isPullNewImage(), - dockerConfiguration.isRandomizePorts(), - dockerConfiguration.getImageName(), - dockerConfiguration.getImageTag(), - dockerConfiguration.getPortEdge(), - dockerConfiguration.getPortElasticSearch(), - dockerConfiguration.getEnvironmentVariables(), - dockerConfiguration.getPortMappings(), - dockerConfiguration.getBindMounts(), - dockerConfiguration.getPlatform() - ); + localStackContainer = Container.createLocalstackContainer(dockerConfiguration.getExternalHostName(), + dockerConfiguration.isPullNewImage(), dockerConfiguration.isRandomizePorts(), + dockerConfiguration.getImageName(), dockerConfiguration.getImageTag(), + dockerConfiguration.getPortEdge(), dockerConfiguration.getPortElasticSearch(), + dockerConfiguration.getEnvironmentVariables(), dockerConfiguration.getPortMappings(), + dockerConfiguration.getBindMounts(), dockerConfiguration.getPlatform()); loadServiceToPortMap(); LOG.info("Waiting for LocalStack container to be ready..."); @@ -114,13 +108,18 @@ public boolean isRunning() { } private void loadServiceToPortMap() { - String localStackPortConfig; - try { - String completePath = LOCALSTACK_FOLDER + PYTHON_3_8_LIB + PORT_CONFIG_FILENAME; - localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", completePath)); - } catch (Exception e) { - String completePath = LOCALSTACK_FOLDER + PYTHON_3_7_LIB + PORT_CONFIG_FILENAME; - localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", completePath)); + String localStackPortConfig = ""; + for (int i = 0; i < PYTHON_VERSIONS_FOLDERS.length; i++) { + String filePath = String.format(PORT_CONFIG_FILENAME, PYTHON_VERSIONS_FOLDERS[i]); + + try { + localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", filePath)); + break; + } catch (Exception e) { + if(i == (PYTHON_VERSIONS_FOLDERS.length - 1)){ + throw e; + } + } } int edgePort = getEdgePort(); @@ -133,10 +132,11 @@ private void loadServiceToPortMap() { public String getEndpointS3() { String s3Endpoint = endpointForService(ServiceName.S3); /* - * Use the domain name wildcard *.localhost.localstack.cloud which maps to 127.0.0.1 - * We need to do this because S3 SDKs attempt to access a domain . - * which by default would result in .localhost, but that name cannot be resolved - * (unless hardcoded in /etc/hosts) + * Use the domain name wildcard *.localhost.localstack.cloud which maps to + * 127.0.0.1 We need to do this because S3 SDKs attempt to access a domain + * . which by default would result in + * .localhost, but that name cannot be resolved (unless hardcoded + * in /etc/hosts) */ s3Endpoint = s3Endpoint.replace("localhost", Constants.LOCALHOST_DOMAIN_NAME); return s3Endpoint; @@ -150,7 +150,7 @@ public int getEdgePort() { public String getEndpointKinesis() { return endpointForService(ServiceName.KINESIS); } - + public String getEndpointKMS() { return endpointForService(ServiceName.KMS); } From 4a2492848108b9693a7e3b35ee2d843d0ee64fe9 Mon Sep 17 00:00:00 2001 From: Cristopher Pinzon Date: Tue, 15 Jun 2021 16:29:22 -0500 Subject: [PATCH 3/5] more considerations during initialization --- src/main/java/cloud/localstack/Localstack.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index becbd4a..1a7931e 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -85,7 +85,8 @@ public void startup(LocalstackDockerConfiguration dockerConfiguration) { localStackContainer.waitForLogToken(dockerConfiguration.getInitializationToken()); } } catch (Exception t) { - if (t.toString().contains("port is already allocated") && dockerConfiguration.isIgnoreDockerRunErrors()) { + if ((t.toString().contains("port is already allocated") || t.toString().contains("address already in use")) + && dockerConfiguration.isIgnoreDockerRunErrors()) { LOG.info("Ignoring port conflict when starting Docker container, due to ignoreDockerRunErrors=true"); localStackContainer = Container.getRunningLocalstackContainer(); loadServiceToPortMap(); @@ -114,6 +115,10 @@ private void loadServiceToPortMap() { try { localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", filePath)); + if(localStackPortConfig.contains("No such container")){ + throw new LocalstackDockerException("No localstack_main container, make sure tu install localstack", + new Exception()); + } break; } catch (Exception e) { if(i == (PYTHON_VERSIONS_FOLDERS.length - 1)){ From 521e9b0f9c8a610cf669a488552835d35319043f Mon Sep 17 00:00:00 2001 From: Cristopher Pinzon Date: Thu, 17 Jun 2021 13:47:10 -0500 Subject: [PATCH 4/5] fix break after first search not succesful --- src/main/java/cloud/localstack/Localstack.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index 1a7931e..45a62fd 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -116,7 +116,12 @@ private void loadServiceToPortMap() { try { localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", filePath)); if(localStackPortConfig.contains("No such container")){ - throw new LocalstackDockerException("No localstack_main container, make sure tu install localstack", + throw new LocalstackDockerException("No localstack_main container", + new Exception()); + } + + if(localStackPortConfig.contains("No such file")){ + throw new LocalstackDockerException("No config file found", new Exception()); } break; From 66993dcb858c8537ed93e9f3d69ca1ce11aea571 Mon Sep 17 00:00:00 2001 From: Cristopher Pinzon Date: Thu, 17 Jun 2021 13:58:36 -0500 Subject: [PATCH 5/5] more readable search --- .../java/cloud/localstack/Localstack.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/cloud/localstack/Localstack.java b/src/main/java/cloud/localstack/Localstack.java index 45a62fd..9a0ad45 100644 --- a/src/main/java/cloud/localstack/Localstack.java +++ b/src/main/java/cloud/localstack/Localstack.java @@ -113,25 +113,22 @@ private void loadServiceToPortMap() { for (int i = 0; i < PYTHON_VERSIONS_FOLDERS.length; i++) { String filePath = String.format(PORT_CONFIG_FILENAME, PYTHON_VERSIONS_FOLDERS[i]); - try { - localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", filePath)); - if(localStackPortConfig.contains("No such container")){ - throw new LocalstackDockerException("No localstack_main container", - new Exception()); - } - - if(localStackPortConfig.contains("No such file")){ - throw new LocalstackDockerException("No config file found", - new Exception()); - } + localStackPortConfig = localStackContainer.executeCommand(Arrays.asList("cat", filePath)); + if(localStackPortConfig.contains("No such container")){ + localStackPortConfig = ""; + continue; + }else if(localStackPortConfig.contains("No such file")){ + localStackPortConfig = ""; + continue; + }else{ break; - } catch (Exception e) { - if(i == (PYTHON_VERSIONS_FOLDERS.length - 1)){ - throw e; - } } } + if(localStackPortConfig.isEmpty()){ + throw new LocalstackDockerException("No config file found",new Exception()); + } + int edgePort = getEdgePort(); Map ports = new RegexStream(DEFAULT_PORT_PATTERN.matcher(localStackPortConfig)).stream() .collect(Collectors.toMap(match -> match.group(1), match -> edgePort));