From 04899e91dcdb4a407db4eb7af3e7b6ff9a9e9ad6 Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Wed, 4 Sep 2024 15:31:03 +0200 Subject: [PATCH] refactor: cleanup deprecated stuff (#4451) --- DEPENDENCIES | 10 +- .../catalog/CatalogProtocolServiceImpl.java | 5 - .../JsonObjectFromDataServiceTransformer.java | 6 - ...nObjectFromDataServiceTransformerTest.java | 19 -- ...omContractAgreementMessageTransformer.java | 6 - ...reementVerificationMessageTransformer.java | 2 - ...actNegotiationEventMessageTransformer.java | 2 - ...otiationTerminationMessageTransformer.java | 4 +- ...ectFromContractNegotiationTransformer.java | 2 - ...ctFromContractOfferMessageTransformer.java | 4 +- ...FromContractRequestMessageTransformer.java | 4 +- ...ToContractAgreementMessageTransformer.java | 21 +- ...reementVerificationMessageTransformer.java | 34 +-- ...ntractAgreementMessageTransformerTest.java | 37 --- ...entVerificationMessageTransformerTest.java | 3 - ...egotiationEventMessageTransformerTest.java | 3 - ...tionTerminationMessageTransformerTest.java | 3 - ...romContractNegotiationTransformerTest.java | 3 - ...omContractOfferMessageTransformerTest.java | 3 - ...ContractRequestMessageTransformerTest.java | 3 - ...ntractAgreementMessageTransformerTest.java | 42 --- ...entVerificationMessageTransformerTest.java | 20 -- .../DspNegotiationPropertyAndTypeNames.java | 2 - .../dsp/spi/type/DspPropertyAndTypeNames.java | 1 - ...mTransferCompletionMessageTransformer.java | 2 - ...FromTransferRequestMessageTransformer.java | 6 +- ...ctFromTransferStartMessageTransformer.java | 4 +- ...TransferTerminationMessageTransformer.java | 4 +- ...ctToTransferRequestMessageTransformer.java | 7 +- ...nsferCompletionMessageTransformerTest.java | 2 - ...TransferRequestMessageTransformerTest.java | 4 - ...omTransferStartMessageTransformerTest.java | 3 - ...sferTerminationMessageTransformerTest.java | 3 - ...TransferRequestMessageTransformerTest.java | 22 -- .../main/resources/control-api-version.json | 6 +- .../ContractNegotiationApiExtension.java | 2 +- .../v2/ContractNegotiationApiV2.java | 1 - .../validation/ContractRequestValidator.java | 7 +- .../BaseContractNegotiationApiTest.java | 2 +- .../ContractRequestValidatorTest.java | 20 +- .../transfer/transfer-data-plane/README.md | 43 --- .../transfer-data-plane/build.gradle.kts | 51 ---- .../TransferDataPlaneCoreExtension.java | 133 --------- ...sferDataPlaneDefaultServicesExtension.java | 62 ----- ...onsumerPullTransferTokenValidationApi.java | 35 --- ...lTransferTokenValidationApiController.java | 77 ----- ...onsumerPullTransferDataFlowController.java | 98 ------- ...roviderPushTransferDataFlowController.java | 116 -------- .../ConsumerPullDataPlaneProxyResolver.java | 93 ------- ...sumerPullDataPlaneProxyTokenDecorator.java | 45 --- .../dataplane/security/NoopDataEncrypter.java | 33 --- .../ExpirationDateValidationRule.java | 53 ---- ...rg.eclipse.edc.spi.system.ServiceExtension | 16 -- .../TransferDataPlaneCoreExtensionTest.java | 99 ------- ...nsferTokenValidationApiControllerTest.java | 105 ------- ...merPullTransferDataFlowControllerTest.java | 166 ----------- ...derPushTransferDataFlowControllerTest.java | 234 ---------------- ...onsumerPullDataPlaneProxyResolverTest.java | 177 ------------ ...rPullDataPlaneProxyTokenDecoratorTest.java | 59 ---- .../ExpirationDateValidationRuleTest.java | 67 ----- .../src/test/resources/rsa-pubkey.pem | 9 - .../build.gradle.kts | 32 --- .../data-plane-client/build.gradle.kts | 39 --- .../client/DataPlaneClientExtension.java | 68 ----- .../client/RemoteDataPlaneClient.java | 86 ------ ...rg.eclipse.edc.spi.system.ServiceExtension | 1 - .../client/DataPlaneClientExtensionTest.java | 68 ----- .../client/RemoteDataPlaneClientTest.java | 167 ----------- .../data-plane-control-api/README.md | 72 ----- .../data-plane-control-api/build.gradle.kts | 41 --- .../api/DataPlaneControlApiExtension.java | 53 ---- .../api/controller/DataPlaneControlApi.java | 52 ---- .../DataPlaneControlApiController.java | 87 ------ ...rg.eclipse.edc.spi.system.ServiceExtension | 1 - .../DataPlaneControlApiControllerTest.java | 131 --------- .../build.gradle.kts | 1 + .../http/DataPlaneHttpIntegrationTests.java | 263 ++++++++---------- .../data-plane-public-api/README.md | 1 - .../data-plane-public-api/build.gradle.kts | 48 ---- .../api/DataPlanePublicApiExtension.java | 108 ------- .../ContainerRequestContextApi.java | 68 ----- .../ContainerRequestContextApiImpl.java | 108 ------- .../controller/DataFlowRequestSupplier.java | 73 ----- .../api/controller/DataPlanePublicApi.java | 90 ------ .../DataPlanePublicApiController.java | 168 ----------- ...nsumerPullTransferDataAddressResolver.java | 68 ----- ...rg.eclipse.edc.spi.system.ServiceExtension | 1 - .../DataFlowStartMessageSupplierTest.java | 94 ------- .../DataPlanePublicApiControllerTest.java | 190 ------------- ...erPullTransferDataAddressResolverTest.java | 106 ------- .../build.gradle.kts | 38 --- .../SignalingApiConfigurationExtension.java | 121 -------- ...rg.eclipse.edc.spi.system.ServiceExtension | 15 - ...ignalingApiConfigurationExtensionTest.java | 78 ------ .../build.gradle.kts | 1 - .../client/EmbeddedDataPlaneClient.java | 0 .../client/EmbeddedDataPlaneClientTest.java | 0 settings.gradle.kts | 6 - .../org/eclipse/edc/spi/query/Criterion.java | 6 - .../edc/jsonld/spi/PropertyAndTypeNames.java | 6 - .../types/negotiation/ContractRequest.java | 2 - .../runtimes/data-plane/build.gradle.kts | 2 - .../data-plane/build.gradle.kts | 1 - .../build.gradle.kts | 2 +- .../telemetry-test-runtime/build.gradle.kts | 2 +- .../edc/test/e2e/versionapi/Runtimes.java | 16 +- .../version-api-test-runtime/build.gradle.kts | 2 - 107 files changed, 160 insertions(+), 4528 deletions(-) delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/README.md delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/build.gradle.kts delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtension.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneDefaultServicesExtension.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApi.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiController.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowController.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowController.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolver.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecorator.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/security/NoopDataEncrypter.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRule.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtensionTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiControllerTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowControllerTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowControllerTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolverTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecoratorTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRuleTest.java delete mode 100644 extensions/control-plane/transfer/transfer-data-plane/src/test/resources/rsa-pubkey.pem delete mode 100644 extensions/data-plane/data-plane-client-embedded/build.gradle.kts delete mode 100644 extensions/data-plane/data-plane-client/build.gradle.kts delete mode 100644 extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtension.java delete mode 100644 extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClient.java delete mode 100644 extensions/data-plane/data-plane-client/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtensionTest.java delete mode 100644 extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClientTest.java delete mode 100644 extensions/data-plane/data-plane-control-api/README.md delete mode 100644 extensions/data-plane/data-plane-control-api/build.gradle.kts delete mode 100644 extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlaneControlApiExtension.java delete mode 100644 extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApi.java delete mode 100644 extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiController.java delete mode 100644 extensions/data-plane/data-plane-control-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/data-plane/data-plane-control-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiControllerTest.java delete mode 100644 extensions/data-plane/data-plane-public-api/README.md delete mode 100644 extensions/data-plane/data-plane-public-api/build.gradle.kts delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlanePublicApiExtension.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApi.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApiImpl.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowRequestSupplier.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApi.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiController.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolver.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowStartMessageSupplierTest.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiControllerTest.java delete mode 100644 extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolverTest.java delete mode 100644 extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/build.gradle.kts delete mode 100644 extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtension.java delete mode 100644 extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/test/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtensionTest.java rename extensions/data-plane/{data-plane-client-embedded => data-plane-signaling/data-plane-signaling-client}/src/main/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClient.java (100%) rename extensions/data-plane/{data-plane-client-embedded => data-plane-signaling/data-plane-signaling-client}/src/test/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClientTest.java (100%) diff --git a/DEPENDENCIES b/DEPENDENCIES index afe536bdd09..c03e0b3b341 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -59,7 +59,7 @@ maven/mavencentral/com.github.stephenc.jcip/jcip-annotations/1.0-1, Apache-2.0, maven/mavencentral/com.google.code.findbugs/jsr305/2.0.1, BSD-3-Clause AND CC-BY-2.5 AND LGPL-2.1+, approved, CQ13390 maven/mavencentral/com.google.code.findbugs/jsr305/3.0.2, CC-BY-2.5, approved, #15220 maven/mavencentral/com.google.code.gson/gson/2.10.1, Apache-2.0, approved, #6159 -maven/mavencentral/com.google.crypto.tink/tink/1.15.0, , restricted, clearlydefined +maven/mavencentral/com.google.crypto.tink/tink/1.15.0, Apache-2.0, approved, clearlydefined maven/mavencentral/com.google.errorprone/error_prone_annotations/2.11.0, Apache-2.0, approved, clearlydefined maven/mavencentral/com.google.errorprone/error_prone_annotations/2.22.0, Apache-2.0, approved, #10661 maven/mavencentral/com.google.errorprone/error_prone_annotations/2.28.0, Apache-2.0, approved, #15107 @@ -82,7 +82,7 @@ maven/mavencentral/com.lmax/disruptor/3.4.4, Apache-2.0, approved, clearlydefine maven/mavencentral/com.networknt/json-schema-validator/1.0.76, Apache-2.0, approved, CQ22638 maven/mavencentral/com.nimbusds/nimbus-jose-jwt/9.28, Apache-2.0, approved, clearlydefined maven/mavencentral/com.nimbusds/nimbus-jose-jwt/9.40, Apache-2.0, approved, #15156 -maven/mavencentral/com.puppycrawl.tools/checkstyle/10.18.1, LGPL-2.1-or-later, restricted, clearlydefined +maven/mavencentral/com.puppycrawl.tools/checkstyle/10.18.1, LGPL-2.1-or-later AND (Apache-2.0 AND LGPL-2.1-or-later) AND Apache-2.0, approved, #16060 maven/mavencentral/com.samskivert/jmustache/1.15, BSD-2-Clause AND BSD-3-Clause, approved, clearlydefined maven/mavencentral/com.squareup.okhttp3/okhttp-dnsoverhttps/4.12.0, Apache-2.0, approved, #11159 maven/mavencentral/com.squareup.okhttp3/okhttp/4.12.0, Apache-2.0, approved, #15227 @@ -195,7 +195,7 @@ maven/mavencentral/net.javacrumbs.json-unit/json-unit-core/2.36.0, Apache-2.0, a maven/mavencentral/net.minidev/accessors-smart/2.4.7, Apache-2.0, approved, #7515 maven/mavencentral/net.minidev/json-smart/2.4.7, Apache-2.0, approved, #3288 maven/mavencentral/net.sf.jopt-simple/jopt-simple/5.0.4, MIT, approved, CQ13174 -maven/mavencentral/net.sf.saxon/Saxon-HE/12.5, NOASSERTION, restricted, clearlydefined +maven/mavencentral/net.sf.saxon/Saxon-HE/12.5, MPL-2.0-no-copyleft-exception AND (LicenseRef-scancode-proprietary-license AND MPL-2.0-no-copyleft-exception) AND (MPL-2.0-no-copyleft-exception AND X11) AND (MIT AND MPL-2.0-no-copyleft-exception) AND (MPL-1.0 AND MPL-2.0-no-copyleft-exception) AND (Apache-2.0 AND MPL-2.0-no-copyleft-exception) AND MPL-1.0, restricted, #16061 maven/mavencentral/org.antlr/antlr4-runtime/4.13.2, BSD-3-Clause, approved, #10767 maven/mavencentral/org.apache.commons/commons-compress/1.24.0, Apache-2.0 AND BSD-3-Clause AND bzip2-1.0.6 AND LicenseRef-Public-Domain, approved, #10368 maven/mavencentral/org.apache.commons/commons-digester3/3.2, Apache-2.0, approved, clearlydefined @@ -219,7 +219,7 @@ maven/mavencentral/org.apache.httpcomponents/httpclient/4.5.13, Apache-2.0, appr maven/mavencentral/org.apache.httpcomponents/httpcore/4.4.13, Apache-2.0, approved, CQ23528 maven/mavencentral/org.apache.httpcomponents/httpcore/4.4.14, Apache-2.0, approved, CQ23528 maven/mavencentral/org.apache.httpcomponents/httpmime/4.5.13, Apache-2.0, approved, CQ11718 -maven/mavencentral/org.apache.kafka/kafka-clients/3.8.0, Apache-2.0, restricted, clearlydefined +maven/mavencentral/org.apache.kafka/kafka-clients/3.8.0, Apache-2.0 AND (Apache-2.0 AND MIT) AND (Apache-2.0 AND BSD-3-Clause), approved, #16063 maven/mavencentral/org.apache.maven.doxia/doxia-core/1.12.0, Apache-2.0, approved, clearlydefined maven/mavencentral/org.apache.maven.doxia/doxia-logging-api/1.12.0, Apache-2.0, approved, clearlydefined maven/mavencentral/org.apache.maven.doxia/doxia-module-xdoc/1.12.0, Apache-2.0, approved, clearlydefined @@ -309,7 +309,7 @@ maven/mavencentral/org.junit.jupiter/junit-jupiter-params/5.11.0, EPL-2.0, appro maven/mavencentral/org.junit.platform/junit-platform-commons/1.11.0, EPL-2.0, approved, #15936 maven/mavencentral/org.junit.platform/junit-platform-engine/1.11.0, EPL-2.0, approved, #15932 maven/mavencentral/org.junit.platform/junit-platform-launcher/1.11.0, EPL-2.0, approved, #15934 -maven/mavencentral/org.junit/junit-bom/5.11.0, , restricted, clearlydefined +maven/mavencentral/org.junit/junit-bom/5.11.0, EPL-2.0, approved, #16062 maven/mavencentral/org.junit/junit-bom/5.9.2, EPL-2.0, approved, #4711 maven/mavencentral/org.jvnet.mimepull/mimepull/1.9.15, CDDL-1.1 OR GPL-2.0-only WITH Classpath-exception-2.0, approved, CQ21484 maven/mavencentral/org.latencyutils/LatencyUtils/2.0.3, CC0-1.0, approved, #15280 diff --git a/core/control-plane/control-plane-aggregate-services/src/main/java/org/eclipse/edc/connector/controlplane/services/catalog/CatalogProtocolServiceImpl.java b/core/control-plane/control-plane-aggregate-services/src/main/java/org/eclipse/edc/connector/controlplane/services/catalog/CatalogProtocolServiceImpl.java index 7a2d32bd743..fdc5da202e5 100644 --- a/core/control-plane/control-plane-aggregate-services/src/main/java/org/eclipse/edc/connector/controlplane/services/catalog/CatalogProtocolServiceImpl.java +++ b/core/control-plane/control-plane-aggregate-services/src/main/java/org/eclipse/edc/connector/controlplane/services/catalog/CatalogProtocolServiceImpl.java @@ -28,16 +28,12 @@ import org.jetbrains.annotations.NotNull; import static java.lang.String.format; -import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; public class CatalogProtocolServiceImpl implements CatalogProtocolService { @PolicyScope public static final String CATALOGING_REQUEST_SCOPE = "request.catalog"; - @Deprecated(since = "0.5.1") - private static final String EDC_PROPERTY_PARTICIPANT_ID = EDC_NAMESPACE + "participantId"; - private final DatasetResolver datasetResolver; private final DataServiceRegistry dataServiceRegistry; private final String participantId; @@ -69,7 +65,6 @@ public ServiceResult getCatalog(CatalogRequestMessage message, TokenRep .dataServices(dataServices) .datasets(datasets.toList()) .participantId(participantId) - .property(EDC_PROPERTY_PARTICIPANT_ID, participantId) .build(); } }) diff --git a/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/main/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformer.java b/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/main/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformer.java index cd2a0ef2d9c..11d8375fee0 100644 --- a/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/main/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformer.java +++ b/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/main/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformer.java @@ -27,8 +27,6 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_DATA_SERVICE_TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_DESCRIPTION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_URL_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_ENDPOINT_URL_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_TERMS_ATTRIBUTE; /** * Converts from a {@link DataService} to a DCAT data service as a {@link JsonObject} in JSON-LD expanded form. @@ -51,10 +49,6 @@ public JsonObjectFromDataServiceTransformer(JsonBuilderFactory jsonFactory) { addIfNotNull(dataService.getEndpointDescription(), DCAT_ENDPOINT_DESCRIPTION_ATTRIBUTE, objectBuilder); addIfNotNull(dataService.getEndpointUrl(), DCAT_ENDPOINT_URL_ATTRIBUTE, objectBuilder); - // deprecated attributes, to be removed - addIfNotNull(dataService.getEndpointDescription(), DCT_TERMS_ATTRIBUTE, objectBuilder); - addIfNotNull(dataService.getEndpointUrl(), DCT_ENDPOINT_URL_ATTRIBUTE, objectBuilder); - return objectBuilder.build(); } diff --git a/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/test/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformerTest.java b/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/test/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformerTest.java index b317a4a5e01..1d8f31d5505 100644 --- a/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/test/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformerTest.java +++ b/data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/test/java/org/eclipse/edc/protocol/dsp/catalog/transform/from/JsonObjectFromDataServiceTransformerTest.java @@ -29,8 +29,6 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_DATA_SERVICE_TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_DESCRIPTION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_URL_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_ENDPOINT_URL_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_TERMS_ATTRIBUTE; import static org.mockito.Mockito.mock; class JsonObjectFromDataServiceTransformerTest { @@ -62,21 +60,4 @@ void transform_returnJsonObject() { assertThat(result.getJsonString(DCAT_ENDPOINT_URL_ATTRIBUTE).getString()).isEqualTo("url"); } - @Deprecated - @Test - void deprecated_attributes() { - var dataService = DataService.Builder.newInstance() - .id("dataServiceId") - .endpointDescription("description") - .endpointUrl("url") - .build(); - - var result = transformer.transform(dataService, context); - - assertThat(result).isNotNull(); - assertThat(result.getJsonString(ID).getString()).isEqualTo(dataService.getId()); - assertThat(result.getJsonString(TYPE).getString()).isEqualTo(DCAT_DATA_SERVICE_TYPE); - assertThat(result.getJsonString(DCT_TERMS_ATTRIBUTE).getString()).isEqualTo("description"); - assertThat(result.getJsonString(DCT_ENDPOINT_URL_ATTRIBUTE).getString()).isEqualTo("url"); - } } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformer.java index 2b8f10d7716..570aa3a1a80 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformer.java @@ -29,12 +29,9 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNEE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNER_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_AGREEMENT; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_ID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_TIMESTAMP; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; @@ -70,8 +67,6 @@ public JsonObjectFromContractAgreementMessageTransformer(JsonBuilderFactory json .add(ID, agreement.getId()) .add(ODRL_ASSIGNEE_ATTRIBUTE, agreement.getConsumerId()) .add(ODRL_ASSIGNER_ATTRIBUTE, agreement.getProviderId()) - .add(DSPACE_PROPERTY_CONSUMER_ID, agreement.getConsumerId()) - .add(DSPACE_PROPERTY_PROVIDER_ID, agreement.getProviderId()) .add(DSPACE_PROPERTY_TIMESTAMP, signing) .build(); @@ -80,7 +75,6 @@ public JsonObjectFromContractAgreementMessageTransformer(JsonBuilderFactory json .add(TYPE, DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE) .add(DSPACE_PROPERTY_PROVIDER_PID, agreementMessage.getProviderPid()) .add(DSPACE_PROPERTY_CONSUMER_PID, agreementMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, agreementMessage.getProcessId()) .add(DSPACE_PROPERTY_AGREEMENT, copiedPolicy) .build(); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformer.java index a944c972739..1f4f801ca70 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformer.java @@ -26,7 +26,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; /** @@ -48,7 +47,6 @@ public JsonObjectFromContractAgreementVerificationMessageTransformer(JsonBuilder .add(TYPE, DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) .add(DSPACE_PROPERTY_CONSUMER_PID, verificationMessage.getConsumerPid()) .add(DSPACE_PROPERTY_PROVIDER_PID, verificationMessage.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, verificationMessage.getProcessId()) .build(); } } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformer.java index d2136877f0d..99d0a241f10 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformer.java @@ -29,7 +29,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_ACCEPTED; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_FINALIZED; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; @@ -52,7 +51,6 @@ public JsonObjectFromContractNegotiationEventMessageTransformer(JsonBuilderFacto .add(TYPE, DSPACE_TYPE_CONTRACT_NEGOTIATION_EVENT_MESSAGE) .add(DSPACE_PROPERTY_CONSUMER_PID, eventMessage.getConsumerPid()) .add(DSPACE_PROPERTY_PROVIDER_PID, eventMessage.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, eventMessage.getProcessId()) .add(DSPACE_PROPERTY_EVENT_TYPE, switch (eventMessage.getType()) { case ACCEPTED -> DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_ACCEPTED; case FINALIZED -> DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_FINALIZED; diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformer.java index eeabc4bdf67..82393ef5654 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformer.java @@ -27,7 +27,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_NEGOTIATION_TERMINATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON; @@ -49,8 +48,7 @@ public JsonObjectFromContractNegotiationTerminationMessageTransformer(JsonBuilde .add(ID, terminationMessage.getId()) .add(TYPE, DSPACE_TYPE_CONTRACT_NEGOTIATION_TERMINATION_MESSAGE) .add(DSPACE_PROPERTY_CONSUMER_PID, terminationMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROVIDER_PID, terminationMessage.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, terminationMessage.getProcessId()); + .add(DSPACE_PROPERTY_PROVIDER_PID, terminationMessage.getProviderPid()); addIfNotNull(terminationMessage.getRejectionReason(), DSPACE_PROPERTY_REASON, builder); addIfNotNull(terminationMessage.getCode(), DSPACE_PROPERTY_CODE, builder); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformer.java index 6ec3a8d7f2f..f077e12b7af 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformer.java @@ -34,7 +34,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_STATE_TERMINATED; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_STATE_VERIFIED; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_STATE; @@ -58,7 +57,6 @@ public JsonObjectFromContractNegotiationTransformer(JsonBuilderFactory jsonFacto .add(TYPE, DSPACE_TYPE_CONTRACT_NEGOTIATION) .add(DSPACE_PROPERTY_CONSUMER_PID, pidFor(contractNegotiation, ContractNegotiation.Type.CONSUMER)) .add(DSPACE_PROPERTY_PROVIDER_PID, pidFor(contractNegotiation, ContractNegotiation.Type.PROVIDER)) - .add(DSPACE_PROPERTY_PROCESS_ID, pidFor(contractNegotiation, ContractNegotiation.Type.CONSUMER)) .add(DSPACE_PROPERTY_STATE, state(contractNegotiation.getState(), context)) .build(); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformer.java index 52110a493a6..5e80c30a23d 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformer.java @@ -29,7 +29,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_OFFER_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; /** @@ -49,8 +48,7 @@ public JsonObjectFromContractOfferMessageTransformer(JsonBuilderFactory jsonFact var builder = jsonFactory.createObjectBuilder() .add(ID, message.getId()) .add(TYPE, DSPACE_TYPE_CONTRACT_OFFER_MESSAGE) - .add(DSPACE_PROPERTY_PROVIDER_PID, message.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, message.getProcessId()); + .add(DSPACE_PROPERTY_PROVIDER_PID, message.getProviderPid()); addIfNotNull(message.getConsumerPid(), DSPACE_PROPERTY_CONSUMER_PID, builder); addIfNotNull(message.getCallbackAddress(), DSPACE_PROPERTY_CALLBACK_ADDRESS, builder); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformer.java index bbcf33cacaa..9147dd1d04e 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformer.java @@ -29,7 +29,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_REQUEST_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; @@ -50,8 +49,7 @@ public JsonObjectFromContractRequestMessageTransformer(JsonBuilderFactory jsonFa var builder = jsonFactory.createObjectBuilder() .add(ID, requestMessage.getId()) .add(TYPE, DSPACE_TYPE_CONTRACT_REQUEST_MESSAGE) - .add(DSPACE_PROPERTY_CONSUMER_PID, requestMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, requestMessage.getProcessId()); + .add(DSPACE_PROPERTY_CONSUMER_PID, requestMessage.getConsumerPid()); addIfNotNull(requestMessage.getProviderPid(), DSPACE_PROPERTY_PROVIDER_PID, builder); addIfNotNull(requestMessage.getCallbackAddress(), DSPACE_PROPERTY_CALLBACK_ADDRESS, builder); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformer.java index 40e45742307..d511351543f 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformer.java @@ -41,8 +41,7 @@ * Creates a {@link ContractAgreementMessage} from a {@link JsonObject}. */ public class JsonObjectToContractAgreementMessageTransformer extends AbstractJsonLdTransformer { - private static final Set EXCLUDED_POLICY_KEYWORDS = - Set.of(DSPACE_PROPERTY_CONSUMER_ID, DSPACE_PROPERTY_PROVIDER_ID, DSPACE_PROPERTY_TIMESTAMP); + private static final Set EXCLUDED_POLICY_KEYWORDS = Set.of(DSPACE_PROPERTY_TIMESTAMP, DSPACE_PROPERTY_CONSUMER_ID, DSPACE_PROPERTY_PROVIDER_ID); public JsonObjectToContractAgreementMessageTransformer() { super(JsonObject.class, ContractAgreementMessage.class); @@ -126,24 +125,6 @@ private ContractAgreement contractAgreement(JsonObject jsonAgreement, Policy pol .policy(policy) .assetId(policy.getTarget()); - if (assignee == null && !transformMandatoryString(jsonAgreement.get(DSPACE_PROPERTY_CONSUMER_ID), builder::consumerId, context)) { - context.problem() - .missingProperty() - .type(DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE) - .property(DSPACE_PROPERTY_CONSUMER_ID) - .report(); - return null; - } - - if (assigner == null && !transformMandatoryString(jsonAgreement.get(DSPACE_PROPERTY_PROVIDER_ID), builder::providerId, context)) { - context.problem() - .missingProperty() - .type(DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE) - .property(DSPACE_PROPERTY_PROVIDER_ID) - .report(); - return null; - } - var timestamp = transformString(jsonAgreement.get(DSPACE_PROPERTY_TIMESTAMP), context); if (timestamp == null) { context.problem() diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformer.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformer.java index e9fd3de8312..936edb5da82 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformer.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/main/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformer.java @@ -23,7 +23,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; /** @@ -38,30 +37,21 @@ public JsonObjectToContractAgreementVerificationMessageTransformer() { @Override public @Nullable ContractAgreementVerificationMessage transform(@NotNull JsonObject object, @NotNull TransformerContext context) { var builder = ContractAgreementVerificationMessage.Builder.newInstance(); - var processId = object.get(DSPACE_PROPERTY_PROCESS_ID); if (!transformMandatoryString(object.get(DSPACE_PROPERTY_CONSUMER_PID), builder::consumerPid, context)) { - if (processId == null) { - context.problem() - .missingProperty() - .type(DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) - .property(DSPACE_PROPERTY_CONSUMER_PID) - .report(); - return null; - } else { - builder.consumerPid(transformString(processId, context)); - } + context.problem() + .missingProperty() + .type(DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) + .property(DSPACE_PROPERTY_CONSUMER_PID) + .report(); + return null; } if (!transformMandatoryString(object.get(DSPACE_PROPERTY_PROVIDER_PID), builder::providerPid, context)) { - if (processId == null) { - context.problem() - .missingProperty() - .type(DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) - .property(DSPACE_PROPERTY_PROVIDER_PID) - .report(); - return null; - } else { - builder.providerPid(transformString(processId, context)); - } + context.problem() + .missingProperty() + .type(DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) + .property(DSPACE_PROPERTY_PROVIDER_PID) + .report(); + return null; } return builder.build(); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformerTest.java index 1d2de8b7e2a..f65c56b478d 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementMessageTransformerTest.java @@ -38,12 +38,9 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNEE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNER_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_AGREEMENT; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_ID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_TIMESTAMP; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -77,7 +74,6 @@ void setUp() { void transform() { var message = ContractAgreementMessage.Builder.newInstance() .protocol(DSP) - .processId("processId") .providerPid("providerPid") .consumerPid("consumerPid") .counterPartyAddress("https://example.com") @@ -102,7 +98,6 @@ void transform() { assertThat(result.getString(TYPE)).isEqualTo(DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); var jsonAgreement = result.getJsonObject(DSPACE_PROPERTY_AGREEMENT); assertThat(jsonAgreement).isNotNull(); @@ -114,38 +109,6 @@ void transform() { verify(context, never()).reportProblem(anyString()); } - @Deprecated(since = "0.5.1") - @Test - void shouldSetConsumerIdAndProviderIdForBackwardCompatibility() { - var message = ContractAgreementMessage.Builder.newInstance() - .protocol(DSP) - .processId("processId") - .providerPid("providerPid") - .consumerPid("consumerPid") - .counterPartyAddress("https://example.com") - .contractAgreement(ContractAgreement.Builder.newInstance() - .id(AGREEMENT_ID) - .providerId(PROVIDER_ID) - .consumerId(CONSUMER_ID) - .assetId("assetId") - .policy(policy()).build()) - .build(); - var policyObject = jsonFactory.createObjectBuilder() - .add(ID, "contractOfferId") - .build(); - - when(context.transform(any(Policy.class), eq(JsonObject.class))).thenReturn(policyObject); - - var result = transformer.transform(message, context); - - assertThat(result).isNotNull(); - var jsonAgreement = result.getJsonObject(DSPACE_PROPERTY_AGREEMENT); - assertThat(jsonAgreement.getString(DSPACE_PROPERTY_CONSUMER_ID)).isEqualTo(CONSUMER_ID); - assertThat(jsonAgreement.getString(DSPACE_PROPERTY_PROVIDER_ID)).isEqualTo(PROVIDER_ID); - - verify(context, never()).reportProblem(anyString()); - } - @Test void transform_policyError() { var message = ContractAgreementMessage.Builder.newInstance() diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformerTest.java index 46d972a80b9..aa42da74849 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractAgreementVerificationMessageTransformerTest.java @@ -27,7 +27,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -47,7 +46,6 @@ void transform() { var value = "example"; var message = ContractAgreementVerificationMessage.Builder.newInstance() .protocol(value) - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .counterPartyAddress(value) @@ -60,7 +58,6 @@ void transform() { assertThat(result.getJsonString(TYPE).getString()).isEqualTo(DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE); assertThat(result.getJsonString(DSPACE_PROPERTY_CONSUMER_PID).getString()).isEqualTo("consumerPid"); assertThat(result.getJsonString(DSPACE_PROPERTY_PROVIDER_PID).getString()).isEqualTo("providerPid"); - assertThat(result.getJsonString(DSPACE_PROPERTY_PROCESS_ID).getString()).isEqualTo("processId"); verify(context, never()).reportProblem(anyString()); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformerTest.java index b5aa58c42dd..9b7c00600c3 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationEventMessageTransformerTest.java @@ -30,7 +30,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_NEGOTIATION_EVENT_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_ACCEPTED; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -50,7 +49,6 @@ class JsonObjectFromContractNegotiationEventMessageTransformerTest { void transform() { var message = ContractNegotiationEventMessage.Builder.newInstance() .protocol(DSP) - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .counterPartyAddress("https://test.com") @@ -64,7 +62,6 @@ void transform() { assertThat(result.getString(TYPE)).isEqualTo(DSPACE_TYPE_CONTRACT_NEGOTIATION_EVENT_MESSAGE); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); assertThat(result.getString(DSPACE_PROPERTY_EVENT_TYPE)).isEqualTo(DSPACE_VALUE_NEGOTIATION_EVENT_TYPE_ACCEPTED); verify(context, never()).reportProblem(anyString()); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformerTest.java index 4b4bf0c61fe..8bc222a3fb7 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTerminationMessageTransformerTest.java @@ -28,7 +28,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_NEGOTIATION_TERMINATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON; import static org.mockito.ArgumentMatchers.anyString; @@ -51,7 +50,6 @@ class JsonObjectFromContractNegotiationTerminationMessageTransformerTest { void transform() { var message = ContractNegotiationTerminationMessage.Builder.newInstance() .protocol(DSP) - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .counterPartyAddress("https://test.com") @@ -66,7 +64,6 @@ void transform() { assertThat(result.getString(TYPE)).isEqualTo(DSPACE_TYPE_CONTRACT_NEGOTIATION_TERMINATION_MESSAGE); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); assertThat(result.getString(DSPACE_PROPERTY_CODE)).isEqualTo(REJECTION_CODE); assertThat(result.getString(DSPACE_PROPERTY_REASON)).isEqualTo(REJECTION_REASON); diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformerTest.java index 43d9b73dfec..e58174214d6 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractNegotiationTransformerTest.java @@ -56,7 +56,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_STATE_TERMINATED; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_VALUE_NEGOTIATION_STATE_VERIFIED; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_STATE; import static org.mockito.ArgumentMatchers.anyString; @@ -95,7 +94,6 @@ void transform_consumer() { assertThat(result.getString(TYPE)).isEqualTo(DSPACE_TYPE_CONTRACT_NEGOTIATION); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("consumerPid"); verify(context, never()).reportProblem(anyString()); } @@ -119,7 +117,6 @@ void transform_provider() { assertThat(result.getString(TYPE)).isEqualTo(DSPACE_TYPE_CONTRACT_NEGOTIATION); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("consumerPid"); verify(context, never()).reportProblem(anyString()); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformerTest.java index 47fb505dd95..2c76131e58a 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractOfferMessageTransformerTest.java @@ -34,7 +34,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_OFFER_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -67,7 +66,6 @@ void transform_shouldReturnJsonObject_whenValidMessage() { var message = ContractOfferMessage.Builder.newInstance() .id(MESSAGE_ID) .callbackAddress(CALLBACK_ADDRESS) - .processId("processId") .providerPid("providerPid") .consumerPid("consumerPid") .protocol(PROTOCOL) @@ -88,7 +86,6 @@ void transform_shouldReturnJsonObject_whenValidMessage() { assertThat(result.getJsonObject(DSPACE_PROPERTY_OFFER).getJsonString(ID).getString()).isEqualTo(CONTRACT_OFFER_ID); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); verify(context, never()).reportProblem(anyString()); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformerTest.java index 88fe16c2896..cd81460ee1e 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/from/JsonObjectFromContractRequestMessageTransformerTest.java @@ -34,7 +34,6 @@ import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_REQUEST_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -67,7 +66,6 @@ void setUp() { @Test void verify_contractOffer() { var message = contractRequestMessageBuilder() - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .contractOffer(contractOffer()) @@ -85,7 +83,6 @@ void verify_contractOffer() { assertThat(result.getJsonObject(DSPACE_PROPERTY_OFFER).getString(ID)).isEqualTo(CONTRACT_OFFER_ID); assertThat(result.getJsonString(DSPACE_PROPERTY_CONSUMER_PID).getString()).isEqualTo("consumerPid"); assertThat(result.getJsonString(DSPACE_PROPERTY_PROVIDER_PID).getString()).isEqualTo("providerPid"); - assertThat(result.getJsonString(DSPACE_PROPERTY_PROCESS_ID).getString()).isEqualTo("processId"); verify(context, never()).reportProblem(anyString()); } diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformerTest.java index ad3f9dee013..590f40a8446 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementMessageTransformerTest.java @@ -40,8 +40,6 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_AGREEMENT; import static org.eclipse.edc.protocol.dsp.negotiation.transform.to.TestInput.getExpanded; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_AGREEMENT; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_ID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_PROPERTY_TIMESTAMP; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; @@ -113,46 +111,6 @@ void transform() { verify(context, never()).reportProblem(anyString()); } - @Deprecated - @Test - void transformFallbackConsumerIdProviderId_whenAssigneeAndAssignerAreMissing() { - var message = jsonFactory.createObjectBuilder() - .add(ID, MESSAGE_ID) - .add(TYPE, DSPACE_TYPE_CONTRACT_AGREEMENT_MESSAGE) - .add(DSPACE_PROPERTY_CONSUMER_PID, "consumerPid") - .add(DSPACE_PROPERTY_PROVIDER_PID, "providerPid") - .add(DSPACE_PROPERTY_AGREEMENT, jsonFactory.createObjectBuilder() - .add(ID, AGREEMENT_ID) - .add(TYPE, ODRL_POLICY_TYPE_AGREEMENT) - .add(DSPACE_PROPERTY_CONSUMER_ID, CONSUMER_ID) - .add(DSPACE_PROPERTY_PROVIDER_ID, PROVIDER_ID) - .add(DSPACE_PROPERTY_TIMESTAMP, TIMESTAMP) - .build()) - .build(); - - var policy = policyBuilder().assignee(null).assigner(null).build(); - when(context.transform(any(JsonObject.class), eq(Policy.class))).thenReturn(policy); - - var result = transformer.transform(getExpanded(message), context); - - assertThat(result).isNotNull(); - assertThat(result.getClass()).isEqualTo(ContractAgreementMessage.class); - assertThat(result.getProtocol()).isNotEmpty(); - assertThat(result.getConsumerPid()).isEqualTo("consumerPid"); - assertThat(result.getProviderPid()).isEqualTo("providerPid"); - - var agreement = result.getContractAgreement(); - assertThat(agreement).isNotNull(); - assertThat(agreement.getClass()).isEqualTo(ContractAgreement.class); - assertThat(agreement.getId()).isEqualTo(AGREEMENT_ID); - assertThat(agreement.getConsumerId()).isEqualTo(CONSUMER_ID); - assertThat(agreement.getProviderId()).isEqualTo(PROVIDER_ID); - assertThat(agreement.getAssetId()).isEqualTo(TARGET); - assertThat(agreement.getContractSigningDate()).isEqualTo(Instant.parse(TIMESTAMP).getEpochSecond()); - - verify(context, never()).reportProblem(anyString()); - } - @Test void transform_nullPolicy() { var value = "example"; diff --git a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformerTest.java b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformerTest.java index 88e28f93bc5..71e6747b8c2 100644 --- a/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-negotiation/dsp-negotiation-transform/src/test/java/org/eclipse/edc/protocol/dsp/negotiation/transform/to/JsonObjectToContractAgreementVerificationMessageTransformerTest.java @@ -29,7 +29,6 @@ import static org.eclipse.edc.protocol.dsp.negotiation.transform.to.TestInput.getExpanded; import static org.eclipse.edc.protocol.dsp.spi.type.DspNegotiationPropertyAndTypeNames.DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.contains; @@ -72,25 +71,6 @@ void transform() { verify(context, never()).reportProblem(anyString()); } - @Test - void transform_processId() { - var message = jsonFactory.createObjectBuilder() - .add(JsonLdKeywords.ID, "messageId") - .add(JsonLdKeywords.TYPE, DSPACE_TYPE_CONTRACT_AGREEMENT_VERIFICATION_MESSAGE) - .add(DSPACE_PROPERTY_PROCESS_ID, "processId") - .build(); - - var result = transformer.transform(getExpanded(message), context); - - assertThat(result).isNotNull(); - assertThat(result.getClass()).isEqualTo(ContractAgreementVerificationMessage.class); - assertThat(result.getProtocol()).isNotEmpty(); - assertThat(result.getConsumerPid()).isEqualTo("processId"); - assertThat(result.getProviderPid()).isEqualTo("processId"); - - verify(context, never()).reportProblem(anyString()); - } - @Test void verify_failTransformWhenConsumerPidMissing() { var message = jsonFactory.createObjectBuilder() diff --git a/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspNegotiationPropertyAndTypeNames.java b/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspNegotiationPropertyAndTypeNames.java index 9139987675f..b86bf8faa97 100644 --- a/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspNegotiationPropertyAndTypeNames.java +++ b/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspNegotiationPropertyAndTypeNames.java @@ -38,9 +38,7 @@ public interface DspNegotiationPropertyAndTypeNames { String DSPACE_PROPERTY_AGREEMENT = DSPACE_SCHEMA + "agreement"; String DSPACE_PROPERTY_OFFER = DSPACE_SCHEMA + "offer"; String DSPACE_PROPERTY_TIMESTAMP = DSPACE_SCHEMA + "timestamp"; - @Deprecated(since = "0.5.1") String DSPACE_PROPERTY_CONSUMER_ID = DSPACE_SCHEMA + "consumerId"; - @Deprecated(since = "0.5.1") String DSPACE_PROPERTY_PROVIDER_ID = DSPACE_SCHEMA + "providerId"; // event types diff --git a/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspPropertyAndTypeNames.java b/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspPropertyAndTypeNames.java index e1f5125f2dd..1e8dd0c92ab 100644 --- a/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspPropertyAndTypeNames.java +++ b/data-protocols/dsp/dsp-spi/src/main/java/org/eclipse/edc/protocol/dsp/spi/type/DspPropertyAndTypeNames.java @@ -25,7 +25,6 @@ public interface DspPropertyAndTypeNames { String DSPACE_PROPERTY_REASON = DSPACE_SCHEMA + "reason"; String DSPACE_PROPERTY_CONSUMER_PID = DSPACE_SCHEMA + "consumerPid"; String DSPACE_PROPERTY_PROVIDER_PID = DSPACE_SCHEMA + "providerPid"; - @Deprecated(since = "0.5.1") String DSPACE_PROPERTY_PROCESS_ID = DSPACE_SCHEMA + "processId"; String DSPACE_PROPERTY_CALLBACK_ADDRESS = DSPACE_SCHEMA + "callbackAddress"; String DSPACE_PROPERTY_STATE = DSPACE_SCHEMA + "state"; diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferCompletionMessageTransformer.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferCompletionMessageTransformer.java index 7daff948535..eb9c70854d3 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferCompletionMessageTransformer.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferCompletionMessageTransformer.java @@ -25,7 +25,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_COMPLETION_MESSAGE; @@ -46,7 +45,6 @@ public JsonObjectFromTransferCompletionMessageTransformer(JsonBuilderFactory jso .add(TYPE, DSPACE_TYPE_TRANSFER_COMPLETION_MESSAGE) .add(DSPACE_PROPERTY_CONSUMER_PID, transferCompletionMessage.getConsumerPid()) .add(DSPACE_PROPERTY_PROVIDER_PID, transferCompletionMessage.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, transferCompletionMessage.getProcessId()) .build(); } } diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferRequestMessageTransformer.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferRequestMessageTransformer.java index 33a4178902f..bc9866e349b 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferRequestMessageTransformer.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferRequestMessageTransformer.java @@ -27,10 +27,8 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_FORMAT_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DEPRECATED_DCT_FORMAT_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_DATA_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_REQUEST_MESSAGE; @@ -54,11 +52,9 @@ public JsonObjectFromTransferRequestMessageTransformer(JsonBuilderFactory jsonBu .add(ID, transferRequestMessage.getId()) .add(TYPE, DSPACE_TYPE_TRANSFER_REQUEST_MESSAGE) .add(DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID, transferRequestMessage.getContractId()) - .add(DEPRECATED_DCT_FORMAT_ATTRIBUTE, format) .add(DCT_FORMAT_ATTRIBUTE, format) .add(DSPACE_PROPERTY_CALLBACK_ADDRESS, transferRequestMessage.getCallbackAddress()) - .add(DSPACE_PROPERTY_CONSUMER_PID, transferRequestMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, transferRequestMessage.getProcessId()); + .add(DSPACE_PROPERTY_CONSUMER_PID, transferRequestMessage.getConsumerPid()); if (transferRequestMessage.getDataDestination() != null && transferRequestMessage.getDataDestination().getProperties().size() > 1) { builder.add(DSPACE_PROPERTY_DATA_ADDRESS, context.transform(transferRequestMessage.getDataDestination(), JsonObject.class)); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferStartMessageTransformer.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferStartMessageTransformer.java index b6d5093497c..b991041e85d 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferStartMessageTransformer.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferStartMessageTransformer.java @@ -25,7 +25,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_DATA_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_START_MESSAGE; @@ -45,8 +44,7 @@ public JsonObjectFromTransferStartMessageTransformer(JsonBuilderFactory jsonBuil .add(ID, transferStartMessage.getId()) .add(TYPE, DSPACE_TYPE_TRANSFER_START_MESSAGE) .add(DSPACE_PROPERTY_PROVIDER_PID, transferStartMessage.getProviderPid()) - .add(DSPACE_PROPERTY_CONSUMER_PID, transferStartMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, transferStartMessage.getProcessId()); + .add(DSPACE_PROPERTY_CONSUMER_PID, transferStartMessage.getConsumerPid()); if (transferStartMessage.getDataAddress() != null) { builder.add(DSPACE_PROPERTY_DATA_ADDRESS, context.transform(transferStartMessage.getDataAddress(), JsonObject.class)); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferTerminationMessageTransformer.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferTerminationMessageTransformer.java index 5c47edb4d34..eea1ea253fd 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferTerminationMessageTransformer.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/from/JsonObjectFromTransferTerminationMessageTransformer.java @@ -26,7 +26,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_TERMINATION_MESSAGE; @@ -46,8 +45,7 @@ public JsonObjectFromTransferTerminationMessageTransformer(JsonBuilderFactory js .add(ID, transferTerminationMessage.getId()) .add(TYPE, DSPACE_TYPE_TRANSFER_TERMINATION_MESSAGE) .add(DSPACE_PROPERTY_CONSUMER_PID, transferTerminationMessage.getConsumerPid()) - .add(DSPACE_PROPERTY_PROVIDER_PID, transferTerminationMessage.getProviderPid()) - .add(DSPACE_PROPERTY_PROCESS_ID, transferTerminationMessage.getProcessId()); + .add(DSPACE_PROPERTY_PROVIDER_PID, transferTerminationMessage.getProviderPid()); addIfNotNull(transferTerminationMessage.getCode(), DSPACE_PROPERTY_CODE, builder); addIfNotNull(transferTerminationMessage.getReason(), DSPACE_PROPERTY_REASON, builder); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/to/JsonObjectToTransferRequestMessageTransformer.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/to/JsonObjectToTransferRequestMessageTransformer.java index ff8341b6e3e..536e9f6284a 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/to/JsonObjectToTransferRequestMessageTransformer.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/main/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/type/to/JsonObjectToTransferRequestMessageTransformer.java @@ -23,7 +23,6 @@ import org.jetbrains.annotations.Nullable; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_FORMAT_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DEPRECATED_DCT_FORMAT_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID; @@ -52,10 +51,8 @@ public JsonObjectToTransferRequestMessageTransformer() { visitProperties(messageObject, k -> switch (k) { case DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID -> v -> builder.contractId(transformString(v, context)); case DSPACE_PROPERTY_CALLBACK_ADDRESS -> v -> builder.callbackAddress(transformString(v, context)); - case DSPACE_PROPERTY_DATA_ADDRESS -> - v -> builder.dataDestination(transformObject(v, DataAddress.class, context)); - case DCT_FORMAT_ATTRIBUTE, DEPRECATED_DCT_FORMAT_ATTRIBUTE -> - v -> builder.transferType(transformString(v, context)); + case DSPACE_PROPERTY_DATA_ADDRESS -> v -> builder.dataDestination(transformObject(v, DataAddress.class, context)); + case DCT_FORMAT_ATTRIBUTE -> v -> builder.transferType(transformString(v, context)); default -> doNothing(); }); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferCompletionMessageTransformerTest.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferCompletionMessageTransformerTest.java index d8fd3669968..fbbf085d27e 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferCompletionMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferCompletionMessageTransformerTest.java @@ -26,7 +26,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_COMPLETION_MESSAGE; import static org.mockito.ArgumentMatchers.anyString; @@ -58,7 +57,6 @@ void transformTransferCompletionMessage() { assertThat(result.getString(JsonLdKeywords.TYPE)).isEqualTo(DSPACE_TYPE_TRANSFER_COMPLETION_MESSAGE); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); verify(context, never()).reportProblem(anyString()); } diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferRequestMessageTransformerTest.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferRequestMessageTransformerTest.java index 4219798c2f6..bcb4c53f942 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferRequestMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferRequestMessageTransformerTest.java @@ -29,10 +29,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_FORMAT_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DEPRECATED_DCT_FORMAT_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_DATA_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_REQUEST_MESSAGE; @@ -86,9 +84,7 @@ void transformTransferRequestMessageWithDataAddress() { assertThat(result.getJsonString(JsonLdKeywords.TYPE).getString()).isEqualTo(DSPACE_TYPE_TRANSFER_REQUEST_MESSAGE); assertThat(result.getJsonString(DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID).getString()).isEqualTo(contractId); assertThat(result.getJsonString(DCT_FORMAT_ATTRIBUTE).getString()).isEqualTo(dataAddressType); - assertThat(result.getJsonString(DEPRECATED_DCT_FORMAT_ATTRIBUTE).getString()).isEqualTo(dataAddressType); assertThat(result.getJsonString(DSPACE_PROPERTY_CALLBACK_ADDRESS).getString()).isEqualTo(callbackAddress); - assertThat(result.getJsonString(DSPACE_PROPERTY_PROCESS_ID).getString()).isEqualTo("processId"); assertThat(result.getJsonString(DSPACE_PROPERTY_CONSUMER_PID).getString()).isEqualTo("consumerPid"); assertThat(result.getJsonObject(DSPACE_PROPERTY_DATA_ADDRESS).getString("keyName")).isEqualTo(dataAddressKey); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferStartMessageTransformerTest.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferStartMessageTransformerTest.java index 4e34cdb78b3..d362a1b7c73 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferStartMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferStartMessageTransformerTest.java @@ -28,7 +28,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_DATA_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_START_MESSAGE; @@ -51,7 +50,6 @@ class JsonObjectFromTransferStartMessageTransformerTest { void transformTransferStartMessage() { var dataAddress = DataAddress.Builder.newInstance().type("type").build(); var message = TransferStartMessage.Builder.newInstance() - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .protocol("testProtocol") @@ -65,7 +63,6 @@ void transformTransferStartMessage() { assertThat(result).isNotNull(); assertThat(result.getString(JsonLdKeywords.TYPE)).isEqualTo(DSPACE_TYPE_TRANSFER_START_MESSAGE); - assertThat(result.getString(DSPACE_PROPERTY_PROCESS_ID)).isEqualTo("processId"); assertThat(result.getString(DSPACE_PROPERTY_PROVIDER_PID)).isEqualTo("providerPid"); assertThat(result.getString(DSPACE_PROPERTY_CONSUMER_PID)).isEqualTo("consumerPid"); assertThat(result.getJsonObject(DSPACE_PROPERTY_DATA_ADDRESS)).isEqualTo(dataAddressJson); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferTerminationMessageTransformerTest.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferTerminationMessageTransformerTest.java index 9d932b1b034..2362134803d 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferTerminationMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/from/JsonObjectFromTransferTerminationMessageTransformerTest.java @@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; -import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROCESS_ID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_PROVIDER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_TYPE_TRANSFER_TERMINATION_MESSAGE; @@ -48,7 +47,6 @@ class JsonObjectFromTransferTerminationMessageTransformerTest { @Test void transformTransferTerminationMessage() { var message = TransferTerminationMessage.Builder.newInstance() - .processId("processId") .consumerPid("consumerPid") .providerPid("providerPid") .protocol("dsp") @@ -62,7 +60,6 @@ void transformTransferTerminationMessage() { assertThat(result.getJsonString(JsonLdKeywords.TYPE).getString()).isEqualTo(DSPACE_TYPE_TRANSFER_TERMINATION_MESSAGE); assertThat(result.getJsonString(DSPACE_PROPERTY_CONSUMER_PID).getString()).isEqualTo("consumerPid"); assertThat(result.getJsonString(DSPACE_PROPERTY_PROVIDER_PID).getString()).isEqualTo("providerPid"); - assertThat(result.getJsonString(DSPACE_PROPERTY_PROCESS_ID).getString()).isEqualTo("processId"); assertThat(result.getJsonString(DSPACE_PROPERTY_CODE).getString()).isEqualTo("testCode"); assertThat(result.getJsonString(DSPACE_PROPERTY_REASON).getString()).isEqualTo("testReason"); diff --git a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/to/JsonObjectToTransferRequestMessageTransformerTest.java b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/to/JsonObjectToTransferRequestMessageTransformerTest.java index d622f47feb9..cdf5604bbc8 100644 --- a/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/to/JsonObjectToTransferRequestMessageTransformerTest.java +++ b/data-protocols/dsp/dsp-transfer-process/dsp-transfer-process-transform/src/test/java/org/eclipse/edc/protocol/dsp/transferprocess/transform/to/JsonObjectToTransferRequestMessageTransformerTest.java @@ -25,7 +25,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_FORMAT_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DEPRECATED_DCT_FORMAT_ATTRIBUTE; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CALLBACK_ADDRESS; import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CONSUMER_PID; import static org.eclipse.edc.protocol.dsp.spi.type.DspTransferProcessPropertyAndTypeNames.DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID; @@ -98,27 +97,6 @@ void jsonObjectToTransferRequestWithDataAddress() { verify(context, never()).reportProblem(anyString()); } - @Deprecated(since = "0.5.1") - @Test - void jsonObjectToTransferRequestWithDataAddress_withDeprecatedDctNamespace() { - var dataDestination = DataAddress.Builder.newInstance().type("any").build(); - when(context.transform(any(), eq(DataAddress.class))).thenReturn(dataDestination); - var json = Json.createObjectBuilder() - .add(TYPE, DSPACE_TYPE_TRANSFER_REQUEST_MESSAGE) - .add(DSPACE_PROPERTY_CONTRACT_AGREEMENT_ID, contractId) - .add(DEPRECATED_DCT_FORMAT_ATTRIBUTE, destinationType) - .add(DSPACE_PROPERTY_DATA_ADDRESS, createDataAddress()) - .add(DSPACE_PROPERTY_CALLBACK_ADDRESS, callbackAddress) - .add(DSPACE_PROPERTY_CONSUMER_PID, "processId") - .build(); - - var result = transformer.transform(getExpanded(json), context); - - assertThat(result).isNotNull(); - assertThat(result.getTransferType()).isEqualTo(destinationType); - verify(context, never()).reportProblem(anyString()); - } - @Test void shouldReturnNullAndReportError_whenConsumerPidNotSet() { when(context.problem()).thenReturn(new ProblemBuilder(context)); diff --git a/extensions/common/api/control-api-configuration/src/main/resources/control-api-version.json b/extensions/common/api/control-api-configuration/src/main/resources/control-api-version.json index bd45bde9d06..3720262d42e 100644 --- a/extensions/common/api/control-api-configuration/src/main/resources/control-api-version.json +++ b/extensions/common/api/control-api-configuration/src/main/resources/control-api-version.json @@ -1,8 +1,8 @@ [ { - "version": "1.0.1", + "version": "1.0.2", "urlPath": "/v1", - "lastUpdated": "2024-06-02T14:30:00Z", + "lastUpdated": "2024-09-04T14:30:00Z", "maturity": "stable" } -] \ No newline at end of file +] diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/ContractNegotiationApiExtension.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/ContractNegotiationApiExtension.java index 2e9282f9338..0412c0dfac0 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/ContractNegotiationApiExtension.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/ContractNegotiationApiExtension.java @@ -74,7 +74,7 @@ public void initialize(ServiceExtensionContext context) { managementApiTransformerRegistry.register(new JsonObjectFromContractNegotiationTransformer(factory)); managementApiTransformerRegistry.register(new JsonObjectFromNegotiationStateTransformer(factory)); - validatorRegistry.register(CONTRACT_REQUEST_TYPE, ContractRequestValidator.instance(monitor)); + validatorRegistry.register(CONTRACT_REQUEST_TYPE, ContractRequestValidator.instance()); validatorRegistry.register(TERMINATE_NEGOTIATION_TYPE, TerminateNegotiationValidator.instance()); webService.registerResource(ApiContext.MANAGEMENT, new ContractNegotiationApiV2Controller(service, managementApiTransformerRegistry, monitor, validatorRegistry)); diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/v2/ContractNegotiationApiV2.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/v2/ContractNegotiationApiV2.java index e145f65f332..8aae11f61fc 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/v2/ContractNegotiationApiV2.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/v2/ContractNegotiationApiV2.java @@ -141,7 +141,6 @@ record ContractRequestSchema( String protocol, @Schema(requiredMode = REQUIRED) String counterPartyAddress, - @Deprecated(since = "0.5.1") @Schema(deprecated = true, description = "please use policy.assigner instead") String providerId, @Schema(requiredMode = REQUIRED) diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidator.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidator.java index d50d83f1dc3..e2669fcf05f 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidator.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidator.java @@ -15,9 +15,7 @@ package org.eclipse.edc.connector.controlplane.api.management.contractnegotiation.validation; import jakarta.json.JsonObject; -import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.validator.jsonobject.JsonObjectValidator; -import org.eclipse.edc.validator.jsonobject.validators.LogDeprecatedValue; import org.eclipse.edc.validator.jsonobject.validators.MandatoryIdNotBlank; import org.eclipse.edc.validator.jsonobject.validators.MandatoryObject; import org.eclipse.edc.validator.jsonobject.validators.MandatoryValue; @@ -25,18 +23,15 @@ import org.eclipse.edc.validator.spi.Validator; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS; -import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.CONTRACT_REQUEST_TYPE; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.POLICY; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.PROTOCOL; -import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.PROVIDER_ID; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNER_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_OFFER; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; public class ContractRequestValidator { - public static Validator instance(Monitor monitor) { + public static Validator instance() { return JsonObjectValidator.newValidator() - .verify(PROVIDER_ID, path -> new LogDeprecatedValue(path, CONTRACT_REQUEST_TYPE, ODRL_ASSIGNER_ATTRIBUTE, monitor)) .verify(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, MandatoryValue::new) .verify(PROTOCOL, MandatoryValue::new) .verify(POLICY, MandatoryObject::new) diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/BaseContractNegotiationApiTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/BaseContractNegotiationApiTest.java index 6cf585c85f8..9d290467c96 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/BaseContractNegotiationApiTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/BaseContractNegotiationApiTest.java @@ -67,7 +67,7 @@ void setUp() { @Test void contractRequestExample() throws JsonProcessingException { - var validator = ContractRequestValidator.instance(monitor); + var validator = ContractRequestValidator.instance(); var jsonObject = objectMapper.readValue(CONTRACT_REQUEST_EXAMPLE, JsonObject.class); assertThat(jsonObject).isNotNull(); diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java index e9b18e9045d..aa591dc9079 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/controlplane/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java @@ -25,14 +25,11 @@ import static jakarta.json.Json.createArrayBuilder; import static jakarta.json.Json.createObjectBuilder; -import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.list; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS; -import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.CONTRACT_REQUEST_TYPE; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.POLICY; import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.PROTOCOL; -import static org.eclipse.edc.connector.controlplane.contract.spi.types.negotiation.ContractRequest.PROVIDER_ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VALUE; @@ -41,12 +38,11 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; class ContractRequestValidatorTest { private final Monitor monitor = mock(); - private final Validator validator = ContractRequestValidator.instance(monitor); + private final Validator validator = ContractRequestValidator.instance(); @Test void shouldSuccess_whenObjectIsValid() { @@ -115,20 +111,6 @@ void shouldFail_whenMandatoryPropertiesAreMissing() { .anySatisfy(violation -> assertThat(violation.path()).isEqualTo(PROTOCOL)); } - @Test - void shouldSucceed_whenDeprecatedProviderIdIsUsedWarningLogged() { - var expectedLogMessage = format("The attribute %s has been deprecated in type %s, please use %s", - PROVIDER_ID, CONTRACT_REQUEST_TYPE, ODRL_ASSIGNER_ATTRIBUTE); - - var input = Json.createObjectBuilder() - .add(PROVIDER_ID, value("provider_id")) - .build(); - - validator.validate(input); - - verify(monitor).warning(expectedLogMessage); - } - private JsonArrayBuilder value(String value) { return createArrayBuilder().add(createObjectBuilder().add(VALUE, value)); } diff --git a/extensions/control-plane/transfer/transfer-data-plane/README.md b/extensions/control-plane/transfer/transfer-data-plane/README.md deleted file mode 100644 index 0007621028f..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Transfer Data Plane - -This extension provides services for delegating data transfer to the Data Plane. Especially two types of data transfers are supported: - -- Consumer Pull: data consumer pulls actively the data by hitting an endpoint exposed by the provider. This use-case is typically - used in cases where the data provider wants to use its Data Plane as a http proxy for querying data to an API. -- Provider Push: if data request is successfully processed, then the provider pushes data from its data source to the consumer. - -## Background - -The Data Plane is the component performing the actual data exchange between the provider and the consumer. Once an agreement -is established between the consumer and the provider, then the consumer can trigger the data request that will initiate the data exchange. -When at this stage, the present extension is used for delegating the data transfer to the appropriate Data Plane instance. - -### Scope - -This extension is to be used for every data transfer use-case relying on the EDC data plane. - -### Use Cases - -#### Consumer pull - -Let us consider that a data provider wants to expose a REST API serving flight schedule data. This REST API takes in input -a set of query parameters which enables to restrict the amount of data returned in the response, e.g. departure date, boarding airport... -A consumer of this API will potentially be interested in hitting this API several times, potentially with different parameters, depending -on how the consumer backend application are exploiting the data. - -For this use-case, the Provider Push data transfer type would not be relevant, as it would require to establish a new contract before -the consumer send a new http request, which would potentially overload the Control Plane. The Consumer Pull data transfer comes handy in that case. - -To trigger this data transfer type, the destination type of the `DataRequest` must be set to `HttpProxy`. - -#### Provider push - -A consumer wants to perform a one-time transfer of a large amount of data stored in a S3 bucket on provider side, and -put these data into its Azure Blob Storage. - -## Technical Details - -### Interfaces - -This extension introduces a Control Plane endpoint used by the Data Plane for validating the access token received in input -of its public API. OpenApi documentation can be found [here](../../../../resources/openapi/yaml/transfer-data-plane.yaml). diff --git a/extensions/control-plane/transfer/transfer-data-plane/build.gradle.kts b/extensions/control-plane/transfer/transfer-data-plane/build.gradle.kts deleted file mode 100644 index e56703b7e39..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -plugins { - `java-library` - id(libs.plugins.swagger.get().pluginId) -} - -dependencies { - api(project(":spi:common:core-spi")) - api(project(":spi:control-plane:contract-spi")) - api(project(":spi:control-plane:transfer-spi")) - api(project(":spi:common:web-spi")) - - api(project(":spi:control-plane:transfer-data-plane-spi")) - api(project(":spi:data-plane:data-plane-spi")) - api(project(":extensions:data-plane:data-plane-client")) - api(project(":spi:data-plane-selector:data-plane-selector-spi")) - - implementation(project(":spi:common:keys-spi")) - implementation(project(":core:common:token-core")) - - api(libs.jakarta.rsApi) - api(libs.nimbus.jwt) - // Note: nimbus requires bouncycastle as mentioned in documentation: - // https://www.javadoc.io/doc/com.nimbusds/nimbus-jose-jwt/7.2.1/com/nimbusds/jose/jwk/JWK.html#parseFromPEMEncodedObjects-java.lang.String- - api(libs.bouncyCastle.bcpkixJdk18on) - - testImplementation(project(":core:common:junit")) - testImplementation(libs.jersey.multipart) -} - -edcBuild { - swagger { - apiGroup.set("control-api") - } -} - - - diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtension.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtension.java deleted file mode 100644 index acb5a1abfa0..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtension.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * Mercedes-Benz Tech Innovation GmbH - DataEncrypter can be provided by extensions - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane; - -import org.eclipse.edc.connector.controlplane.transfer.dataplane.api.ConsumerPullTransferTokenValidationApiController; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.flow.ConsumerPullTransferDataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.flow.ProviderPushTransferDataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy.ConsumerPullDataPlaneProxyResolver; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.token.ConsumerPullTokenExpirationDateFunction; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.validation.ExpirationDateValidationRule; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.DataFlowManager; -import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClientFactory; -import org.eclipse.edc.jwt.signer.spi.JwsSignerProvider; -import org.eclipse.edc.keys.spi.LocalPublicKeyService; -import org.eclipse.edc.keys.spi.PrivateKeyResolver; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Setting; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.token.JwtGenerationService; -import org.eclipse.edc.token.spi.TokenValidationRulesRegistry; -import org.eclipse.edc.token.spi.TokenValidationService; -import org.eclipse.edc.validator.spi.DataAddressValidatorRegistry; -import org.eclipse.edc.validator.spi.ValidationResult; -import org.eclipse.edc.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; -import org.eclipse.edc.web.spi.configuration.context.ControlApiUrl; - -import java.time.Clock; - -@Extension(value = TransferDataPlaneCoreExtension.NAME) -public class TransferDataPlaneCoreExtension implements ServiceExtension { - - @Setting(value = "Alias of private key used for signing tokens, retrieved from private key resolver") - public static final String TOKEN_SIGNER_PRIVATE_KEY_ALIAS = "edc.transfer.proxy.token.signer.privatekey.alias"; - - @Setting(value = "Alias of public key used for verifying the tokens, retrieved from the vault") - public static final String TOKEN_VERIFIER_PUBLIC_KEY_ALIAS = "edc.transfer.proxy.token.verifier.publickey.alias"; - - public static final String NAME = "Transfer Data Plane Core"; - public static final String TRANSFER_DATAPLANE_TOKEN_CONTEXT = "dataplane-transfer"; - - @Inject - private WebService webService; - - @Inject - private DataFlowManager dataFlowManager; - - @Inject - private Clock clock; - - @Inject - private DataEncrypter dataEncrypter; - - @Inject - private DataPlaneSelectorService selectorService; - - @Inject - private DataPlaneClientFactory clientFactory; - - @Inject - private ConsumerPullTokenExpirationDateFunction tokenExpirationDateFunction; - - @Inject(required = false) - private ControlApiUrl callbackUrl; - - @Inject - private TypeManager typeManager; - - @Inject - private LocalPublicKeyService publicKeyService; - - @Inject - private PrivateKeyResolver privateKeyResolver; - - @Inject - private DataAddressValidatorRegistry dataAddressValidatorRegistry; - - @Inject - private TokenValidationRulesRegistry tokenValidationRulesRegistry; - - @Inject - private TokenValidationService tokenValidationService; - @Inject - private JwsSignerProvider jwsSignerProvider; - - @Override - public String name() { - return NAME; - } - - @Override - public void initialize(ServiceExtensionContext context) { - var monitor = context.getMonitor(); - monitor.warning("The transfer-data-plane extension has been deprecated, please switch to the Data Plane Signaling feature."); - var publicKeyAlias = context.getSetting(TOKEN_VERIFIER_PUBLIC_KEY_ALIAS, null); - var privateKeyAlias = context.getSetting(TOKEN_SIGNER_PRIVATE_KEY_ALIAS, null); - - if (publicKeyAlias != null && privateKeyAlias != null) { - var controller = new ConsumerPullTransferTokenValidationApiController(tokenValidationService, dataEncrypter, typeManager, (i) -> publicKeyService.resolveKey(publicKeyAlias)); - webService.registerResource(ApiContext.CONTROL, controller); - - var resolver = new ConsumerPullDataPlaneProxyResolver(dataEncrypter, typeManager, new JwtGenerationService(jwsSignerProvider), () -> privateKeyAlias, () -> publicKeyAlias, tokenExpirationDateFunction); - dataFlowManager.register(new ConsumerPullTransferDataFlowController(selectorService, resolver)); - } else { - monitor.info("One of these settings is not configured, so the connector won't be able to provide 'consumer-pull' transfers: [%s, %s]" - .formatted(TOKEN_VERIFIER_PUBLIC_KEY_ALIAS, TOKEN_SIGNER_PRIVATE_KEY_ALIAS)); - } - - tokenValidationRulesRegistry.addRule(TRANSFER_DATAPLANE_TOKEN_CONTEXT, new ExpirationDateValidationRule(clock)); - - dataFlowManager.register(new ProviderPushTransferDataFlowController(callbackUrl, selectorService, clientFactory)); - dataAddressValidatorRegistry.registerDestinationValidator("HttpProxy", dataAddress -> ValidationResult.success()); - } - -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneDefaultServicesExtension.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneDefaultServicesExtension.java deleted file mode 100644 index a45ca631be3..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneDefaultServicesExtension.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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.controlplane.transfer.dataplane; - -import org.eclipse.edc.connector.controlplane.transfer.dataplane.security.NoopDataEncrypter; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.token.ConsumerPullTokenExpirationDateFunction; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Provider; -import org.eclipse.edc.runtime.metamodel.annotation.Setting; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; - -import java.time.Clock; -import java.util.Date; - -/** - * Provides default service implementations for fallback - * Omitted {@link Extension since this module already contains {@link TransferDataPlaneCoreExtension }} - */ -public class TransferDataPlaneDefaultServicesExtension implements ServiceExtension { - - private static final String DEFAULT_TOKEN_VALIDITY_SECONDS = "600"; // 10min - @Setting(value = "Validity (in seconds) of tokens issued by the Control Plane for targeting the Data Plane public API.", type = "long", defaultValue = DEFAULT_TOKEN_VALIDITY_SECONDS) - private static final String TOKEN_VALIDITY_SECONDS = "edc.transfer.proxy.token.validity.seconds"; - - public static final String NAME = "Transfer Data Plane Default Services"; - - @Inject - private Clock clock; - - @Override - public String name() { - return NAME; - } - - @Provider(isDefault = true) - public DataEncrypter getDataEncrypter(ServiceExtensionContext context) { - context.getMonitor().warning("No DataEncrypter registered, a no-op implementation will be used, not suitable for production environments"); - return new NoopDataEncrypter(); - } - - @Provider(isDefault = true) - public ConsumerPullTokenExpirationDateFunction tokenExpirationDateFunction(ServiceExtensionContext context) { - var validity = context.getSetting(TOKEN_VALIDITY_SECONDS, Integer.parseInt(DEFAULT_TOKEN_VALIDITY_SECONDS)); - return (contentAddress, contractId) -> Result.success(Date.from(clock.instant().plusSeconds(validity))); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApi.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApi.java deleted file mode 100644 index f27687d5b89..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApi.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.api; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.eclipse.edc.spi.types.domain.DataAddress; - -@OpenAPIDefinition -@Tag(name = "Consumer Pull Token Validation") -public interface ConsumerPullTransferTokenValidationApi { - - @Operation(description = "Checks that the provided token has been signed by the present entity and asserts its validity. " + - "If token is valid, then the data address contained in its claims is decrypted and returned back to the caller.", - responses = { - @ApiResponse(responseCode = "200", description = "Token is valid"), - @ApiResponse(responseCode = "400", description = "Request was malformed"), - @ApiResponse(responseCode = "403", description = "Token is invalid") } - ) - DataAddress validate(String token); -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiController.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiController.java deleted file mode 100644 index 315b360db38..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiController.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.api; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.HeaderParam; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.keys.spi.PublicKeyResolver; -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.token.spi.TokenValidationService; -import org.eclipse.edc.web.spi.exception.InvalidRequestException; -import org.eclipse.edc.web.spi.exception.NotAuthorizedException; - -import static java.lang.String.format; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.DATA_ADDRESS; - -@Path("/token") -public class ConsumerPullTransferTokenValidationApiController implements ConsumerPullTransferTokenValidationApi { - private final TokenValidationService service; - private final DataEncrypter dataEncrypter; - private final TypeManager typeManager; - private final PublicKeyResolver publicKeyResolver; - - public ConsumerPullTransferTokenValidationApiController(TokenValidationService service, DataEncrypter dataEncrypter, TypeManager typeManager, PublicKeyResolver publicKeyResolver) { - this.service = service; - this.dataEncrypter = dataEncrypter; - this.typeManager = typeManager; - this.publicKeyResolver = publicKeyResolver; - } - - /** - * Validate the token provided in input and decrypt the {@link DataAddress} - * contained in its claims. - * - * @param token Input token. - * @return Decrypted DataAddress contained in the input token claims. - */ - @GET - @Produces({ MediaType.APPLICATION_JSON }) - @Override - public DataAddress validate(@HeaderParam(HttpHeaders.AUTHORIZATION) String token) { - return service.validate(token, publicKeyResolver) - .map(this::extractDataAddressClaim) - .map(this::toDataAddress) - .orElseThrow(failure -> new NotAuthorizedException("Token validation failed: " + failure.getFailureDetail())); - } - - String extractDataAddressClaim(ClaimToken claims) { - var claim = claims.getClaim(DATA_ADDRESS); - if (!(claim instanceof String)) { - throw new InvalidRequestException(format("Missing claim `%s` in token", DATA_ADDRESS)); - } - return (String) claim; - } - - private DataAddress toDataAddress(String claim) { - return typeManager.readValue(dataEncrypter.decrypt(claim), DataAddress.class); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowController.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowController.java deleted file mode 100644 index 415948fd183..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowController.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.flow; - -import org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy.ConsumerPullDataPlaneProxyResolver; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.DataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.DataFlowResponse; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.response.StatusResult; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; -import java.util.Set; - -import static java.lang.String.format; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.HTTP_PROXY; -import static org.eclipse.edc.spi.response.ResponseStatus.FATAL_ERROR; -import static org.eclipse.edc.spi.response.StatusResult.failure; -import static org.eclipse.edc.spi.types.domain.transfer.FlowType.PULL; - -@Deprecated(since = "0.5.1") -public class ConsumerPullTransferDataFlowController implements DataFlowController { - - private final DataPlaneSelectorService selectorService; - private final ConsumerPullDataPlaneProxyResolver resolver; - - private final Set transferTypes = Set.of("%s-%s".formatted("HttpData", PULL)); - - public ConsumerPullTransferDataFlowController(DataPlaneSelectorService selectorService, ConsumerPullDataPlaneProxyResolver resolver) { - this.selectorService = selectorService; - this.resolver = resolver; - } - - @Override - public boolean canHandle(TransferProcess transferProcess) { - // Backward compatibility: can handle if destination type is `HttpProxy` or the transfer type is `Http-PULL` - return HTTP_PROXY.equals(transferProcess.getDestinationType()) || - (Optional.ofNullable(transferProcess.getTransferType()).map(transferTypes::contains).orElse(false)); - } - - @Override - public @NotNull StatusResult start(TransferProcess transferProcess, Policy policy) { - var contentAddress = transferProcess.getContentDataAddress(); - - return Optional.ofNullable(selectorService.select(contentAddress, destinationAddress(transferProcess))) - .map(instance -> resolver.toDataAddress(transferProcess, contentAddress, instance) - .map(this::toResponse) - .map(StatusResult::success) - .orElse(failure -> failure(FATAL_ERROR, "Failed to generate proxy: " + failure.getFailureDetail()))) - .orElse(failure(FATAL_ERROR, format("Failed to find DataPlaneInstance for source/destination: %s/%s", contentAddress.getType(), HTTP_PROXY))); - } - - @Override - public StatusResult suspend(TransferProcess transferProcess) { - throw new RuntimeException("not implemented"); - } - - @Override - public StatusResult terminate(TransferProcess transferProcess) { - return StatusResult.success(); - } - - @Override - public Set transferTypesFor(Asset asset) { - return transferTypes; - } - - // Shim translation from "Http-PULL" to HttpProxy dataAddress - private DataAddress destinationAddress(TransferProcess transferProcess) { - if (transferTypes.contains(transferProcess.getDestinationType())) { - var dadBuilder = DataAddress.Builder.newInstance(); - transferProcess.getDataDestination().getProperties().forEach(dadBuilder::property); - return dadBuilder.type(HTTP_PROXY).build(); - } else { - return transferProcess.getDataDestination(); - } - } - - private DataFlowResponse toResponse(DataAddress address) { - return DataFlowResponse.Builder.newInstance().dataAddress(address).build(); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowController.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowController.java deleted file mode 100644 index fd624474311..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowController.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.flow; - -import org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.DataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.DataFlowResponse; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClientFactory; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.response.ResponseStatus; -import org.eclipse.edc.spi.response.StatusResult; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.eclipse.edc.web.spi.configuration.context.ControlApiUrl; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.toSet; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.HTTP_PROXY; -import static org.eclipse.edc.spi.types.domain.transfer.FlowType.PULL; -import static org.eclipse.edc.spi.types.domain.transfer.FlowType.PUSH; - -@Deprecated(since = "0.5.1") -public class ProviderPushTransferDataFlowController implements DataFlowController { - - private final ControlApiUrl callbackUrl; - private final DataPlaneSelectorService selectorClient; - private final DataPlaneClientFactory clientFactory; - - private final Set transferTypes = Set.of("%s-%s".formatted("HttpData", PULL)); - - public ProviderPushTransferDataFlowController(ControlApiUrl callbackUrl, DataPlaneSelectorService selectorClient, DataPlaneClientFactory clientFactory) { - this.callbackUrl = callbackUrl; - this.selectorClient = selectorClient; - this.clientFactory = clientFactory; - } - - @Override - public boolean canHandle(TransferProcess transferProcess) { - // Backward compatibility: adds check if a transfer type is provided, it should not be Http-PULL - return !HTTP_PROXY.equals(transferProcess.getDestinationType()) && - (Optional.ofNullable(transferProcess.getTransferType()).map(type -> !transferTypes.contains(type)).orElse(true)); - - } - - @Override - public @NotNull StatusResult start(TransferProcess transferProcess, Policy policy) { - var dataFlowRequest = DataFlowStartMessage.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .processId(transferProcess.getId()) - .sourceDataAddress(transferProcess.getContentDataAddress()) - .destinationDataAddress(transferProcess.getDataDestination()) - .flowType(PUSH) - .callbackAddress(callbackUrl != null ? callbackUrl.get() : null) - .build(); - - var dataPlaneInstance = selectorClient.select(transferProcess.getContentDataAddress(), transferProcess.getDataDestination()); - - var dataPlaneInstanceId = dataPlaneInstance != null ? dataPlaneInstance.getId() : null; - return clientFactory.createClient(dataPlaneInstance) - .start(dataFlowRequest) - .map(it -> DataFlowResponse.Builder.newInstance().dataPlaneId(dataPlaneInstanceId).build()); - } - - @Override - public StatusResult suspend(TransferProcess transferProcess) { - throw new RuntimeException("not implemented"); - } - - @Override - public StatusResult terminate(TransferProcess transferProcess) { - return selectorClient.getAll().getContent().stream() // result is not evaluated because this class is deprecated - .filter(dataPlaneInstanceFilter(transferProcess)) - .map(clientFactory::createClient) - .map(client -> client.terminate(transferProcess.getId())) - .reduce(StatusResult::merge) - .orElse(StatusResult.failure(ResponseStatus.FATAL_ERROR, "Failed to select the data plane for terminating the transfer process %s".formatted(transferProcess.getId()))); - } - - @Override - public Set transferTypesFor(Asset asset) { - return selectorClient.getAll().getContent().stream() // result is not evaluated because this class is deprecated - .filter(it -> it.getAllowedSourceTypes().contains(asset.getDataAddress().getType())) - .map(DataPlaneInstance::getAllowedDestTypes) - .flatMap(Collection::stream) - .map(it -> "%s-%s".formatted(it, PUSH)) - .collect(toSet()); - } - - private Predicate dataPlaneInstanceFilter(TransferProcess transferProcess) { - if (transferProcess.getDataPlaneId() != null) { - return (dataPlaneInstance -> dataPlaneInstance.getId().equals(transferProcess.getDataPlaneId())); - } else { - return (d) -> true; - } - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolver.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolver.java deleted file mode 100644 index be4ac830e5b..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolver.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2023 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy; - -import jakarta.ws.rs.core.HttpHeaders; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.token.ConsumerPullTokenExpirationDateFunction; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.spi.iam.TokenRepresentation; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.edc.token.spi.KeyIdDecorator; -import org.eclipse.edc.token.spi.TokenGenerationService; - -import java.util.Optional; -import java.util.function.Supplier; - -import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; - -@Deprecated(since = "0.5.1") -public class ConsumerPullDataPlaneProxyResolver { - - private static final String PUBLIC_API_URL_PROPERTY_DEPRECATED = "publicApiUrl"; - private static final String PUBLIC_API_URL_PROPERTY = EDC_NAMESPACE + "publicApiUrl"; - - private final DataEncrypter dataEncrypter; - private final TypeManager typeManager; - private final TokenGenerationService tokenGenerationService; - private final Supplier privateKeyIdSupplier; - private final Supplier publicKeyIdSupplier; - private final ConsumerPullTokenExpirationDateFunction tokenExpirationDateFunction; - - public ConsumerPullDataPlaneProxyResolver(DataEncrypter dataEncrypter, TypeManager typeManager, TokenGenerationService tokenGenerationService, - Supplier privateKeyIdSupplier, Supplier publicKeyIdSupplier, - ConsumerPullTokenExpirationDateFunction tokenExpirationDateFunction) { - this.dataEncrypter = dataEncrypter; - this.typeManager = typeManager; - this.tokenExpirationDateFunction = tokenExpirationDateFunction; - this.tokenGenerationService = tokenGenerationService; - this.privateKeyIdSupplier = privateKeyIdSupplier; - this.publicKeyIdSupplier = publicKeyIdSupplier; - } - - private static Object getPublicApiUrl(DataPlaneInstance instance) { - return Optional.ofNullable(instance.getProperties().get(PUBLIC_API_URL_PROPERTY)) - .orElseGet(() -> instance.getProperties().get(PUBLIC_API_URL_PROPERTY_DEPRECATED)); - } - - public Result toDataAddress(TransferProcess transferProcess, DataAddress address, DataPlaneInstance instance) { - return resolveProxyUrl(instance) - .compose(proxyUrl -> generateAccessToken(address, transferProcess.getContractId()) - .map(token -> DataAddress.Builder.newInstance() - .type(EndpointDataReference.EDR_SIMPLE_TYPE) - .property(EndpointDataReference.ID, transferProcess.getCorrelationId()) - .property(EndpointDataReference.CONTRACT_ID, transferProcess.getContractId()) - .property(EndpointDataReference.ENDPOINT, proxyUrl) - .property(EndpointDataReference.AUTH_KEY, HttpHeaders.AUTHORIZATION) - .property(EndpointDataReference.AUTH_CODE, token) - .build())); - } - - private Result resolveProxyUrl(DataPlaneInstance instance) { - return Optional.ofNullable(getPublicApiUrl(instance)) - .map(url -> Result.success((String) url)) - .orElse(Result.failure(String.format("Missing property `%s` (deprecated: `%s`) in DataPlaneInstance", PUBLIC_API_URL_PROPERTY, PUBLIC_API_URL_PROPERTY_DEPRECATED))); - } - - private Result generateAccessToken(DataAddress source, String contractId) { - var encryptedDataAddress = dataEncrypter.encrypt(typeManager.writeValueAsString(source)); - return tokenExpirationDateFunction.expiresAt(source, contractId) - .compose(expiration -> { - var keyIdDecorator = new KeyIdDecorator(publicKeyIdSupplier.get()); - var dataAddressDecorator = new ConsumerPullDataPlaneProxyTokenDecorator(expiration, encryptedDataAddress); - return tokenGenerationService.generate(privateKeyIdSupplier.get(), keyIdDecorator, dataAddressDecorator); - }) - .map(TokenRepresentation::getToken); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecorator.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecorator.java deleted file mode 100644 index b19f9b4084b..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy; - -import org.eclipse.edc.spi.iam.TokenParameters; -import org.eclipse.edc.token.spi.TokenDecorator; - -import java.util.Date; - -import static com.nimbusds.jwt.JWTClaimNames.EXPIRATION_TIME; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.DATA_ADDRESS; - -/** - * Decorator for access token used in input of Data Plane public API. The token is composed of: - * - a contract id (used to check if contract between consumer and provider is still valid). - * - the address of the data source formatted as an encrypted string. - */ -class ConsumerPullDataPlaneProxyTokenDecorator implements TokenDecorator { - - private final Date expirationDate; - private final String encryptedDataAddress; - - ConsumerPullDataPlaneProxyTokenDecorator(Date expirationDate, String encryptedDataAddress) { - this.expirationDate = expirationDate; - this.encryptedDataAddress = encryptedDataAddress; - } - - @Override - public TokenParameters.Builder decorate(TokenParameters.Builder tokenParameters) { - return tokenParameters.claims(EXPIRATION_TIME, expirationDate) - .claims(DATA_ADDRESS, encryptedDataAddress); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/security/NoopDataEncrypter.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/security/NoopDataEncrypter.java deleted file mode 100644 index 4ad9b44a93d..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/security/NoopDataEncrypter.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.security; - - -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; - -/** - * No-op implementation of {@link DataEncrypter}. - */ -public class NoopDataEncrypter implements DataEncrypter { - @Override - public String encrypt(String raw) { - return raw; - } - - @Override - public String decrypt(String encrypted) { - return encrypted; - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRule.java b/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRule.java deleted file mode 100644 index e5940ecd1b8..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRule.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.validation; - -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.token.spi.TokenValidationRule; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.time.Clock; -import java.util.Map; - -import static com.nimbusds.jwt.JWTClaimNames.EXPIRATION_TIME; - -/** - * Assert that token containing these claims is not expired yet. - */ -public class ExpirationDateValidationRule implements TokenValidationRule { - - private final Clock clock; - - public ExpirationDateValidationRule(Clock clock) { - this.clock = clock; - } - - @Override - public Result checkRule(@NotNull ClaimToken toVerify, @Nullable Map additional) { - var expiration = toVerify.getInstantClaim(EXPIRATION_TIME); - if (expiration == null) { - return Result.failure("Missing expiration time in token"); - } - - // check contract expiration date - if (clock.instant().isAfter(expiration)) { - return Result.failure("Token has expired on " + expiration); - } - - return Result.success(); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/control-plane/transfer/transfer-data-plane/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index 1367a4916fb..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (c) 2022 Amadeus -# -# 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: -# Amadeus - initial API and implementation -# -# - -org.eclipse.edc.connector.controlplane.transfer.dataplane.TransferDataPlaneCoreExtension -org.eclipse.edc.connector.controlplane.transfer.dataplane.TransferDataPlaneDefaultServicesExtension \ No newline at end of file diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtensionTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtensionTest.java deleted file mode 100644 index 05a1c83534b..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/TransferDataPlaneCoreExtensionTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane; - -import org.eclipse.edc.connector.controlplane.transfer.dataplane.api.ConsumerPullTransferTokenValidationApiController; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.flow.ConsumerPullTransferDataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.flow.ProviderPushTransferDataFlowController; -import org.eclipse.edc.connector.controlplane.transfer.spi.flow.DataFlowManager; -import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; -import org.eclipse.edc.spi.monitor.Monitor; -import org.eclipse.edc.spi.security.Vault; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.system.configuration.Config; -import org.eclipse.edc.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import java.io.IOException; -import java.util.Objects; - -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.TransferDataPlaneCoreExtension.TOKEN_SIGNER_PRIVATE_KEY_ALIAS; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.TransferDataPlaneCoreExtension.TOKEN_VERIFIER_PUBLIC_KEY_ALIAS; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; - -@ExtendWith(DependencyInjectionExtension.class) -class TransferDataPlaneCoreExtensionTest { - - private final Vault vault = mock(); - private final WebService webService = mock(); - private final DataFlowManager dataFlowManager = mock(); - private final Monitor monitor = mock(); - - @BeforeEach - public void setUp(ServiceExtensionContext context) { - context.registerService(WebService.class, webService); - context.registerService(DataFlowManager.class, dataFlowManager); - context.registerService(Vault.class, vault); - - when(context.getMonitor()).thenReturn(monitor); - } - - @Test - void verifyInitializeSuccess(TransferDataPlaneCoreExtension extension, ServiceExtensionContext context) throws IOException { - var publicKeyAlias = "publicKey"; - var privateKeyAlias = "privateKey"; - var config = mock(Config.class); - when(context.getConfig()).thenReturn(config); - when(config.getString(TOKEN_VERIFIER_PUBLIC_KEY_ALIAS, null)).thenReturn(publicKeyAlias); - when(config.getString(TOKEN_SIGNER_PRIVATE_KEY_ALIAS, null)).thenReturn(privateKeyAlias); - when(vault.resolveSecret(publicKeyAlias)).thenReturn(publicKeyPem()); - - extension.initialize(context); - - verify(dataFlowManager).register(any(ConsumerPullTransferDataFlowController.class)); - verify(dataFlowManager).register(any(ProviderPushTransferDataFlowController.class)); - verify(webService).registerResource(eq(ApiContext.CONTROL), any(ConsumerPullTransferTokenValidationApiController.class)); - } - - @Test - void shouldNotRegisterConsumerPullControllers_whenSettingsAreMissing(TransferDataPlaneCoreExtension extension, ServiceExtensionContext context) { - var config = mock(Config.class); - when(context.getConfig()).thenReturn(config); - when(config.getString(TOKEN_VERIFIER_PUBLIC_KEY_ALIAS, null)).thenReturn(null); - when(config.getString(TOKEN_SIGNER_PRIVATE_KEY_ALIAS, null)).thenReturn(null); - - extension.initialize(context); - - verify(dataFlowManager, never()).register(isA(ConsumerPullTransferDataFlowController.class)); - verifyNoInteractions(webService); - verify(monitor).info(any(String.class)); - } - - private String publicKeyPem() throws IOException { - try (var resource = TransferDataPlaneCoreExtensionTest.class.getClassLoader().getResourceAsStream("rsa-pubkey.pem")) { - return new String(Objects.requireNonNull(resource).readAllBytes()); - } - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiControllerTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiControllerTest.java deleted file mode 100644 index 971000e5149..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/api/ConsumerPullTransferTokenValidationApiControllerTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.api; - -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.keys.spi.PublicKeyResolver; -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.token.spi.TokenValidationService; -import org.eclipse.edc.web.spi.exception.InvalidRequestException; -import org.eclipse.edc.web.spi.exception.NotAuthorizedException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Map; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.DATA_ADDRESS; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class ConsumerPullTransferTokenValidationApiControllerTest { - - private static final TypeManager TYPE_MANAGER = new JacksonTypeManager(); - - private final DataEncrypter encrypterMock = mock(DataEncrypter.class); - private final TokenValidationService tokenValidationServiceMock = mock(TokenValidationService.class); - private final PublicKeyResolver publicKeyResolver = mock(); - private ConsumerPullTransferTokenValidationApiController controller; - - @BeforeEach - void setUp() { - controller = new ConsumerPullTransferTokenValidationApiController(tokenValidationServiceMock, encrypterMock, TYPE_MANAGER, publicKeyResolver); - } - - @Test - void verifyValidateSuccess() { - var token = UUID.randomUUID().toString(); - var encryptedDataAddress = UUID.randomUUID().toString(); - var decryptedDataAddress = DataAddress.Builder.newInstance().type(UUID.randomUUID().toString()).build(); - var claims = ClaimToken.Builder.newInstance() - .claims(Map.of( - "key1", "value1", - DATA_ADDRESS, encryptedDataAddress - ) - ) - .build(); - - when(tokenValidationServiceMock.validate(token, publicKeyResolver)).thenReturn(Result.success(claims)); - when(encrypterMock.decrypt(encryptedDataAddress)).thenReturn(TYPE_MANAGER.writeValueAsString(decryptedDataAddress)); - - var responseAddress = controller.validate(token); - assertThat(responseAddress.getType()).isEqualTo(decryptedDataAddress.getType()); - - verify(tokenValidationServiceMock).validate(anyString(), eq(publicKeyResolver)); - verify(encrypterMock).decrypt(anyString()); - } - - @Test - void verifyTokenValidationFailureThrowsException() { - var token = UUID.randomUUID().toString(); - var errorMsg = UUID.randomUUID().toString(); - - when(tokenValidationServiceMock.validate(token, publicKeyResolver)).thenReturn(Result.failure(errorMsg)); - - assertThatExceptionOfType(NotAuthorizedException.class).isThrownBy(() -> controller.validate(token)); - - verify(encrypterMock, never()).decrypt(anyString()); - } - - @Test - void verifyMissingAddressThrowsException() { - var token = UUID.randomUUID().toString(); - var claims = ClaimToken.Builder.newInstance() - .claims(Map.of("key1", "value1")) - .build(); - - when(tokenValidationServiceMock.validate(token, publicKeyResolver)).thenReturn(Result.success(claims)); - - assertThatExceptionOfType(InvalidRequestException.class).isThrownBy(() -> controller.validate(token)); - - verify(encrypterMock, never()).decrypt(anyString()); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowControllerTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowControllerTest.java deleted file mode 100644 index 951c8d9881a..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ConsumerPullTransferDataFlowControllerTest.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.flow; - -import org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy.ConsumerPullDataPlaneProxyResolver; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.result.Failure; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.junit.jupiter.api.Test; - -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.HTTP_PROXY; -import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class ConsumerPullTransferDataFlowControllerTest { - - private final DataPlaneSelectorService selectorService = mock(); - private final ConsumerPullDataPlaneProxyResolver resolver = mock(); - - private final ConsumerPullTransferDataFlowController flowController = new ConsumerPullTransferDataFlowController(selectorService, resolver); - - private static final String HTTP_DATA_PULL = "HttpData-PULL"; - - @Test - void verifyCanHandle() { - assertThat(flowController.canHandle(transferProcess(HTTP_PROXY))).isTrue(); - assertThat(flowController.canHandle(transferProcess(HTTP_DATA_PULL, HTTP_DATA_PULL))).isTrue(); - assertThat(flowController.canHandle(transferProcess(HTTP_DATA_PULL, null))).isFalse(); - assertThat(flowController.canHandle(transferProcess("not-http-proxy"))).isFalse(); - } - - @Test - void initiateFlow_success() { - var proxyAddress = dataAddress(); - var instance = mock(DataPlaneInstance.class); - var transferProcess = transferProcessBuilder(HTTP_PROXY) - .contentDataAddress(dataAddress()) - .build(); - - when(selectorService.select(any(), argThat(destination -> destination.getType().equals(HTTP_PROXY)))).thenReturn(instance); - when(resolver.toDataAddress(any(), any(), any())).thenReturn(Result.success(proxyAddress)); - - var result = flowController.start(transferProcess, null); - - assertThat(result).isSucceeded().satisfies(response -> { - assertThat(response.getDataAddress()).isEqualTo(proxyAddress); - }); - } - - @Test - void initiateFlow_success_withTransferType() { - var proxyAddress = dataAddress(); - var instance = mock(DataPlaneInstance.class); - var transferProcess = transferProcessBuilder(HTTP_PROXY) - .transferType(HTTP_DATA_PULL) - .contentDataAddress(dataAddress()) - .build(); - - when(selectorService.select(any(), argThat(destination -> destination.getType().equals(HTTP_PROXY)))).thenReturn(instance); - when(resolver.toDataAddress(any(), any(), any())).thenReturn(Result.success(proxyAddress)); - - var result = flowController.start(transferProcess, null); - - assertThat(result).isSucceeded().satisfies(response -> { - assertThat(response.getDataAddress()).isEqualTo(proxyAddress); - }); - } - - @Test - void initiateFlow_returnsFailureIfNoDataPlaneInstance() { - var transferProcess = transferProcessBuilder(HTTP_PROXY) - .contentDataAddress(dataAddress()) - .build(); - - var result = flowController.start(transferProcess, null); - - - assertThat(result).isFailed().extracting(Failure::getFailureDetail).asString() - .isEqualTo(String.format("Failed to find DataPlaneInstance for source/destination: %s/%s", transferProcess.getContentDataAddress().getType(), HTTP_PROXY)); - } - - @Test - void initiateFlow_returnsFailureIfAddressResolutionFails() { - var errorMsg = "Test Error Message"; - var instance = mock(DataPlaneInstance.class); - var transferProcess = transferProcessBuilder(HTTP_PROXY) - .contentDataAddress(dataAddress()) - .build(); - - when(selectorService.select(any(), argThat(destination -> destination.getType().equals(HTTP_PROXY)))).thenReturn(instance); - when(resolver.toDataAddress(any(), any(), any())).thenReturn(Result.failure(errorMsg)); - - var result = flowController.start(transferProcess, Policy.Builder.newInstance().build()); - - assertThat(result).isFailed().extracting(Failure::getFailureDetail).asString().contains(errorMsg); - } - - @Test - void terminate_shouldAlwaysReturnSuccess() { - var transferProcess = transferProcessBuilder(HTTP_PROXY) - .contentDataAddress(dataAddress()) - .build(); - - var result = flowController.terminate(transferProcess); - - assertThat(result).isSucceeded(); - } - - @Test - void transferTypes_shouldReturnHttpPull() { - var asset = Asset.Builder.newInstance().dataAddress(DataAddress.Builder.newInstance().type("any").build()).build(); - - var transferTypes = flowController.transferTypesFor(asset); - - assertThat(transferTypes).hasSize(1).contains(HTTP_DATA_PULL); - } - - private TransferProcess transferProcess(String destinationType) { - return transferProcess(destinationType, null); - } - - private TransferProcess.Builder transferProcessBuilder(String destinationType) { - return TransferProcess.Builder.newInstance() - .correlationId(UUID.randomUUID().toString()) - .protocol("protocol") - .contractId(UUID.randomUUID().toString()) - .assetId(UUID.randomUUID().toString()) - .counterPartyAddress("test.connector.address") - .dataDestination(DataAddress.Builder.newInstance().type(destinationType).build()); - } - - private TransferProcess transferProcess(String destinationType, String transferType) { - return transferProcessBuilder(destinationType) - .transferType(transferType) - .dataDestination(DataAddress.Builder.newInstance().type(destinationType).build()) - .build(); - } - - private DataAddress dataAddress() { - return DataAddress.Builder.newInstance().type(UUID.randomUUID().toString()).build(); - } - -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowControllerTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowControllerTest.java deleted file mode 100644 index 99ffdf40dfd..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/flow/ProviderPushTransferDataFlowControllerTest.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.flow; - -import org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.DataFlowResponse; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClient; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClientFactory; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.response.ResponseStatus; -import org.eclipse.edc.spi.response.StatusResult; -import org.eclipse.edc.spi.result.ServiceResult; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowResponseMessage; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; - -import java.net.URI; -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.HTTP_PROXY; -import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class ProviderPushTransferDataFlowControllerTest { - - private static final String HTTP_DATA_PULL = "HttpData-PULL"; - private final DataPlaneClient dataPlaneClient = mock(); - private final DataPlaneClientFactory dataPlaneClientFactory = mock(); - private final DataPlaneSelectorService selectorService = mock(); - private final ProviderPushTransferDataFlowController flowController = - new ProviderPushTransferDataFlowController(() -> URI.create("http://localhost"), selectorService, dataPlaneClientFactory); - - @NotNull - private static DataPlaneInstance.Builder dataPlaneInstanceBuilder() { - return DataPlaneInstance.Builder.newInstance().url("http://any"); - } - - @Test - void canHandle() { - assertThat(flowController.canHandle(transferProcess(HTTP_PROXY))).isFalse(); - assertThat(flowController.canHandle(transferProcess(HTTP_PROXY))).isFalse(); - assertThat(flowController.canHandle(transferProcess(HTTP_DATA_PULL, HTTP_DATA_PULL))).isFalse(); - assertThat(flowController.canHandle(transferProcess("not-http-proxy"))).isTrue(); - } - - @Test - void initiateFlow_transferSuccess() { - var source = testDataAddress(); - var transferProcess = transferProcessBuilder("test") - .contentDataAddress(testDataAddress()) - .build(); - - when(dataPlaneClient.start(any(DataFlowStartMessage.class))).thenReturn(StatusResult.success(mock(DataFlowResponseMessage.class))); - var dataPlaneInstance = createDataPlaneInstance(); - when(selectorService.select(any(), any())).thenReturn(dataPlaneInstance); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - - var result = flowController.start(transferProcess, Policy.Builder.newInstance().build()); - - assertThat(result).isSucceeded().extracting(DataFlowResponse::getDataPlaneId).isEqualTo(dataPlaneInstance.getId()); - var captor = ArgumentCaptor.forClass(DataFlowStartMessage.class); - verify(dataPlaneClient).start(captor.capture()); - var captured = captor.getValue(); - assertThat(captured.getProcessId()).isEqualTo(transferProcess.getId()); - assertThat(captured.getSourceDataAddress()).usingRecursiveComparison().isEqualTo(source); - assertThat(captured.getDestinationDataAddress()).usingRecursiveComparison().isEqualTo(transferProcess.getDataDestination()); - assertThat(captured.getProperties()).isEmpty(); - assertThat(captured.getCallbackAddress()).isNotNull(); - } - - @Test - void initiateFlow_transferSuccess_withoutDataPlane() { - var source = testDataAddress(); - var transferProcess = transferProcessBuilder("test") - .contentDataAddress(testDataAddress()) - .build(); - - when(dataPlaneClient.start(any(DataFlowStartMessage.class))).thenReturn(StatusResult.success(mock(DataFlowResponseMessage.class))); - when(selectorService.select(any(), any())).thenReturn(null); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - - var result = flowController.start(transferProcess, Policy.Builder.newInstance().build()); - - assertThat(result).isSucceeded().extracting(DataFlowResponse::getDataPlaneId).isNull(); - var captor = ArgumentCaptor.forClass(DataFlowStartMessage.class); - verify(dataPlaneClient).start(captor.capture()); - var captured = captor.getValue(); - assertThat(captured.getProcessId()).isEqualTo(transferProcess.getId()); - assertThat(captured.getSourceDataAddress()).usingRecursiveComparison().isEqualTo(source); - assertThat(captured.getDestinationDataAddress()).usingRecursiveComparison().isEqualTo(transferProcess.getDataDestination()); - assertThat(captured.getProperties()).isEmpty(); - assertThat(captured.getCallbackAddress()).isNotNull(); - } - - @Test - void initiateFlow_returnFailedResultIfTransferFails() { - var errorMsg = "error"; - var transferProcess = transferProcessBuilder("test") - .contentDataAddress(testDataAddress()) - .build(); - - when(dataPlaneClient.start(any())).thenReturn(StatusResult.failure(ResponseStatus.FATAL_ERROR, errorMsg)); - var dataPlaneInstance = createDataPlaneInstance(); - when(selectorService.select(any(), any())).thenReturn(dataPlaneInstance); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - - var result = flowController.start(transferProcess, Policy.Builder.newInstance().build()); - - verify(dataPlaneClient).start(any()); - - assertThat(result.failed()).isTrue(); - assertThat(result.getFailureMessages()).allSatisfy(s -> assertThat(s).contains(errorMsg)); - } - - @Test - void terminate_shouldCallTerminate() { - var transferProcess = transferProcessBuilder("test") - .id("transferProcessId") - .contentDataAddress(testDataAddress()) - .build(); - when(dataPlaneClient.terminate(any())).thenReturn(StatusResult.success()); - var dataPlaneInstance = createDataPlaneInstance(); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - when(selectorService.getAll()).thenReturn(ServiceResult.success(List.of(dataPlaneInstance))); - - var result = flowController.terminate(transferProcess); - - assertThat(result).isSucceeded(); - verify(dataPlaneClient).terminate("transferProcessId"); - } - - @Test - void terminate_shouldCallTerminateOnTheRightDataPlane() { - var dataPlaneInstance = createDataPlaneInstance(); - var mockedDataPlane = mock(DataPlaneInstance.class); - var transferProcess = transferProcessBuilder("test") - .id("transferProcessId") - .contentDataAddress(testDataAddress()) - .dataPlaneId(dataPlaneInstance.getId()) - .build(); - when(mockedDataPlane.getId()).thenReturn("notValidId"); - when(dataPlaneClient.terminate(any())).thenReturn(StatusResult.success()); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - when(selectorService.getAll()).thenReturn(ServiceResult.success(List.of(dataPlaneInstance, mockedDataPlane))); - - var result = flowController.terminate(transferProcess); - - assertThat(result).isSucceeded(); - verify(dataPlaneClient).terminate("transferProcessId"); - verify(mockedDataPlane).getId(); - } - - @Test - void terminate_shouldFail_withInvalidDataPlaneId() { - var dataPlaneInstance = createDataPlaneInstance(); - var transferProcess = transferProcessBuilder("test") - .id("transferProcessId") - .contentDataAddress(testDataAddress()) - .dataPlaneId("invalid") - .build(); - when(dataPlaneClient.terminate(any())).thenReturn(StatusResult.success()); - when(dataPlaneClientFactory.createClient(any())).thenReturn(dataPlaneClient); - when(selectorService.getAll()).thenReturn(ServiceResult.success(List.of(dataPlaneInstance))); - - var result = flowController.terminate(transferProcess); - - assertThat(result).isFailed().detail().contains("Failed to select the data plane for terminating the transfer process"); - } - - @Test - void transferTypes_shouldReturnTypesForSpecifiedAsset() { - when(selectorService.getAll()).thenReturn(ServiceResult.success(List.of( - dataPlaneInstanceBuilder().allowedSourceType("TargetSrc").allowedDestType("TargetDest").build(), - dataPlaneInstanceBuilder().allowedSourceType("TargetSrc").allowedDestType("AnotherTargetDest").build(), - dataPlaneInstanceBuilder().allowedSourceType("AnotherSrc").allowedDestType("ThisWontBeListed").build() - ))); - var asset = Asset.Builder.newInstance().dataAddress(DataAddress.Builder.newInstance().type("TargetSrc").build()).build(); - - var transferTypes = flowController.transferTypesFor(asset); - - assertThat(transferTypes).containsExactly("TargetDest-PUSH", "AnotherTargetDest-PUSH"); - } - - private DataPlaneInstance createDataPlaneInstance() { - return dataPlaneInstanceBuilder().build(); - } - - private DataAddress testDataAddress() { - return DataAddress.Builder.newInstance().type("test-type").build(); - } - - private TransferProcess transferProcess(String destinationType) { - return transferProcess(destinationType, null); - } - - private TransferProcess transferProcess(String destinationType, String transferType) { - return transferProcessBuilder(destinationType) - .transferType(transferType) - .build(); - } - - private TransferProcess.Builder transferProcessBuilder(String destinationType) { - return TransferProcess.Builder.newInstance() - .correlationId(UUID.randomUUID().toString()) - .protocol("test-protocol") - .contractId(UUID.randomUUID().toString()) - .assetId(UUID.randomUUID().toString()) - .counterPartyAddress("test.connector.address") - .dataDestination(DataAddress.Builder.newInstance().type(destinationType).build()); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolverTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolverTest.java deleted file mode 100644 index 6eca8795d82..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyResolverTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy; - -import jakarta.ws.rs.core.HttpHeaders; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.token.ConsumerPullTokenExpirationDateFunction; -import org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcess; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.spi.iam.TokenParameters; -import org.eclipse.edc.spi.iam.TokenRepresentation; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.edc.token.spi.TokenDecorator; -import org.eclipse.edc.token.spi.TokenGenerationService; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; - -import java.sql.Date; -import java.time.Instant; -import java.util.UUID; - -import static com.nimbusds.jwt.JWTClaimNames.EXPIRATION_TIME; -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.DATA_ADDRESS; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.HTTP_PROXY; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class ConsumerPullDataPlaneProxyResolverTest { - - private static final TypeManager TYPE_MANAGER = new JacksonTypeManager(); - - private final DataEncrypter dataEncrypter = mock(); - private final TokenGenerationService tokenGenerationService = mock(); - private final ConsumerPullTokenExpirationDateFunction tokenExpirationDateFunction = mock(); - - private final ConsumerPullDataPlaneProxyResolver resolver = new ConsumerPullDataPlaneProxyResolver(dataEncrypter, TYPE_MANAGER, tokenGenerationService, () -> "test-private-key", () -> "test-public-key", tokenExpirationDateFunction); - - private static DataAddress dataAddress() { - return DataAddress.Builder.newInstance().type(UUID.randomUUID().toString()).build(); - } - - @Test - void verifyToDataAddressSuccess() { - var address = dataAddress(); - var encryptedAddress = "encryptedAddress"; - var expiration = Date.from(Instant.now().plusSeconds(100)); - var proxyUrl = "test.proxy.url"; - var token = "token-test"; - var instance = DataPlaneInstance.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .url("http://some.test.url") - .property("publicApiUrl", proxyUrl) - .build(); - var transferProcess = transferProcessBuilder().build(); - - var captor = ArgumentCaptor.forClass(TokenDecorator[].class); - when(dataEncrypter.encrypt(TYPE_MANAGER.writeValueAsString(address))).thenReturn(encryptedAddress); - when(tokenExpirationDateFunction.expiresAt(address, transferProcess.getContractId())).thenReturn(Result.success(expiration)); - when(tokenGenerationService.generate(anyString(), captor.capture())) - .thenReturn(Result.success(TokenRepresentation.Builder.newInstance().token(token).build())); - - var result = resolver.toDataAddress(transferProcess, address, instance); - - assertThat(result.succeeded()).isTrue(); - var proxyAddress = result.getContent(); - assertThat(proxyAddress.getType()).isEqualTo(EndpointDataReference.EDR_SIMPLE_TYPE); - assertThat(proxyAddress.getProperties()) - .containsEntry(EndpointDataReference.ID, transferProcess.getCorrelationId()) - .containsEntry(EndpointDataReference.CONTRACT_ID, transferProcess.getContractId()) - .containsEntry(EndpointDataReference.ENDPOINT, proxyUrl) - .containsEntry(EndpointDataReference.AUTH_KEY, HttpHeaders.AUTHORIZATION) - .containsEntry(EndpointDataReference.AUTH_CODE, token); - - var decorators = captor.getValue(); - - assertThat(decorators) - .anySatisfy(decorator -> { - var builder = TokenParameters.Builder.newInstance(); - decorator.decorate(builder); - assertThat(builder.build().getClaims()) - .containsEntry(DATA_ADDRESS, encryptedAddress) - .containsEntry(EXPIRATION_TIME, expiration); - }); - - assertThat(decorators).anySatisfy(decorator -> { - var builder = TokenParameters.Builder.newInstance(); - decorator.decorate(builder); - assertThat(builder.build().getHeaders()) - .containsEntry("kid", "test-public-key"); - }); - } - - @Test - void verifyToDataAddressReturnsFailureIfMissingPublicApiUrl() { - var instance = DataPlaneInstance.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .url("http://some.test.url") - .build(); - var transferProcess = transferProcessBuilder().build(); - - var result = resolver.toDataAddress(transferProcess, dataAddress(), instance); - - assertThat(result.failed()).isTrue(); - assertThat(result.getFailureDetail()).isEqualTo("Missing property `https://w3id.org/edc/v0.0.1/ns/publicApiUrl` (deprecated: `publicApiUrl`) in DataPlaneInstance"); - } - - @Test - void verifyToDataAddressReturnsFailureIfTokenExpirationDateFunctionFails() { - var address = dataAddress(); - var errorMsg = "error test"; - var instance = DataPlaneInstance.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .url("http://some.test.url") - .property("publicApiUrl", "test.proxy.url") - .build(); - var transferProcess = transferProcessBuilder().build(); - - when(dataEncrypter.encrypt(TYPE_MANAGER.writeValueAsString(address))).thenReturn("encryptedAddress"); - when(tokenExpirationDateFunction.expiresAt(any(), any())).thenReturn(Result.failure(errorMsg)); - - var result = resolver.toDataAddress(transferProcess, address, instance); - - assertThat(result.failed()).isTrue(); - assertThat(result.getFailureDetail()).contains(errorMsg); - } - - @Test - void verifyToDataAddressReturnsFailureIfTokenGenerationFails() { - var address = dataAddress(); - var errorMsg = "error test"; - var transferProcess = transferProcessBuilder().build(); - var expiration = Date.from(Instant.now().plusSeconds(100)); - var instance = DataPlaneInstance.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .url("http://some.test.url") - .property("publicApiUrl", "test.proxy.url") - .build(); - - when(dataEncrypter.encrypt(TYPE_MANAGER.writeValueAsString(address))).thenReturn("encryptedAddress"); - when(tokenExpirationDateFunction.expiresAt(address, transferProcess.getContractId())).thenReturn(Result.success(expiration)); - when(tokenGenerationService.generate(anyString(), any(TokenDecorator[].class))).thenReturn(Result.failure(errorMsg)); - - var result = resolver.toDataAddress(transferProcess, address, instance); - - assertThat(result.failed()).isTrue(); - assertThat(result.getFailureDetail()).contains(errorMsg); - } - - private TransferProcess.Builder transferProcessBuilder() { - return TransferProcess.Builder.newInstance() - .correlationId(UUID.randomUUID().toString()) - .protocol("test-protocol") - .contractId(UUID.randomUUID().toString()) - .assetId(UUID.randomUUID().toString()) - .counterPartyAddress("test.connector.address") - .dataDestination(DataAddress.Builder.newInstance().type(HTTP_PROXY).build()); - } -} diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecoratorTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecoratorTest.java deleted file mode 100644 index 1bea0d7d493..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/proxy/ConsumerPullDataPlaneProxyTokenDecoratorTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.controlplane.transfer.dataplane.proxy; - -import org.eclipse.edc.spi.iam.TokenParameters; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.time.Instant; -import java.util.Date; -import java.util.HashMap; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import static com.nimbusds.jwt.JWTClaimNames.EXPIRATION_TIME; -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.connector.controlplane.transfer.dataplane.spi.TransferDataPlaneConstants.DATA_ADDRESS; - -class ConsumerPullDataPlaneProxyTokenDecoratorTest { - - private Date expiration; - private String encryptedDataAddress; - - private ConsumerPullDataPlaneProxyTokenDecorator decorator; - - @BeforeEach - public void setUp() { - expiration = Date.from(Instant.now().plusSeconds(ThreadLocalRandom.current().nextInt(1, 10))); - encryptedDataAddress = UUID.randomUUID().toString(); - decorator = new ConsumerPullDataPlaneProxyTokenDecorator(expiration, encryptedDataAddress); - } - - @Test - void verifyDecorate() { - - var headers = new HashMap(); - var claims = new HashMap(); - var b = TokenParameters.Builder.newInstance(); - decorator.decorate(b); - - - assertThat(b.build().getHeaders()).isEmpty(); - assertThat(b.build().getClaims()) - .containsEntry(DATA_ADDRESS, encryptedDataAddress) - .containsEntry(EXPIRATION_TIME, expiration); - } -} \ No newline at end of file diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRuleTest.java b/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRuleTest.java deleted file mode 100644 index dd37f777396..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/java/org/eclipse/edc/connector/controlplane/transfer/dataplane/validation/ExpirationDateValidationRuleTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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.controlplane.transfer.dataplane.validation; - -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.result.Result; -import org.junit.jupiter.api.Test; - -import java.sql.Date; -import java.time.Clock; -import java.time.Instant; - -import static com.nimbusds.jwt.JWTClaimNames.EXPIRATION_TIME; -import static java.time.ZoneOffset.UTC; -import static java.util.Collections.emptyMap; -import static org.assertj.core.api.Assertions.assertThat; - -class ExpirationDateValidationRuleTest { - - private final Instant now = Instant.now(); - private final ExpirationDateValidationRule rule = new ExpirationDateValidationRule(Clock.fixed(now, UTC)); - - @Test - void failsWithoutExpiration() { - var token = ClaimToken.Builder.newInstance().build(); - - var result = rule.checkRule(token, emptyMap()); - - assertThat(result).matches(Result::failed) - .extracting(Result::getFailureDetail).isEqualTo("Missing expiration time in token"); - } - - @Test - void failsIfTokenIsExpired() { - var token = ClaimToken.Builder.newInstance() - .claim(EXPIRATION_TIME, Date.from(now)) - .build(); - - var result = rule.checkRule(token, emptyMap()); - - assertThat(result).matches(Result::failed) - .extracting(Result::getFailureDetail).asString().startsWith("Token has expired on"); - } - - @Test - void succeedIfTokenIsNotExpired() { - var token = ClaimToken.Builder.newInstance() - .claim(EXPIRATION_TIME, Date.from(now.plusMillis(1))) - .build(); - - var result = rule.checkRule(token, emptyMap()); - - assertThat(result).matches(Result::succeeded); - } -} \ No newline at end of file diff --git a/extensions/control-plane/transfer/transfer-data-plane/src/test/resources/rsa-pubkey.pem b/extensions/control-plane/transfer/transfer-data-plane/src/test/resources/rsa-pubkey.pem deleted file mode 100644 index a840db4c833..00000000000 --- a/extensions/control-plane/transfer/transfer-data-plane/src/test/resources/rsa-pubkey.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi4zQvCGMlQ0N7wsKIU8N -5aExdhxPPiFqUvV27+WtbPdREEVAmOESUeW00+JO2EBSjuIf4ny4yCRhykr8CjqQ -HFN+ehXaTjw8HyOK7izbExdMe0Bb+SoNcduYL6KRLqUp4QF5fym0vTulRPQ/lT3n -IVUfh4BoEasiWc+cP/7y0qDtsjmiDlPUTRi6UJJHDOokS1P800weSRbDMQmX3zFO -+fztK6zklnbBhuZHjmnuIvqKncFvAgs2ZQkuYEhz/dWAqs5Jepyy4S7SZ4stvHzJ -zpwimRHWJEm0XEK56wrGt7V5j63fXvl72KpncWyNHm+2Obru1OrPBGaHm0kNZnCi -jwIDAQAB ------END PUBLIC KEY----- \ No newline at end of file diff --git a/extensions/data-plane/data-plane-client-embedded/build.gradle.kts b/extensions/data-plane/data-plane-client-embedded/build.gradle.kts deleted file mode 100644 index 1e236356a5e..00000000000 --- a/extensions/data-plane/data-plane-client-embedded/build.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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 - * - */ - - -plugins { - `java-library` -} - -dependencies { - api(project(":spi:data-plane:data-plane-spi")) - api(project(":spi:data-plane-selector:data-plane-selector-spi")) - - implementation(libs.opentelemetry.instrumentation.annotations) - - testImplementation(project(":core:common:junit")) - testImplementation(libs.restAssured) - testImplementation(libs.mockserver.netty) - testImplementation(libs.mockserver.client) -} - - diff --git a/extensions/data-plane/data-plane-client/build.gradle.kts b/extensions/data-plane/data-plane-client/build.gradle.kts deleted file mode 100644 index ece68df85cc..00000000000 --- a/extensions/data-plane/data-plane-client/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 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 - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * - */ - - -plugins { - `java-library` -} - -dependencies { - api(project(":spi:common:auth-spi")) - api(project(":spi:common:http-spi")) - api(project(":spi:data-plane:data-plane-spi")) - api(project(":spi:data-plane-selector:data-plane-selector-spi")) - implementation(project(":core:common:lib:util-lib")) - implementation(project(":extensions:data-plane:data-plane-client-embedded")) - - implementation(libs.opentelemetry.instrumentation.annotations) - - testImplementation(project(":core:common:junit")) - testImplementation(libs.restAssured) - testImplementation(libs.mockserver.netty) - testImplementation(libs.mockserver.client) - - testImplementation(testFixtures(project(":core:common:lib:http-lib"))) -} - - diff --git a/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtension.java b/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtension.java deleted file mode 100644 index 12747f20c75..00000000000 --- a/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtension.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 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 - * - */ - -package org.eclipse.edc.connector.dataplane.client; - -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClientFactory; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.http.spi.ControlApiHttpClient; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Provider; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; - -import java.util.Objects; - -/** - * This extension provides the Data Plane API: - * - Control API: set of endpoints to trigger/monitor/cancel data transfers that should be accessible only from the Control Plane. - * - Public API: generic endpoint open to other participants of the Dataspace and used to proxy a data request to the actual data source. - * - * @deprecated replaced by data-plane-signaling. - */ -@Extension(value = DataPlaneClientExtension.NAME) -@Deprecated(since = "0.6.0") -public class DataPlaneClientExtension implements ServiceExtension { - public static final String NAME = "DEPRECATED: Data Plane Client"; - - @Inject(required = false) - private DataPlaneManager dataPlaneManager; - @Inject(required = false) - private ControlApiHttpClient httpClient; - @Inject - private TypeManager typeManager; - - @Override - public String name() { - return NAME; - } - - @Provider - public DataPlaneClientFactory dataPlaneClientFactory(ServiceExtensionContext context) { - context.getMonitor().warning("the `data-plane-client` extension has been deprecated, please switch to data-plane-signaling"); - if (dataPlaneManager != null) { - // Data plane manager is embedded in the current runtime - context.getMonitor().debug(() -> "Using embedded Data Plane client."); - return instance -> new EmbeddedDataPlaneClient(dataPlaneManager); - } - - context.getMonitor().debug(() -> "Using remote Data Plane client."); - Objects.requireNonNull(httpClient, "To use remote Data Plane client, a ControlApiHttpClient instance must be registered"); - return instance -> new RemoteDataPlaneClient(httpClient, typeManager.getMapper(), instance); - } -} - - diff --git a/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClient.java b/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClient.java deleted file mode 100644 index 4bef9494a54..00000000000 --- a/extensions/data-plane/data-plane-client/src/main/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClient.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.client; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.opentelemetry.instrumentation.annotations.WithSpan; -import okhttp3.MediaType; -import okhttp3.Request; -import okhttp3.RequestBody; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClient; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.http.spi.ControlApiHttpClient; -import org.eclipse.edc.spi.EdcException; -import org.eclipse.edc.spi.response.StatusResult; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowResponseMessage; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; - -import static org.eclipse.edc.spi.response.ResponseStatus.FATAL_ERROR; - -/** - * Implementation of a {@link DataPlaneClient} that uses a remote {@link DataPlaneManager} accessible from a REST API. - * - * @deprecated replaced by data-plane-signaling. - */ -@Deprecated(since = "0.6.0") -public class RemoteDataPlaneClient implements DataPlaneClient { - public static final MediaType TYPE_JSON = MediaType.parse("application/json"); - private final ControlApiHttpClient httpClient; - private final ObjectMapper mapper; - private final DataPlaneInstance dataPlane; - - public RemoteDataPlaneClient(ControlApiHttpClient httpClient, ObjectMapper mapper, DataPlaneInstance dataPlane) { - this.httpClient = httpClient; - this.mapper = mapper; - this.dataPlane = dataPlane; - } - - @WithSpan - @Override - public StatusResult start(DataFlowStartMessage dataFlowStartMessage) { - RequestBody body; - try { - body = RequestBody.create(mapper.writeValueAsString(dataFlowStartMessage), TYPE_JSON); - } catch (JsonProcessingException e) { - throw new EdcException(e); - } - var builder = new Request.Builder().post(body).url(dataPlane.getUrl()); - - return httpClient.execute(builder) - .map(it -> StatusResult.success(DataFlowResponseMessage.Builder.newInstance().build())) - .orElse(f -> StatusResult.failure(FATAL_ERROR, f.getFailureDetail())); - } - - @Override - public StatusResult suspend(String transferProcessId) { - throw new RuntimeException("not implemented"); - } - - @Override - public StatusResult terminate(String transferProcessId) { - var builder = new Request.Builder().delete().url(dataPlane.getUrl() + "/" + transferProcessId); - - return httpClient.execute(builder) - .map(it -> StatusResult.success()) - .orElse(f -> StatusResult.failure(FATAL_ERROR, f.getFailureDetail())); - } - - @Override - public StatusResult checkAvailability() { - throw new UnsupportedOperationException("feature not implemented for deprecated client"); - } -} diff --git a/extensions/data-plane/data-plane-client/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/data-plane/data-plane-client/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index a2cc964b905..00000000000 --- a/extensions/data-plane/data-plane-client/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.edc.connector.dataplane.client.DataPlaneClientExtension diff --git a/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtensionTest.java b/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtensionTest.java deleted file mode 100644 index 47aa46d79f1..00000000000 --- a/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/DataPlaneClientExtensionTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.client; - -import dev.failsafe.RetryPolicy; -import org.eclipse.edc.boot.system.injection.ObjectFactory; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.http.spi.EdcHttpClient; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -@ExtendWith(DependencyInjectionExtension.class) -class DataPlaneClientExtensionTest { - - @BeforeEach - void setUp(ServiceExtensionContext context) { - context.registerService(TypeManager.class, new JacksonTypeManager()); - } - - @Test - void verifyReturnEmbeddedClient(ServiceExtensionContext context, ObjectFactory factory) { - context.registerService(DataPlaneManager.class, mock(DataPlaneManager.class)); - - var extension = factory.constructInstance(DataPlaneClientExtension.class); - - var client = extension.dataPlaneClientFactory(context).createClient(createDataPlaneInstance()); - - assertThat(client).isInstanceOf(EmbeddedDataPlaneClient.class); - } - - @Test - void verifyReturnRemoteClient(ServiceExtensionContext context, ObjectFactory factory) { - context.registerService(DataPlaneManager.class, null); - context.registerService(EdcHttpClient.class, mock(EdcHttpClient.class)); - context.registerService(RetryPolicy.class, mock(RetryPolicy.class)); - - var extension = factory.constructInstance(DataPlaneClientExtension.class); - - var client = extension.dataPlaneClientFactory(context).createClient(createDataPlaneInstance()); - - assertThat(client).isInstanceOf(RemoteDataPlaneClient.class); - } - - private DataPlaneInstance createDataPlaneInstance() { - return DataPlaneInstance.Builder.newInstance().url("http://any").build(); - } -} diff --git a/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClientTest.java b/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClientTest.java deleted file mode 100644 index 76352124b82..00000000000 --- a/extensions/data-plane/data-plane-client/src/test/java/org/eclipse/edc/connector/dataplane/client/RemoteDataPlaneClientTest.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.client; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClient; -import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; -import org.eclipse.edc.connector.dataplane.spi.response.TransferErrorResponse; -import org.eclipse.edc.http.client.ControlApiHttpClientImpl; -import org.eclipse.edc.http.spi.ControlApiHttpClient; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.spi.response.ResponseStatus; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.model.HttpRequest; -import org.mockserver.model.HttpResponse; -import org.mockserver.model.HttpStatusCode; -import org.mockserver.model.MediaType; -import org.mockserver.verify.VerificationTimes; - -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.http.client.testfixtures.HttpTestUtils.testHttpClient; -import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; -import static org.eclipse.edc.util.io.Ports.getFreePort; -import static org.mockito.Mockito.mock; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.matchers.Times.once; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; -import static org.mockserver.model.HttpStatusCode.CONFLICT_409; -import static org.mockserver.model.HttpStatusCode.NO_CONTENT_204; -import static org.mockserver.stop.Stop.stopQuietly; - -class RemoteDataPlaneClientTest { - - private static final ObjectMapper MAPPER = new JacksonTypeManager().getMapper(); - - private static final int DATA_PLANE_API_PORT = getFreePort(); - private static final String DATA_PLANE_PATH = "/transfer"; - private static final String DATA_PLANE_API_URI = "http://localhost:" + DATA_PLANE_API_PORT + DATA_PLANE_PATH; - private static ClientAndServer dataPlane; - private final DataPlaneInstance instance = DataPlaneInstance.Builder.newInstance().url(DATA_PLANE_API_URI).build(); - private final ControlApiHttpClient httpClient = new ControlApiHttpClientImpl(testHttpClient(), mock()); - - private final DataPlaneClient dataPlaneClient = new RemoteDataPlaneClient(httpClient, MAPPER, instance); - - @BeforeAll - public static void setUp() { - dataPlane = startClientAndServer(DATA_PLANE_API_PORT); - } - - @AfterAll - public static void tearDown() { - stopQuietly(dataPlane); - } - - @AfterEach - public void resetMockServer() { - dataPlane.reset(); - } - - @Test - void transfer_verifyReturnFatalErrorIfReceiveResponseWithNullBody() throws JsonProcessingException { - var flowRequest = createDataFlowRequest(); - - var httpRequest = new HttpRequest().withPath(DATA_PLANE_PATH).withBody(MAPPER.writeValueAsString(flowRequest)); - dataPlane.when(request()).respond(response().withStatusCode(HttpStatusCode.BAD_REQUEST_400.code())); - - var result = dataPlaneClient.start(flowRequest); - - dataPlane.verify(httpRequest); - - assertThat(result).isFailed().satisfies(failure -> { - assertThat(failure.status()).isEqualTo(ResponseStatus.FATAL_ERROR); - assertThat(failure.getMessages()).anySatisfy(s -> assertThat(s).contains("400")); - }); - } - - @Test - void transfer_verifyReturnFatalErrorIfReceiveErrorInResponse() throws JsonProcessingException { - var flowRequest = createDataFlowRequest(); - - var httpRequest = new HttpRequest().withPath(DATA_PLANE_PATH).withBody(MAPPER.writeValueAsString(flowRequest)); - var errorMsg = UUID.randomUUID().toString(); - dataPlane.when(httpRequest, once()).respond(withResponse(errorMsg)); - - var result = dataPlaneClient.start(flowRequest); - - dataPlane.verify(httpRequest); - - assertThat(result).isFailed().satisfies(failure -> { - assertThat(failure.status()).isEqualTo(ResponseStatus.FATAL_ERROR); - assertThat(failure.getMessages()).anySatisfy(s -> assertThat(s).contains("404")); - }); - } - - @Test - void transfer_verifyTransferSuccess() throws JsonProcessingException { - var flowRequest = createDataFlowRequest(); - - var httpRequest = new HttpRequest().withPath(DATA_PLANE_PATH).withBody(MAPPER.writeValueAsString(flowRequest)); - dataPlane.when(httpRequest, once()).respond(response().withStatusCode(HttpStatusCode.OK_200.code())); - - var result = dataPlaneClient.start(flowRequest); - - dataPlane.verify(httpRequest, VerificationTimes.once()); - - assertThat(result.succeeded()).isTrue(); - } - - @Test - void terminate_shouldCallTerminateOnAllTheAvailableDataPlanes() { - var httpRequest = new HttpRequest().withMethod("DELETE").withPath(DATA_PLANE_PATH + "/processId"); - dataPlane.when(httpRequest, once()).respond(response().withStatusCode(NO_CONTENT_204.code())); - - var result = dataPlaneClient.terminate("processId"); - - assertThat(result).isSucceeded(); - dataPlane.verify(httpRequest, VerificationTimes.once()); - } - - @Test - void terminate_shouldFail_whenConflictResponse() { - var httpRequest = new HttpRequest().withMethod("DELETE").withPath(DATA_PLANE_PATH + "/processId"); - dataPlane.when(httpRequest, once()).respond(response().withStatusCode(CONFLICT_409.code())); - - var result = dataPlaneClient.terminate("processId"); - - assertThat(result).isFailed(); - } - - private HttpResponse withResponse(String errorMsg) throws JsonProcessingException { - return response().withStatusCode(HttpStatusCode.BAD_REQUEST_400.code()) - .withBody(MAPPER.writeValueAsString(new TransferErrorResponse(List.of(errorMsg))), MediaType.APPLICATION_JSON); - } - - private DataFlowStartMessage createDataFlowRequest() { - return DataFlowStartMessage.Builder.newInstance() - .id("123") - .processId("456") - .sourceDataAddress(DataAddress.Builder.newInstance().type("test").build()) - .destinationDataAddress(DataAddress.Builder.newInstance().type("test").build()) - .build(); - } - -} diff --git a/extensions/data-plane/data-plane-control-api/README.md b/extensions/data-plane/data-plane-control-api/README.md deleted file mode 100644 index c25fc3fd3b3..00000000000 --- a/extensions/data-plane/data-plane-control-api/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# Data Plane API - -This extension provides the interfaces and implementations for the Data Plane API, which are respectively: - -- the Control API which is used by the Control Plane to delegate the data transfer to its Data Plane, -- the Public API which is essentially a data proxy enabling a consumer to actively query data out from the provider data source. - -### Scope - -These APIs have been designed to support the different data transfer types that the Data Plane must support, which are: - -- Consumer Data Pull: the consumer backend applications use the Data Plane to proxy data request until the provided data source. - This data transfer type is exclusively built around the Public API of the Data Plane. -- Provider Push and Streaming: once contract is agreed by both participants, the Control Plane of the provider delegates - the data transfer to its Data Plane through the Control API. - -### Use Cases - -#### Use Case #1 - -Provider wants to expose a Rest API taking as input some query parameters that restrict the amount of data returned for each query. -Here it is not feasible for the data consumer to negotiate a contract for each query that will hit the provider data source API. -Here the approach for the consumer would then be to -[negotiate with the provider the possibility to access the data source through a proxy](../../control-plane/data-plane-transfer/data-plane-transfer-sync/). -If the negotiation ends successfully, the consumer will be provided an access token that its backend applications can then use when querying the Data Plane public API. - -This approach enables the consumer backend application to pass directly the query parameters, path parameters and body -in the request to Data Plane public API. If the provider data source allows it, these parameters will then be conveyed until the data source. - -### Use Case #2 - -Provider exposes some data located in a Cloud storage, such as AWS S3 or Azure storage. Consumer wants to copy these data -into its own storage system (which can be of a different type than the one of the provider). Here the consumer will negotiate a -_simple_ data transfer, by notifying to which location the data should be copied. Once contract is agreed between both parties, -the provider will automatically trigger the data transfer by delegating the data copy to is Data Plane system, through its Control API. - -## Technical Details - -### Interfaces - -OpenApi documentation can be found [here](../../../resources/openapi/yaml/data-plane-api.yaml). - -### Dependencies - -_Provide some information about dependencies, e.g., used extensions._ - -| Name | Description | -|:--------|:---------------------------------------------| -| web-spi | Essentially for the Controllers registration | - -## Design Principles - -Both public and control APIs rely on the `DataPlaneManager` for executing the actual data transfer, see [Data Plane Framework](../../../core/data-plane/data-plane-framework/README.md) for more details. - -The Data Plane public API takes an access token in input from the `Authorization` header, which is validated and decode by calling the -validation server. If the validation is successful, then the Data Plane is executed in order to query the data from the data address returned by the validation server. -As mentioned earlier, the Data Plane public API is essentially a data proxy, which by definition will convey the information from the request (query parameters, path information, request body) -into the `DataPlaneManager` through the `DataFlowRequest` properties. If the data source allows it, then the request information will -be used in the request to the actual data source. - -### Security - -Data Plane public API is, by nature, opened to external incoming http calls. Because it accepts any set of query params, path parameters and request body, -it could be used by malicious attackers to attempt an attack e.g. DDoS. - -By default, Jetty, which is the embedded HTTP server in the EDC, provides some security against this: - -- max request header size of 8 KB: every call whose request header size is larger is discarded, -- max form content size of 200 KB: every form request call whose body is larger than this is discarded, -- max form content keys of 1000: every form request call which contains more keys is discarded. - -No other limits are implemented as of now, so we strongly recommend putting a reverse proxy in front of the Data Plane public API, such as Nginx, configured to block malicious calls. \ No newline at end of file diff --git a/extensions/data-plane/data-plane-control-api/build.gradle.kts b/extensions/data-plane/data-plane-control-api/build.gradle.kts deleted file mode 100644 index 96c2daec91a..00000000000 --- a/extensions/data-plane/data-plane-control-api/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 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 - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * Mercedes-Benz Tech Innovation GmbH - publish public api context into dedicated swagger hub page - * - */ - - -plugins { - `java-library` - id(libs.plugins.swagger.get().pluginId) -} - -dependencies { - api(project(":spi:common:web-spi")) - api(project(":spi:data-plane:data-plane-spi")) - - implementation(libs.jakarta.rsApi) - - testImplementation(project(":extensions:common:http")) - testImplementation(project(":core:common:junit")) - testImplementation(libs.jersey.multipart) - testImplementation(libs.restAssured) - testImplementation(testFixtures(project(":extensions:common:http:jersey-core"))) -} -edcBuild { - swagger { - apiGroup.set("control-api") - } -} - - diff --git a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlaneControlApiExtension.java b/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlaneControlApiExtension.java deleted file mode 100644 index 379a6bdd942..00000000000 --- a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlaneControlApiExtension.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 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 - * Mercedes-Benz Tech Innovation GmbH - publish public api context into dedicated swagger hub page - * - */ - -package org.eclipse.edc.connector.dataplane.api; - -import org.eclipse.edc.connector.dataplane.api.controller.DataPlaneControlApiController; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -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.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; - -/** - * This extension provides set of endpoints to trigger/monitor/cancel data transfers that should be accessible only - * by the Control Plane. - * - * @deprecated please use data-plane signaling feature. - */ -@Extension(value = DataPlaneControlApiExtension.NAME) -@Deprecated(since = "0.6.0") -public class DataPlaneControlApiExtension implements ServiceExtension { - public static final String NAME = "Data Plane Control API"; - - @Inject - private DataPlaneManager dataPlaneManager; - - @Inject - private WebService webService; - - @Override - public String name() { - return NAME; - } - - @Override - public void initialize(ServiceExtensionContext context) { - webService.registerResource(ApiContext.CONTROL, new DataPlaneControlApiController(dataPlaneManager)); - } -} diff --git a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApi.java b/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApi.java deleted file mode 100644 index 43b632e7b11..00000000000 --- a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApi.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.ws.rs.container.AsyncResponse; -import org.eclipse.edc.connector.dataplane.spi.DataFlowStates; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; - -@OpenAPIDefinition -@Tag(name = "Data Plane control API", - description = "Api targeted by the Control Plane to delegate a data transfer (Provider Push or Streaming) " + - "to the Data Plane after the contract has been successfully negotiated and agreed between the two participants. ") -public interface DataPlaneControlApi { - - @Operation(description = "Initiates a data transfer for the given request. The transfer will be performed asynchronously.", - responses = { - @ApiResponse(responseCode = "400", description = "Failed to validate request"), - @ApiResponse(responseCode = "200", description = "Data transfer initiated"), - } - ) - void initiateTransfer(DataFlowStartMessage request, AsyncResponse response); - - @Operation(description = "Get the current state of a data transfer.", - responses = @ApiResponse(responseCode = "200", description = "Missing access token") - ) - DataFlowStates getTransferState(String transferProcessId); - - @Operation(description = "Terminates a data transfer.", - responses = { - @ApiResponse(responseCode = "204", description = "Data transfer terminated"), - @ApiResponse(responseCode = "404", description = "Data transfer not handled by the data plane"), - @ApiResponse(responseCode = "409", description = "Cannot terminate the transfer"), - } - ) - void terminateTransfer(String transferProcessId, AsyncResponse response); -} diff --git a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiController.java b/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiController.java deleted file mode 100644 index 226b6d463b9..00000000000 --- a/extensions/data-plane/data-plane-control-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiController.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 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 - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DELETE; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.container.AsyncResponse; -import jakarta.ws.rs.container.Suspended; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; -import org.eclipse.edc.connector.dataplane.spi.DataFlowStates; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.connector.dataplane.spi.response.TransferErrorResponse; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; - -import java.util.List; - -import static jakarta.ws.rs.core.Response.status; -import static java.lang.String.format; - -@Path("/transfer") -@Consumes({ MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_JSON }) -public class DataPlaneControlApiController implements DataPlaneControlApi { - private final DataPlaneManager dataPlaneManager; - - public DataPlaneControlApiController(DataPlaneManager dataPlaneManager) { - this.dataPlaneManager = dataPlaneManager; - } - - @POST - @Override - public void initiateTransfer(DataFlowStartMessage request, @Suspended AsyncResponse response) { - // TODO token authentication - var result = dataPlaneManager.validate(request); - if (result.succeeded()) { - dataPlaneManager.start(request); - response.resume(Response.ok().build()); - } else { - var resp = result.getFailureMessages().isEmpty() ? - badRequest(format("Failed to validate request: %s", request.getId())) : - badRequest(result.getFailureMessages()); - response.resume(resp); - } - } - - @GET - @Override - @Path("/{transferProcessId}") - public DataFlowStates getTransferState(@PathParam("transferProcessId") String transferProcessId) { - return dataPlaneManager.getTransferState(transferProcessId); - } - - @DELETE - @Path("/{transferProcessId}") - @Override - public void terminateTransfer(@PathParam("transferProcessId") String transferProcessId, @Suspended AsyncResponse response) { - dataPlaneManager.terminate(transferProcessId) - .onSuccess(r -> response.resume(Response.noContent().build())) - .onFailure(f -> response.resume(badRequest(List.of("Cannot terminate transfer: " + f.getFailureDetail())))); - } - - private Response badRequest(String error) { - return badRequest(List.of(error)); - } - - private Response badRequest(List errors) { - return status(Response.Status.BAD_REQUEST).entity(new TransferErrorResponse(errors)).build(); - } -} diff --git a/extensions/data-plane/data-plane-control-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/data-plane/data-plane-control-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index d9c9ca5c4cd..00000000000 --- a/extensions/data-plane/data-plane-control-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.edc.connector.dataplane.api.DataPlaneControlApiExtension diff --git a/extensions/data-plane/data-plane-control-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiControllerTest.java b/extensions/data-plane/data-plane-control-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiControllerTest.java deleted file mode 100644 index 54c233a4026..00000000000 --- a/extensions/data-plane/data-plane-control-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlaneControlApiControllerTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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.dataplane.api.controller; - -import io.restassured.http.ContentType; -import io.restassured.specification.RequestSpecification; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.Response; -import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; -import org.eclipse.edc.junit.annotations.ApiTest; -import org.eclipse.edc.spi.response.StatusResult; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; -import org.hamcrest.CoreMatchers; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.UUID; - -import static io.restassured.RestAssured.given; -import static org.eclipse.edc.spi.response.ResponseStatus.FATAL_ERROR; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ApiTest -class DataPlaneControlApiControllerTest extends RestControllerTestBase { - - private final DataPlaneManager manager = mock(); - - @Test - void should_callDataPlaneManager_if_requestIsValid() { - var flowRequest = DataFlowStartMessage.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .processId(UUID.randomUUID().toString()) - .sourceDataAddress(testDestAddress()) - .destinationDataAddress(testDestAddress()) - .build(); - - when(manager.validate(isA(DataFlowStartMessage.class))).thenReturn(Result.success(Boolean.TRUE)); - - baseRequest() - .contentType(ContentType.JSON) - .body(flowRequest) - .post("/transfer") - .then() - .statusCode(Response.Status.OK.getStatusCode()); - - verify(manager).start(isA(DataFlowStartMessage.class)); - } - - @Test - void should_returnBadRequest_if_requestIsInValid() { - var errorMsg = "test error message"; - var flowRequest = DataFlowStartMessage.Builder.newInstance() - .id(UUID.randomUUID().toString()) - .processId(UUID.randomUUID().toString()) - .sourceDataAddress(testDestAddress()) - .destinationDataAddress(testDestAddress()) - .build(); - - when(manager.validate(isA(DataFlowStartMessage.class))).thenReturn(Result.failure(errorMsg)); - - baseRequest() - .contentType(ContentType.JSON) - .body(flowRequest) - .post("/transfer") - .then() - .statusCode(Response.Status.BAD_REQUEST.getStatusCode()) - .body("errors", CoreMatchers.equalTo(List.of(errorMsg))); - - verify(manager, never()).start(any()); - } - - @Test - void delete_shouldReturnOk_whenTerminationSucceeds() { - when(manager.terminate(any())).thenReturn(StatusResult.success()); - - baseRequest() - .delete("/transfer/transferId") - .then() - .statusCode(204); - - verify(manager).terminate("transferId"); - } - - @Test - void delete_shouldReturnError_whenTerminationFails() { - when(manager.terminate(any())).thenReturn(StatusResult.failure(FATAL_ERROR)); - - baseRequest() - .delete("/transfer/transferId") - .then() - .statusCode(400); - - verify(manager).terminate("transferId"); - } - - @Override - protected Object controller() { - return new DataPlaneControlApiController(manager); - } - - private RequestSpecification baseRequest() { - return given() - .baseUri("http://localhost:" + port) - .header(HttpHeaders.AUTHORIZATION, "auth") - .when(); - } - - private DataAddress testDestAddress() { - return DataAddress.Builder.newInstance().type("test").build(); - } -} diff --git a/extensions/data-plane/data-plane-integration-tests/build.gradle.kts b/extensions/data-plane/data-plane-integration-tests/build.gradle.kts index 180535bd841..dcd996242e2 100644 --- a/extensions/data-plane/data-plane-integration-tests/build.gradle.kts +++ b/extensions/data-plane/data-plane-integration-tests/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { testImplementation(project(":core:common:connector-core")) testImplementation(project(":core:common:junit")) + testImplementation(project(":extensions:common:json-ld")) testImplementation(testFixtures(project(":extensions:data-plane:data-plane-http"))) } diff --git a/extensions/data-plane/data-plane-integration-tests/src/test/java/org/eclipse/edc/connector/dataplane/http/DataPlaneHttpIntegrationTests.java b/extensions/data-plane/data-plane-integration-tests/src/test/java/org/eclipse/edc/connector/dataplane/http/DataPlaneHttpIntegrationTests.java index 88b931bd4e5..54cf2929720 100644 --- a/extensions/data-plane/data-plane-integration-tests/src/test/java/org/eclipse/edc/connector/dataplane/http/DataPlaneHttpIntegrationTests.java +++ b/extensions/data-plane/data-plane-integration-tests/src/test/java/org/eclipse/edc/connector/dataplane/http/DataPlaneHttpIntegrationTests.java @@ -14,20 +14,23 @@ package org.eclipse.edc.connector.dataplane.http; -import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpMethod; import io.restassured.http.ContentType; +import io.restassured.response.Response; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.apache.http.HttpStatus; import org.eclipse.edc.connector.dataplane.http.spi.HttpDataAddress; import org.eclipse.edc.connector.dataplane.spi.DataFlowStates; -import org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema; +import org.eclipse.edc.connector.dataplane.spi.iam.DataPlaneAuthorizationService; import org.eclipse.edc.junit.annotations.ComponentTest; import org.eclipse.edc.junit.extensions.EmbeddedRuntime; import org.eclipse.edc.junit.extensions.RuntimeExtension; import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; +import org.eclipse.edc.spi.result.Result; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -45,10 +48,8 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.HashMap; import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; import static io.netty.handler.codec.http.HttpHeaderNames.AUTHORIZATION; import static io.restassured.RestAssured.given; @@ -57,11 +58,15 @@ import static java.lang.String.valueOf; import static java.util.Collections.emptyMap; import static org.awaitility.Awaitility.await; -import static org.eclipse.edc.connector.dataplane.http.testfixtures.TestFunctions.createRequest; import static org.eclipse.edc.connector.dataplane.spi.DataFlowStates.NOTIFIED; +import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; +import static org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage.EDC_DATA_FLOW_START_MESSAGE_TYPE; import static org.eclipse.edc.util.io.Ports.getFreePort; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.matchers.Times.exactly; import static org.mockserver.matchers.Times.once; @@ -76,34 +81,24 @@ import static org.mockserver.model.Parameter.param; import static org.mockserver.stop.Stop.stopQuietly; -/** - * System Test for Data Plane HTTP extension. - */ + @ComponentTest public class DataPlaneHttpIntegrationTests { - private static final int VALIDATION_API_PORT = getFreePort(); - private static final String VALIDATION_API_HOST = "http://localhost:" + VALIDATION_API_PORT; private static final int PUBLIC_API_PORT = getFreePort(); private static final int CONTROL_API_PORT = getFreePort(); private static final int HTTP_SOURCE_API_PORT = getFreePort(); private static final int HTTP_SINK_API_PORT = getFreePort(); - private static final String CONTROL_API_HOST = "http://localhost:" + CONTROL_API_PORT; private static final String HTTP_SOURCE_API_HOST = "http://localhost:" + HTTP_SOURCE_API_PORT; private static final String HTTP_SINK_API_HOST = "http://localhost:" + HTTP_SINK_API_PORT; private static final String CONTROL_PATH = "/control"; private static final String PUBLIC_PATH = "/public"; private static final String PUBLIC_API_HOST = "http://localhost:" + PUBLIC_API_PORT; - private static final String TRANSFER_PATH = format("%s/transfer", CONTROL_PATH); - private static final String TRANSFER_RESULT_PATH = format("%s/{processId}", TRANSFER_PATH); - private static final String PROCESS_ID = "processId"; - private static final String HTTP_API_PATH = "sample"; private static final String AUTH_HEADER_KEY = AUTHORIZATION.toString(); private static final String SOURCE_AUTH_VALUE = "source-auth-key"; private static final String SINK_AUTH_VALUE = "sink-auth-key"; private static ClientAndServer httpSourceMockServer; private static ClientAndServer httpSinkMockServer; - private static ClientAndServer validationApiMockServer; private final Duration timeout = Duration.ofSeconds(30); private static final EmbeddedRuntime RUNTIME = new EmbeddedRuntime( @@ -113,10 +108,8 @@ public class DataPlaneHttpIntegrationTests { "web.http.public.path", PUBLIC_PATH, "web.http.control.port", valueOf(CONTROL_API_PORT), "web.http.control.path", CONTROL_PATH, - "edc.dataplane.token.validation.endpoint", VALIDATION_API_HOST, "edc.core.retry.retries.max", "0" ), - ":extensions:common:metrics:micrometer-core", ":core:data-plane:data-plane-core", ":extensions:common:api:control-api-configuration", ":extensions:common:http", @@ -124,40 +117,38 @@ public class DataPlaneHttpIntegrationTests { ":extensions:common:configuration:configuration-filesystem", ":extensions:control-plane:api:control-plane-api-client", ":extensions:data-plane:data-plane-http", - ":extensions:data-plane:data-plane-control-api", - ":extensions:data-plane:data-plane-public-api" - ); + ":extensions:data-plane:data-plane-public-api-v2", + ":extensions:data-plane:data-plane-signaling:data-plane-signaling-api" + ).registerServiceMock(DataPlaneAuthorizationService.class, mock()); @BeforeAll public static void setUp() { httpSourceMockServer = startClientAndServer(HTTP_SOURCE_API_PORT); httpSinkMockServer = startClientAndServer(HTTP_SINK_API_PORT); - validationApiMockServer = startClientAndServer(VALIDATION_API_PORT); } @AfterAll public static void tearDown() { stopQuietly(httpSourceMockServer); stopQuietly(httpSinkMockServer); - stopQuietly(validationApiMockServer); } @AfterEach public void resetMockServer() { httpSourceMockServer.reset(); httpSinkMockServer.reset(); - validationApiMockServer.reset(); } @Nested class Pull { + private static final String HTTP_API_PATH = "sample"; + @RegisterExtension static RuntimeExtension dataPlane = new RuntimePerClassExtension(RUNTIME); @Test - void transfer_pull_withSourceQueryParamsAndPath_success(TypeManager typeManager) { - // prepare data source and validation servers + void transfer_pull_withSourceQueryParamsAndPath_success(DataPlaneAuthorizationService dataPlaneAuthorizationService) { var token = UUID.randomUUID().toString(); var responseBody = "some info"; var queryParams = Map.of( @@ -168,11 +159,7 @@ void transfer_pull_withSourceQueryParamsAndPath_success(TypeManager typeManager) var sourceRequest = getRequest(queryParams, HTTP_API_PATH); httpSourceMockServer.when(sourceRequest, once()).respond(successfulResponse(responseBody, PLAIN_TEXT_UTF_8)); - - // prepare validation server of the control plane - var validationRequest = request().withMethod(HttpMethod.GET.name()).withHeader(AUTH_HEADER_KEY, token); - validationApiMockServer.when(validationRequest, once()) - .respond(successfulResponse(typeManager.writeValueAsString(sourceDataAddress), PLAIN_TEXT_UTF_8)); + when(dataPlaneAuthorizationService.authorize(any(), any())).thenReturn(Result.success(sourceDataAddress)); given() .baseUri(PUBLIC_API_HOST) @@ -190,22 +177,7 @@ void transfer_pull_withSourceQueryParamsAndPath_success(TypeManager typeManager) } @Test - void transfer_invalidInput_failure(TypeManager typeManager) { - var processId = UUID.randomUUID().toString(); - var invalidRequest = transferRequestPayload(processId, typeManager).remove("processId"); - - given() - .baseUri(CONTROL_API_HOST) - .contentType(ContentType.JSON) - .body(invalidRequest) - .when() - .post(TRANSFER_PATH) - .then() - .assertThat().statusCode(HttpStatus.SC_BAD_REQUEST); - } - - @Test - void shouldProxyMethodAndBody_whenSet(TypeManager typeManager) { + void shouldProxyMethodAndBody_whenSet(DataPlaneAuthorizationService dataPlaneAuthorizationService) { var sourceAddress = HttpDataAddress.Builder.newInstance() .baseUrl(HTTP_SOURCE_API_HOST) .proxyMethod(TRUE.toString()) @@ -213,8 +185,7 @@ void shouldProxyMethodAndBody_whenSet(TypeManager typeManager) { .proxyBody(TRUE.toString()) .build(); httpSourceMockServer.when(request(), once()).respond(successfulResponse("any", PLAIN_TEXT_UTF_8)); - validationApiMockServer.when(request(), once()) - .respond(successfulResponse(typeManager.writeValueAsString(sourceAddress), PLAIN_TEXT_UTF_8)); + when(dataPlaneAuthorizationService.authorize(any(), any())).thenReturn(Result.success(sourceAddress)); given() .baseUri(PUBLIC_API_HOST) @@ -229,6 +200,16 @@ void shouldProxyMethodAndBody_whenSet(TypeManager typeManager) { httpSourceMockServer.verify(request().withMethod("PUT").withBody("body"), VerificationTimes.once()); } + + private HttpDataAddress sourceDataAddress() { + return HttpDataAddress.Builder.newInstance() + .baseUrl(HTTP_SOURCE_API_HOST) + .proxyPath(TRUE.toString()) + .proxyQueryParams(TRUE.toString()) + .authKey(AUTH_HEADER_KEY) + .authCode(SOURCE_AUTH_VALUE) + .build(); + } } @Nested @@ -238,26 +219,23 @@ class Push { static RuntimeExtension dataPlane = new RuntimePerClassExtension(RUNTIME); @Test - void transfer_toHttpSink_success(TypeManager typeManager) { + void transfer_toHttpSink_success() { var body = UUID.randomUUID().toString(); var processId = UUID.randomUUID().toString(); - httpSourceMockServer.when(getRequest(HTTP_API_PATH), once()).respond(successfulResponse(body, APPLICATION_JSON)); - - // HTTP Sink Request & Response + httpSourceMockServer.when(getRequest(""), once()).respond(successfulResponse(body, APPLICATION_JSON)); httpSinkMockServer.when(request(), once()).respond(successfulResponse()); - initiateTransfer(transferRequestPayload(processId, typeManager)); + initiate(transferRequestPayload(processId)) + .then() + .assertThat().statusCode(HttpStatus.SC_OK); await().atMost(timeout).untilAsserted(() -> expectState(processId, NOTIFIED)); - // Verify HTTP Source server called exactly once. - httpSourceMockServer.verify(getRequest(HTTP_API_PATH), VerificationTimes.once()); - // Verify HTTP Sink server called exactly once. + httpSourceMockServer.verify(getRequest(""), VerificationTimes.once()); httpSinkMockServer.verify(postRequest(body, APPLICATION_JSON), VerificationTimes.once()); } @Test - void transfer_toHttpSink_withSourceQueryParams_success(TypeManager typeManager) { - // HTTP Source Request & Response + void transfer_toHttpSink_withSourcePathAndQueryParams_success() { var body = UUID.randomUUID().toString(); var processId = UUID.randomUUID().toString(); var queryParams = Map.of( @@ -265,32 +243,37 @@ void transfer_toHttpSink_withSourceQueryParams_success(TypeManager typeManager) "param2", "any other value" ); - httpSourceMockServer.when(getRequest(queryParams, HTTP_API_PATH), once()).respond(successfulResponse(body, APPLICATION_OCTET_STREAM)); - - // HTTP Sink Request & Response + httpSourceMockServer.when(getRequest(queryParams, "path"), once()).respond(successfulResponse(body, APPLICATION_OCTET_STREAM)); httpSinkMockServer.when(postRequest(body, APPLICATION_OCTET_STREAM), once()).respond(successfulResponse()); - initiateTransfer(transferRequestPayload(processId, queryParams, typeManager)); + var sourceDataAddress = Json.createObjectBuilder() + .add("@type", "dspace:DataAddress") + .add("dspace:endpointType", "HttpData") + .add("dspace:endpointProperties", sourceAddressProperties() + .add(dspaceProperty(EDC_NAMESPACE + "path", "path")) + .add(dspaceProperty(EDC_NAMESPACE + "queryParams", "param1=any value¶m2=any other value")) + ); + + initiate(transferRequestPayload(processId, sourceDataAddress)) + .then() + .assertThat().statusCode(HttpStatus.SC_OK); await().atMost(timeout).untilAsserted(() -> expectState(processId, NOTIFIED)); - // Verify HTTP Source server called exactly once. - httpSourceMockServer.verify(getRequest(queryParams, HTTP_API_PATH), VerificationTimes.once()); - // Verify HTTP Sink server called exactly once. + httpSourceMockServer.verify(getRequest(queryParams, "path"), VerificationTimes.once()); httpSinkMockServer.verify(postRequest(body, APPLICATION_OCTET_STREAM), VerificationTimes.once()); } @Test - void transfer_toHttpSink_sourceNotAvailable_noInteractionWithSink(TypeManager typeManager) { + void transfer_toHttpSink_sourceNotAvailable_noInteractionWithSink() { var processId = UUID.randomUUID().toString(); - // HTTP Source Request & Error Response - httpSourceMockServer.when(getRequest(HTTP_API_PATH)).error(withDropConnection()); + httpSourceMockServer.when(getRequest("")).error(withDropConnection()); - initiateTransfer(transferRequestPayload(processId, typeManager)); + initiate(transferRequestPayload(processId)) + .then() + .assertThat().statusCode(HttpStatus.SC_OK); await().atMost(timeout).untilAsserted(() -> expectState(processId, NOTIFIED)); - // Verify HTTP Source server called at lest once. - httpSourceMockServer.verify(getRequest(HTTP_API_PATH), VerificationTimes.atLeast(1)); - // Verify zero interaction with HTTP Sink. + httpSourceMockServer.verify(getRequest(""), VerificationTimes.atLeast(1)); httpSinkMockServer.verifyZeroInteractions(); } @@ -298,44 +281,50 @@ void transfer_toHttpSink_sourceNotAvailable_noInteractionWithSink(TypeManager ty * Validate if intermittently source is dropping connection than DPF server retries to fetch data. */ @Test - void transfer_toHttpSink_sourceTemporaryDropConnection_success(TypeManager typeManager) { + void transfer_toHttpSink_sourceTemporaryDropConnection_success() { var processId = UUID.randomUUID().toString(); - // First two calls to HTTP Source returns a failure response. - httpSourceMockServer.when(getRequest(HTTP_API_PATH), exactly(2)).error(withDropConnection()); + httpSourceMockServer.when(getRequest(""), exactly(2)).error(withDropConnection()); - // Next call to HTTP Source returns a valid response. var body = UUID.randomUUID().toString(); - httpSourceMockServer.when(getRequest(HTTP_API_PATH), once()).respond(successfulResponse(body, PLAIN_TEXT_UTF_8)); + httpSourceMockServer.when(getRequest(""), once()).respond(successfulResponse(body, PLAIN_TEXT_UTF_8)); - // HTTP Sink Request & Response httpSinkMockServer.when(postRequest(body, APPLICATION_OCTET_STREAM), once()).respond(successfulResponse()); - initiateTransfer(transferRequestPayload(processId, typeManager)); + initiate(transferRequestPayload(processId)) + .then() + .assertThat().statusCode(HttpStatus.SC_OK); await().atMost(timeout).untilAsserted(() -> expectState(processId, NOTIFIED)); - // Verify HTTP Source server called exactly 3 times. - httpSourceMockServer.verify(getRequest(HTTP_API_PATH), VerificationTimes.exactly(3)); - // Verify HTTP Sink server called exactly once. + httpSourceMockServer.verify(getRequest(""), VerificationTimes.exactly(3)); httpSinkMockServer.verify(postRequest(body, PLAIN_TEXT_UTF_8), VerificationTimes.once()); } - private void initiateTransfer(Object payload) { - given() - .baseUri(CONTROL_API_HOST) + @Test + void transfer_invalidInput_failure() { + var processId = UUID.randomUUID().toString(); + var validRequest = transferRequestPayload(processId); + var invalidRequest = Json.createObjectBuilder(validRequest).remove("transferTypeDestination").build(); + + initiate(invalidRequest) + .then() + .assertThat().statusCode(HttpStatus.SC_BAD_REQUEST); + } + + private Response initiate(JsonObject payload) { + return given() + .port(CONTROL_API_PORT) .contentType(ContentType.JSON) .body(payload) .when() - .post(TRANSFER_PATH) - .then() - .assertThat().statusCode(HttpStatus.SC_OK); + .post("/control/v1/dataflows"); } private void expectState(String processId, DataFlowStates expectedState) { given() - .baseUri(CONTROL_API_HOST) - .pathParam(PROCESS_ID, processId) + .port(CONTROL_API_PORT) .when() - .get(TRANSFER_RESULT_PATH) + .pathParam("id", processId) + .get("/control/v1/dataflows/{id}/state") .then() .assertThat().statusCode(HttpStatus.SC_OK) .body(containsString(expectedState.name())); @@ -345,59 +334,51 @@ private HttpError withDropConnection() { return error() .withDropConnection(true); } - } - /** - * Request payload to initiate DPF transfer. - * - * @param processId ProcessID of transfer.See {@link DataFlowStartMessage} - * @return JSON object. see {@link ObjectNode}. - */ - private ObjectNode transferRequestPayload(String processId, TypeManager typeManager) { - return transferRequestPayload(processId, emptyMap(), typeManager); - } + private JsonObject transferRequestPayload(String processId) { + return transferRequestPayload(processId, sourceAddress()); + } - /** - * Request payload with query params to initiate DPF transfer. - * - * @param processId ProcessID of transfer.See {@link DataFlowStartMessage} - * @param queryParams Query params name and value as key-value entries. - * @return JSON object. see {@link ObjectNode}. - */ - private ObjectNode transferRequestPayload(String processId, Map queryParams, TypeManager typeManager) { - var requestProperties = new HashMap(); - requestProperties.put(DataFlowRequestSchema.METHOD, HttpMethod.GET.name()); - requestProperties.put(DataFlowRequestSchema.PATH, HTTP_API_PATH); - - if (!queryParams.isEmpty()) { - requestProperties.put(DataFlowRequestSchema.QUERY_PARAMS, queryParams.entrySet() - .stream() - .map(entry -> entry.getKey() + "=" + entry.getValue()) - .collect(Collectors.joining("&"))); + private JsonObject transferRequestPayload(String processId, JsonObjectBuilder sourceDataAddress) { + return Json.createObjectBuilder() + .add("@context", Json.createObjectBuilder().add("@vocab", EDC_NAMESPACE).add("dspace", "https://w3id.org/dspace/v0.8/")) + .add("@type", EDC_DATA_FLOW_START_MESSAGE_TYPE) + .add("@id", UUID.randomUUID().toString()) + .add("processId", processId) + .add("sourceDataAddress", sourceDataAddress) + .add("destinationDataAddress", Json.createObjectBuilder() + .add("dspace:endpointType", "HttpData") + .add("dspace:endpointProperties", Json.createArrayBuilder() + .add(dspaceProperty(EDC_NAMESPACE + "baseUrl", HTTP_SINK_API_HOST)) + .add(dspaceProperty(EDC_NAMESPACE + "authKey", AUTH_HEADER_KEY)) + .add(dspaceProperty(EDC_NAMESPACE + "authCode", SINK_AUTH_VALUE)) + ) + ) + .add("flowType", "PUSH") + .add("transferTypeDestination", "HttpData-PUSH") + .build(); } - var destinationDataAddress = HttpDataAddress.Builder.newInstance() - .baseUrl(HTTP_SINK_API_HOST) - .authKey(AUTH_HEADER_KEY) - .authCode(SINK_AUTH_VALUE) - .build(); + private JsonObjectBuilder sourceAddress() { + return Json.createObjectBuilder() + .add("@type", "dspace:DataAddress") + .add("dspace:endpointType", "HttpData") + .add("dspace:endpointProperties", sourceAddressProperties()); + } - // Create valid dataflow request instance. - var request = createRequest(requestProperties, sourceDataAddress(), destinationDataAddress) - .processId(processId) - .build(); + private JsonArrayBuilder sourceAddressProperties() { + return Json.createArrayBuilder() + .add(dspaceProperty(EDC_NAMESPACE + "baseUrl", HTTP_SOURCE_API_HOST)) + .add(dspaceProperty(EDC_NAMESPACE + "authKey", AUTH_HEADER_KEY)) + .add(dspaceProperty(EDC_NAMESPACE + "authCode", SOURCE_AUTH_VALUE)); + } - return typeManager.getMapper().convertValue(request, ObjectNode.class); - } + private JsonObjectBuilder dspaceProperty(String name, String value) { + return Json.createObjectBuilder() + .add("dspace:name", name) + .add("dspace:value", value); + } - private HttpDataAddress sourceDataAddress() { - return HttpDataAddress.Builder.newInstance() - .baseUrl(HTTP_SOURCE_API_HOST) - .proxyPath(TRUE.toString()) - .proxyQueryParams(TRUE.toString()) - .authKey(AUTH_HEADER_KEY) - .authCode(SOURCE_AUTH_VALUE) - .build(); } /** @@ -420,7 +401,7 @@ private HttpRequest getRequest(Map queryParams, String path) { var paramsList = queryParams.entrySet() .stream() .map(entry -> param(entry.getKey(), entry.getValue())) - .collect(Collectors.toList()); + .toList(); request.withQueryStringParameters(new Parameters(paramsList).withKeyMatchStyle(MATCHING_KEY)); diff --git a/extensions/data-plane/data-plane-public-api/README.md b/extensions/data-plane/data-plane-public-api/README.md deleted file mode 100644 index ae975c34dbd..00000000000 --- a/extensions/data-plane/data-plane-public-api/README.md +++ /dev/null @@ -1 +0,0 @@ -# Data Plane Public API diff --git a/extensions/data-plane/data-plane-public-api/build.gradle.kts b/extensions/data-plane/data-plane-public-api/build.gradle.kts deleted file mode 100644 index 1516ceb8107..00000000000 --- a/extensions/data-plane/data-plane-public-api/build.gradle.kts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 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 - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * Mercedes-Benz Tech Innovation GmbH - publish public api context into dedicated swagger hub page - * - */ - - -plugins { - `java-library` - id(libs.plugins.swagger.get().pluginId) -} - -dependencies { - api(project(":spi:common:http-spi")) - api(project(":spi:common:web-spi")) - api(project(":spi:data-plane:data-plane-spi")) - implementation(project(":core:common:lib:util-lib")) - - implementation(project(":core:data-plane:data-plane-util")) - implementation(libs.jakarta.rsApi) - - testImplementation(project(":extensions:common:http")) - testImplementation(project(":core:common:junit")) - testImplementation(libs.jersey.multipart) - testImplementation(libs.restAssured) - testImplementation(libs.mockserver.netty) - testImplementation(libs.mockserver.client) - - testImplementation(testFixtures(project(":core:common:lib:http-lib"))) - testImplementation(testFixtures(project(":extensions:common:http:jersey-core"))) -} -edcBuild { - swagger { - apiGroup.set("public-api") - } -} - - diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlanePublicApiExtension.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlanePublicApiExtension.java deleted file mode 100644 index 0f981282588..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/DataPlanePublicApiExtension.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 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 - * Mercedes-Benz Tech Innovation GmbH - publish public api context into dedicated swagger hub page - * - */ - -package org.eclipse.edc.connector.dataplane.api; - -import org.eclipse.edc.connector.dataplane.api.controller.DataPlanePublicApiController; -import org.eclipse.edc.connector.dataplane.api.validation.ConsumerPullTransferDataAddressResolver; -import org.eclipse.edc.connector.dataplane.spi.pipeline.PipelineService; -import org.eclipse.edc.http.spi.EdcHttpClient; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Setting; -import org.eclipse.edc.runtime.metamodel.annotation.SettingContext; -import org.eclipse.edc.spi.system.ExecutorInstrumentation; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.web.spi.WebServer; -import org.eclipse.edc.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; -import org.eclipse.edc.web.spi.configuration.WebServiceConfigurer; -import org.eclipse.edc.web.spi.configuration.WebServiceSettings; - -import java.util.concurrent.Executors; - -/** - * This extension provides generic endpoints which are open to public participants of the Dataspace to execute - * requests on the actual data source. - * - * @deprecated will be replaced by v2. - */ -@Extension(value = DataPlanePublicApiExtension.NAME) -@Deprecated(since = "0.6.0") -public class DataPlanePublicApiExtension implements ServiceExtension { - public static final String NAME = "Data Plane Public API"; - - @SettingContext("Public API context setting key") - private static final String PUBLIC_CONFIG_KEY = "web.http." + ApiContext.PUBLIC; - - @Setting(value = "Token validation server endpoint", required = true) - private static final String CONTROL_PLANE_VALIDATION_ENDPOINT = "edc.dataplane.token.validation.endpoint"; - - private static final int DEFAULT_THREAD_POOL = 10; - - private static final WebServiceSettings PUBLIC_SETTINGS = WebServiceSettings.Builder.newInstance() - .apiConfigKey(PUBLIC_CONFIG_KEY) - .contextAlias(ApiContext.PUBLIC) - .defaultPath("/api/v1/public") - .defaultPort(8185) - .name(NAME) - .build(); - - @Inject - private WebServer webServer; - - @Inject - private WebServiceConfigurer webServiceConfigurer; - - @Inject - private PipelineService pipelineService; - - @Inject - private WebService webService; - - @Inject - private EdcHttpClient httpClient; - - @Inject - private TypeManager typeManager; - - @Inject - private ExecutorInstrumentation executorInstrumentation; - - @Override - public String name() { - return NAME; - } - - @Override - public void initialize(ServiceExtensionContext context) { - var config = context.getConfig(PUBLIC_CONFIG_KEY); - var validationEndpoint = context.getConfig().getString(CONTROL_PLANE_VALIDATION_ENDPOINT); - var dataAddressResolver = new ConsumerPullTransferDataAddressResolver(httpClient, validationEndpoint, typeManager.getMapper()); - webServiceConfigurer.configure(config, webServer, PUBLIC_SETTINGS); - var executorService = executorInstrumentation.instrument( - Executors.newFixedThreadPool(DEFAULT_THREAD_POOL), - "Data plane proxy transfers" - ); - var monitor = context.getMonitor().withPrefix("DataPlane Public API"); - var publicApiController = new DataPlanePublicApiController(pipelineService, dataAddressResolver, executorService, monitor); - webService.registerResource(ApiContext.PUBLIC, publicApiController); - - monitor.warning("This public API controller is scheduled for removal. Please consider upgrading your deployment " + - "to the data-plane-public-api-v2 module. The Data Plane Public API will then be available under at /v2/ prefix."); - } -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApi.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApi.java deleted file mode 100644 index 99c48a2e4df..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApi.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import jakarta.ws.rs.container.ContainerRequestContext; - -import java.util.Map; - -/** - * Wrapper around {@link ContainerRequestContext} enabling mocking. - */ -public interface ContainerRequestContextApi { - - /** - * Get the request headers. Note that if more than one value is associated to a specific header, - * only the first one is retained. - * - * @return Headers map. - */ - Map headers(); - - /** - * Format query of the request as string, e.g. "hello=world\&foo=bar". - * - * @return Query param string. - */ - String queryParams(); - - /** - * Format the request body into a string. - * - * @return Request body. - */ - String body(); - - /** - * Get the media type from incoming request. - * - * @return Media type. - */ - String mediaType(); - - /** - * Return request path, e.g. "hello/world/foo/bar". - * - * @return Path string. - */ - String path(); - - /** - * Get http method from the incoming request, e.g. "GET", "POST"... - * - * @return Http method. - */ - String method(); -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApiImpl.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApiImpl.java deleted file mode 100644 index c81245a62d6..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/ContainerRequestContextApiImpl.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.core.MediaType; -import org.eclipse.edc.spi.EdcException; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * This class provides a set of API wrapping a {@link ContainerRequestContext}. - */ -public class ContainerRequestContextApiImpl implements ContainerRequestContextApi { - - private static final String QUERY_PARAM_SEPARATOR = "&"; - - private final ContainerRequestContext context; - - public ContainerRequestContextApiImpl(ContainerRequestContext context) { - this.context = context; - } - - @Override - public Map headers() { - return context.getHeaders().entrySet() - .stream() - .filter(entry -> !entry.getValue().isEmpty()) - .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().get(0))); - } - - @Override - public String queryParams() { - return context.getUriInfo().getQueryParameters().entrySet() - .stream() - .map(entry -> new QueryParam(entry.getKey(), entry.getValue())) - .filter(QueryParam::isValid) - .map(QueryParam::toString) - .collect(Collectors.joining(QUERY_PARAM_SEPARATOR)); - } - - @Override - public String body() { - try (BufferedReader br = new BufferedReader(new InputStreamReader(context.getEntityStream()))) { - return br.lines().collect(Collectors.joining("\n")); - } catch (IOException e) { - throw new EdcException("Failed to read request body: " + e.getMessage()); - } - } - - @Override - public String path() { - var pathInfo = context.getUriInfo().getPath(); - return pathInfo.startsWith("/") ? pathInfo.substring(1) : pathInfo; - } - - @Override - public String mediaType() { - return Optional.ofNullable(context.getMediaType()) - .map(MediaType::toString) - .orElse(null); - } - - @Override - public String method() { - return context.getMethod(); - } - - private static final class QueryParam { - - private final String key; - private final List values; - private final boolean valid; - - private QueryParam(String key, List values) { - this.key = key; - this.values = values; - this.valid = key != null && values != null && !values.isEmpty(); - } - - public boolean isValid() { - return valid; - } - - @Override - public String toString() { - return valid ? key + "=" + values.get(0) : ""; - } - } -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowRequestSupplier.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowRequestSupplier.java deleted file mode 100644 index 3ab5c2368b8..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowRequestSupplier.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import org.eclipse.edc.connector.dataplane.util.sink.AsyncStreamingDataSink; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.eclipse.edc.spi.types.domain.transfer.FlowType; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.function.BiFunction; - -import static org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema.BODY; -import static org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema.MEDIA_TYPE; -import static org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema.METHOD; -import static org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema.PATH; -import static org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema.QUERY_PARAMS; - -public class DataFlowRequestSupplier implements BiFunction { - - /** - * Put all properties of the incoming request (method, request body, query params...) into a map. - */ - private static Map createProps(ContainerRequestContextApi contextApi) { - var props = new HashMap(); - props.put(METHOD, contextApi.method()); - props.put(QUERY_PARAMS, contextApi.queryParams()); - props.put(PATH, contextApi.path()); - Optional.ofNullable(contextApi.mediaType()) - .ifPresent(mediaType -> { - props.put(MEDIA_TYPE, mediaType); - props.put(BODY, contextApi.body()); - }); - return props; - } - - /** - * Create a {@link DataFlowStartMessage} based on incoming request and claims decoded from the access token. - * - * @param contextApi Api for accessing request properties. - * @param dataAddress Source data address. - * @return DataFlowRequest - */ - @Override - public DataFlowStartMessage apply(ContainerRequestContextApi contextApi, DataAddress dataAddress) { - var props = createProps(contextApi); - return DataFlowStartMessage.Builder.newInstance() - .processId(UUID.randomUUID().toString()) - .sourceDataAddress(dataAddress) - .flowType(FlowType.PULL) - .destinationDataAddress(DataAddress.Builder.newInstance() - .type(AsyncStreamingDataSink.TYPE) - .build()) - .id(UUID.randomUUID().toString()) - .properties(props) - .build(); - } -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApi.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApi.java deleted file mode 100644 index 36188bdf8a3..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApi.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - Initial implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.ws.rs.container.AsyncResponse; -import jakarta.ws.rs.container.ContainerRequestContext; - -@OpenAPIDefinition -@Tag(name = "Data Plane public API", - description = "The public API of the Data Plane is a data proxy enabling a data consumer to actively query" + - "data from the provider data source (e.g. backend Rest API, internal database...) through its Data Plane" + - "instance. Thus the Data Plane is the only entry/output door for the data, which avoids the provider to expose" + - "directly its data externally." + - "The Data Plane public API being a proxy, it supports all verbs (i.e. GET, POST, PUT, PATCH, DELETE), which" + - "can then conveyed until the data source is required. This is especially useful when the actual data source" + - "is a Rest API itself." + - "In the same manner, any set of arbitrary query parameters, path parameters and request body are supported " + - "(in the limits fixed by the HTTP server) and can also conveyed to the actual data source.") -@Deprecated(since = "0.6.0") -public interface DataPlanePublicApi { - - @Operation(description = "Send `GET` data query to the Data Plane.", - responses = { - @ApiResponse(responseCode = "400", description = "Missing access token"), - @ApiResponse(responseCode = "403", description = "Access token is expired or invalid"), - @ApiResponse(responseCode = "500", description = "Failed to transfer data") - }, - deprecated = true - ) - @Deprecated(since = "0.5.1") - void get(ContainerRequestContext context, AsyncResponse response); - - @Operation(description = "Send `POST` data query to the Data Plane.", - responses = { - @ApiResponse(responseCode = "400", description = "Missing access token"), - @ApiResponse(responseCode = "403", description = "Access token is expired or invalid"), - @ApiResponse(responseCode = "500", description = "Failed to transfer data") - }, - deprecated = true - ) - @Deprecated(since = "0.5.1") - void post(ContainerRequestContext context, AsyncResponse response); - - @Operation(description = "Send `PUT` data query to the Data Plane.", - responses = { - @ApiResponse(responseCode = "400", description = "Missing access token"), - @ApiResponse(responseCode = "403", description = "Access token is expired or invalid"), - @ApiResponse(responseCode = "500", description = "Failed to transfer data") - }, - deprecated = true - ) - @Deprecated(since = "0.5.1") - void put(ContainerRequestContext context, AsyncResponse response); - - @Operation(description = "Send `DELETE` data query to the Data Plane.", - responses = { - @ApiResponse(responseCode = "400", description = "Missing access token"), - @ApiResponse(responseCode = "403", description = "Access token is expired or invalid"), - @ApiResponse(responseCode = "500", description = "Failed to transfer data") - } - ) - void delete(ContainerRequestContext context, AsyncResponse response); - - @Operation(description = "Send `PATCH` data query to the Data Plane.", - responses = { - @ApiResponse(responseCode = "400", description = "Missing access token"), - @ApiResponse(responseCode = "403", description = "Access token is expired or invalid"), - @ApiResponse(responseCode = "500", description = "Failed to transfer data") - }, - deprecated = true - ) - @Deprecated(since = "0.5.1") - void patch(ContainerRequestContext context, AsyncResponse response); -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiController.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiController.java deleted file mode 100644 index de0e566e857..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiController.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * Mercedes-Benz Tech Innovation GmbH - publish public api context into dedicated swagger hub page - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import jakarta.ws.rs.DELETE; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.PUT; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.container.AsyncResponse; -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.container.Suspended; -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.Response; -import jakarta.ws.rs.core.StreamingOutput; -import org.eclipse.edc.connector.dataplane.spi.pipeline.PipelineService; -import org.eclipse.edc.connector.dataplane.spi.resolver.DataAddressResolver; -import org.eclipse.edc.connector.dataplane.spi.response.TransferErrorResponse; -import org.eclipse.edc.connector.dataplane.util.sink.AsyncStreamingDataSink; -import org.eclipse.edc.spi.monitor.Monitor; - -import java.util.List; -import java.util.concurrent.ExecutorService; - -import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; -import static jakarta.ws.rs.core.MediaType.WILDCARD; -import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; -import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; -import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static jakarta.ws.rs.core.Response.status; - -@Path("{any:.*}") -@Produces(WILDCARD) -@Deprecated(since = "0.6.0") -public class DataPlanePublicApiController implements DataPlanePublicApi { - - private final PipelineService pipelineService; - private final DataAddressResolver dataAddressResolver; - private final DataFlowRequestSupplier requestSupplier; - private final ExecutorService executorService; - private final Monitor monitor; - - public DataPlanePublicApiController(PipelineService pipelineService, DataAddressResolver dataAddressResolver, - ExecutorService executorService, Monitor monitor) { - this.pipelineService = pipelineService; - this.dataAddressResolver = dataAddressResolver; - this.monitor = monitor; - this.requestSupplier = new DataFlowRequestSupplier(); - this.executorService = executorService; - } - - private static Response error(Response.Status status, String error) { - return status(status).type(APPLICATION_JSON).entity(new TransferErrorResponse(List.of(error))).build(); - } - - @GET - @Override - public void get(@Context ContainerRequestContext requestContext, @Suspended AsyncResponse response) { - handle(requestContext, response); - } - - /** - * Sends a {@link POST} request to the data source and returns data. - * - * @param requestContext Request context. - * @param response Data fetched from the data source. - */ - @POST - @Override - public void post(@Context ContainerRequestContext requestContext, @Suspended AsyncResponse response) { - handle(requestContext, response); - } - - /** - * Sends a {@link PUT} request to the data source and returns data. - * - * @param requestContext Request context. - * @param response Data fetched from the data source. - */ - @PUT - @Override - public void put(@Context ContainerRequestContext requestContext, @Suspended AsyncResponse response) { - handle(requestContext, response); - } - - /** - * Sends a {@link DELETE} request to the data source and returns data. - * - * @param requestContext Request context. - * @param response Data fetched from the data source. - */ - @DELETE - @Override - public void delete(@Context ContainerRequestContext requestContext, @Suspended AsyncResponse response) { - handle(requestContext, response); - } - - /** - * Sends a {@link PATCH} request to the data source and returns data. - * - * @param requestContext Request context. - * @param response Data fetched from the data source. - */ - @PATCH - @Override - public void patch(@Context ContainerRequestContext requestContext, @Suspended AsyncResponse response) { - handle(requestContext, response); - } - - private void handle(ContainerRequestContext context, AsyncResponse response) { - - monitor.warning("The DataPlane Public API is deprecated. Please consider upgrading to the /v2/ path. Your request will then be: %s" - .formatted(context.getUriInfo().getBaseUri() + "v2/" + context.getUriInfo().getPath())); - var contextApi = new ContainerRequestContextApiImpl(context); - var token = contextApi.headers().get(HttpHeaders.AUTHORIZATION); - if (token == null) { - response.resume(error(BAD_REQUEST, "Missing token")); - return; - } - - var tokenValidation = dataAddressResolver.resolve(token); - if (tokenValidation.failed()) { - response.resume(error(FORBIDDEN, tokenValidation.getFailureDetail())); - return; - } - - var dataAddress = tokenValidation.getContent(); - var dataFlowRequest = requestSupplier.apply(contextApi, dataAddress); - - AsyncStreamingDataSink.AsyncResponseContext asyncResponseContext = callback -> { - StreamingOutput output = t -> callback.outputStreamConsumer().accept(t); - var resp = Response.ok(output).type(callback.mediaType()).build(); - return response.resume(resp); - }; - - var sink = new AsyncStreamingDataSink(asyncResponseContext, executorService); - - pipelineService.transfer(dataFlowRequest, sink) - .whenComplete((result, throwable) -> { - if (throwable == null) { - if (result.failed()) { - response.resume(error(INTERNAL_SERVER_ERROR, result.getFailureDetail())); - } - } else { - var error = "Unhandled exception occurred during data transfer: " + throwable.getMessage(); - response.resume(error(INTERNAL_SERVER_ERROR, error)); - } - }); - } - -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolver.java b/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolver.java deleted file mode 100644 index 908822ac5c8..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolver.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.validation; - -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.ws.rs.core.HttpHeaders; -import okhttp3.Request; -import org.eclipse.edc.connector.dataplane.spi.resolver.DataAddressResolver; -import org.eclipse.edc.http.spi.EdcHttpClient; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.domain.DataAddress; - -import java.io.IOException; - -import static java.lang.String.format; - -@Deprecated(since = "0.6.0") -public class ConsumerPullTransferDataAddressResolver implements DataAddressResolver { - - private final EdcHttpClient httpClient; - private final String endpoint; - private final ObjectMapper mapper; - - public ConsumerPullTransferDataAddressResolver(EdcHttpClient httpClient, String endpoint, ObjectMapper mapper) { - this.httpClient = httpClient; - this.endpoint = endpoint; - this.mapper = mapper; - } - - /** - * Resolves access token received in input of Data Plane public API (consumer pull) into the {@link DataAddress} - * of the requested data. - * - * @param token Access token received in input of the Data Plane public API - * @return Data address - */ - @Override - public Result resolve(String token) { - var request = new Request.Builder().url(endpoint).header(HttpHeaders.AUTHORIZATION, token).get().build(); - try (var response = httpClient.execute(request)) { - var body = response.body(); - var stringBody = body != null ? body.string() : null; - if (stringBody == null) { - return Result.failure("Token validation server returned null body"); - } - - if (response.isSuccessful()) { - return Result.success(mapper.readValue(stringBody, DataAddress.class)); - } else { - return Result.failure(format("Call to token validation sever failed: %s - %s. %s", response.code(), response.message(), stringBody)); - } - } catch (IOException e) { - return Result.failure("Unhandled exception occurred during call to token validation server: " + e.getMessage()); - } - } -} diff --git a/extensions/data-plane/data-plane-public-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/data-plane/data-plane-public-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index d0da2de712a..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.edc.connector.dataplane.api.DataPlanePublicApiExtension \ No newline at end of file diff --git a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowStartMessageSupplierTest.java b/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowStartMessageSupplierTest.java deleted file mode 100644 index 8961e2e42f4..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataFlowStartMessageSupplierTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import jakarta.ws.rs.HttpMethod; -import jakarta.ws.rs.core.MediaType; -import org.eclipse.edc.connector.dataplane.spi.schema.DataFlowRequestSchema; -import org.eclipse.edc.connector.dataplane.util.sink.AsyncStreamingDataSink; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class DataFlowStartMessageSupplierTest { - - - private final DataFlowRequestSupplier supplier = new DataFlowRequestSupplier(); - - private static DataAddress createDataAddress() { - return DataAddress.Builder.newInstance().type("test-type").build(); - } - - @Test - void verifyMapping_noInputBody() { - var contextApi = mock(ContainerRequestContextApi.class); - var address = createDataAddress(); - - var method = HttpMethod.GET; - var queryParams = "test-query-param"; - var path = "test-path"; - - when(contextApi.method()).thenReturn(method); - when(contextApi.queryParams()).thenReturn(queryParams); - when(contextApi.path()).thenReturn(path); - - var request = supplier.apply(contextApi, address); - - assertThat(request.getId()).isNotBlank(); - assertThat(request.getDestinationDataAddress().getType()).isEqualTo(AsyncStreamingDataSink.TYPE); - assertThat(request.getSourceDataAddress().getType()).isEqualTo(address.getType()); - assertThat(request.getProperties()).containsExactlyInAnyOrderEntriesOf(Map.of( - DataFlowRequestSchema.PATH, path, - DataFlowRequestSchema.METHOD, method, - DataFlowRequestSchema.QUERY_PARAMS, queryParams - - )); - } - - @Test - void verifyMapping_withInputBody() { - var contextApi = mock(ContainerRequestContextApi.class); - var address = createDataAddress(); - - var method = HttpMethod.GET; - var queryParams = "test-query-param"; - var path = "test-path"; - var body = "Test request body"; - - when(contextApi.method()).thenReturn(method); - when(contextApi.queryParams()).thenReturn(queryParams); - when(contextApi.path()).thenReturn(path); - when(contextApi.mediaType()).thenReturn(MediaType.TEXT_PLAIN); - when(contextApi.body()).thenReturn(body); - - var request = supplier.apply(contextApi, address); - - assertThat(request.getId()).isNotBlank(); - assertThat(request.getDestinationDataAddress().getType()).isEqualTo(AsyncStreamingDataSink.TYPE); - assertThat(request.getSourceDataAddress().getType()).isEqualTo(address.getType()); - assertThat(request.getProperties()).containsExactlyInAnyOrderEntriesOf(Map.of( - DataFlowRequestSchema.PATH, path, - DataFlowRequestSchema.METHOD, method, - DataFlowRequestSchema.QUERY_PARAMS, queryParams, - DataFlowRequestSchema.BODY, body, - DataFlowRequestSchema.MEDIA_TYPE, MediaType.TEXT_PLAIN - )); - } -} diff --git a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiControllerTest.java b/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiControllerTest.java deleted file mode 100644 index 78e6dcc727c..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/controller/DataPlanePublicApiControllerTest.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * - */ - -package org.eclipse.edc.connector.dataplane.api.controller; - -import io.restassured.specification.RequestSpecification; -import jakarta.ws.rs.core.Response; -import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; -import org.eclipse.edc.connector.dataplane.spi.pipeline.PipelineService; -import org.eclipse.edc.connector.dataplane.spi.pipeline.StreamResult; -import org.eclipse.edc.connector.dataplane.spi.resolver.DataAddressResolver; -import org.eclipse.edc.connector.dataplane.util.sink.AsyncStreamingDataSink; -import org.eclipse.edc.junit.annotations.ApiTest; -import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; -import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executors; -import java.util.stream.Stream; - -import static io.restassured.RestAssured.given; -import static io.restassured.http.ContentType.JSON; -import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; -import static java.util.concurrent.CompletableFuture.completedFuture; -import static java.util.concurrent.CompletableFuture.failedFuture; -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.connector.dataplane.spi.pipeline.StreamFailure.Reason.GENERAL_ERROR; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ApiTest -class DataPlanePublicApiControllerTest extends RestControllerTestBase { - - private final PipelineService pipelineService = mock(); - private final DataAddressResolver dataAddressResolver = mock(); - - @Test - void should_returnBadRequest_if_missingAuthorizationHeader() { - baseRequest() - .post("/any") - .then() - .statusCode(Response.Status.BAD_REQUEST.getStatusCode()) - .body("errors[0]", is("Missing token")); - } - - @Test - void shouldNotReturn302_whenUrlWithoutTrailingSlash() { - baseRequest() - .post("") - .then() - .statusCode(not(302)); - } - - @Test - void should_returnForbidden_if_tokenValidationFails() { - var token = UUID.randomUUID().toString(); - when(dataAddressResolver.resolve(any())).thenReturn(Result.failure("token is not value")); - - baseRequest() - .header(AUTHORIZATION, token) - .post("/any") - .then() - .statusCode(Response.Status.FORBIDDEN.getStatusCode()) - .contentType(JSON) - .body("errors.size()", is(1)); - - verify(dataAddressResolver).resolve(token); - } - - @Test - void should_returnInternalServerError_if_transferFails() { - var token = UUID.randomUUID().toString(); - var errorMsg = UUID.randomUUID().toString(); - when(dataAddressResolver.resolve(any())).thenReturn(Result.success(testDestAddress())); - when(pipelineService.transfer(any(), any())) - .thenReturn(completedFuture(StreamResult.error(errorMsg))); - - baseRequest() - .header(AUTHORIZATION, token) - .when() - .post("/any") - .then() - .statusCode(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()) - .contentType(JSON) - .body("errors[0]", is(GENERAL_ERROR + ": " + errorMsg)); - } - - @Test - void should_returnInternalServerError_if_transferThrows() { - var token = UUID.randomUUID().toString(); - var errorMsg = UUID.randomUUID().toString(); - when(dataAddressResolver.resolve(any())).thenReturn(Result.success(testDestAddress())); - when(pipelineService.transfer(any(DataFlowStartMessage.class), any())) - .thenReturn(failedFuture(new RuntimeException(errorMsg))); - - baseRequest() - .header(AUTHORIZATION, token) - .when() - .post("/any") - .then() - .statusCode(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()) - .contentType(JSON) - .body("errors[0]", is("Unhandled exception occurred during data transfer: " + errorMsg)); - } - - @Test - void shouldStreamSourceToResponse() { - when(dataAddressResolver.resolve(any())).thenReturn(Result.success(testDestAddress())); - when(pipelineService.transfer(any(), any())).thenAnswer(i -> { - ((AsyncStreamingDataSink) i.getArgument(1)).transfer(new TestDataSource("application/something", "data")); - return CompletableFuture.completedFuture(StreamResult.success()); - }); - - var responseBody = baseRequest() - .header(AUTHORIZATION, UUID.randomUUID().toString()) - .when() - .post("/any?foo=bar") - .then() - .log().ifError() - .statusCode(Response.Status.OK.getStatusCode()) - .contentType("application/something") - .extract().body().asString(); - - assertThat(responseBody).isEqualTo("data"); - var requestCaptor = ArgumentCaptor.forClass(DataFlowStartMessage.class); - verify(pipelineService).transfer(requestCaptor.capture(), any()); - var request = requestCaptor.getValue(); - assertThat(request.getDestinationDataAddress().getType()).isEqualTo(AsyncStreamingDataSink.TYPE); - assertThat(request.getSourceDataAddress().getType()).isEqualTo("test"); - assertThat(request.getProperties()).containsEntry("method", "POST").containsEntry("pathSegments", "any").containsEntry("queryParams", "foo=bar"); - } - - @Override - protected Object controller() { - return new DataPlanePublicApiController(pipelineService, dataAddressResolver, Executors.newSingleThreadExecutor(), mock()); - } - - private RequestSpecification baseRequest() { - return given() - .baseUri("http://localhost:" + port) - .when(); - } - - private DataAddress testDestAddress() { - return DataAddress.Builder.newInstance().type("test").build(); - } - - private record TestDataSource(String mediaType, String data) implements DataSource, DataSource.Part { - - @Override - public StreamResult> openPartStream() { - return StreamResult.success(Stream.of(this)); - } - - @Override - public String name() { - return "test"; - } - - @Override - public InputStream openStream() { - return new ByteArrayInputStream(data.getBytes()); - } - - } - -} diff --git a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolverTest.java b/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolverTest.java deleted file mode 100644 index b98d2478d5c..00000000000 --- a/extensions/data-plane/data-plane-public-api/src/test/java/org/eclipse/edc/connector/dataplane/api/validation/ConsumerPullTransferDataAddressResolverTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.edc.connector.dataplane.api.validation; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.ws.rs.core.HttpHeaders; -import org.eclipse.edc.json.JacksonTypeManager; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.model.HttpRequest; -import org.mockserver.model.HttpResponse; -import org.mockserver.model.MediaType; - -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.http.client.testfixtures.HttpTestUtils.testHttpClient; -import static org.eclipse.edc.util.io.Ports.getFreePort; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.matchers.Times.once; -import static org.mockserver.stop.Stop.stopQuietly; - -class ConsumerPullTransferDataAddressResolverTest { - - private static final ObjectMapper MAPPER = new JacksonTypeManager().getMapper(); - private static final int PORT = getFreePort(); - private static final String TOKEN_VALIDATION_SERVER_URL = "http://localhost:" + PORT; - private static ClientAndServer validationClientAndServer; - - private ConsumerPullTransferDataAddressResolver resolver; - - @BeforeAll - public static void startServer() { - validationClientAndServer = startClientAndServer(PORT); - } - - @AfterAll - public static void stopServer() { - stopQuietly(validationClientAndServer); - } - - @BeforeEach - public void setUp() { - resolver = new ConsumerPullTransferDataAddressResolver(testHttpClient(), TOKEN_VALIDATION_SERVER_URL, MAPPER); - } - - @AfterEach - public void tearDown() { - validationClientAndServer.reset(); - } - - @Test - void verifySuccessTokenValidation() throws JsonProcessingException { - var token = UUID.randomUUID().toString(); - var address = DataAddress.Builder.newInstance() - .type("test-type") - .build(); - - validationClientAndServer.when(new HttpRequest().withHeader(HttpHeaders.AUTHORIZATION, token), once()) - .respond(HttpResponse.response() - .withStatusCode(200) - .withBody(MAPPER.writeValueAsString(address)) - .withContentType(MediaType.APPLICATION_JSON)); - - var result = resolver.resolve(token); - - assertThat(result.succeeded()).isTrue(); - assertThat(result.getContent().getType()).isEqualTo(address.getType()); - } - - @Test - void verifyFailedResultReturnedIfServerResponseIsUnsuccessful() throws JsonProcessingException { - var token = UUID.randomUUID().toString(); - var address = DataAddress.Builder.newInstance() - .type("test-type") - .build(); - - validationClientAndServer.when(new HttpRequest().withHeader(HttpHeaders.AUTHORIZATION, token), once()) - .respond(HttpResponse.response() - .withStatusCode(400) - .withBody(MAPPER.writeValueAsString(address)) - .withContentType(MediaType.APPLICATION_JSON)); - - var result = resolver.resolve(token); - - assertThat(result.failed()).isTrue(); - } -} diff --git a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/build.gradle.kts b/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/build.gradle.kts deleted file mode 100644 index c5f5b2b5055..00000000000 --- a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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 - * - */ - - -plugins { - `java-library` -} - -dependencies { - api(project(":spi:common:json-ld-spi")) - api(project(":spi:common:web-spi")) - api(project(":spi:data-plane:data-plane-spi")) - - implementation(project(":core:common:lib:transform-lib")) - implementation(project(":extensions:common:http:lib:jersey-providers-lib")) - implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-transform")) - implementation(libs.jakarta.rsApi) - - testImplementation(project(":core:common:junit")) -} -edcBuild { - swagger { - apiGroup.set("control-api") - } -} - - diff --git a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtension.java b/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtension.java deleted file mode 100644 index a5ceff37ad3..00000000000 --- a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtension.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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.api.signaling.configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.json.Json; -import org.eclipse.edc.connector.api.signaling.transform.from.JsonObjectFromDataFlowResponseMessageTransformer; -import org.eclipse.edc.connector.api.signaling.transform.to.JsonObjectToDataFlowStartMessageTransformer; -import org.eclipse.edc.connector.api.signaling.transform.to.JsonObjectToDataFlowSuspendMessageTransformer; -import org.eclipse.edc.connector.api.signaling.transform.to.JsonObjectToDataFlowTerminateMessageTransformer; -import org.eclipse.edc.jsonld.spi.JsonLd; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.SettingContext; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.transform.spi.TypeTransformerRegistry; -import org.eclipse.edc.transform.transformer.dspace.from.JsonObjectFromDataAddressDspaceTransformer; -import org.eclipse.edc.transform.transformer.dspace.to.JsonObjectToDataAddressDspaceTransformer; -import org.eclipse.edc.web.jersey.providers.jsonld.JerseyJsonLdInterceptor; -import org.eclipse.edc.web.jersey.providers.jsonld.ObjectMapperProvider; -import org.eclipse.edc.web.spi.WebServer; -import org.eclipse.edc.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; -import org.eclipse.edc.web.spi.configuration.WebServiceConfigurer; -import org.eclipse.edc.web.spi.configuration.WebServiceSettings; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -import static org.eclipse.edc.connector.api.signaling.configuration.SignalingApiConfigurationExtension.NAME; -import static org.eclipse.edc.jsonld.spi.Namespaces.DSPACE_PREFIX; -import static org.eclipse.edc.jsonld.spi.Namespaces.DSPACE_SCHEMA; -import static org.eclipse.edc.policy.model.OdrlNamespace.ODRL_PREFIX; -import static org.eclipse.edc.policy.model.OdrlNamespace.ODRL_SCHEMA; -import static org.eclipse.edc.spi.constants.CoreConstants.JSON_LD; - -@Deprecated(since = "0.6.4") -@Extension(value = NAME) -public class SignalingApiConfigurationExtension implements ServiceExtension { - - public static final String NAME = "DataPlane Signaling API Configuration Extension"; - - @SettingContext("Signaling API context setting key") - private static final String SIGNALING_CONFIG_KEY = "web.http." + ApiContext.SIGNALING; - - public static final WebServiceSettings SETTINGS = WebServiceSettings.Builder.newInstance() - .apiConfigKey(SIGNALING_CONFIG_KEY) - .contextAlias(ApiContext.SIGNALING) - .defaultPath("/api/signaling") - .defaultPort(10080) - .useDefaultContext(false) - .name("DataPlane Signaling API") - .build(); - - private static final String SIGNALING_SCOPE = "SIGNALING_API"; - - @Inject - private WebService webService; - @Inject - private WebServiceConfigurer configurer; - @Inject - private WebServer webServer; - @Inject - private JsonLd jsonLd; - @Inject - private TypeManager typeManager; - @Inject - private TypeTransformerRegistry transformerRegistry; - - @Override - public String name() { - return NAME; - } - - @Override - public void initialize(ServiceExtensionContext context) { - var warningMessage = """ - The data-plane-signaling-api-configuration extension is deprecated as the related 'web.http.signaling' - settings, please exclude from your build and configure your endpoints to the control-api context - """; - context.getMonitor().warning(warningMessage); - var config = context.getConfig(SIGNALING_CONFIG_KEY); - configurer.configure(config, webServer, SETTINGS); - - jsonLd.registerNamespace(ODRL_PREFIX, ODRL_SCHEMA, SIGNALING_SCOPE); - jsonLd.registerNamespace(DSPACE_PREFIX, DSPACE_SCHEMA, SIGNALING_SCOPE); - - var jsonLdMapper = getJsonLdMapper(); - webService.registerResource(ApiContext.SIGNALING, new ObjectMapperProvider(jsonLdMapper)); - webService.registerResource(ApiContext.SIGNALING, new JerseyJsonLdInterceptor(jsonLd, jsonLdMapper, SIGNALING_SCOPE)); - - var factory = Json.createBuilderFactory(Map.of()); - - var signalingApiTypeTransformerRegistry = transformerRegistry.forContext("signaling-api"); - signalingApiTypeTransformerRegistry.register(new JsonObjectToDataFlowStartMessageTransformer()); - signalingApiTypeTransformerRegistry.register(new JsonObjectToDataFlowSuspendMessageTransformer()); - signalingApiTypeTransformerRegistry.register(new JsonObjectToDataFlowTerminateMessageTransformer()); - signalingApiTypeTransformerRegistry.register(new JsonObjectToDataAddressDspaceTransformer()); - signalingApiTypeTransformerRegistry.register(new JsonObjectFromDataFlowResponseMessageTransformer(factory)); - signalingApiTypeTransformerRegistry.register(new JsonObjectFromDataAddressDspaceTransformer(factory, jsonLdMapper)); - } - - @NotNull - private ObjectMapper getJsonLdMapper() { - return typeManager.getMapper(JSON_LD); - } -} diff --git a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index d82f7a2961a..00000000000 --- a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1,15 +0,0 @@ -# -# Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -# -# 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 -# -# - -org.eclipse.edc.connector.api.signaling.configuration.SignalingApiConfigurationExtension diff --git a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/test/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtensionTest.java b/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/test/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtensionTest.java deleted file mode 100644 index 7362ff9a5c6..00000000000 --- a/extensions/data-plane/data-plane-signaling/data-plane-signaling-api-configuration/src/test/java/org/eclipse/edc/connector/api/signaling/configuration/SignalingApiConfigurationExtensionTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * 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.api.signaling.configuration; - -import org.eclipse.edc.boot.system.DefaultServiceExtensionContext; -import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; -import org.eclipse.edc.spi.monitor.Monitor; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.system.configuration.Config; -import org.eclipse.edc.spi.system.configuration.ConfigFactory; -import org.eclipse.edc.transform.spi.TypeTransformerRegistry; -import org.eclipse.edc.web.jersey.providers.jsonld.JerseyJsonLdInterceptor; -import org.eclipse.edc.web.jersey.providers.jsonld.ObjectMapperProvider; -import org.eclipse.edc.web.spi.WebService; -import org.eclipse.edc.web.spi.configuration.ApiContext; -import org.eclipse.edc.web.spi.configuration.WebServiceConfiguration; -import org.eclipse.edc.web.spi.configuration.WebServiceConfigurer; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import static org.eclipse.edc.connector.api.signaling.configuration.SignalingApiConfigurationExtension.SETTINGS; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(DependencyInjectionExtension.class) -class SignalingApiConfigurationExtensionTest { - - private final WebServiceConfigurer configurer = mock(); - private final Monitor monitor = mock(); - private final WebService webService = mock(); - - @BeforeEach - void setUp(ServiceExtensionContext context) { - TypeTransformerRegistry typeTransformerRegistry = mock(); - when(typeTransformerRegistry.forContext(any())).thenReturn(mock()); - context.registerService(TypeTransformerRegistry.class, typeTransformerRegistry); - context.registerService(WebService.class, webService); - context.registerService(WebServiceConfigurer.class, configurer); - } - - @Test - void initialize_shouldConfigureAndRegisterResource(SignalingApiConfigurationExtension extension) { - var context = contextWithConfig(ConfigFactory.empty()); - var configuration = WebServiceConfiguration.Builder.newInstance().path("/path").port(1234).build(); - when(configurer.configure(any(), any(), any())).thenReturn(configuration); - - extension.initialize(context); - - verify(configurer).configure(any(), any(), eq(SETTINGS)); - verify(webService).registerResource(eq(ApiContext.SIGNALING), isA(ObjectMapperProvider.class)); - verify(webService).registerResource(eq(ApiContext.SIGNALING), isA(JerseyJsonLdInterceptor.class)); - } - - @NotNull - private DefaultServiceExtensionContext contextWithConfig(Config config) { - var context = new DefaultServiceExtensionContext(monitor, config); - context.initialize(); - return context; - } -} diff --git a/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/build.gradle.kts b/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/build.gradle.kts index 5547bfee5b9..ce6b71c4dcf 100644 --- a/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/build.gradle.kts +++ b/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/build.gradle.kts @@ -25,7 +25,6 @@ dependencies { implementation(project(":core:common:lib:util-lib")) implementation(project(":core:common:lib:transform-lib")) implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-transform")) - implementation(project(":extensions:data-plane:data-plane-client-embedded")) implementation(libs.opentelemetry.instrumentation.annotations) diff --git a/extensions/data-plane/data-plane-client-embedded/src/main/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClient.java b/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/src/main/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClient.java similarity index 100% rename from extensions/data-plane/data-plane-client-embedded/src/main/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClient.java rename to extensions/data-plane/data-plane-signaling/data-plane-signaling-client/src/main/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClient.java diff --git a/extensions/data-plane/data-plane-client-embedded/src/test/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClientTest.java b/extensions/data-plane/data-plane-signaling/data-plane-signaling-client/src/test/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClientTest.java similarity index 100% rename from extensions/data-plane/data-plane-client-embedded/src/test/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClientTest.java rename to extensions/data-plane/data-plane-signaling/data-plane-signaling-client/src/test/java/org/eclipse/edc/connector/dataplane/client/EmbeddedDataPlaneClientTest.java diff --git a/settings.gradle.kts b/settings.gradle.kts index 8a244ef480e..e1bee6771db 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -174,7 +174,6 @@ include(":extensions:control-plane:api:management-api:management-api-test-fixtur include(":extensions:control-plane:api:management-api:policy-definition-api") include(":extensions:control-plane:api:management-api:transfer-process-api") include(":extensions:control-plane:api:management-api:edr-cache-api") -include(":extensions:control-plane:transfer:transfer-data-plane") include(":extensions:control-plane:transfer:transfer-data-plane-signaling") include(":extensions:control-plane:transfer:transfer-pull-http-receiver") include(":extensions:control-plane:transfer:transfer-pull-http-dynamic-receiver") @@ -192,15 +191,10 @@ include(":extensions:control-plane:callback:callback-static-endpoint") include(":extensions:control-plane:edr:edr-store-receiver") -include(":extensions:data-plane:data-plane-client") -include(":extensions:data-plane:data-plane-client-embedded") -include(":extensions:data-plane:data-plane-control-api") include(":extensions:data-plane:data-plane-self-registration") include(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api") -include(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api-configuration") include(":extensions:data-plane:data-plane-signaling:data-plane-signaling-client") include(":extensions:data-plane:data-plane-signaling:data-plane-signaling-transform") -include(":extensions:data-plane:data-plane-public-api") include(":extensions:data-plane:data-plane-public-api-v2") include(":extensions:data-plane:data-plane-http") diff --git a/spi/common/core-spi/src/main/java/org/eclipse/edc/spi/query/Criterion.java b/spi/common/core-spi/src/main/java/org/eclipse/edc/spi/query/Criterion.java index deb5fefcb04..2a29b29aa3a 100644 --- a/spi/common/core-spi/src/main/java/org/eclipse/edc/spi/query/Criterion.java +++ b/spi/common/core-spi/src/main/java/org/eclipse/edc/spi/query/Criterion.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import java.util.Objects; -import java.util.function.Function; import static java.lang.String.format; import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; @@ -74,11 +73,6 @@ public Criterion withLeftOperand(String operandLeft) { return new Criterion(operandLeft, operator, getOperandRight()); } - @Deprecated(since = "0.5.0") - public Criterion withLeftOperand(Function function) { - return new Criterion(function.apply(operandLeft), operator, getOperandRight()); - } - @Override public int hashCode() { return Objects.hash(operandLeft, operator, operandRight); diff --git a/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java b/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java index 913aa7283c8..8cffd380e5f 100644 --- a/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java +++ b/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java @@ -40,13 +40,7 @@ public interface PropertyAndTypeNames { String EDC_CREATED_AT = EDC_NAMESPACE + "createdAt"; //DCT - @Deprecated(since = "0.5.1") - String DEPRECATED_DCT_FORMAT_ATTRIBUTE = "https://purl.org/dc/terms/format"; String DCT_FORMAT_ATTRIBUTE = DCT_SCHEMA + "format"; - @Deprecated(since = "0.6.2") - String DCT_TERMS_ATTRIBUTE = DCT_SCHEMA + "terms"; - @Deprecated(since = "0.6.2") - String DCT_ENDPOINT_URL_ATTRIBUTE = DCT_SCHEMA + "endpointUrl"; String ODRL_POLICY_ATTRIBUTE = ODRL_SCHEMA + "hasPolicy"; String ODRL_POLICY_TYPE_SET = ODRL_SCHEMA + "Set"; diff --git a/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/controlplane/contract/spi/types/negotiation/ContractRequest.java b/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/controlplane/contract/spi/types/negotiation/ContractRequest.java index fb4fa58a9f6..d736de5bdc1 100644 --- a/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/controlplane/contract/spi/types/negotiation/ContractRequest.java +++ b/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/controlplane/contract/spi/types/negotiation/ContractRequest.java @@ -31,8 +31,6 @@ public class ContractRequest { public static final String CONTRACT_REQUEST_TYPE = EDC_NAMESPACE + "ContractRequest"; public static final String CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS = EDC_NAMESPACE + "counterPartyAddress"; public static final String PROTOCOL = EDC_NAMESPACE + "protocol"; - @Deprecated(since = "0.5.1") - public static final String PROVIDER_ID = EDC_NAMESPACE + "providerId"; public static final String POLICY = EDC_NAMESPACE + "policy"; public static final String CALLBACK_ADDRESSES = EDC_NAMESPACE + "callbackAddresses"; diff --git a/system-tests/e2e-dataplane-tests/runtimes/data-plane/build.gradle.kts b/system-tests/e2e-dataplane-tests/runtimes/data-plane/build.gradle.kts index f75dcff010a..153e4955fab 100644 --- a/system-tests/e2e-dataplane-tests/runtimes/data-plane/build.gradle.kts +++ b/system-tests/e2e-dataplane-tests/runtimes/data-plane/build.gradle.kts @@ -23,10 +23,8 @@ dependencies { implementation(project(":extensions:control-plane:api:control-plane-api-client")) implementation(project(":extensions:data-plane:data-plane-http")) implementation(project(":extensions:data-plane:data-plane-iam")) - implementation(project(":extensions:data-plane:data-plane-control-api")) implementation(project(":extensions:data-plane:data-plane-public-api-v2")) implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api")) - implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api-configuration")) } edcBuild { diff --git a/system-tests/e2e-transfer-test/data-plane/build.gradle.kts b/system-tests/e2e-transfer-test/data-plane/build.gradle.kts index f3081336e4c..6815345ca90 100644 --- a/system-tests/e2e-transfer-test/data-plane/build.gradle.kts +++ b/system-tests/e2e-transfer-test/data-plane/build.gradle.kts @@ -26,7 +26,6 @@ dependencies { implementation(project(":extensions:data-plane:data-plane-http")) implementation(project(":extensions:data-plane:data-plane-kafka")) implementation(project(":extensions:data-plane:data-plane-http-oauth2")) - implementation(project(":extensions:data-plane:data-plane-control-api")) implementation(project(":extensions:data-plane:data-plane-public-api-v2")) implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api")) } diff --git a/system-tests/management-api/management-api-test-runtime/build.gradle.kts b/system-tests/management-api/management-api-test-runtime/build.gradle.kts index b4ecd9d264a..43951224b61 100644 --- a/system-tests/management-api/management-api-test-runtime/build.gradle.kts +++ b/system-tests/management-api/management-api-test-runtime/build.gradle.kts @@ -26,7 +26,7 @@ dependencies { implementation(project(":extensions:common:api:control-api-configuration")) implementation(project(":extensions:control-plane:api:management-api")) implementation(project(":extensions:control-plane:api:management-api:secrets-api")) - implementation(project(":extensions:data-plane:data-plane-client")) + implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-client")) implementation(project(":core:data-plane-selector:data-plane-selector-core")) } diff --git a/system-tests/telemetry/telemetry-test-runtime/build.gradle.kts b/system-tests/telemetry/telemetry-test-runtime/build.gradle.kts index 2a55a2ec345..8aea9ed7c92 100644 --- a/system-tests/telemetry/telemetry-test-runtime/build.gradle.kts +++ b/system-tests/telemetry/telemetry-test-runtime/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { implementation(project(":extensions:common:json-ld")) implementation(project(":extensions:common:api:control-api-configuration")) implementation(project(":extensions:control-plane:api:management-api")) - implementation(project(":extensions:data-plane:data-plane-client")) + implementation(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-client")) implementation(project(":core:data-plane-selector:data-plane-selector-core")) diff --git a/system-tests/version-api/version-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/versionapi/Runtimes.java b/system-tests/version-api/version-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/versionapi/Runtimes.java index 9ab2fbb65d7..11578d41cd3 100644 --- a/system-tests/version-api/version-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/versionapi/Runtimes.java +++ b/system-tests/version-api/version-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/versionapi/Runtimes.java @@ -14,13 +14,13 @@ package org.eclipse.edc.test.e2e.versionapi; +import org.eclipse.edc.connector.dataplane.selector.spi.client.DataPlaneClientFactory; import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; import org.eclipse.edc.iam.identitytrust.sts.spi.service.StsClientService; import org.eclipse.edc.iam.identitytrust.sts.spi.service.StsClientTokenGeneratorService; import org.eclipse.edc.junit.extensions.EmbeddedRuntime; import org.eclipse.edc.junit.extensions.RuntimeExtension; import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -33,6 +33,7 @@ public interface Runtimes { static RuntimeExtension inMemoryRuntime() { var rt = new RuntimePerClassExtension(new EmbeddedRuntime("control-plane", inMemoryConfiguration(), ":system-tests:version-api:version-api-test-runtime")); rt.registerServiceMock(DataPlaneManager.class, mock()); + rt.registerServiceMock(DataPlaneClientFactory.class, mock()); rt.registerServiceMock(StsClientService.class, mock()); rt.registerServiceMock(StsClientTokenGeneratorService.class, mock()); return rt; @@ -56,17 +57,4 @@ static HashMap inMemoryConfiguration() { }; } - @NotNull - static HashMap postgresqlConfiguration() { - var config = new HashMap() { - { - put("edc.datasource.default.url", PostgresqlEndToEndInstance.JDBC_URL_PREFIX + "runtime"); - put("edc.datasource.default.user", PostgresqlEndToEndInstance.USER); - put("edc.datasource.default.password", PostgresqlEndToEndInstance.PASSWORD); - } - }; - - config.putAll(inMemoryConfiguration()); - return config; - } } diff --git a/system-tests/version-api/version-api-test-runtime/build.gradle.kts b/system-tests/version-api/version-api-test-runtime/build.gradle.kts index 3578720b769..3d157981c74 100644 --- a/system-tests/version-api/version-api-test-runtime/build.gradle.kts +++ b/system-tests/version-api/version-api-test-runtime/build.gradle.kts @@ -26,9 +26,7 @@ dependencies { implementation(project(":extensions:control-plane:api:management-api")) implementation(project(":extensions:control-plane:api:management-api:secrets-api")) implementation(project(":extensions:common:api:version-api")) - implementation(project(":extensions:data-plane:data-plane-control-api")) implementation(project(":extensions:common:api:api-observability")) - implementation(project(":extensions:data-plane:data-plane-client")) implementation(project(":extensions:common:iam:identity-trust:identity-trust-sts:identity-trust-sts-api")) implementation(project(":core:data-plane-selector:data-plane-selector-core")) implementation(project(":extensions:common:api:control-api-configuration"))