Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(httpReceiver): rename module http-receiver to transfer-pull-http-receiver #2282

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
- [Policy Definition](control-plane/api/management-api/policy-definition-api/)
- [Transfer Process](control-plane/api/management-api/transfer-process-api/)
- [Data Plane Transfer](control-plane/data-plane-transfer/)
- [HTTP Receiver](control-plane/http-receiver/)
- [HTTP Receiver](control-plane/transfer-pull-http-receiver/)
- Provision
- [Blob](control-plane/provision/provision-blob/)
- [HTTP](control-plane/provision/provision-http/)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ put these data into its Azure Blob Storage.
### 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).
of its public API. OpenApi documentation can be found [here](../../../../resources/openapi/yaml/transfer-data-plane.yaml).

### Configurations

Expand All @@ -57,7 +57,7 @@ of its public API. OpenApi documentation can be found [here](../../../resources/

### Consumer pull

![alt text](../../../docs/developer/architecture/data-transfer/diagrams/transfer-data-plane-consumer-pull.png)
![alt text](../../../../docs/developer/architecture/data-transfer/diagrams/transfer-data-plane-consumer-pull.png)

0. Provider and consumer agree to a contract (not displayed in the diagram)
1. Consumer initiates the transfer process, i.e. sends `DataRequest` with destination type equals to `HttpProxy`
Expand Down Expand Up @@ -92,7 +92,7 @@ of its public API. OpenApi documentation can be found [here](../../../resources/

### Provider push

![alt text](../../../docs/developer/architecture/data-transfer/diagrams/transfer-data-plane-provider-push.png)
![alt text](../../../../docs/developer/architecture/data-transfer/diagrams/transfer-data-plane-provider-push.png)

0. Provider and consumer agree to a contract (not displayed in the diagram)
1. Consumer initiates the transfer process, i.e. sends `DataRequest` with any destination type other than `HttpProxy`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,17 @@ dependencies {

implementation(libs.okhttp)
implementation(libs.failsafe.core)

testImplementation(libs.mockserver.netty)
testImplementation(libs.mockserver.client)
testImplementation(project(":core:common:junit"))
}


publishing {
publications {
create<MavenPublication>("http-receiver") {
artifactId = "http-receiver"
create<MavenPublication>("transfer-pull-http-receiver") {
artifactId = "transfer-pull-http-receiver"
from(components["java"])
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
/*
* Copyright (c) 2020-2022 Microsoft Corporation
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* Microsoft Corporation - initial API and implementation
*
*/

package org.eclipse.edc.connector.receiver.http;

import dev.failsafe.RetryPolicy;
import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpMethod;
import okhttp3.OkHttpClient;
import org.eclipse.edc.spi.EdcException;
import org.eclipse.edc.spi.monitor.Monitor;
import org.eclipse.edc.spi.result.Result;
import org.eclipse.edc.spi.types.TypeManager;
import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockserver.integration.ClientAndServer;
import org.mockserver.model.HttpResponse;
import org.mockserver.model.HttpStatusCode;
import org.mockserver.model.MediaType;

import java.util.UUID;
import java.util.concurrent.ExecutionException;

import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.edc.junit.testfixtures.TestUtils.getFreePort;
import static org.eclipse.edc.junit.testfixtures.TestUtils.testOkHttpClient;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockserver.integration.ClientAndServer.startClientAndServer;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.mockserver.stop.Stop.stopQuietly;

public class HttpEndpointDataReferenceReceiverTest {

private static final int RECEIVER_ENDPOINT_PORT = getFreePort();
private static final String RECEIVER_ENDPOINT_PATH = "path";


private static ClientAndServer receiverEndpointServer;
private Monitor monitor;
private HttpEndpointDataReferenceReceiver receiver;
private OkHttpClient httpClient;
private TypeManager typeManager;
private RetryPolicy<Object> retryPolicy;


@BeforeEach
void setup() {

receiverEndpointServer = startClientAndServer(RECEIVER_ENDPOINT_PORT);
monitor = mock(Monitor.class);
httpClient = spy(testOkHttpClient());
typeManager = new TypeManager();
retryPolicy = RetryPolicy.builder().withMaxRetries(1).build();
receiver = receiverBuilder()
.build();
}

@AfterEach
public void teardown() {
stopQuietly(receiverEndpointServer);
}

@Test
public void send_shouldForwardTheEdr_withReceiverEndpoint() throws ExecutionException, InterruptedException {
var edr = createEndpointDataReference();


var request = request().withPath("/" + RECEIVER_ENDPOINT_PATH)
.withMethod(HttpMethod.POST.name())
.withBody(typeManager.writeValueAsString(edr));

receiverEndpointServer.when(request).respond(successfulResponse());
var result = receiver.send(edr).get();
assertThat(result).satisfies(Result::success);
}

@Test
public void send_shouldForwardTheEdr_withReceiverEndpointAndHeaders() throws ExecutionException, InterruptedException {
var authKey = "key";
var authToken = "token";
receiver = receiverBuilder()
.authHeader(authKey, authToken)
.build();

var edr = createEndpointDataReference();

var request = request().withPath("/" + RECEIVER_ENDPOINT_PATH)
.withMethod(HttpMethod.POST.name())
.withHeader(authKey, authToken)
.withBody(typeManager.writeValueAsString(edr));

receiverEndpointServer.when(request).respond(successfulResponse());
var result = receiver.send(edr).get();
assertThat(result).satisfies(Result::success);
}

@Test
public void send_shouldFailForwardTheEdr_withPathNotFound() throws ExecutionException, InterruptedException {

var edr = createEndpointDataReference();

var request = request().withPath("/" + RECEIVER_ENDPOINT_PATH + "/another")
.withMethod(HttpMethod.POST.name())
.withBody(typeManager.writeValueAsString(edr));

receiverEndpointServer.when(request).respond(successfulResponse());

assertThrows(EdcException.class, () -> receiver.send(edr));
}

private HttpEndpointDataReferenceReceiver.Builder receiverBuilder() {
return HttpEndpointDataReferenceReceiver.Builder.newInstance()
.httpClient(httpClient)
.retryPolicy(retryPolicy)
.typeManager(typeManager)
.monitor(monitor)
.endpoint(receiverUrl());
}

private EndpointDataReference createEndpointDataReference() {
return EndpointDataReference.Builder.newInstance()
.endpoint("some.endpoint.url")
.authKey("test-authkey")
.authCode(UUID.randomUUID().toString())
.id(UUID.randomUUID().toString()).build();
}

private String receiverUrl() {
return String.format("http://localhost:%d/%s", receiverEndpointServer.getLocalPort(), RECEIVER_ENDPOINT_PATH);
}

private HttpResponse successfulResponse() {
return response()
.withStatusCode(HttpStatusCode.OK_200.code())
.withHeader(HttpHeaderNames.CONTENT_TYPE.toString(), MediaType.PLAIN_TEXT_UTF_8.toString())
.withBody("{}");
}


}
4 changes: 2 additions & 2 deletions samples/04.0-file-transfer/transfer-file/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ dependencies {
implementation(project(":core:control-plane:control-plane-core"))
implementation(project(":core:data-plane:data-plane-core"))
implementation(project(":core:data-plane:data-plane-util"))
implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))
implementation(project(":extensions:data-plane-selector:data-plane-selector-client"))
implementation(project(":core:data-plane-selector:data-plane-selector-core"))
implementation(libs.opentelemetry.annotations)

implementation(project(":spi:data-plane:data-plane-spi"))
}
}
4 changes: 2 additions & 2 deletions samples/05-file-transfer-cloud/transfer-file/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ dependencies {
implementation(project(":core:data-plane:data-plane-core"))
implementation(project(":extensions:data-plane:data-plane-azure-storage"))
implementation(project(":extensions:data-plane:data-plane-aws-s3"))
implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))
implementation(project(":extensions:data-plane-selector:data-plane-selector-client"))
implementation(project(":core:data-plane-selector:data-plane-selector-core"))

implementation(libs.opentelemetry.annotations)
}
}
4 changes: 2 additions & 2 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ include(":extensions:control-plane:api:management-api:contract-definition-api")
include(":extensions:control-plane:api:management-api:contract-negotiation-api")
include(":extensions:control-plane:api:management-api:policy-definition-api")
include(":extensions:control-plane:api:management-api:transfer-process-api")
include(":extensions:control-plane:transfer-data-plane")
include(":extensions:control-plane:http-receiver")
include(":extensions:control-plane:transfer:transfer-data-plane")
include(":extensions:control-plane:transfer:transfer-pull-http-receiver")
include(":extensions:control-plane:provision:provision-blob")
include(":extensions:control-plane:provision:provision-gcs")
include(":extensions:control-plane:provision:provision-http")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ dependencies {
implementation(project(":extensions:common:http"))
implementation(project(":extensions:common:iam:iam-mock"))
implementation(project(":extensions:control-plane:api:management-api"))
implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))

