Skip to content

Commit 2b99466

Browse files
committed
refactor classpath setup for v1/v2 SDKs; fall back to using edge port if port mapping cannot be determined from container
1 parent c82a5a8 commit 2b99466

File tree

9 files changed

+235
-133
lines changed

9 files changed

+235
-133
lines changed

Diff for: Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ usage: ## Show this help
66
build: ## Build the code using Maven
77
mvn -Pfatjar $(ADDITIONAL_MVN_ARGS) clean javadoc:jar source:jar package $(ADDITIONAL_MVN_TARGETS)
88

9+
compile:
10+
mvn -Pawssdkv1,awssdkv2 -DskipTests compile test-compile
11+
912
publish-maven: ## Publish artifacts to Maven Central
1013
ADDITIONAL_MVN_TARGETS=deploy ADDITIONAL_MVN_ARGS="-DskipTests" make build
1114

Diff for: README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Build Status](https://travis-ci.org/localstack/localstack-java-utils.svg)](https://travis-ci.org/localstack/localstack-java-utils)
1+
[![Build Status](https://travis-ci.com/localstack/localstack-java-utils.svg)](https://travis-ci.com/localstack/localstack-java-utils)
22
[![Maven Central](https://img.shields.io/maven-central/v/cloud.localstack/localstack-utils)](https://mvnrepository.com/artifact/cloud.localstack/localstack-utils)
33

44
# LocalStack Java Utils
@@ -108,7 +108,7 @@ make build
108108

109109
## Change Log
110110

111-
* v0.2.14: Add ability to get handler class name through `_HANDLER` environment variable like on real **AWS Lambda** platform and **Lambci** environment
111+
* v0.2.14: Add ability to get handler class name through `_HANDLER` environment variable like on real AWS and Lambci environment
112112
* v0.2.11: Enable specification of "platform" when configuring container
113113
* v0.2.10: Add Lambda async utils for AWS SDK v2; add support for specifying bind mounts and init scripts via `@LocalstackDockerProperties`; add PowerMock integration for easy patching of AWS SDK to use local endpoints; add support for configuring the Docker image name via `@LocalstackDockerProperties`; add tests for templated emails
114114
* v0.2.8: Allow overwriting the port binding via environment variables

Diff for: pom.xml

+130-126
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<maven.compiler.source>1.8</maven.compiler.source>
3232
<maven.compiler.target>1.8</maven.compiler.target>
3333
<aws.sdk.version>1.11.642</aws.sdk.version>
34-
<aws.sdkv2.version>2.13.39</aws.sdkv2.version>
34+
<aws.sdkv2.version>2.15.79</aws.sdkv2.version>
3535
<commons.lang3.version>3.5</commons.lang3.version>
3636
<lambda.core.version>1.2.0</lambda.core.version>
3737
</properties>
@@ -101,123 +101,7 @@
101101
<scope>provided</scope>
102102
</dependency>
103103

104-
<!-- AWS SDKs -->
105-
<dependency>
106-
<groupId>com.amazonaws</groupId>
107-
<artifactId>aws-java-sdk</artifactId>
108-
<version>${aws.sdk.version}</version>
109-
<scope>provided</scope>
110-
<exclusions>
111-
<exclusion>
112-
<groupId>com.amazonaws</groupId>
113-
<artifactId>aws-java-sdk-kinesisvideo</artifactId>
114-
</exclusion>
115-
</exclusions>
116-
</dependency>
117-
<dependency>
118-
<groupId>com.amazonaws</groupId>
119-
<artifactId>aws-lambda-java-core</artifactId>
120-
<version>${lambda.core.version}</version>
121-
<scope>provided</scope>
122-
</dependency>
123-
<dependency>
124-
<groupId>com.amazonaws</groupId>
125-
<artifactId>aws-lambda-java-events</artifactId>
126-
<version>2.2.7</version>
127-
<scope>provided</scope>
128-
</dependency>
129-
<dependency>
130-
<groupId>com.amazonaws</groupId>
131-
<artifactId>aws-java-sdk-core</artifactId>
132-
<version>${aws.sdk.version}</version>
133-
<scope>provided</scope>
134-
</dependency>
135-
<dependency>
136-
<groupId>com.amazonaws</groupId>
137-
<artifactId>aws-java-sdk-lambda</artifactId>
138-
<version>${aws.sdk.version}</version>
139-
<scope>provided</scope>
140-
</dependency>
141-
<dependency>
142-
<groupId>com.amazonaws</groupId>
143-
<artifactId>aws-java-sdk-sqs</artifactId>
144-
<version>${aws.sdk.version}</version>
145-
<scope>provided</scope>
146-
</dependency>
147-
148-
<!-- AWS SDK version 2 libs -->
149-
<dependency>
150-
<groupId>software.amazon.awssdk</groupId>
151-
<artifactId>cloudwatch</artifactId>
152-
<version>${aws.sdkv2.version}</version>
153-
<scope>provided</scope>
154-
</dependency>
155-
<dependency>
156-
<groupId>software.amazon.awssdk</groupId>
157-
<artifactId>dynamodb</artifactId>
158-
<version>${aws.sdkv2.version}</version>
159-
</dependency>
160-
<dependency>
161-
<groupId>software.amazon.awssdk</groupId>
162-
<artifactId>sns</artifactId>
163-
<version>${aws.sdkv2.version}</version>
164-
<scope>provided</scope>
165-
</dependency>
166-
<dependency>
167-
<groupId>software.amazon.awssdk</groupId>
168-
<artifactId>sqs</artifactId>
169-
<version>${aws.sdkv2.version}</version>
170-
<scope>provided</scope>
171-
</dependency>
172-
<dependency>
173-
<groupId>software.amazon.awssdk</groupId>
174-
<artifactId>ssm</artifactId>
175-
<version>${aws.sdkv2.version}</version>
176-
<scope>provided</scope>
177-
</dependency>
178-
<dependency>
179-
<groupId>software.amazon.awssdk</groupId>
180-
<artifactId>secretsmanager</artifactId>
181-
<version>${aws.sdkv2.version}</version>
182-
<scope>provided</scope>
183-
</dependency>
184-
<dependency>
185-
<groupId>software.amazon.awssdk</groupId>
186-
<artifactId>kinesis</artifactId>
187-
<version>${aws.sdkv2.version}</version>
188-
<scope>provided</scope>
189-
</dependency>
190-
<dependency>
191-
<groupId>software.amazon.awssdk</groupId>
192-
<artifactId>s3</artifactId>
193-
<version>${aws.sdkv2.version}</version>
194-
<scope>provided</scope>
195-
</dependency>
196-
<dependency>
197-
<groupId>software.amazon.awssdk</groupId>
198-
<artifactId>iam</artifactId>
199-
<version>${aws.sdkv2.version}</version>
200-
<scope>provided</scope>
201-
</dependency>
202-
<dependency>
203-
<groupId>software.amazon.awssdk</groupId>
204-
<artifactId>netty-nio-client</artifactId>
205-
<version>${aws.sdkv2.version}</version>
206-
<scope>provided</scope>
207-
</dependency>
208-
<dependency>
209-
<groupId>software.amazon.awssdk</groupId>
210-
<artifactId>lambda</artifactId>
211-
<version>${aws.sdkv2.version}</version>
212-
<scope>provided</scope>
213-
</dependency>
214-
215-
<dependency>
216-
<groupId>software.amazon.kinesis</groupId>
217-
<artifactId>amazon-kinesis-client</artifactId>
218-
<version>2.2.9</version>
219-
<scope>provided</scope>
220-
</dependency>
104+
<!-- logging libs -->
221105
<dependency>
222106
<groupId>org.apache.logging.log4j</groupId>
223107
<artifactId>log4j-core</artifactId>
@@ -238,13 +122,6 @@
238122
</dependency>
239123

240124
<!-- test dependencies -->
241-
<dependency>
242-
<groupId>com.amazonaws</groupId>
243-
<artifactId>amazon-sqs-java-messaging-lib</artifactId>
244-
<version>1.0.5</version>
245-
<type>jar</type>
246-
<scope>test</scope>
247-
</dependency>
248125
<dependency>
249126
<groupId>org.testcontainers</groupId>
250127
<artifactId>testcontainers</artifactId>
@@ -316,7 +193,56 @@
316193
</profile>
317194
<profile>
318195
<id>awssdkv1</id>
319-
<dependencies></dependencies>
196+
<dependencies>
197+
<dependency>
198+
<groupId>com.amazonaws</groupId>
199+
<artifactId>aws-java-sdk</artifactId>
200+
<version>${aws.sdk.version}</version>
201+
<scope>provided</scope>
202+
<exclusions>
203+
<exclusion>
204+
<groupId>com.amazonaws</groupId>
205+
<artifactId>aws-java-sdk-kinesisvideo</artifactId>
206+
</exclusion>
207+
</exclusions>
208+
</dependency>
209+
<dependency>
210+
<groupId>com.amazonaws</groupId>
211+
<artifactId>aws-lambda-java-core</artifactId>
212+
<version>${lambda.core.version}</version>
213+
<scope>provided</scope>
214+
</dependency>
215+
<dependency>
216+
<groupId>com.amazonaws</groupId>
217+
<artifactId>aws-lambda-java-events</artifactId>
218+
<version>2.2.7</version>
219+
<scope>provided</scope>
220+
</dependency>
221+
<dependency>
222+
<groupId>com.amazonaws</groupId>
223+
<artifactId>aws-java-sdk-core</artifactId>
224+
<version>${aws.sdk.version}</version>
225+
<scope>provided</scope>
226+
</dependency>
227+
<dependency>
228+
<groupId>com.amazonaws</groupId>
229+
<artifactId>aws-java-sdk-lambda</artifactId>
230+
<version>${aws.sdk.version}</version>
231+
<scope>provided</scope>
232+
</dependency>
233+
<dependency>
234+
<groupId>com.amazonaws</groupId>
235+
<artifactId>aws-java-sdk-sqs</artifactId>
236+
<version>${aws.sdk.version}</version>
237+
<scope>provided</scope>
238+
</dependency>
239+
<dependency>
240+
<groupId>com.amazonaws</groupId>
241+
<artifactId>amazon-sqs-java-messaging-lib</artifactId>
242+
<version>1.0.5</version>
243+
<scope>test</scope>
244+
</dependency>
245+
</dependencies>
320246
</profile>
321247
<profile>
322248
<id>awssdkv2</id>
@@ -336,10 +262,88 @@
336262
<artifactId>kinesis</artifactId>
337263
<version>${aws.sdkv2.version}</version>
338264
</dependency>
265+
<dependency>
266+
<groupId>software.amazon.awssdk</groupId>
267+
<artifactId>cloudwatch</artifactId>
268+
<version>${aws.sdkv2.version}</version>
269+
<scope>provided</scope>
270+
</dependency>
271+
<dependency>
272+
<groupId>software.amazon.awssdk</groupId>
273+
<artifactId>dynamodb</artifactId>
274+
<version>${aws.sdkv2.version}</version>
275+
<scope>provided</scope>
276+
</dependency>
277+
<dependency>
278+
<groupId>software.amazon.awssdk</groupId>
279+
<artifactId>sns</artifactId>
280+
<version>${aws.sdkv2.version}</version>
281+
<scope>provided</scope>
282+
</dependency>
283+
<dependency>
284+
<groupId>software.amazon.awssdk</groupId>
285+
<artifactId>sqs</artifactId>
286+
<version>${aws.sdkv2.version}</version>
287+
<scope>provided</scope>
288+
</dependency>
289+
<dependency>
290+
<groupId>software.amazon.awssdk</groupId>
291+
<artifactId>ssm</artifactId>
292+
<version>${aws.sdkv2.version}</version>
293+
<scope>provided</scope>
294+
</dependency>
295+
<dependency>
296+
<groupId>software.amazon.awssdk</groupId>
297+
<artifactId>secretsmanager</artifactId>
298+
<version>${aws.sdkv2.version}</version>
299+
<scope>provided</scope>
300+
</dependency>
301+
<dependency>
302+
<groupId>software.amazon.awssdk</groupId>
303+
<artifactId>kinesis</artifactId>
304+
<version>${aws.sdkv2.version}</version>
305+
<scope>provided</scope>
306+
</dependency>
307+
<dependency>
308+
<groupId>software.amazon.awssdk</groupId>
309+
<artifactId>s3</artifactId>
310+
<version>${aws.sdkv2.version}</version>
311+
<scope>provided</scope>
312+
</dependency>
313+
<dependency>
314+
<groupId>software.amazon.awssdk</groupId>
315+
<artifactId>iam</artifactId>
316+
<version>${aws.sdkv2.version}</version>
317+
<scope>provided</scope>
318+
</dependency>
319+
<dependency>
320+
<groupId>software.amazon.awssdk</groupId>
321+
<artifactId>netty-nio-client</artifactId>
322+
<version>${aws.sdkv2.version}</version>
323+
<scope>provided</scope>
324+
</dependency>
325+
<dependency>
326+
<groupId>software.amazon.awssdk</groupId>
327+
<artifactId>lambda</artifactId>
328+
<version>${aws.sdkv2.version}</version>
329+
<scope>provided</scope>
330+
</dependency>
331+
<dependency>
332+
<groupId>software.amazon.awssdk</groupId>
333+
<artifactId>qldb</artifactId>
334+
<version>${aws.sdkv2.version}</version>
335+
</dependency>
336+
339337
<dependency>
340338
<groupId>software.amazon.kinesis</groupId>
341339
<artifactId>amazon-kinesis-client</artifactId>
342340
<version>2.2.9</version>
341+
<scope>provided</scope>
342+
</dependency>
343+
<dependency>
344+
<groupId>software.amazon.qldb</groupId>
345+
<artifactId>amazon-qldb-driver-java</artifactId>
346+
<version>2.3.1</version>
343347
</dependency>
344348
</dependencies>
345349
</profile>

Diff for: src/main/java/cloud/localstack/Constants.java

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class Constants {
1010

1111
public static final String DEFAULT_AWS_ACCOUNT_ID = "000000000000";
1212

13+
public static final String ENV_LOCALSTACK_API_KEY = "LOCALSTACK_API_KEY";
14+
1315
public static final String DEFAULT_REGION = "us-east-1";
1416
public static final String TEST_ACCESS_KEY = "test";
1517
public static final String TEST_SECRET_KEY = "test";

Diff for: src/main/java/cloud/localstack/Localstack.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@ public class Localstack {
2222
public static final String ENV_CONFIG_EDGE_PORT = "EDGE_PORT";
2323
public static final String INIT_SCRIPTS_PATH = "/docker-entrypoint-initaws.d";
2424
public static final String TMP_PATH = "/tmp/localstack";
25+
public static final int DEFAULT_EDGE_PORT = 4566;
2526

2627
private static final Logger LOG = Logger.getLogger(Localstack.class.getName());
2728

2829
private static final Pattern READY_TOKEN = Pattern.compile("Ready\\.");
2930

30-
private static final int DEFAULT_EDGE_PORT = 4566;
31-
3231
private static final String[] PYTHON_VERSIONS_FOLDERS = { "python3.8", "python3.7" };
3332

3433
private static final String PORT_CONFIG_FILENAME = "/opt/code/localstack/"
@@ -40,6 +39,9 @@ public class Localstack {
4039

4140
private Container localStackContainer;
4241

42+
// Whether to use the edge port 4566 as fallback if the service port cannot be determined
43+
private boolean useEdgePortAsFallback = true;
44+
4345
/**
4446
* This is a mapping from service name to internal ports. In order to use them,
4547
* the internal port must be resolved to an external docker port via
@@ -109,6 +111,15 @@ public boolean isRunning() {
109111
}
110112

111113
private void loadServiceToPortMap() {
114+
try {
115+
doLoadServiceToPortMap();
116+
} catch (Exception e) {
117+
LOG.info("Ignoring error when fetching service ports -> using single edge port");
118+
}
119+
}
120+
121+
// TODO: this is now obsolete, as we're using a single edge port - remove!
122+
private void doLoadServiceToPortMap() {
112123
String localStackPortConfig = "";
113124
for (int i = 0; i < PYTHON_VERSIONS_FOLDERS.length; i++) {
114125
String filePath = String.format(PORT_CONFIG_FILENAME, PYTHON_VERSIONS_FOLDERS[i]);
@@ -242,16 +253,26 @@ public String getEndpointIAM() {
242253
return endpointForService(ServiceName.IAM);
243254
}
244255

256+
public String getEndpointQLDB() {
257+
return endpointForService(ServiceName.QLDB);
258+
}
259+
245260
public String endpointForService(String serviceName) {
246261
return endpointForPort(getServicePort(serviceName));
247262
}
248263

249264
public int getServicePort(String serviceName) {
250265
if (serviceToPortMap == null) {
266+
if (useEdgePortAsFallback) {
267+
return getEdgePort();
268+
}
251269
throw new IllegalStateException("Service to port mapping has not been determined yet.");
252270
}
253271

254272
if (!serviceToPortMap.containsKey(serviceName)) {
273+
if (useEdgePortAsFallback) {
274+
return getEdgePort();
275+
}
255276
throw new IllegalArgumentException("Unknown port mapping for service: " + serviceName);
256277
}
257278

0 commit comments

Comments
 (0)