From 0fadff32495eccd24d0710390d6abe839974f6c0 Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Tue, 25 Feb 2025 15:01:40 +0100 Subject: [PATCH] refactor: remove data-plane-public-v2 deprecated module from dataplane-base-bom --- dist/bom/dataplane-base-bom/build.gradle.kts | 1 - resources/openapi/sts-accounts-api.version | 1 - resources/openapi/sts-api.version | 1 - .../e2e/DataPlanePublicApiEndToEndTest.java | 236 ------------------ .../DataPlaneSignalingApiEndToEndTest.java | 8 +- .../e2e/participant/DataPlaneParticipant.java | 10 - .../test/e2e/HttpProxyDataPlaneExtension.java | 95 +++++++ .../test/e2e/TransferEndToEndParticipant.java | 3 - .../test/e2e/TransferPullEndToEndTest.java | 44 ++-- 9 files changed, 117 insertions(+), 282 deletions(-) delete mode 100644 resources/openapi/sts-accounts-api.version delete mode 100644 resources/openapi/sts-api.version delete mode 100644 system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlanePublicApiEndToEndTest.java create mode 100644 system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/HttpProxyDataPlaneExtension.java diff --git a/dist/bom/dataplane-base-bom/build.gradle.kts b/dist/bom/dataplane-base-bom/build.gradle.kts index 3980f7d90e8..624585ac63e 100644 --- a/dist/bom/dataplane-base-bom/build.gradle.kts +++ b/dist/bom/dataplane-base-bom/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { api(project(":extensions:data-plane:data-plane-self-registration")) api(project(":extensions:data-plane:data-plane-http")) api(project(":extensions:data-plane:data-plane-http-oauth2")) - api(project(":extensions:data-plane:data-plane-public-api-v2")) api(project(":extensions:data-plane:data-plane-signaling:data-plane-signaling-api")) api(project(":extensions:data-plane:data-plane-iam")) api(project(":extensions:data-plane-selector:data-plane-selector-client")) diff --git a/resources/openapi/sts-accounts-api.version b/resources/openapi/sts-accounts-api.version deleted file mode 100644 index d3296346f97..00000000000 --- a/resources/openapi/sts-accounts-api.version +++ /dev/null @@ -1 +0,0 @@ -extensions/common/iam/identity-trust/identity-trust-sts/identity-trust-sts-accounts-api/src/main/resources/sts-accounts-api-version.json \ No newline at end of file diff --git a/resources/openapi/sts-api.version b/resources/openapi/sts-api.version deleted file mode 100644 index c69da0466c7..00000000000 --- a/resources/openapi/sts-api.version +++ /dev/null @@ -1 +0,0 @@ -extensions/common/iam/identity-trust/identity-trust-sts/identity-trust-sts-api/src/main/resources/sts-api-version.json diff --git a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlanePublicApiEndToEndTest.java b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlanePublicApiEndToEndTest.java deleted file mode 100644 index c2218527a46..00000000000 --- a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlanePublicApiEndToEndTest.java +++ /dev/null @@ -1,236 +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.test.e2e; - -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jose.JWSAlgorithm; -import com.nimbusds.jose.JWSHeader; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.SignedJWT; -import io.restassured.http.ContentType; -import jakarta.ws.rs.core.HttpHeaders; -import org.eclipse.edc.connector.dataplane.spi.AccessTokenData; -import org.eclipse.edc.connector.dataplane.spi.store.AccessTokenDataStore; -import org.eclipse.edc.junit.annotations.EndToEndTest; -import org.eclipse.edc.keys.keyparsers.PemParser; -import org.eclipse.edc.security.token.jwt.CryptoConverter; -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.security.Vault; -import org.eclipse.edc.spi.types.domain.DataAddress; -import org.hamcrest.Matchers; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.model.HttpResponse; -import org.mockserver.model.Parameter; -import org.mockserver.verify.VerificationTimes; - -import java.security.Key; -import java.security.PrivateKey; -import java.util.Date; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -import static org.eclipse.edc.util.io.Ports.getFreePort; -import static org.mockito.Mockito.mock; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.JsonBody.json; -import static org.mockserver.verify.VerificationTimes.exactly; - -@EndToEndTest -public class DataPlanePublicApiEndToEndTest extends AbstractDataPlaneTest { - - public static final String PUBLIC_KEY_ALIAS = "public-key"; - public static final String PRIVATE_KEY_ALIAS = "1"; - // this is a data address representing the private backend for an HTTP pull transfer - public static DataAddress backendDataAddress; - - private ClientAndServer backendServer; - - @BeforeEach - void setup() { - backendServer = ClientAndServer.startClientAndServer(getFreePort()); - backendDataAddress = DataAddress.Builder.newInstance() - .type("HttpData") - .property(EDC_NAMESPACE + "baseUrl", "http://localhost:%d/foo".formatted(backendServer.getPort())) - .property(EDC_NAMESPACE + "proxyQueryParams", "true") - .property(EDC_NAMESPACE + "proxyPath", "true") - .property(EDC_NAMESPACE + "proxyMethod", "true") - .build(); - - backendServer.when(request()).respond(HttpResponse.response().withBody(""" - { - "foo": "bar", - "fizz": "buzz", - } - """).withStatusCode(200)); - } - - @Test - void httpPull_missingToken_expect401() { - seedVault(); - DATAPLANE.basePublicRequest() - .contentType(ContentType.JSON) - /*.header(HttpHeaders.AUTHORIZATION, token) missing */ - .body(""" - { - "bar": "baz" - } - """) - .post("/v2/foo") - .then() - .statusCode(401) - .body(Matchers.containsString("Missing Authorization Header")); - - backendServer.verify(request().withMethod("POST"), VerificationTimes.never()); - } - - @Test - void httpPull_invalidToken_expect403() { - seedVault(); - var token = "some-invalid-token"; - DATAPLANE.basePublicRequest() - .contentType(ContentType.JSON) - .header(HttpHeaders.AUTHORIZATION, token) - .body(""" - { - "bar": "baz" - } - """) - .post("/v2/foo") - .then() - .statusCode(403); - } - - @DisplayName("Test methods with request body") - @ParameterizedTest(name = "Method = {0}") - @ValueSource(strings = { "POST", "PUT", "PATCH" }) - void request_withBody_expect200(String method) { - seedVault(); - backendDataAddress.getProperties().put(EDC_NAMESPACE + "proxyBody", "true"); - backendDataAddress.getProperties().put(EDC_NAMESPACE + "mediaType", "application/json"); - - var token = createEdr(); - var jsonBody = """ - { - "quizz": "quzz" - } - """; - var body = DATAPLANE.basePublicRequest() - .contentType(ContentType.JSON) - .header(HttpHeaders.AUTHORIZATION, token) - .body(jsonBody) - .request(method, "/v2/bar/baz") - .then() - .log().ifError() - .statusCode(200) - .extract().body().asString(); - assertThat(body).isNotNull(); - - backendServer.verify(request() - .withMethod(method) - .withPath("/foo/v2/bar/baz") - .withBody(json(jsonBody)), exactly(1)); - } - - @DisplayName("Test methods without request body") - @ParameterizedTest(name = "Method = {0}") - @ValueSource(strings = { "GET", "DELETE", "HEAD" }) - void request_noBody_expect200(String method) { - seedVault(); - var token = createEdr(); - var body = DATAPLANE.basePublicRequest() - .contentType(ContentType.JSON) - .header(HttpHeaders.AUTHORIZATION, token) - .request(method, "/v2/bar/baz") - .then() - .log().ifError() - .statusCode(200) - .extract().body().asString(); - assertThat(body).isNotNull(); - - backendServer.verify(request().withMethod(method).withPath("/foo/v2/bar/baz"), exactly(1)); - } - - @Test - void request_getMultipleIdenticalQuery() { - seedVault(); - var token = createEdr(); - var body = DATAPLANE.basePublicRequest() - .contentType(ContentType.JSON) - .header(HttpHeaders.AUTHORIZATION, token) - .request("GET", "/v2/bar/baz?foo=bar&foo=fizz&foo=buzz") - .then() - .log().ifError() - .statusCode(200) - .extract().body().asString(); - assertThat(body).isNotNull(); - - backendServer.verify(request() - .withPath("/foo/v2/bar/baz") - .withQueryStringParameters(new Parameter("foo", "bar"), - new Parameter("foo", "fizz"), - new Parameter("foo", "buzz") - ), exactly(1)); - } - - private Key resolvePrivateKey() { - var privateKeyPem = runtime.getService(Vault.class).resolveSecret(PRIVATE_KEY_ALIAS); - return new PemParser(mock()).parse(privateKeyPem).orElseThrow(f -> new RuntimeException(f.getFailureDetail())); - } - - /** - * Creates and stores an EDR in the data plane. The serialized EDR (as serialized JWT) is returned. Token and the {@link AccessTokenData} - * stored in the data plane are correlated via the "jti" claim in the token. - * - * @return The EDR in the form of a serialized JWT. - */ - private String createEdr() { - var tokenId = UUID.randomUUID().toString(); - // create JWT representing the EDR - var jwt = createJwt(tokenId); - - // store the EDR - var accessTokenStore = runtime.getService(AccessTokenDataStore.class); - accessTokenStore.store(new AccessTokenData(tokenId, ClaimToken.Builder.newInstance().build(), backendDataAddress)); - return jwt; - } - - private String createJwt(String tokenId) { - - try { - var jwk = resolvePrivateKey(); - var header = new JWSHeader.Builder(JWSAlgorithm.RS256) - .keyID(PUBLIC_KEY_ALIAS).build(); - var claims = new JWTClaimsSet.Builder() - .issuer("me") - .subject("me") - .issueTime(new Date()) - .jwtID(tokenId) - .build(); - - var jwt = new SignedJWT(header, claims); - jwt.sign(CryptoConverter.createSignerFor((PrivateKey) jwk)); - return jwt.serialize(); - } catch (JOSEException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlaneSignalingApiEndToEndTest.java b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlaneSignalingApiEndToEndTest.java index 67062030ee6..027f392d466 100644 --- a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlaneSignalingApiEndToEndTest.java +++ b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/DataPlaneSignalingApiEndToEndTest.java @@ -23,6 +23,8 @@ import org.eclipse.edc.connector.api.signaling.transform.to.JsonObjectToDataFlowResponseMessageTransformer; import org.eclipse.edc.connector.dataplane.spi.DataFlow; import org.eclipse.edc.connector.dataplane.spi.DataFlowStates; +import org.eclipse.edc.connector.dataplane.spi.Endpoint; +import org.eclipse.edc.connector.dataplane.spi.iam.PublicEndpointGeneratorService; import org.eclipse.edc.connector.dataplane.spi.store.DataPlaneStore; import org.eclipse.edc.jsonld.spi.JsonLd; import org.eclipse.edc.jsonld.util.JacksonJsonLd; @@ -62,7 +64,7 @@ @EndToEndTest public class DataPlaneSignalingApiEndToEndTest extends AbstractDataPlaneTest { - private static final String DATAPLANE_PUBLIC_ENDPOINT_URL = DATAPLANE.publicEndpointUrl(); + private static final String DATAPLANE_PUBLIC_ENDPOINT_URL = "http://public/endpoint"; private final TypeTransformerRegistry registry = new TypeTransformerRegistryImpl(); private final TypeManager typeManager = mock(); private ObjectMapper mapper; @@ -76,6 +78,10 @@ void setup() { registry.register(new JsonObjectToDataAddressDspaceTransformer()); registry.register(new JsonObjectToDataFlowResponseMessageTransformer()); when(typeManager.getMapper("test")).thenReturn(mapper); + runtime.getService(PublicEndpointGeneratorService.class) + .addGeneratorFunction("HttpData", address -> Endpoint.url(DATAPLANE_PUBLIC_ENDPOINT_URL)); + runtime.getService(PublicEndpointGeneratorService.class) + .addGeneratorFunction("HttpData", () -> Endpoint.url(DATAPLANE_PUBLIC_ENDPOINT_URL + "/responseChannel")); } @DisplayName("Verify the POST /v1/dataflows endpoint returns the correct EDR (PULL)") diff --git a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/participant/DataPlaneParticipant.java b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/participant/DataPlaneParticipant.java index bc6b6935ace..44582581bfa 100644 --- a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/participant/DataPlaneParticipant.java +++ b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/participant/DataPlaneParticipant.java @@ -44,14 +44,6 @@ public RequestSpecification baseControlRequest() { return given().baseUri(dataPlaneControl.get().toString()); } - public RequestSpecification basePublicRequest() { - return given().baseUri(dataPlanePublic.get().toString()); - } - - public String publicEndpointUrl() { - return dataPlanePublic.get().toString(); - } - public Config dataPlaneConfig() { return ConfigFactory.fromMap(dataPlaneConfiguration()); } @@ -62,8 +54,6 @@ public Map dataPlaneConfiguration() { put("edc.component.id", UUID.randomUUID().toString()); put("web.http.port", String.valueOf(getFreePort())); put("web.http.path", "/api"); - put("web.http.public.port", String.valueOf(dataPlanePublic.get().getPort())); - put("web.http.public.path", "/public"); put("web.http.control.port", String.valueOf(dataPlaneControl.get().getPort())); put("web.http.control.path", dataPlaneControl.get().getPath()); put("edc.keystore", resourceAbsolutePath("certs/cert.pfx")); diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/HttpProxyDataPlaneExtension.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/HttpProxyDataPlaneExtension.java new file mode 100644 index 00000000000..f31a61a388b --- /dev/null +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/HttpProxyDataPlaneExtension.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2025 Cofinity-X + * + * 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: + * Cofinity-X - initial API and implementation + * + */ + +package org.eclipse.edc.test.e2e; + +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response; +import org.eclipse.edc.connector.dataplane.spi.Endpoint; +import org.eclipse.edc.connector.dataplane.spi.iam.DataPlaneAuthorizationService; +import org.eclipse.edc.connector.dataplane.spi.iam.PublicEndpointGeneratorService; +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.PortMapping; +import org.eclipse.edc.web.spi.configuration.PortMappingRegistry; + +import static jakarta.ws.rs.core.MediaType.WILDCARD; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static java.util.Collections.emptyMap; +import static org.eclipse.edc.util.io.Ports.getFreePort; + +/** + * Extension that provides a dummy proxy that always return a hardcoded successful response when the token validation + * succeeds. + */ +public class HttpProxyDataPlaneExtension implements ServiceExtension { + + private static final String API_CONTEXT = "proxy"; + + @Inject + private DataPlaneAuthorizationService authorizationService; + @Inject + private PublicEndpointGeneratorService generatorService; + @Inject + private PortMappingRegistry portMappingRegistry; + @Inject + private WebService webService; + + @Override + public void initialize(ServiceExtensionContext context) { + var portMapping = new PortMapping(API_CONTEXT, getFreePort(), "/proxy"); + portMappingRegistry.register(portMapping); + + var proxyUrl = "http://localhost:%d%s".formatted(portMapping.port(), portMapping.path()); + generatorService.addGeneratorFunction("HttpData", address -> Endpoint.url(proxyUrl)); + + webService.registerResource(API_CONTEXT, new Controller(authorizationService)); + } + + @Path("{any:.*}") + @Consumes(WILDCARD) + @Produces(WILDCARD) + public static class Controller { + + private final DataPlaneAuthorizationService authorizationService; + + Controller(DataPlaneAuthorizationService authorizationService) { + this.authorizationService = authorizationService; + } + + @GET + public Response get(@Context ContainerRequestContext requestContext) { + var token = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); + if (token == null) { + return Response.status(UNAUTHORIZED).build(); + } + + var sourceDataAddress = authorizationService.authorize(token, emptyMap()); + if (sourceDataAddress.failed()) { + return Response.status(FORBIDDEN).build(); + } + + return Response.ok("data").build(); + } + } +} diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java index 691fb35e90e..8d71e4afe23 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java @@ -62,7 +62,6 @@ public Config controlPlaneConfig() { put("edc.dsp.callback.address", controlPlaneProtocol.get().toString()); put("edc.keystore", resourceAbsolutePath("certs/cert.pfx")); put("edc.keystore.password", "123456"); - put("edc.transfer.proxy.endpoint", dataPlanePublic.get().toString()); put("edc.transfer.send.retry.limit", "1"); put("edc.transfer.send.retry.base-delay.ms", "100"); put("edc.negotiation.consumer.send.retry.limit", "1"); @@ -88,8 +87,6 @@ public Config dataPlaneConfig() { { put("web.http.port", String.valueOf(getFreePort())); put("web.http.path", "/api"); - put("web.http.public.port", String.valueOf(dataPlanePublic.get().getPort())); - put("web.http.public.path", "/public"); put("web.http.control.port", String.valueOf(dataPlaneControl.get().getPort())); put("web.http.control.path", dataPlaneControl.get().getPath()); put("edc.keystore", resourceAbsolutePath("certs/cert.pfx")); diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java index e0dcc511749..25263ebab39 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java @@ -33,6 +33,7 @@ import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.event.EventEnvelope; import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.jetbrains.annotations.NotNull; @@ -43,7 +44,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockserver.integration.ClientAndServer; import org.mockserver.mock.action.ExpectationResponseCallback; import org.mockserver.model.HttpRequest; import org.mockserver.model.HttpResponse; @@ -84,27 +84,6 @@ class TransferPullEndToEndTest { abstract static class Tests extends TransferEndToEndTestBase { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static ClientAndServer providerDataSource; - - @BeforeAll - static void beforeAll() { - providerDataSource = startClientAndServer(getFreePort()); - providerDataSource.when(request()).respond(HttpResponse.response().withBody("data")); - } - - @AfterAll - static void afterAll() { - stopQuietly(providerDataSource); - } - - private static @NotNull Map httpSourceDataAddress() { - return Map.of( - EDC_NAMESPACE + "name", "transfer-test", - EDC_NAMESPACE + "baseUrl", "http://localhost:" + providerDataSource.getPort() + "/source", - EDC_NAMESPACE + "type", "HttpData", - EDC_NAMESPACE + "proxyQueryParams", "true" - ); - } @Test void httpPull_dataTransfer_withCallbacks() { @@ -137,7 +116,6 @@ void httpPull_dataTransfer_withCallbacks() { var msg = UUID.randomUUID().toString(); await().atMost(timeout).untilAsserted(() -> CONSUMER.pullData(event.getDataAddress(), Map.of("message", msg), body -> assertThat(body).isEqualTo("data"))); - providerDataSource.verify(request("/source").withMethod("GET")); stopQuietly(callbacksEndpoint); } @@ -156,8 +134,6 @@ void httpPull_dataTransfer_withEdrCache() { var edrEntry = assertConsumerCanAccessData(transferProcessId); assertConsumerCanNotAccessData(transferProcessId, edrEntry); - - providerDataSource.verify(request("/source").withMethod("GET")); } @Test @@ -182,8 +158,6 @@ void suspendAndResumeByConsumer_httpPull_dataTransfer_withEdrCache() { CONSUMER.awaitTransferToBeInState(transferProcessId, STARTED); assertConsumerCanAccessData(transferProcessId); - - providerDataSource.verify(request("/source").withMethod("GET")); } @Test @@ -213,8 +187,6 @@ void suspendAndResumeByProvider_httpPull_dataTransfer_withEdrCache() { // check that transfer is available again PROVIDER.awaitTransferToBeInState(providerTransferProcessId, STARTED); assertConsumerCanAccessData(consumerTransferProcessId); - - providerDataSource.verify(request("/source").withMethod("GET")); } @Test @@ -417,6 +389,14 @@ public HttpResponse handle(HttpRequest httpRequest) throws Exception { return response(); } } + + private static @NotNull Map httpSourceDataAddress() { + return Map.of( + EDC_NAMESPACE + "name", "transfer-test", + EDC_NAMESPACE + "baseUrl", "http://any/source", + EDC_NAMESPACE + "type", "HttpData" + ); + } } @Nested @@ -439,12 +419,14 @@ class InMemory extends Tests { static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension( Runtimes.IN_MEMORY_DATA_PLANE.create("provider-data-plane") .configurationProvider(PROVIDER::dataPlaneConfig) + .registerSystemExtension(ServiceExtension.class, new HttpProxyDataPlaneExtension()) ); @Override protected Vault getDataplaneVault() { return PROVIDER_DATA_PLANE.getService(Vault.class); } + } @Nested @@ -467,6 +449,7 @@ class InMemoryV2024Rev1 extends Tests { static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension( Runtimes.IN_MEMORY_DATA_PLANE.create("provider-data-plane") .configurationProvider(PROVIDER::dataPlaneConfig) + .registerSystemExtension(ServiceExtension.class, new HttpProxyDataPlaneExtension()) ); // TODO: replace with something better. Temporary hack @@ -490,6 +473,7 @@ protected Vault getDataplaneVault() { @EndToEndTest class EmbeddedDataPlane extends Tests { + @RegisterExtension static final RuntimeExtension CONSUMER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.IN_MEMORY_CONTROL_PLANE_EMBEDDED_DATA_PLANE.create("consumer-control-plane") @@ -500,6 +484,7 @@ class EmbeddedDataPlane extends Tests { static final RuntimeExtension PROVIDER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.IN_MEMORY_CONTROL_PLANE_EMBEDDED_DATA_PLANE.create("provider-control-plane") .configurationProvider(PROVIDER::controlPlaneEmbeddedDataPlaneConfig) + .registerSystemExtension(ServiceExtension.class, new HttpProxyDataPlaneExtension()) ); @Override @@ -542,6 +527,7 @@ class Postgres extends Tests { Runtimes.POSTGRES_DATA_PLANE.create("provider-data-plane") .configurationProvider(PROVIDER::dataPlaneConfig) .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) + .registerSystemExtension(ServiceExtension.class, new HttpProxyDataPlaneExtension()) ); @Override