implementation(project(":core:data-plane-selector:data-plane-selector-core"))
Expand All @@ -33,5 +33,5 @@ dependencies {

implementation(project(":extensions:control-plane:provision:provision-http"))
implementation(project(":extensions:control-plane:provision:provision-oauth2"))
implementation(project(":extensions:control-plane:http-receiver"))
implementation(project(":extensions:control-plane:transfer:transfer-pull-http-receiver"))
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ dependencies {
implementation(project(":core:common:util"))
implementation(project(":core:control-plane:control-plane-core"))
implementation(project(":core:data-plane:data-plane-core"))
implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))
implementation(project(":extensions:data-plane-selector:data-plane-selector-client"))
implementation(project(":core:data-plane-selector:data-plane-selector-core"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ dependencies {
implementation(project(":core:control-plane:control-plane-core"))
implementation(project(":core:data-plane:data-plane-core"))

implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))
implementation(project(":extensions:data-plane-selector:data-plane-selector-client"))
implementation(project(":core:data-plane-selector:data-plane-selector-core"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ dependencies {
implementation(project(":core:control-plane:control-plane-core"))
implementation(project(":core:data-plane:data-plane-core"))
implementation(project(":core:data-plane:data-plane-util"))
implementation(project(":extensions:control-plane:transfer-data-plane"))
implementation(project(":extensions:control-plane:transfer:transfer-data-plane"))
implementation(project(":extensions:data-plane:data-plane-client"))
implementation(project(":extensions:data-plane-selector:data-plane-selector-client"))
implementation(project(":core:data-plane-selector:data-plane-selector-core"))
Expand All @@ -49,4 +49,4 @@ tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> {
exclude("**/pom.properties", "**/pom.xm")
mergeServiceFiles()
archiveFileName.set("provider.jar")
}
}