From 95fac26dfc1507120d13d72b717805985edc39e3 Mon Sep 17 00:00:00 2001 From: Fokion Sotiropoulos Date: Tue, 24 Oct 2023 20:14:01 +0100 Subject: [PATCH] the default credentials according to the localstack are test , when we do getAccessKey and getSecretKey we are checking the env map if we have the keys AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY respectively and fallback to the defaults --- .../localstack/LocalStackContainer.java | 10 +++- .../localstack/LocalstackContainerTest.java | 55 +++++++++++++++++++ .../localstack/LocalstackTestImages.java | 2 + 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java index 4cae1c19b1d..b3651aea9e5 100644 --- a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java +++ b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java @@ -47,6 +47,10 @@ public class LocalStackContainer extends GenericContainer { private static final String DEFAULT_REGION = "us-east-1"; + private static final String DEFAULT_AWS_ACCESS_KEY_ID = "test"; + + private static final String DEFAULT_AWS_SECRET_ACCESS_KEY = "test"; + @Deprecated public static final String VERSION = DEFAULT_TAG; @@ -293,6 +297,7 @@ private int getServicePort(EnabledService service) { /** * Provides a default access key that is preconfigured to communicate with a given simulated service. + * AWS Access Key * The access key can be used to construct AWS SDK v2 clients: *
S3Client s3 = S3Client
              .builder()
@@ -306,11 +311,12 @@ private int getServicePort(EnabledService service) {
      * @return a default access key
      */
     public String getAccessKey() {
-        return "accesskey";
+        return this.getEnvMap().getOrDefault("AWS_ACCESS_KEY_ID", DEFAULT_AWS_ACCESS_KEY_ID);
     }
 
     /**
      * Provides a default secret key that is preconfigured to communicate with a given simulated service.
+     * AWS Secret Key
      * The secret key can be used to construct AWS SDK v2 clients:
      * 
S3Client s3 = S3Client
              .builder()
@@ -324,7 +330,7 @@ public String getAccessKey() {
      * @return a default secret key
      */
     public String getSecretKey() {
-        return "secretkey";
+        return this.getEnvMap().getOrDefault("AWS_SECRET_ACCESS_KEY", DEFAULT_AWS_SECRET_ACCESS_KEY);
     }
 
     /**
diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java
index f9f1e1c372a..d3593475251 100644
--- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java
+++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java
@@ -37,11 +37,17 @@
 import software.amazon.awssdk.services.s3.S3Client;
 
 import java.io.IOException;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.fail;
 
 /**
  * Tests for Localstack Container, used both in bridge network (exposed to host) and docker network modes.
@@ -110,6 +116,7 @@ public void s3TestOverBridgeNetwork() throws IOException {
             assertThat(content).as("The object can be retrieved").isEqualTo("baz");
         }
 
+
         @Test
         public void s3TestUsingAwsSdkV2() {
             // with_aws_sdk_v2 {
@@ -451,4 +458,52 @@ private String runAwsCliAgainstDockerNetworkContainer(String command) throws Exc
             return logs;
         }
     }
+
+
+    public static class WithEnvironmentVariables {
+        @ClassRule
+        public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_LATEST)
+            .withServices(
+                Service.S3
+            ).withEnv("S3_SKIP_SIGNATURE_VALIDATION", "0");
+
+        @Test
+        public void s3TestWithPresignedURL() throws IOException {
+
+            AmazonS3 s3 = AmazonS3ClientBuilder
+                .standard()
+                .withEndpointConfiguration(
+                    new AwsClientBuilder.EndpointConfiguration(
+                        localstack.getEndpoint().toString(),
+                        localstack.getRegion()
+                    )
+                )
+                .withCredentials(
+                    new AWSStaticCredentialsProvider(
+                        new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey())
+                    )
+                )
+                .build();
+
+
+            final String bucketName = "foo";
+
+            s3.createBucket(bucketName);
+
+            s3.putObject(bucketName, "bar", "baz");
+
+            final List buckets = s3.listBuckets();
+            final Optional maybeBucket = buckets
+                .stream()
+                .filter(b -> b.getName().equals(bucketName))
+                .findFirst();
+            assertThat(maybeBucket).as("The created bucket is present").isPresent();
+
+            URL presignedUrl = s3.generatePresignedUrl(bucketName, "bar", Date.from(Instant.now().plus(5, ChronoUnit.MINUTES)));
+
+            assertThat(presignedUrl).as("The presigned url is valid").isNotNull();
+            final String content = IOUtils.toString(presignedUrl, StandardCharsets.UTF_8);
+            assertThat(content).as("The object can be retrieved").isEqualTo("baz");
+        }
+    }
 }
diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java
index f6a5cbf50e4..13cf433d04b 100644
--- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java
+++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java
@@ -9,5 +9,7 @@ public interface LocalstackTestImages {
     DockerImageName LOCALSTACK_0_11_IMAGE = LOCALSTACK_IMAGE.withTag("0.11.3");
     DockerImageName LOCALSTACK_0_12_IMAGE = LOCALSTACK_IMAGE.withTag("0.12.8");
     DockerImageName LOCALSTACK_0_13_IMAGE = LOCALSTACK_IMAGE.withTag("0.13.0");
+
+    DockerImageName LOCALSTACK_LATEST = LOCALSTACK_IMAGE.withTag("latest");
     DockerImageName AWS_CLI_IMAGE = DockerImageName.parse("amazon/aws-cli:2.7.27");
 }