From c7e4f71f5e3d1070333acdee02e5ca2588ab4c10 Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Mon, 12 Jan 2026 13:49:38 +0100 Subject: [PATCH] refactor: cleanup control-plane provisioning --- .../azure/event/AzureEventGridPublisher.java | 9 +- .../provision/provision-blob/build.gradle.kts | 28 --- .../azure/AzureProvisionConfiguration.java | 24 -- .../azure/AzureProvisionExtension.java | 82 ------- .../ObjectContainerProvisionedResource.java | 89 -------- ...geConsumerResourceDefinitionGenerator.java | 64 ------ .../azure/blob/ObjectStorageProvisioner.java | 131 ----------- .../blob/ObjectStorageResourceDefinition.java | 97 -------- ...rg.eclipse.edc.spi.system.ServiceExtension | 16 -- ...bjectContainerProvisionedResourceTest.java | 115 ---------- ...nsumerResourceDefinitionGeneratorTest.java | 177 --------------- .../blob/ObjectStorageProvisionerTest.java | 209 ------------------ .../ObjectStorageResourceDefinitionTest.java | 69 ------ .../src/test/resources/hello.txt | 1 - settings.gradle.kts | 1 - .../build.gradle.kts | 1 - .../build.gradle.kts | 1 - 17 files changed, 4 insertions(+), 1110 deletions(-) delete mode 100644 extensions/control-plane/provision/provision-blob/build.gradle.kts delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionConfiguration.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionExtension.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResource.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGenerator.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisioner.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinition.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResourceTest.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGeneratorTest.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisionerTest.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinitionTest.java delete mode 100644 extensions/control-plane/provision/provision-blob/src/test/resources/hello.txt diff --git a/extensions/common/azure/azure-eventgrid/src/main/java/org/eclipse/edc/azure/event/AzureEventGridPublisher.java b/extensions/common/azure/azure-eventgrid/src/main/java/org/eclipse/edc/azure/event/AzureEventGridPublisher.java index a969a8ee..19b79f45 100644 --- a/extensions/common/azure/azure-eventgrid/src/main/java/org/eclipse/edc/azure/event/AzureEventGridPublisher.java +++ b/extensions/common/azure/azure-eventgrid/src/main/java/org/eclipse/edc/azure/event/AzureEventGridPublisher.java @@ -39,7 +39,7 @@ class AzureEventGridPublisher implements TransferProcessListener { } @Override - public void preCreated(TransferProcess process) { + public void initiated(TransferProcess process) { var dto = createTransferProcessDto(process); if (process.getType() == TransferProcess.Type.CONSUMER) { sendEvent("createdConsumer", eventTypeTransferprocess, dto).subscribe(new LoggingSubscriber<>("Transfer process created")); @@ -49,19 +49,18 @@ public void preCreated(TransferProcess process) { } @Override - public void preCompleted(TransferProcess process) { + public void completed(TransferProcess process) { sendEvent("completed", eventTypeTransferprocess, createTransferProcessDto(process)).subscribe(new LoggingSubscriber<>("Transfer process completed")); } - @Override - public void preDeprovisioned(TransferProcess process) { + public void deprovisioned(TransferProcess process) { sendEvent("deprovisioned", eventTypeTransferprocess, createTransferProcessDto(process)).subscribe(new LoggingSubscriber<>("Transfer process resources deprovisioned")); } @Override - public void preTerminated(TransferProcess process) { + public void terminated(TransferProcess process) { sendEvent("ended", eventTypeTransferprocess, createTransferProcessDto(process)).subscribe(new LoggingSubscriber<>("Transfer process ended")); } diff --git a/extensions/control-plane/provision/provision-blob/build.gradle.kts b/extensions/control-plane/provision/provision-blob/build.gradle.kts deleted file mode 100644 index 7ca1d741..00000000 --- a/extensions/control-plane/provision/provision-blob/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -plugins { - `java-library` -} - -dependencies { - api(libs.edc.spi.core) - - implementation(project(":extensions:common:azure:azure-blob-core")) - implementation(libs.azure.storageblob) - - testImplementation(testFixtures(project(":extensions:common:azure:azure-test"))) -} - - diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionConfiguration.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionConfiguration.java deleted file mode 100644 index cf28a674..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motorenwerke Aktiengesellschaft - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure; - -import org.eclipse.edc.runtime.metamodel.annotation.Setting; -import org.eclipse.edc.runtime.metamodel.annotation.Settings; - -@Settings -public record AzureProvisionConfiguration( - @Setting(key = "edc.azure.token.expiry.time", description = "Expiration time, in hours, for the SAS token.", defaultValue = "1") - long tokenExpiryTime) { -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionExtension.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionExtension.java deleted file mode 100644 index 1e18694f..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/AzureProvisionExtension.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure; - -import dev.failsafe.RetryPolicy; -import org.eclipse.edc.azure.blob.AzureSasToken; -import org.eclipse.edc.azure.blob.api.BlobStoreApi; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.TransferTypeParser; -import org.eclipse.edc.connector.controlplane.transfer.spi.provision.ProvisionManager; -import org.eclipse.edc.connector.controlplane.transfer.spi.provision.Provisioner; -import org.eclipse.edc.connector.controlplane.transfer.spi.provision.ResourceManifestGenerator; -import org.eclipse.edc.connector.provision.azure.blob.ObjectContainerProvisionedResource; -import org.eclipse.edc.connector.provision.azure.blob.ObjectStorageConsumerResourceDefinitionGenerator; -import org.eclipse.edc.connector.provision.azure.blob.ObjectStorageProvisioner; -import org.eclipse.edc.connector.provision.azure.blob.ObjectStorageResourceDefinition; -import org.eclipse.edc.runtime.metamodel.annotation.Configuration; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; - -/** - * Provides data transfer {@link Provisioner}s backed by Azure services. - * - * @deprecated "The control-plane based azure provision extension is DEPRECATED. Please use the data-plane based provisioner instead." - */ -@Deprecated(since = "0.15.0") -public class AzureProvisionExtension implements ServiceExtension { - - @Configuration - private AzureProvisionConfiguration azureProvisionConfiguration; - - @Inject - private BlobStoreApi blobStoreApi; - - @Inject - private RetryPolicy retryPolicy; - - @Inject - private ResourceManifestGenerator manifestGenerator; - - @Inject - private TypeManager typeManager; - - @Inject - private TransferTypeParser transferTypeParser; - - @Inject - private ProvisionManager provisionManager; - - @Override - public String name() { - return "DEPRECATED: Azure Provision"; - } - - @Override - public void initialize(ServiceExtensionContext context) { - var monitor = context.getMonitor(); - monitor.warning("The control-plane based azure provision extension is DEPRECATED. Please use the data-plane based provisioner instead."); - provisionManager.register(new ObjectStorageProvisioner(retryPolicy, monitor, blobStoreApi, azureProvisionConfiguration)); - manifestGenerator.registerGenerator(new ObjectStorageConsumerResourceDefinitionGenerator(transferTypeParser)); - - registerTypes(typeManager); - } - - private void registerTypes(TypeManager typeManager) { - typeManager.registerTypes(ObjectContainerProvisionedResource.class, ObjectStorageResourceDefinition.class, AzureSasToken.class); - } - -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResource.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResource.java deleted file mode 100644 index 86aab014..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResource.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import org.eclipse.edc.azure.blob.AzureBlobStoreSchema; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionedDataDestinationResource; - -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.ACCOUNT_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.BLOB_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.CONTAINER_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.FOLDER_NAME; -import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; - -@JsonDeserialize(builder = ObjectContainerProvisionedResource.Builder.class) -@JsonTypeName("dataspaceconnector:objectcontainerprovisionedresource") -public class ObjectContainerProvisionedResource extends ProvisionedDataDestinationResource { - - private ObjectContainerProvisionedResource() { - } - - public String getAccountName() { - return getDataAddress().getStringProperty(ACCOUNT_NAME); - } - - public String getContainerName() { - return getDataAddress().getStringProperty(CONTAINER_NAME); - } - - @JsonPOJOBuilder(withPrefix = "") - public static class Builder extends ProvisionedDataDestinationResource.Builder { - - private Builder() { - super(new ObjectContainerProvisionedResource()); - dataAddressBuilder.type(AzureBlobStoreSchema.TYPE); - } - - @JsonCreator - public static Builder newInstance() { - return new Builder(); - } - - public Builder accountName(String accountName) { - dataAddressBuilder.property(EDC_NAMESPACE + ACCOUNT_NAME, accountName); - return this; - } - - public Builder containerName(String containerName) { - dataAddressBuilder.property(EDC_NAMESPACE + CONTAINER_NAME, containerName); - return this; - } - - @Override - public Builder resourceName(String name) { - dataAddressBuilder.keyName(name); - super.resourceName(name); - return this; - } - - public Builder folderName(String folderName) { - if (folderName != null) { - dataAddressBuilder.property(EDC_NAMESPACE + FOLDER_NAME, folderName); - } - return this; - } - - public Builder blobName(String blobName) { - if (blobName != null) { - dataAddressBuilder.property(EDC_NAMESPACE + BLOB_NAME, blobName); - } - return this; - } - } -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGenerator.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGenerator.java deleted file mode 100644 index 4d8ccfd6..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGenerator.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * ZF Friedrichshafen AG - improvements (refactoring of generate method) - * SAP SE - refactoring - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import org.eclipse.edc.azure.blob.AzureBlobStoreSchema; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.TransferTypeParser; -import org.eclipse.edc.connector.controlplane.transfer.spi.provision.ConsumerResourceDefinitionGenerator; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceDefinition; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.types.domain.transfer.TransferType; -import org.jetbrains.annotations.Nullable; - -import static java.util.UUID.randomUUID; - -public class ObjectStorageConsumerResourceDefinitionGenerator implements ConsumerResourceDefinitionGenerator { - - private final TransferTypeParser transferTypeParser; - - public ObjectStorageConsumerResourceDefinitionGenerator(TransferTypeParser transferTypeParser) { - this.transferTypeParser = transferTypeParser; - } - - @Override - public @Nullable ResourceDefinition generate(TransferProcess transferProcess, Policy policy) { - var definitionBuilder = ObjectStorageResourceDefinition.Builder.newInstance() - .id(randomUUID().toString()) - .containerName(randomUUID().toString()) - .accountName(randomUUID().toString()); - - var destination = transferProcess.getDataDestination(); - if (destination != null) { - definitionBuilder - .accountName(destination.getStringProperty(AzureBlobStoreSchema.ACCOUNT_NAME)) - .containerName(destination.getStringProperty(AzureBlobStoreSchema.CONTAINER_NAME, randomUUID().toString())) - .folderName(destination.getStringProperty(AzureBlobStoreSchema.FOLDER_NAME)) - .blobName(destination.getStringProperty(AzureBlobStoreSchema.BLOB_NAME)); - } - - return definitionBuilder.build(); - } - - @Override - public boolean canGenerate(TransferProcess transferProcess, Policy policy) { - return transferTypeParser.parse(transferProcess.getTransferType()) - .map(TransferType::destinationType) - .map(AzureBlobStoreSchema.TYPE::equals) - .orElse(failure -> false); - } -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisioner.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisioner.java deleted file mode 100644 index 9a94c700..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisioner.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import dev.failsafe.RetryPolicy; -import org.eclipse.edc.azure.blob.AzureSasToken; -import org.eclipse.edc.azure.blob.api.BlobStoreApi; -import org.eclipse.edc.connector.controlplane.transfer.spi.provision.Provisioner; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.DeprovisionedResource; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionResponse; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionedResource; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceDefinition; -import org.eclipse.edc.connector.provision.azure.AzureProvisionConfiguration; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.monitor.Monitor; -import org.eclipse.edc.spi.response.StatusResult; -import org.jetbrains.annotations.NotNull; - -import java.time.OffsetDateTime; -import java.util.concurrent.CompletableFuture; - -import static dev.failsafe.Failsafe.with; - -public class ObjectStorageProvisioner implements Provisioner { - private final RetryPolicy retryPolicy; - private final Monitor monitor; - private final BlobStoreApi blobStoreApi; - private final AzureProvisionConfiguration azureProvisionConfiguration; - - public ObjectStorageProvisioner(RetryPolicy retryPolicy, Monitor monitor, BlobStoreApi blobStoreApi, AzureProvisionConfiguration azureProvisionConfiguration) { - this.retryPolicy = retryPolicy; - this.monitor = monitor; - this.blobStoreApi = blobStoreApi; - this.azureProvisionConfiguration = azureProvisionConfiguration; - } - - @Override - public boolean canProvision(ResourceDefinition resourceDefinition) { - return resourceDefinition instanceof ObjectStorageResourceDefinition; - } - - @Override - public boolean canDeprovision(ProvisionedResource resourceDefinition) { - return resourceDefinition instanceof ObjectContainerProvisionedResource; - } - - @Override - public CompletableFuture> provision(ObjectStorageResourceDefinition resourceDefinition, Policy policy) { - String containerName = resourceDefinition.getContainerName(); - String accountName = resourceDefinition.getAccountName(); - String folderName = resourceDefinition.getFolderName(); - String blobName = resourceDefinition.getBlobName(); - - monitor.debug("Azure Storage Container request submitted: " + containerName); - - OffsetDateTime expiryTime = OffsetDateTime.now().plusHours(this.azureProvisionConfiguration.tokenExpiryTime()); - - return with(retryPolicy).getAsync(() -> blobStoreApi.exists(accountName, containerName)) - .thenCompose(exists -> { - if (exists) { - return reusingExistingContainer(containerName); - } else { - return createContainer(containerName, accountName); - } - }) - .thenCompose(empty -> createContainerSasToken(containerName, accountName, expiryTime)) - .thenApply(writeOnlySas -> { - // Ensure resource name is unique to avoid key collisions in local and remote vaults - String resourceName = resourceDefinition.getId() + "-container"; - var resource = ObjectContainerProvisionedResource.Builder.newInstance() - .id(containerName) - .accountName(accountName) - .containerName(containerName) - .folderName(folderName) - .blobName(blobName) - .resourceDefinitionId(resourceDefinition.getId()) - .transferProcessId(resourceDefinition.getTransferProcessId()) - .resourceName(resourceName) - .hasToken(true) - .build(); - - var secretToken = new AzureSasToken("?" + writeOnlySas, expiryTime.toInstant().toEpochMilli()); - - var response = ProvisionResponse.Builder.newInstance().resource(resource).secretToken(secretToken).build(); - return StatusResult.success(response); - }); - } - - @Override - public CompletableFuture> deprovision(ObjectContainerProvisionedResource provisionedResource, Policy policy) { - return with(retryPolicy).runAsync(() -> blobStoreApi.deleteContainer(provisionedResource.getAccountName(), provisionedResource.getContainerName())) - //the sas token will expire automatically. there is no way of revoking them other than a stored access policy - .thenApply(empty -> StatusResult.success(DeprovisionedResource.Builder.newInstance().provisionedResourceId(provisionedResource.getId()).build())); - } - - @NotNull - private CompletableFuture reusingExistingContainer(String containerName) { - monitor.debug("ObjectStorageProvisioner: re-use existing container " + containerName); - return CompletableFuture.completedFuture(null); - } - - @NotNull - private CompletableFuture createContainer(String containerName, String accountName) { - return with(retryPolicy) - .runAsync(() -> { - blobStoreApi.createContainer(accountName, containerName); - monitor.debug("ObjectStorageProvisioner: created a new container " + containerName); - }); - } - - @NotNull - private CompletableFuture createContainerSasToken(String containerName, String accountName, OffsetDateTime expiryTime) { - return with(retryPolicy) - .getAsync(() -> { - monitor.debug("ObjectStorageProvisioner: obtained temporary SAS token (write-only)"); - return blobStoreApi.createContainerSasToken(accountName, containerName, "w", expiryTime); - }); - } -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinition.java b/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinition.java deleted file mode 100644 index 9447520e..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinition.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - add toBuilder method - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceDefinition; - -import java.util.Objects; - -@JsonDeserialize(builder = ObjectStorageResourceDefinition.Builder.class) -public class ObjectStorageResourceDefinition extends ResourceDefinition { - - private String containerName; - private String accountName; - private String folderName; - private String blobName; - - public String getContainerName() { - return containerName; - } - - public String getAccountName() { - return accountName; - } - - @Override - public Builder toBuilder() { - return initializeBuilder(new Builder()) - .containerName(containerName) - .folderName(folderName) - .blobName(blobName) - .accountName(accountName); - } - - public String getFolderName() { - return folderName; - } - - public String getBlobName() { - return blobName; - } - - @JsonPOJOBuilder(withPrefix = "") - public static class Builder extends ResourceDefinition.Builder { - - private Builder() { - super(new ObjectStorageResourceDefinition()); - } - - public static Builder newInstance() { - return new Builder(); - } - - public Builder containerName(String id) { - resourceDefinition.containerName = id; - return this; - } - - public Builder accountName(String accountName) { - resourceDefinition.accountName = accountName; - return this; - } - - public Builder folderName(String folderName) { - resourceDefinition.folderName = folderName; - return this; - } - - public Builder blobName(String blobName) { - resourceDefinition.blobName = blobName; - return this; - } - - @Override - protected void verify() { - super.verify(); - Objects.requireNonNull(resourceDefinition.containerName, "containerName"); - Objects.requireNonNull(resourceDefinition.accountName, "accountName"); - } - } - -} diff --git a/extensions/control-plane/provision/provision-blob/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/control-plane/provision/provision-blob/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index d1a0a1b6..00000000 --- a/extensions/control-plane/provision/provision-blob/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (c) 2020, 2021 Microsoft Corporation -# -# This program and the accompanying materials are made available under the -# terms of the Apache License, Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# -# Contributors: -# Microsoft Corporation - initial API and implementation -# -# - -org.eclipse.edc.connector.provision.azure.AzureProvisionExtension - diff --git a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResourceTest.java b/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResourceTest.java deleted file mode 100644 index e7019534..00000000 --- a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectContainerProvisionedResourceTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import org.eclipse.edc.azure.blob.AzureBlobStoreSchema; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.spi.types.TypeManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.ACCOUNT_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.BLOB_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.CONTAINER_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.FOLDER_NAME; - -class ObjectContainerProvisionedResourceTest { - - private final TypeManager typeManager = new JacksonTypeManager(); - private ObjectContainerProvisionedResource.Builder builder; - - @BeforeEach - void setUp() { - typeManager.registerTypes(ObjectContainerProvisionedResource.class); - - builder = ObjectContainerProvisionedResource.Builder.newInstance() - .containerName("test-container") - .accountName("test-account") - .transferProcessId("test-process-id") - .resourceDefinitionId("test-resdef-id") - .resourceName("test-container") - .id("test-id"); - } - - @Test - void createDataDestination() { - var dest = builder.build().getDataAddress(); - - assertThat(dest.getType()).isEqualTo(AzureBlobStoreSchema.TYPE); - assertThat(dest.getKeyName()).isEqualTo("test-container"); - assertThat(dest.getStringProperty(CONTAINER_NAME)).isEqualTo("test-container"); - assertThat(dest.getStringProperty(ACCOUNT_NAME)).isEqualTo("test-account"); - assertThat(dest.getProperties()).doesNotContainKey(FOLDER_NAME); - assertThat(dest.getProperties()).doesNotContainKey(BLOB_NAME); - } - - @Test - void createDataDestination_withFolderAndBlob() { - var dest = builder - .folderName("testfolder") - .blobName("testblob") - .build().getDataAddress(); - - assertThat(dest.getType()).isEqualTo(AzureBlobStoreSchema.TYPE); - assertThat(dest.getKeyName()).isEqualTo("test-container"); - assertThat(dest.getStringProperty(CONTAINER_NAME)).isEqualTo("test-container"); - assertThat(dest.getStringProperty(ACCOUNT_NAME)).isEqualTo("test-account"); - assertThat(dest.getStringProperty(FOLDER_NAME)).isEqualTo("testfolder"); - assertThat(dest.getStringProperty(BLOB_NAME)).isEqualTo("testblob"); - } - - - @Test - void getResourceName() { - assertThat(builder.build().getResourceName()).isEqualTo("test-container"); - } - - @Test - void verifySerialization() { - var json = typeManager.writeValueAsString(builder.build()); - - assertThat(json).isNotNull() - .contains("accountName") - .contains("containerName"); - } - - @Test - void verifyDeserialization() { - var enrichedBuilder = builder.blobName("test-blob").folderName("test-folder"); - - var serialized = Map.of( - "id", "test-id", - "edctype", "dataspaceconnector:objectcontainerprovisionedresource", - "transferProcessId", "test-process-id", - "resourceDefinitionId", "test-resdef-id", - "accountName", "test-account", - "containerName", "test-container", - "resourceName", "test-container", - "folderName", "test-folder", - "blobName", "test-blob" - ); - - var res = typeManager.readValue(typeManager.writeValueAsBytes(serialized), ObjectContainerProvisionedResource.class); - - assertThat(res).isNotNull(); - assertThat(res.getContainerName()).isEqualTo("test-container"); - assertThat(res.getAccountName()).isEqualTo("test-account"); - assertThat(res).usingRecursiveComparison().isEqualTo(enrichedBuilder.build()); - } - -} diff --git a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGeneratorTest.java b/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGeneratorTest.java deleted file mode 100644 index da7a1402..00000000 --- a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageConsumerResourceDefinitionGeneratorTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2020 - 2022 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * ZF Friedrichshafen AG - Addition of new tests - * SAP SE - refactoring - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import org.eclipse.edc.azure.blob.AzureBlobStoreSchema; -import org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.TransferTypeParser; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.FlowType; -import org.eclipse.edc.spi.types.domain.transfer.TransferType; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class ObjectStorageConsumerResourceDefinitionGeneratorTest { - - private final TransferTypeParser transferTypeParser = mock(); - private final ObjectStorageConsumerResourceDefinitionGenerator generator = - new ObjectStorageConsumerResourceDefinitionGenerator(transferTypeParser); - - @Nested - class Generate { - - @Test - void generate_withContainerName() { - var destination = DataAddress.Builder.newInstance().type(AzureBlobStoreSchema.TYPE) - .property(AzureBlobStoreSchema.CONTAINER_NAME, "test-container") - .property(AzureBlobStoreSchema.ACCOUNT_NAME, "test-account") - .build(); - var asset = Asset.Builder.newInstance().build(); - var transferProcess = TransferProcess.Builder.newInstance().dataDestination(destination).assetId(asset.getId()) - .build(); - - var definition = generator.generate(transferProcess, emptyPolicy()); - - assertThat(definition).isInstanceOf(ObjectStorageResourceDefinition.class); - var objectDef = (ObjectStorageResourceDefinition) definition; - assertThat(objectDef.getAccountName()).isEqualTo("test-account"); - assertThat(objectDef.getContainerName()).isEqualTo("test-container"); - assertThat(objectDef.getId()).satisfies(UUID::fromString); - assertThat(objectDef.getFolderName()).isNull(); - assertThat(objectDef.getBlobName()).isNull(); - } - - @Test - void generate_withContainerName_andFolder_andBlobName() { - var destination = DataAddress.Builder.newInstance().type(AzureBlobStoreSchema.TYPE) - .property(AzureBlobStoreSchema.CONTAINER_NAME, "test-container") - .property(AzureBlobStoreSchema.ACCOUNT_NAME, "test-account") - .property(AzureBlobStoreSchema.FOLDER_NAME, "test-folder") - .property(AzureBlobStoreSchema.BLOB_NAME, "test-blob") - .build(); - var asset = Asset.Builder.newInstance().build(); - var transferProcess = TransferProcess.Builder.newInstance() - .transferType("%s-%s".formatted(AzureBlobStoreSchema.TYPE, FlowType.PUSH)) - .dataDestination(destination) - .assetId(asset.getId()) - .build(); - - var definition = generator.generate(transferProcess, emptyPolicy()); - - assertThat(definition).isNotNull().isInstanceOf(ObjectStorageResourceDefinition.class); - var objectDef = (ObjectStorageResourceDefinition) definition; - assertThat(objectDef.getAccountName()).isEqualTo("test-account"); - assertThat(objectDef.getContainerName()).isEqualTo("test-container"); - assertThat(objectDef.getId()).satisfies(UUID::fromString); - assertThat(objectDef.getFolderName()).isEqualTo("test-folder"); - assertThat(objectDef.getBlobName()).isEqualTo("test-blob"); - } - - @Test - void generate_withoutContainerName() { - var destination = DataAddress.Builder.newInstance().type(AzureBlobStoreSchema.TYPE) - .property(AzureBlobStoreSchema.ACCOUNT_NAME, "test-account") - .build(); - var asset = Asset.Builder.newInstance().build(); - var transferProcess = TransferProcess.Builder.newInstance().dataDestination(destination).assetId(asset.getId()).build(); - - var definition = generator.generate(transferProcess, emptyPolicy()); - - assertThat(definition).isInstanceOf(ObjectStorageResourceDefinition.class); - var objectDef = (ObjectStorageResourceDefinition) definition; - assertThat(objectDef.getAccountName()).isEqualTo("test-account"); - assertThat(objectDef.getContainerName()).satisfies(UUID::fromString); - assertThat(objectDef.getId()).satisfies(UUID::fromString); - } - - @Test - void shouldCreateEmptyDefinition_whenDestinationIsNull() { - var transferProcess = TransferProcess.Builder.newInstance() - .dataDestination(null) - .assetId(UUID.randomUUID().toString()) - .build(); - - var definition = generator.generate(transferProcess, emptyPolicy()); - - assertThat(definition).isInstanceOfSatisfying(ObjectStorageResourceDefinition.class, def -> { - assertThat(def.getAccountName()).satisfies(UUID::fromString); - assertThat(def.getContainerName()).satisfies(UUID::fromString); - assertThat(def.getId()).satisfies(UUID::fromString); - }); - - } - } - - @Nested - class CanGenerate { - - @Test - void shouldReturnTrue_whenDestinationTypeIsTheExpectedOne() { - when(transferTypeParser.parse(any())).thenReturn(Result.success(new TransferType(AzureBlobStoreSchema.TYPE, FlowType.PULL))); - var transferProcess = TransferProcess.Builder.newInstance() - .transferType("valid transfer type") - .assetId(UUID.randomUUID().toString()) - .build(); - - var definition = generator.canGenerate(transferProcess, emptyPolicy()); - - assertThat(definition).isTrue(); - } - - @Test - void shouldReturnFalse_whenDestinationTypeIsNotTheExpectedOne() { - when(transferTypeParser.parse(any())).thenReturn(Result.success(new TransferType("another type", FlowType.PULL))); - var transferProcess = TransferProcess.Builder.newInstance() - .transferType("another transfer type") - .assetId(UUID.randomUUID().toString()) - .build(); - - var definition = generator.canGenerate(transferProcess, emptyPolicy()); - - assertThat(definition).isFalse(); - } - - @Test - void shouldReturnFalse_whenTransferTypeCannotBeParsedCorrectly() { - when(transferTypeParser.parse(any())).thenReturn(Result.failure("transfer type cannot be parsed")); - var transferProcess = TransferProcess.Builder.newInstance() - .transferType("another transfer type") - .assetId(UUID.randomUUID().toString()) - .build(); - - var definition = generator.canGenerate(transferProcess, emptyPolicy()); - - assertThat(definition).isFalse(); - } - - } - - private Policy emptyPolicy() { - return Policy.Builder.newInstance().build(); - } - -} diff --git a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisionerTest.java b/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisionerTest.java deleted file mode 100644 index 5c33d69c..00000000 --- a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageProvisionerTest.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2020, 2021 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Microsoft Corporation - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import com.azure.storage.blob.models.BlobStorageException; -import dev.failsafe.RetryPolicy; -import org.eclipse.edc.azure.blob.AzureSasToken; -import org.eclipse.edc.azure.blob.api.BlobStoreApi; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ProvisionedResource; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceDefinition; -import org.eclipse.edc.connector.provision.azure.AzureProvisionConfiguration; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.monitor.Monitor; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static java.util.concurrent.TimeUnit.SECONDS; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.BLOB_NAME; -import static org.eclipse.edc.azure.blob.AzureBlobStoreSchema.FOLDER_NAME; -import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class ObjectStorageProvisionerTest { - - private final BlobStoreApi blobStoreApiMock = mock(BlobStoreApi.class); - private final AzureProvisionConfiguration azureProvisionConfiguration = mock(AzureProvisionConfiguration.class); - private ObjectStorageProvisioner provisioner; - private Policy policy; - - @BeforeEach - void setup() { - RetryPolicy retryPolicy = RetryPolicy.builder().withMaxRetries(0).build(); - provisioner = new ObjectStorageProvisioner(retryPolicy, mock(Monitor.class), blobStoreApiMock, azureProvisionConfiguration); - policy = Policy.Builder.newInstance().build(); - } - - @Test - void canProvision() { - assertThat(provisioner.canProvision(new ObjectStorageResourceDefinition())).isTrue(); - assertThat(provisioner.canProvision(new ResourceDefinition() { - @Override - public > B toBuilder() { - return null; - } - })).isFalse(); - } - - @Test - void canDeprovision() { - var resource = createProvisionedResource(); - assertThat(provisioner.canDeprovision(resource)).isTrue(); - assertThat(provisioner.canDeprovision(new ProvisionedResource() { - })).isFalse(); - } - - @Test - void deprovision_should_not_do_anything() { - ObjectContainerProvisionedResource resource = createProvisionedResource(); - var result = provisioner.deprovision(resource, policy); - - assertThat(result).succeedsWithin(1, SECONDS); - } - - @Test - void provision_withFolder_andBlob_success() { - var resourceDef = createResourceDefinitionBuilder() - .transferProcessId("tpId") - .folderName("test-folder") - .blobName("test-blob") - .build(); - String accountName = resourceDef.getAccountName(); - String containerName = resourceDef.getContainerName(); - when(blobStoreApiMock.exists(anyString(), anyString())).thenReturn(false); - when(blobStoreApiMock.createContainerSasToken(eq(accountName), eq(containerName), eq("w"), any())).thenReturn("some-sas"); - - var response = provisioner.provision(resourceDef, policy).join().getContent(); - - assertThat(response.getResource()).isInstanceOfSatisfying(ObjectContainerProvisionedResource.class, resource -> { - assertThat(resource.getTransferProcessId()).isEqualTo("tpId"); - assertThat(resource.getDataAddress().getStringProperty(EDC_NAMESPACE + FOLDER_NAME)).isEqualTo("test-folder"); - assertThat(resource.getDataAddress().getStringProperty(EDC_NAMESPACE + BLOB_NAME)).isEqualTo("test-blob"); - }); - assertThat(response.getSecretToken()).isInstanceOfSatisfying(AzureSasToken.class, secretToken -> { - assertThat(secretToken.getSas()).isEqualTo("?some-sas"); - }); - - verify(blobStoreApiMock).exists(anyString(), anyString()); - verify(blobStoreApiMock).createContainer(accountName, containerName); - } - - @Test - void provision_success() { - var resourceDef = createResourceDefinitionBuilder().transferProcessId("tpId").build(); - String accountName = resourceDef.getAccountName(); - String containerName = resourceDef.getContainerName(); - when(blobStoreApiMock.exists(anyString(), anyString())).thenReturn(false); - when(blobStoreApiMock.createContainerSasToken(eq(accountName), eq(containerName), eq("w"), any())).thenReturn("some-sas"); - - var response = provisioner.provision(resourceDef, policy).join().getContent(); - - assertThat(response.getResource()).isInstanceOfSatisfying(ObjectContainerProvisionedResource.class, resource -> { - assertThat(resource.getTransferProcessId()).isEqualTo("tpId"); - assertThat(resource.getDataAddress().getStringProperty(EDC_NAMESPACE + FOLDER_NAME)).isNull(); - }); - assertThat(response.getSecretToken()).isInstanceOfSatisfying(AzureSasToken.class, secretToken -> { - assertThat(secretToken.getSas()).isEqualTo("?some-sas"); - }); - - verify(blobStoreApiMock).exists(anyString(), anyString()); - verify(blobStoreApiMock).createContainer(accountName, containerName); - } - - @Test - void provision_unique_name() { - var resourceDef = createResourceDefinitionBuilder().id("id").transferProcessId("tpId").build(); - String accountName = resourceDef.getAccountName(); - String containerName = resourceDef.getContainerName(); - when(blobStoreApiMock.exists(accountName, containerName)).thenReturn(true); - when(blobStoreApiMock.createContainerSasToken(eq(accountName), eq(containerName), eq("w"), any())).thenReturn("some-sas"); - - var response = provisioner.provision(resourceDef, policy).join().getContent(); - - var resourceDef2 = createResourceDefinitionBuilder().id("id2").transferProcessId("tpId2").build(); - var response2 = provisioner.provision(resourceDef2, policy).join().getContent(); - var resource1 = (ObjectContainerProvisionedResource) response.getResource(); - var resource2 = (ObjectContainerProvisionedResource) response2.getResource(); - assertThat(resource2.getResourceName()).isNotEqualTo(resource1.getResourceName()); - } - - @Test - void provision_container_already_exists() { - var resourceDef = createResourceDefinitionBuilder().transferProcessId("tpId").build(); - String accountName = resourceDef.getAccountName(); - String containerName = resourceDef.getContainerName(); - when(blobStoreApiMock.exists(accountName, containerName)).thenReturn(true); - when(blobStoreApiMock.createContainerSasToken(eq(accountName), eq(containerName), eq("w"), any())).thenReturn("some-sas"); - - var response = provisioner.provision(resourceDef, policy).join().getContent(); - - assertThat(response.getResource()).isInstanceOfSatisfying(ObjectContainerProvisionedResource.class, resource -> { - assertThat(resource.getTransferProcessId()).isEqualTo("tpId"); - }); - assertThat(response.getSecretToken()).isInstanceOfSatisfying(AzureSasToken.class, secretToken -> { - assertThat(secretToken.getSas()).isEqualTo("?some-sas"); - }); - verify(blobStoreApiMock).exists(anyString(), anyString()); - verify(blobStoreApiMock).createContainerSasToken(eq(accountName), eq(containerName), eq("w"), any()); - } - - @Test - void provision_no_key_found_in_vault() { - var resourceDefinition = createResourceDefinitionBuilder().build(); - when(blobStoreApiMock.exists(any(), anyString())) - .thenThrow(new IllegalArgumentException("No Object Storage credential found in vault")); - - assertThatThrownBy(() -> provisioner.provision(resourceDefinition, policy).join()).hasCauseInstanceOf(IllegalArgumentException.class); - verify(blobStoreApiMock).exists(any(), any()); - } - - @Test - void provision_key_not_authorized() { - var resourceDef = createResourceDefinitionBuilder().build(); - when(blobStoreApiMock.exists(anyString(), anyString())).thenReturn(false); - doThrow(new BlobStorageException("not authorized", null, null)) - .when(blobStoreApiMock).createContainer(resourceDef.getAccountName(), resourceDef.getContainerName()); - - assertThatThrownBy(() -> provisioner.provision(resourceDef, policy).join()).hasCauseInstanceOf(BlobStorageException.class); - verify(blobStoreApiMock).exists(anyString(), anyString()); - } - - private ObjectStorageResourceDefinition.Builder createResourceDefinitionBuilder() { - return ObjectStorageResourceDefinition.Builder - .newInstance() - .accountName("test-account-name") - .containerName("test-container-name") - .transferProcessId("test-process-id") - .id("test-id"); - } - - private ObjectContainerProvisionedResource createProvisionedResource() { - return ObjectContainerProvisionedResource.Builder.newInstance() - .id("1") - .transferProcessId("2") - .resourceDefinitionId("3") - .resourceName("resource") - .build(); - } - -} diff --git a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinitionTest.java b/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinitionTest.java deleted file mode 100644 index 83ab14ff..00000000 --- a/extensions/control-plane/provision/provision-blob/src/test/java/org/eclipse/edc/connector/provision/azure/blob/ObjectStorageResourceDefinitionTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2022 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - initial API and implementation - * - */ - -package org.eclipse.edc.connector.provision.azure.blob; - -import com.fasterxml.jackson.core.JsonProcessingException; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.ResourceManifest; -import org.eclipse.edc.json.JacksonTypeManager; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class ObjectStorageResourceDefinitionTest { - - @ParameterizedTest - @ValueSource(strings = { "test-folder" }) - @NullAndEmptySource - void toBuilder_verifyEqualResourceDefinition(String folder) { - var definition = ObjectStorageResourceDefinition.Builder.newInstance() - .id("id") - .transferProcessId("tp-id") - .accountName("account") - .containerName("container") - .folderName(folder) - .blobName("blob") - .build(); - var builder = definition.toBuilder(); - var rebuiltDefinition = builder.build(); - - assertThat(rebuiltDefinition).usingRecursiveComparison().isEqualTo(definition); - } - - @Test - void serdes() throws JsonProcessingException { - var typeManager = new JacksonTypeManager(); - typeManager.registerTypes(ObjectStorageResourceDefinition.class); - var objectMapper = typeManager.getMapper(); - var definition = ObjectStorageResourceDefinition.Builder.newInstance() - .id("id") - .transferProcessId("tp-id") - .accountName("account") - .containerName("container") - .folderName("any") - .blobName("blob") - .build(); - var manifest = ResourceManifest.Builder.newInstance().definitions(List.of(definition)).build(); - - var json = objectMapper.writeValueAsString(manifest); - var deserialized = objectMapper.readValue(json, ResourceManifest.class); - - assertThat(deserialized.getDefinitions().get(0)).usingRecursiveComparison().isEqualTo(definition); - } -} diff --git a/extensions/control-plane/provision/provision-blob/src/test/resources/hello.txt b/extensions/control-plane/provision/provision-blob/src/test/resources/hello.txt deleted file mode 100644 index bc7774a7..00000000 --- a/extensions/control-plane/provision/provision-blob/src/test/resources/hello.txt +++ /dev/null @@ -1 +0,0 @@ -hello world! \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 86dbc511..0539f30f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,7 +41,6 @@ include(":extensions:control-plane:store:contract-definition-store-cosmos") include(":extensions:control-plane:store:contract-negotiation-store-cosmos") include(":extensions:control-plane:store:policy-definition-store-cosmos") include(":extensions:control-plane:store:transfer-process-store-cosmos") -include(":extensions:control-plane:provision:provision-blob") // dataplane extensions include(":extensions:data-plane:data-plane-azure-storage") diff --git a/system-tests/runtimes/azure-data-factory-transfer-consumer/build.gradle.kts b/system-tests/runtimes/azure-data-factory-transfer-consumer/build.gradle.kts index be5cf00d..12b3ba29 100644 --- a/system-tests/runtimes/azure-data-factory-transfer-consumer/build.gradle.kts +++ b/system-tests/runtimes/azure-data-factory-transfer-consumer/build.gradle.kts @@ -33,7 +33,6 @@ dependencies { implementation(libs.edc.dsp) - implementation(project(":extensions:control-plane:provision:provision-blob")) implementation(project(":extensions:common:vault:vault-azure")) implementation(libs.edc.lib.util) } diff --git a/system-tests/runtimes/azure-data-factory-transfer-provider/build.gradle.kts b/system-tests/runtimes/azure-data-factory-transfer-provider/build.gradle.kts index c55ef3c4..34452163 100644 --- a/system-tests/runtimes/azure-data-factory-transfer-provider/build.gradle.kts +++ b/system-tests/runtimes/azure-data-factory-transfer-provider/build.gradle.kts @@ -38,7 +38,6 @@ dependencies { implementation(libs.edc.config.filesystem) implementation(libs.edc.iam.mock) implementation(libs.edc.api.management) - implementation(project(":extensions:control-plane:provision:provision-blob")) implementation(project(":extensions:common:vault:vault-azure")) implementation(libs.edc.dsp)