Skip to content

Commit 71b4fec

Browse files
authored
feat: adds AzureStorage blob dataplane provisioning extension (#405)
* feat: add dataplane-provision-blob extension * Changed e2e tests * fix ut * checkstyle * Deprecation warning * cs * added e2e coverage * nits * comment * cs * suggestions
1 parent 17dd5cd commit 71b4fec

File tree

16 files changed

+801
-8
lines changed

16 files changed

+801
-8
lines changed

extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionExtension.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333

3434
/**
3535
* Provides data transfer {@link Provisioner}s backed by Azure services.
36+
*
37+
* @deprecated "The control-plane based azure provision extension is DEPRECATED. Please use the data-plane based provisioner instead."
3638
*/
39+
@Deprecated(since = "0.15.0")
3740
public class AzureProvisionExtension implements ServiceExtension {
3841

3942
@Configuration
@@ -59,12 +62,14 @@ public class AzureProvisionExtension implements ServiceExtension {
5962

6063
@Override
6164
public String name() {
62-
return "Azure Provision";
65+
return "DEPRECATED: Azure Provision";
6366
}
6467

6568
@Override
6669
public void initialize(ServiceExtensionContext context) {
67-
provisionManager.register(new ObjectStorageProvisioner(retryPolicy, context.getMonitor(), blobStoreApi, azureProvisionConfiguration));
70+
var monitor = context.getMonitor();
71+
monitor.warning("The control-plane based azure provision extension is DEPRECATED. Please use the data-plane based provisioner instead.");
72+
provisionManager.register(new ObjectStorageProvisioner(retryPolicy, monitor, blobStoreApi, azureProvisionConfiguration));
6873
manifestGenerator.registerGenerator(new ObjectStorageConsumerResourceDefinitionGenerator(transferTypeParser));
6974

7075
registerTypes(typeManager);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
12+
*
13+
*/
14+
15+
16+
plugins {
17+
`java-library`
18+
}
19+
20+
dependencies {
21+
api(libs.edc.spi.core)
22+
api(libs.edc.spi.dataplane)
23+
24+
implementation(libs.edc.lib.util)
25+
implementation(project(":extensions:common:azure:azure-blob-core"))
26+
implementation(libs.azure.storageblob)
27+
28+
testImplementation(testFixtures(project(":extensions:common:azure:azure-test")))
29+
}
30+
31+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
12+
*
13+
*/
14+
15+
package org.eclipse.edc.connector.dataplane.provision.azure;
16+
17+
import org.eclipse.edc.runtime.metamodel.annotation.Setting;
18+
import org.eclipse.edc.runtime.metamodel.annotation.Settings;
19+
20+
@Settings
21+
public record AzureProvisionConfiguration(
22+
@Setting(key = "edc.azure.token.expiry.time", description = "Expiration time, in hours, for the SAS token.", defaultValue = "1")
23+
long tokenExpiryTime) {
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
12+
*
13+
*/
14+
15+
package org.eclipse.edc.connector.dataplane.provision.azure;
16+
17+
import dev.failsafe.RetryPolicy;
18+
import org.eclipse.edc.azure.blob.AzureSasToken;
19+
import org.eclipse.edc.azure.blob.api.BlobStoreApi;
20+
import org.eclipse.edc.connector.controlplane.transfer.spi.provision.Provisioner;
21+
import org.eclipse.edc.connector.dataplane.provision.azure.blob.ObjectStorageConsumerProvisionResourceGenerator;
22+
import org.eclipse.edc.connector.dataplane.provision.azure.blob.ObjectStorageDeprovisioner;
23+
import org.eclipse.edc.connector.dataplane.provision.azure.blob.ObjectStorageProvisioner;
24+
import org.eclipse.edc.connector.dataplane.spi.provision.ProvisionerManager;
25+
import org.eclipse.edc.connector.dataplane.spi.provision.ResourceDefinitionGeneratorManager;
26+
import org.eclipse.edc.runtime.metamodel.annotation.Configuration;
27+
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
28+
import org.eclipse.edc.spi.monitor.Monitor;
29+
import org.eclipse.edc.spi.security.Vault;
30+
import org.eclipse.edc.spi.system.ServiceExtension;
31+
import org.eclipse.edc.spi.system.ServiceExtensionContext;
32+
import org.eclipse.edc.spi.types.TypeManager;
33+
34+
/**
35+
* Provides data transfer {@link Provisioner}s backed by Azure services.
36+
*/
37+
public class AzureProvisionExtension implements ServiceExtension {
38+
39+
@Configuration
40+
private AzureProvisionConfiguration azureProvisionConfiguration;
41+
42+
@Inject
43+
private BlobStoreApi blobStoreApi;
44+
45+
@Inject
46+
private RetryPolicy<Object> retryPolicy;
47+
48+
@Inject
49+
private ResourceDefinitionGeneratorManager manifestGenerator;
50+
51+
@Inject
52+
private TypeManager typeManager;
53+
54+
@Inject
55+
private Vault vault;
56+
57+
@Inject
58+
private ProvisionerManager provisionManager;
59+
60+
@Inject
61+
private Monitor monitor;
62+
63+
@Override
64+
public String name() {
65+
return "Dataplane Azure Provisioner";
66+
}
67+
68+
@Override
69+
public void initialize(ServiceExtensionContext context) {
70+
provisionManager.register(new ObjectStorageProvisioner(retryPolicy, context.getMonitor(), blobStoreApi, azureProvisionConfiguration, vault, typeManager));
71+
provisionManager.register(new ObjectStorageDeprovisioner());
72+
manifestGenerator.registerConsumerGenerator(new ObjectStorageConsumerProvisionResourceGenerator(monitor.withPrefix("AzureStorageProvisioner")));
73+
74+
registerTypes(typeManager);
75+
}
76+
77+
private void registerTypes(TypeManager typeManager) {
78+
typeManager.registerTypes(AzureSasToken.class);
79+
}
80+
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
12+
*
13+
*/
14+
15+
package org.eclipse.edc.connector.dataplane.provision.azure.blob;
16+
17+
import org.eclipse.edc.azure.blob.AzureBlobStoreSchema;
18+
import org.eclipse.edc.connector.dataplane.spi.DataFlow;
19+
import org.eclipse.edc.connector.dataplane.spi.provision.ProvisionResource;
20+
import org.eclipse.edc.connector.dataplane.spi.provision.ResourceDefinitionGenerator;
21+
import org.eclipse.edc.spi.monitor.Monitor;
22+
import org.eclipse.edc.spi.types.domain.DataAddress;
23+
24+
import java.util.UUID;
25+
26+
import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE;
27+
import static org.eclipse.edc.util.string.StringUtils.isNullOrEmpty;
28+
29+
30+
public class ObjectStorageConsumerProvisionResourceGenerator implements ResourceDefinitionGenerator {
31+
32+
private final Monitor monitor;
33+
34+
public ObjectStorageConsumerProvisionResourceGenerator(Monitor monitor) {
35+
this.monitor = monitor;
36+
}
37+
38+
@Override
39+
public String supportedType() {
40+
return AzureBlobStoreSchema.TYPE;
41+
}
42+
43+
@Override
44+
public ProvisionResource generate(DataFlow dataFlow) {
45+
46+
var originalDataDestination = dataFlow.getDestination();
47+
var toProvision = DataAddress.Builder.newInstance()
48+
.type(AzureBlobStoreSchema.TYPE)
49+
.property(EDC_NAMESPACE + AzureBlobStoreSchema.ACCOUNT_NAME, UUID.randomUUID().toString())
50+
.property(EDC_NAMESPACE + AzureBlobStoreSchema.CONTAINER_NAME, UUID.randomUUID().toString());
51+
52+
if (originalDataDestination != null) {
53+
toProvision.properties(originalDataDestination.getProperties());
54+
if (isNullOrEmpty(originalDataDestination.getStringProperty(AzureBlobStoreSchema.CONTAINER_NAME))) {
55+
monitor.debug("Container name on destination is null or empty. A random one will be used during provisioning.");
56+
}
57+
if (isNullOrEmpty(originalDataDestination.getStringProperty(AzureBlobStoreSchema.ACCOUNT_NAME))) {
58+
monitor.debug("Account name on destination is null or empty. A random one will be used during provisioning.");
59+
}
60+
}
61+
62+
return ProvisionResource.Builder.newInstance()
63+
.flowId(dataFlow.getId())
64+
.type(AzureBlobStoreSchema.TYPE)
65+
.dataAddress(toProvision.build())
66+
.build();
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
12+
*
13+
*/
14+
15+
package org.eclipse.edc.connector.dataplane.provision.azure.blob;
16+
17+
import org.eclipse.edc.azure.blob.AzureBlobStoreSchema;
18+
import org.eclipse.edc.connector.dataplane.spi.provision.DeprovisionedResource;
19+
import org.eclipse.edc.connector.dataplane.spi.provision.Deprovisioner;
20+
import org.eclipse.edc.connector.dataplane.spi.provision.ProvisionResource;
21+
import org.eclipse.edc.spi.response.StatusResult;
22+
23+
import java.util.concurrent.CompletableFuture;
24+
25+
26+
public class ObjectStorageDeprovisioner implements Deprovisioner {
27+
28+
public ObjectStorageDeprovisioner() {
29+
}
30+
31+
@Override
32+
public String supportedType() {
33+
return AzureBlobStoreSchema.TYPE;
34+
}
35+
36+
@Override
37+
public CompletableFuture<StatusResult<DeprovisionedResource>> deprovision(ProvisionResource resource) {
38+
//the sas token will expire automatically.
39+
return CompletableFuture.supplyAsync(() -> StatusResult.success(DeprovisionedResource.Builder.from(resource).build()));
40+
}
41+
}

0 commit comments

Comments
 (0)