Skip to content

Commit 5cbcf19

Browse files
authored
build: fix tests (#626)
1 parent d25aeaf commit 5cbcf19

File tree

21 files changed

+183
-78
lines changed

21 files changed

+183
-78
lines changed

extensions/common/s3-copy-lib/src/main/java/org/eclipse/edc/aws/s3/copy/lib/S3CopyUtils.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
import org.eclipse.edc.aws.s3.AwsTemporarySecretToken;
1919
import org.eclipse.edc.aws.s3.spi.S3BucketSchema;
2020
import org.eclipse.edc.connector.controlplane.transfer.spi.types.SecretToken;
21-
import org.eclipse.edc.spi.result.Result;
21+
import org.eclipse.edc.participantcontext.spi.service.ParticipantContextSupplier;
22+
import org.eclipse.edc.spi.result.ServiceResult;
2223
import org.eclipse.edc.spi.security.Vault;
2324
import org.eclipse.edc.spi.types.TypeManager;
2425
import org.eclipse.edc.spi.types.domain.DataAddress;
@@ -98,27 +99,30 @@ private static boolean sameEndpointOverride(String source, String destination) {
9899
* @param typeManager type manager required for deserialization
99100
* @return result containing the deserialized secret token or an error message
100101
*/
101-
public static Result<SecretToken> getSecretTokenFromVault(String secretKeyName, Vault vault, TypeManager typeManager) {
102-
return ofNullable(secretKeyName)
103-
.filter(keyName -> !StringUtils.isNullOrBlank(keyName))
104-
.map(vault::resolveSecret)
105-
.filter(secret -> !StringUtils.isNullOrBlank(secret))
106-
.map(secret -> deserializeSecretToken(secret, typeManager))
107-
.orElse(Result.failure(format("Failed to resolve secret with key '%s'", secretKeyName)));
102+
public static ServiceResult<SecretToken> getSecretTokenFromVault(ParticipantContextSupplier participantContextSupplier,
103+
String secretKeyName, Vault vault, TypeManager typeManager) {
104+
return participantContextSupplier.get()
105+
.compose(participantContext -> ofNullable(secretKeyName)
106+
.filter(keyName -> !StringUtils.isNullOrBlank(keyName))
107+
.map(s -> vault.resolveSecret(participantContext.getParticipantContextId(), s))
108+
.filter(secret -> !StringUtils.isNullOrBlank(secret))
109+
.map(secret -> deserializeSecretToken(secret, typeManager))
110+
.orElse(ServiceResult.unexpected(format("Failed to resolve secret with key '%s'", secretKeyName)))
111+
);
108112
}
109113

110-
private static Result<SecretToken> deserializeSecretToken(String secret, TypeManager typeManager) {
114+
private static ServiceResult<SecretToken> deserializeSecretToken(String secret, TypeManager typeManager) {
111115
try {
112116
var objectMapper = typeManager.getMapper();
113117
var tree = objectMapper.readTree(secret);
114118

115119
if (tree.has("sessionToken")) {
116-
return Result.success(objectMapper.treeToValue(tree, AwsTemporarySecretToken.class));
120+
return ServiceResult.success(objectMapper.treeToValue(tree, AwsTemporarySecretToken.class));
117121
} else {
118-
return Result.success(objectMapper.treeToValue(tree, AwsSecretToken.class));
122+
return ServiceResult.success(objectMapper.treeToValue(tree, AwsSecretToken.class));
119123
}
120124
} catch (Exception e) {
121-
return Result.failure(format("Failed to parse AWS secret token: %s", e.getMessage()));
125+
return ServiceResult.unexpected(format("Failed to parse AWS secret token: %s", e.getMessage()));
122126
}
123127
}
124128

extensions/control-plane/provision/provision-aws-s3-copy/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ plugins {
1717
}
1818

1919
dependencies {
20+
api(libs.edc.spi.participant.context.single)
2021
implementation(libs.edc.spi.controlplane)
2122
implementation(libs.edc.lib.util)
2223
implementation(project(":extensions:common:aws:aws-s3-core"))

extensions/control-plane/provision/provision-aws-s3-copy/src/main/java/org/eclipse/edc/connector/provision/aws/s3/copy/AwsS3CopyProvisionExtension.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.eclipse.edc.connector.controlplane.transfer.spi.provision.ProvisionManager;
2121
import org.eclipse.edc.connector.controlplane.transfer.spi.provision.Provisioner;
2222
import org.eclipse.edc.connector.controlplane.transfer.spi.provision.ResourceManifestGenerator;
23+
import org.eclipse.edc.participantcontext.single.spi.SingleParticipantContextSupplier;
2324
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
2425
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
2526
import org.eclipse.edc.runtime.metamodel.annotation.Setting;
@@ -56,6 +57,8 @@ public class AwsS3CopyProvisionExtension implements ServiceExtension {
5657
private ResourceManifestGenerator manifestGenerator;
5758
@Inject
5859
private ProvisionManager provisionManager;
60+
@Inject
61+
private SingleParticipantContextSupplier singleParticipantContextSupplier;
5962

6063
@Override
6164
public String name() {
@@ -66,7 +69,8 @@ public String name() {
6669
public void initialize(ServiceExtensionContext context) {
6770
manifestGenerator.registerGenerator(new S3CopyResourceDefinitionGenerator());
6871

69-
var provisioner = new S3CopyProvisioner(clientProvider, vault, retryPolicy, typeManager, monitor, context.getComponentId(), maxRetries, maxRoleSessionDuration);
72+
var provisioner = new S3CopyProvisioner(clientProvider, vault, retryPolicy, typeManager, monitor,
73+
context.getComponentId(), maxRetries, maxRoleSessionDuration, singleParticipantContextSupplier);
7074
provisionManager.register(provisioner);
7175

7276
registerTypes(typeManager);

extensions/control-plane/provision/provision-aws-s3-copy/src/main/java/org/eclipse/edc/connector/provision/aws/s3/copy/S3CopyDeprovisionPipeline.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.edc.aws.s3.AwsClientProvider;
2323
import org.eclipse.edc.aws.s3.S3ClientRequest;
2424
import org.eclipse.edc.connector.controlplane.transfer.spi.types.DeprovisionedResource;
25+
import org.eclipse.edc.participantcontext.spi.service.ParticipantContextSupplier;
2526
import org.eclipse.edc.spi.EdcException;
2627
import org.eclipse.edc.spi.monitor.Monitor;
2728
import org.eclipse.edc.spi.security.Vault;
@@ -61,18 +62,21 @@ public class S3CopyDeprovisionPipeline {
6162
private final RetryPolicy<Object> retryPolicy;
6263
private final TypeManager typeManager;
6364
private final Monitor monitor;
64-
65-
private S3CopyDeprovisionPipeline(AwsClientProvider clientProvider, Vault vault, RetryPolicy<Object> retryPolicy, TypeManager typeManager, Monitor monitor) {
65+
private final ParticipantContextSupplier participantContextSupplier;
66+
67+
private S3CopyDeprovisionPipeline(AwsClientProvider clientProvider, Vault vault, RetryPolicy<Object> retryPolicy,
68+
TypeManager typeManager, Monitor monitor, ParticipantContextSupplier participantContextSupplier) {
6669
this.clientProvider = clientProvider;
6770
this.vault = vault;
6871
this.retryPolicy = retryPolicy;
6972
this.typeManager = typeManager;
7073
this.monitor = monitor;
74+
this.participantContextSupplier = participantContextSupplier;
7175
}
7276

7377
public CompletableFuture<DeprovisionedResource> deprovision(S3CopyProvisionedResource provisionedResource) {
7478
// create S3 client for destination account -> update S3 bucket policy
75-
var secretTokenResult = getSecretTokenFromVault(provisionedResource.getDestinationKeyName(), vault, typeManager);
79+
var secretTokenResult = getSecretTokenFromVault(participantContextSupplier, provisionedResource.getDestinationKeyName(), vault, typeManager);
7680
if (secretTokenResult.failed()) {
7781
return failedFuture(new EdcException(secretTokenResult.getFailureDetail()));
7882
}
@@ -176,7 +180,8 @@ static class Builder {
176180
private RetryPolicy<Object> retryPolicy;
177181
private TypeManager typeManager;
178182
private Monitor monitor;
179-
183+
private ParticipantContextSupplier participantContextSupplier;
184+
180185
private Builder() {}
181186

182187
public static Builder newInstance() {
@@ -207,14 +212,19 @@ public Builder monitor(Monitor monitor) {
207212
this.monitor = monitor;
208213
return this;
209214
}
210-
215+
216+
public Builder participantContextSupplier(ParticipantContextSupplier participantContextSupplier) {
217+
this.participantContextSupplier = participantContextSupplier;
218+
return this;
219+
}
220+
211221
public S3CopyDeprovisionPipeline build() {
212222
Objects.requireNonNull(clientProvider);
213223
Objects.requireNonNull(vault);
214224
Objects.requireNonNull(retryPolicy);
215225
Objects.requireNonNull(typeManager);
216226
Objects.requireNonNull(monitor);
217-
return new S3CopyDeprovisionPipeline(clientProvider, vault, retryPolicy, typeManager, monitor);
227+
return new S3CopyDeprovisionPipeline(clientProvider, vault, retryPolicy, typeManager, monitor, participantContextSupplier);
218228
}
219229
}
220230
}

extensions/control-plane/provision/provision-aws-s3-copy/src/main/java/org/eclipse/edc/connector/provision/aws/s3/copy/S3CopyProvisionPipeline.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import jakarta.json.Json;
2121
import org.eclipse.edc.aws.s3.AwsClientProvider;
2222
import org.eclipse.edc.aws.s3.S3ClientRequest;
23+
import org.eclipse.edc.participantcontext.spi.service.ParticipantContextSupplier;
2324
import org.eclipse.edc.spi.EdcException;
2425
import org.eclipse.edc.spi.monitor.Monitor;
2526
import org.eclipse.edc.spi.security.Vault;
@@ -72,17 +73,20 @@ public class S3CopyProvisionPipeline {
7273
private final Monitor monitor;
7374
private final String componentId;
7475
private final int maxRoleSessionDuration;
75-
76+
private final ParticipantContextSupplier participantContextSupplier;
77+
7678
private S3CopyProvisionPipeline(AwsClientProvider clientProvider, Vault vault,
7779
RetryPolicy<Object> retryPolicy, TypeManager typeManager,
78-
Monitor monitor, String componentId, int maxRoleSessionDuration) {
80+
Monitor monitor, String componentId, int maxRoleSessionDuration,
81+
ParticipantContextSupplier participantContextSupplier) {
7982
this.clientProvider = clientProvider;
8083
this.vault = vault;
8184
this.retryPolicy = retryPolicy;
8285
this.typeManager = typeManager;
8386
this.monitor = monitor;
8487
this.componentId = componentId;
8588
this.maxRoleSessionDuration = maxRoleSessionDuration;
89+
this.participantContextSupplier = participantContextSupplier;
8690
}
8791

8892
public CompletableFuture<S3CopyProvisionResponse> provision(S3CopyResourceDefinition resourceDefinition) {
@@ -92,7 +96,7 @@ public CompletableFuture<S3CopyProvisionResponse> provision(S3CopyResourceDefini
9296
var stsClient = clientProvider.stsAsyncClient(sourceClientRequest);
9397

9498
// create S3 client for destination account -> update S3 bucket policy
95-
var secretTokenResult = getSecretTokenFromVault(resourceDefinition.getDestinationKeyName(), vault, typeManager);
99+
var secretTokenResult = getSecretTokenFromVault(participantContextSupplier, resourceDefinition.getDestinationKeyName(), vault, typeManager);
96100
if (secretTokenResult.failed()) {
97101
return failedFuture(new EdcException(secretTokenResult.getFailureDetail()));
98102
}
@@ -252,7 +256,8 @@ static class Builder {
252256
private Monitor monitor;
253257
private String componentId;
254258
private int maxRoleSessionDuration;
255-
259+
private ParticipantContextSupplier participantContextSupplier;
260+
256261
private Builder() {}
257262

258263
public static Builder newInstance() {
@@ -293,15 +298,21 @@ public Builder maxRoleSessionDuration(int maxRoleSessionDuration) {
293298
this.maxRoleSessionDuration = maxRoleSessionDuration;
294299
return this;
295300
}
296-
301+
302+
public Builder participantContextSupplier(ParticipantContextSupplier participantContextSupplier) {
303+
this.participantContextSupplier = participantContextSupplier;
304+
return this;
305+
}
306+
297307
public S3CopyProvisionPipeline build() {
298308
Objects.requireNonNull(clientProvider);
299309
Objects.requireNonNull(vault);
300310
Objects.requireNonNull(retryPolicy);
301311
Objects.requireNonNull(typeManager);
302312
Objects.requireNonNull(monitor);
303313
Objects.requireNonNull(componentId);
304-
return new S3CopyProvisionPipeline(clientProvider, vault, retryPolicy, typeManager, monitor, componentId, maxRoleSessionDuration);
314+
return new S3CopyProvisionPipeline(clientProvider, vault, retryPolicy, typeManager, monitor, componentId,
315+
maxRoleSessionDuration, participantContextSupplier);
305316
}
306317
}
307318
}

extensions/control-plane/provision/provision-aws-s3-copy/src/main/java/org/eclipse/edc/connector/provision/aws/s3/copy/S3CopyProvisioner.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionResponse;
2323
import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionedResource;
2424
import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceDefinition;
25+
import org.eclipse.edc.participantcontext.spi.service.ParticipantContextSupplier;
2526
import org.eclipse.edc.policy.model.Policy;
2627
import org.eclipse.edc.spi.monitor.Monitor;
2728
import org.eclipse.edc.spi.response.StatusResult;
@@ -45,17 +46,19 @@ public class S3CopyProvisioner implements Provisioner<S3CopyResourceDefinition,
4546
private final Monitor monitor;
4647
private final String componentId;
4748
private final int maxRoleSessionDuration;
48-
49+
private final ParticipantContextSupplier participantContextSupplier;
50+
4951
public S3CopyProvisioner(AwsClientProvider clientProvider, Vault vault,
5052
RetryPolicy<Object> retryPolicy, TypeManager typeManager,
5153
Monitor monitor, String componentId, int maxRetries,
52-
int maxRoleSessionDuration) {
54+
int maxRoleSessionDuration, ParticipantContextSupplier participantContextSupplier) {
5355
this.clientProvider = clientProvider;
5456
this.vault = vault;
5557
this.typeManager = typeManager;
5658
this.monitor = monitor;
5759
this.componentId = componentId;
5860
this.maxRoleSessionDuration = maxRoleSessionDuration;
61+
this.participantContextSupplier = participantContextSupplier;
5962
this.retryPolicy = RetryPolicy.builder(retryPolicy.getConfig())
6063
.withMaxRetries(maxRetries)
6164
.handle(AwsServiceException.class)
@@ -82,6 +85,7 @@ public CompletableFuture<StatusResult<ProvisionResponse>> provision(S3CopyResour
8285
.monitor(monitor)
8386
.componentId(componentId)
8487
.maxRoleSessionDuration(maxRoleSessionDuration)
88+
.participantContextSupplier(participantContextSupplier)
8589
.build()
8690
.provision(resourceDefinition)
8791
.thenApply(response -> provisioningSucceeded(resourceDefinition, response));
@@ -123,6 +127,7 @@ public CompletableFuture<StatusResult<DeprovisionedResource>> deprovision(S3Copy
123127
.retryPolicy(retryPolicy)
124128
.typeManager(typeManager)
125129
.monitor(monitor)
130+
.participantContextSupplier(participantContextSupplier)
126131
.build()
127132
.deprovision(provisionedResource)
128133
.thenApply(StatusResult::success);

extensions/control-plane/provision/provision-aws-s3-copy/src/test/java/org/eclipse/edc/connector/provision/aws/s3/copy/S3CopyProvisionerTest.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
import org.eclipse.edc.aws.s3.S3ClientRequest;
2626
import org.eclipse.edc.aws.s3.spi.S3BucketSchema;
2727
import org.eclipse.edc.json.JacksonTypeManager;
28+
import org.eclipse.edc.participantcontext.spi.service.ParticipantContextSupplier;
29+
import org.eclipse.edc.participantcontext.spi.types.ParticipantContext;
2830
import org.eclipse.edc.policy.model.Policy;
2931
import org.eclipse.edc.spi.monitor.Monitor;
32+
import org.eclipse.edc.spi.result.ServiceResult;
3033
import org.eclipse.edc.spi.security.Vault;
3134
import org.eclipse.edc.spi.types.TypeManager;
3235
import org.eclipse.edc.spi.types.domain.DataAddress;
@@ -97,23 +100,26 @@ class S3CopyProvisionerTest {
97100
private String roleAccessKeyId = "123";
98101
private String roleSecretAccessKey = "456";
99102
private String roleSessionToken = "789";
100-
103+
private ParticipantContextSupplier participantContextSupplier = mock();
104+
101105
@BeforeEach
102106
void setUp() {
103107
when(clientProvider.iamAsyncClient(any(S3ClientRequest.class))).thenReturn(iamClient);
104108
when(clientProvider.stsAsyncClient(any(S3ClientRequest.class))).thenReturn(stsClient);
105109
when(clientProvider.s3AsyncClient(any(S3ClientRequest.class))).thenReturn(s3Client);
110+
var participantContext = ParticipantContext.Builder.newInstance().participantContextId("participantContextId").identity("any").build();
111+
when(participantContextSupplier.get()).thenReturn(ServiceResult.success(participantContext));
106112

107113
provisioner = new S3CopyProvisioner(clientProvider, vault, RetryPolicy.ofDefaults(),
108-
typeManager, mock(Monitor.class), "componentId", 2, 3600);
114+
typeManager, mock(Monitor.class), "componentId", 2, 3600, participantContextSupplier);
109115
}
110116

111117
@Test
112118
void provision_shouldProvisionResources() throws Exception {
113119
var definition = resourceDefinition();
114120

115121
var secretToken = new AwsSecretToken("accessKeyId", "secretAccessKey");
116-
when(vault.resolveSecret(definition.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
122+
when(vault.resolveSecret("participantContextId", definition.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
117123

118124
var getUserResponse = getUserResponse();
119125
when(iamClient.getUser()).thenReturn(completedFuture(getUserResponse));
@@ -184,7 +190,7 @@ void provision_onError_shouldReturnFailedFuture() throws Exception {
184190
var definition = resourceDefinition();
185191

186192
var secretToken = new AwsSecretToken("accessKeyId", "secretAccessKey");
187-
when(vault.resolveSecret(definition.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
193+
when(vault.resolveSecret("participantContextId", definition.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
188194

189195
when(iamClient.getUser()).thenReturn(failedFuture(new RuntimeException("error")));
190196

@@ -198,7 +204,7 @@ void deprovision_shouldDeprovisionResources() throws Exception {
198204
var resource = provisionedResource();
199205

200206
var secretToken = new AwsSecretToken("accessKeyId", "secretAccessKey");
201-
when(vault.resolveSecret(resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
207+
when(vault.resolveSecret("participantContextId", resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
202208

203209
var getBucketPolicyResponse = getNoneEmptyBucketPolicyResponse();
204210
when(s3Client.getBucketPolicy(any(GetBucketPolicyRequest.class))).thenReturn(completedFuture(getBucketPolicyResponse));
@@ -234,7 +240,7 @@ void deprovision_otherBucketPolicyStatements_shouldOnlyRemoveProvisionedStatemen
234240
var resource = provisionedResource();
235241

236242
var secretToken = new AwsSecretToken("accessKeyId", "secretAccessKey");
237-
when(vault.resolveSecret(resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
243+
when(vault.resolveSecret("participantContextId", resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
238244

239245
var getBucketPolicyResponse = getBucketPolicyResponseWithMultipleStatements();
240246
when(s3Client.getBucketPolicy(any(GetBucketPolicyRequest.class))).thenReturn(completedFuture(getBucketPolicyResponse));
@@ -274,7 +280,7 @@ void deprovision_onError_shouldReturnFailedFuture() throws Exception {
274280
var resource = provisionedResource();
275281

276282
var secretToken = new AwsSecretToken("accessKeyId", "secretAccessKey");
277-
when(vault.resolveSecret(resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
283+
when(vault.resolveSecret("participantContextId", resource.getDestinationKeyName())).thenReturn(typeManager.getMapper().writeValueAsString(secretToken));
278284

279285
when(s3Client.getBucketPolicy(any(GetBucketPolicyRequest.class))).thenReturn(failedFuture(new RuntimeException("error")));
280286

extensions/data-plane/data-plane-aws-s3-copy/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
api(libs.edc.spi.dataplane)
2121
api(libs.edc.spi.web)
2222
api(libs.edc.spi.data.plane.selector)
23+
api(libs.edc.spi.participant.context.single)
2324
implementation(libs.edc.lib.util)
2425
implementation(libs.edc.core.dataPlane.util)
2526

0 commit comments

Comments
 (0)