Skip to content

Commit 4175a1e

Browse files
feat(S3BitStore): add presigner support for S3BitStoreService
ref: DSC-2664
1 parent eb8520c commit 4175a1e

File tree

2 files changed

+52
-12
lines changed

2 files changed

+52
-12
lines changed

dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,17 @@ protected S3BitStoreService(S3AsyncClient s3AsyncClient) {
206206
this.s3AsyncClient = s3AsyncClient;
207207
}
208208

209+
/**
210+
* This constructor is used for test purpose.
211+
*
212+
* @param s3AsyncClient AmazonS3 service
213+
* @param presigner S3Presigner service
214+
*/
215+
protected S3BitStoreService(S3AsyncClient s3AsyncClient, S3Presigner presigner) {
216+
this.s3AsyncClient = s3AsyncClient;
217+
this.presigner = presigner;
218+
}
219+
209220
@Override
210221
public boolean isEnabled() {
211222
return this.enabled;
@@ -225,7 +236,7 @@ public void init() throws IOException {
225236
}
226237

227238
try {
228-
S3Presigner.Builder presignerBuilder = S3Presigner.builder();
239+
229240
if (StringUtils.isNotBlank(getAwsAccessKey()) && StringUtils.isNotBlank(getAwsSecretKey())) {
230241
log.warn("Use local defined S3 credentials");
231242
// region
@@ -250,7 +261,11 @@ public void init() throws IOException {
250261
minPartSizeBytes, maxConcurrency)
251262
);
252263

253-
presignerBuilder = presignerBuilder.region(region).credentialsProvider(credentialsProvider);
264+
presigner =
265+
FunctionalUtils.getDefaultOrBuild(
266+
this.presigner,
267+
amazonPresignerBuilderBy(region, credentialsProvider)
268+
);
254269

255270
log.warn("S3 Region set to: " + region.id());
256271
} else {
@@ -259,9 +274,12 @@ public void init() throws IOException {
259274
this.s3AsyncClient,
260275
amazonClientBuilderBy(null, null , endpoint, targetThroughputGbps,
261276
minPartSizeBytes, maxConcurrency));
262-
}
263277

264-
presigner = presignerBuilder.build();
278+
presigner = FunctionalUtils.getDefaultOrBuild(
279+
this.presigner,
280+
S3Presigner::create
281+
);
282+
}
265283

266284
// bucket name
267285
if (StringUtils.isEmpty(bucketName)) {
@@ -283,6 +301,14 @@ public void init() throws IOException {
283301
}
284302
}
285303

304+
private static Supplier<S3Presigner> amazonPresignerBuilderBy(Region region,
305+
StaticCredentialsProvider credentialsProvider) {
306+
return () -> S3Presigner.builder()
307+
.region(region)
308+
.credentialsProvider(credentialsProvider)
309+
.build();
310+
}
311+
286312
/**
287313
* @param bucketName
288314
* @return whether or not the specified bucket exists

dspace-api/src/test/java/org/dspace/storage/bitstore/S3BitStoreServiceIT.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@
5858
import software.amazon.awssdk.awscore.exception.AwsServiceException;
5959
import software.amazon.awssdk.regions.Region;
6060
import software.amazon.awssdk.services.s3.S3AsyncClient;
61+
import software.amazon.awssdk.services.s3.S3Configuration;
6162
import software.amazon.awssdk.services.s3.model.Bucket;
6263
import software.amazon.awssdk.services.s3.model.ChecksumAlgorithm;
6364
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
65+
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
6466

6567
/**
6668
* @author Luca Giamminonni (luca.giamminonni at 4science.com)
@@ -69,11 +71,9 @@ public class S3BitStoreServiceIT extends AbstractIntegrationTestWithDatabase {
6971
private static S3MockContainer s3Mock = new S3MockContainer("4.8.0");
7072

7173
private static S3AsyncClient s3AsyncClient;
74+
private static S3Presigner s3Presigner;
7275

7376
private static final String DEFAULT_BUCKET_NAME = "dspace-asset-localhost";
74-
public static final String S3_ENDPOINT = "http://127.0.0.1:8001";
75-
public static final int MAX_CONNECTIONS = 5;
76-
public static final int CONNECTION_TIMEOUT = 1000;
7777

7878
private S3BitStoreService s3BitStoreService;
7979

@@ -87,11 +87,25 @@ public class S3BitStoreServiceIT extends AbstractIntegrationTestWithDatabase {
8787
public static void setupS3() {
8888
s3Mock.start();
8989

90+
AnonymousCredentialsProvider credentialsProvider = AnonymousCredentialsProvider.create();
91+
Region region = Region.US_EAST_1;
92+
URI s3URI = URI.create("http://127.0.0.1:" + s3Mock.getHttpServerPort());
9093
s3AsyncClient = S3AsyncClient.crtBuilder()
91-
.endpointOverride(URI.create("http://127.0.0.1:" + s3Mock.getHttpServerPort()))
92-
.credentialsProvider(AnonymousCredentialsProvider.create())
93-
.region(Region.US_EAST_1)
94-
.build();
94+
.endpointOverride(s3URI)
95+
.credentialsProvider(credentialsProvider)
96+
.region(region)
97+
.build();
98+
99+
s3Presigner = S3Presigner.builder()
100+
.endpointOverride(s3URI)
101+
.credentialsProvider(credentialsProvider)
102+
.region(region)
103+
.serviceConfiguration(
104+
S3Configuration.builder()
105+
.pathStyleAccessEnabled(true)
106+
.build()
107+
)
108+
.build();
95109
}
96110

97111
@AfterClass
@@ -105,7 +119,7 @@ public void setup() throws Exception {
105119
configurationService.setProperty("assetstore.s3.enabled", "true");
106120
s3Directory = new File(System.getProperty("java.io.tmpdir"), "s3");
107121

108-
s3BitStoreService = new S3BitStoreService(s3AsyncClient);
122+
s3BitStoreService = new S3BitStoreService(s3AsyncClient, s3Presigner);
109123
s3BitStoreService.setEnabled(BooleanUtils.toBoolean(
110124
configurationService.getProperty("assetstore.s3.enabled")));
111125
s3BitStoreService.setS3ChecksumAlgorithm(ChecksumAlgorithm.SHA256);

0 commit comments

Comments
 (0)