Skip to content

Commit 7e4cb2e

Browse files
Luke SikinaLuke-Sikina
Luke Sikina
authored andcommitted
[ALS-7716] - Use AVL role
1 parent d7cc028 commit 7e4cb2e

File tree

5 files changed

+36
-13
lines changed

5 files changed

+36
-13
lines changed

uploader/src/main/java/edu/harvard/dbmi/avillach/dataupload/aws/AWSClientBuilder.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
55
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.beans.factory.annotation.Value;
67
import org.springframework.context.annotation.Profile;
78
import org.springframework.stereotype.Service;
89
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
10+
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
911
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
1012
import software.amazon.awssdk.http.SdkHttpClient;
1113
import software.amazon.awssdk.services.s3.S3Client;
@@ -27,18 +29,21 @@ public class AWSClientBuilder {
2729
private final StsClientProvider stsClientProvider;
2830
private final S3ClientBuilder s3ClientBuilder;
2931
private final SdkHttpClient sdkHttpClient;
32+
private final boolean retainRole;
3033

3134
@Autowired
3235
public AWSClientBuilder(
3336
Map<String, SiteAWSInfo> sites,
3437
StsClientProvider stsClientProvider,
3538
S3ClientBuilder s3ClientBuilder,
36-
@Autowired(required = false) SdkHttpClient sdkHttpClient
39+
@Autowired(required = false) SdkHttpClient sdkHttpClient,
40+
@Value("${s3.retain_role:false}") boolean retainRole
3741
) {
3842
this.sites = sites;
3943
this.stsClientProvider = stsClientProvider;
4044
this.s3ClientBuilder = s3ClientBuilder;
4145
this.sdkHttpClient = sdkHttpClient;
46+
this.retainRole = retainRole;
4247
}
4348

4449
public Optional<S3Client> buildClientForSite(String siteName) {
@@ -48,6 +53,15 @@ public Optional<S3Client> buildClientForSite(String siteName) {
4853
return Optional.empty();
4954
}
5055

56+
if (retainRole) {
57+
log.info("s3.retain_role set to true. Will retain current role rather than assuming one for site");
58+
InstanceProfileCredentialsProvider credentialsProvider = InstanceProfileCredentialsProvider.create();
59+
S3Client client = s3ClientBuilder
60+
.credentialsProvider(credentialsProvider)
61+
.build();
62+
return Optional.of(client);
63+
}
64+
5165
log.info("Found site, making assume role request");
5266
SiteAWSInfo site = sites.get(siteName);
5367
AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()

uploader/src/main/java/edu/harvard/dbmi/avillach/dataupload/aws/AWSCredentialsService.java

+2
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ private AwsCredentials createUserBasedCredentials() {
5454
if (Strings.isBlank(key)) {
5555
LOG.error("No AWS key. Can't create client. Exiting");
5656
context.close();
57+
return null;
5758
}
5859
if (Strings.isBlank(secret)) {
5960
LOG.error("No AWS secret. Can't create client. Exiting");
6061
context.close();
62+
return null;
6163
}
6264
if (Strings.isBlank(token)) {
6365
return AwsBasicCredentials.create(key, secret);

uploader/src/test/java/edu/harvard/dbmi/avillach/dataupload/aws/AWSClientBuilderTest.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
import org.springframework.beans.factory.annotation.Autowired;
88
import org.springframework.boot.test.context.SpringBootTest;
99
import org.springframework.boot.test.mock.mockito.MockBean;
10-
import org.springframework.boot.test.mock.mockito.SpyBean;
11-
import org.springframework.context.annotation.Profile;
1210
import org.springframework.test.context.ActiveProfiles;
11+
import org.springframework.test.util.ReflectionTestUtils;
1312
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
1413
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
14+
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
1515
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
1616
import software.amazon.awssdk.services.s3.S3Client;
1717
import software.amazon.awssdk.services.s3.S3ClientBuilder;
@@ -43,6 +43,19 @@ class AWSClientBuilderTest {
4343
@Autowired
4444
AWSClientBuilder subject;
4545

46+
@Test
47+
void shouldCreateCredentialsWithoutAssumingRole() {
48+
S3Client s3Client = Mockito.mock(S3Client.class);
49+
Mockito.when(sites.containsKey("bch")).thenReturn(true);
50+
Mockito.when(s3ClientBuilder.credentialsProvider(Mockito.any(InstanceProfileCredentialsProvider.class)))
51+
.thenReturn(s3ClientBuilder);
52+
Mockito.when(s3ClientBuilder.build())
53+
.thenReturn(s3Client);
54+
ReflectionTestUtils.setField(subject, "retainRole", true);
55+
Optional<S3Client> actual = subject.buildClientForSite("bch");
56+
Assertions.assertEquals(Optional.of(s3Client), actual);
57+
}
58+
4659
@Test
4760
void shouldNotBuildClientIfSiteDNE() {
4861
Mockito.when(sites.get("Narnia"))
@@ -80,6 +93,7 @@ void shouldNotBuildClientIfRoleRequestFails() {
8093

8194
@Test
8295
void shouldBuildClient() {
96+
ReflectionTestUtils.setField(subject, "retainRole", false);
8397
SiteAWSInfo siteAWSInfo = new SiteAWSInfo("bch", "aws:arn:420", "external", "bucket", "aws:kms:420");
8498
Mockito.when(sites.get("bch"))
8599
.thenReturn(siteAWSInfo);

uploader/src/test/java/edu/harvard/dbmi/avillach/dataupload/aws/AWSCredentialsServiceTest.java

-4
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,12 @@
55
import org.mockito.InjectMocks;
66
import org.mockito.Mock;
77
import org.mockito.Mockito;
8-
import org.springframework.beans.factory.annotation.Autowired;
98
import org.springframework.boot.test.context.SpringBootTest;
10-
import org.springframework.boot.test.mock.mockito.MockBean;
119
import org.springframework.context.ConfigurableApplicationContext;
1210
import org.springframework.test.util.ReflectionTestUtils;
1311
import software.amazon.awssdk.auth.credentials.AwsCredentials;
1412
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
1513

16-
import static org.junit.jupiter.api.Assertions.*;
17-
1814
@SpringBootTest
1915
class AWSCredentialsServiceTest {
2016

uploader/src/test/java/edu/harvard/dbmi/avillach/dataupload/hpds/HPDSConnectionVerifierTest.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,22 @@
55
import org.junit.jupiter.api.Assertions;
66
import org.junit.jupiter.api.Test;
77
import org.junit.jupiter.api.io.TempDir;
8-
import org.mockito.ArgumentMatcher;
98
import org.mockito.Mockito;
109
import org.springframework.boot.test.context.SpringBootTest;
11-
import org.springframework.boot.test.mock.mockito.MockBean;
10+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
1211

1312
import java.io.IOException;
1413
import java.nio.file.Files;
1514
import java.nio.file.Path;
1615
import java.util.UUID;
1716

18-
import static org.junit.jupiter.api.Assertions.*;
19-
2017
@SpringBootTest
2118
class HPDSConnectionVerifierTest {
2219

23-
@MockBean
20+
@MockitoBean
2421
private HPDSClient client;
2522

26-
@MockBean
23+
@MockitoBean
2724
private UUIDGenerator generator;
2825

2926
private final Query query = new Query();

0 commit comments

Comments
 (0)