From 6096b60c15b856693b73dc7e5019a3119f3ad8d5 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger <43503240+paullatzelsperger@users.noreply.github.com> Date: Wed, 21 Aug 2024 08:46:21 +0200 Subject: [PATCH] docs: add chapter about dataplane signaling (#197) --- .../for-contributors/contributor-handbook.md | 60 ++-- .../data-plane-signaling.md | 311 ++++++++++++++++++ .../data-plane-signaling_authorize.png | Bin 0 -> 36753 bytes .../data-plane-signaling_authorize.puml | 49 +++ .../data-plane-signaling_create-token.png | Bin 0 -> 37042 bytes .../data-plane-signaling_create-token.puml | 49 +++ 6 files changed, 439 insertions(+), 30 deletions(-) create mode 100644 developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling.md create mode 100644 developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_authorize.png create mode 100644 developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_authorize.puml create mode 100644 developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_create-token.png create mode 100644 developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_create-token.puml diff --git a/developer/wip/for-contributors/contributor-handbook.md b/developer/wip/for-contributors/contributor-handbook.md index a73d9de2..e84ff25a 100644 --- a/developer/wip/for-contributors/contributor-handbook.md +++ b/developer/wip/for-contributors/contributor-handbook.md @@ -1,36 +1,34 @@ # Contributor Documentation - * [Contributor Documentation](#contributor-documentation) - * [0. Intended audience](#0-intended-audience) - * [1. Getting started](#1-getting-started) - * [1.1 Prerequisites](#11-prerequisites) - * [1.2 Terminology](#12-terminology) - * [1.3 Architectural and coding principles](#13-architectural-and-coding-principles) - * [2. The control plane](#2-the-control-plane) - * [2.1 Entities](#21-entities) - * [2.2 Programming Primitives](#22-programming-primitives) - * [2.3 Serialization via JSON-LD](#23-serialization-via-json-ld) - * [2.4 Extension model](#24-extension-model) - * [2.5 Dependency injection deep dive](#25-dependency-injection-deep-dive) - * [2.6 Service layers](#26-service-layers) - * [2.7 Policy Monitor](#27-policy-monitor) - * [2.8 Protocol extensions (DSP)](#28-protocol-extensions-dsp) - * [3. (Postgre-)SQL persistence](#3-postgre-sql-persistence) - * [4. The data plane](#4-the-data-plane) - * [4.1 Data plane signaling](#41-data-plane-signaling) - * [4.2 Data plane self-registration](#42-data-plane-self-registration) - * [4.3 Public API authentication](#43-public-api-authentication) - * [4.4 Writing a custom data plane extension (sink/source)](#44-writing-a-custom-data-plane-extension-sinksource) - * [4.5 Writing a custom data plane (using only DPS)](#45-writing-a-custom-data-plane-using-only-dps) - * [5. Development best practices](#5-development-best-practices) - * [5.1 Writing Unit-, Component-, Integration-, Api-, EndToEnd-Tests](#51-writing-unit--component--integration--api--endtoend-tests) - * [5.1 Other best practices](#51-other-best-practices) - * [6. Further concepts](#6-further-concepts) - * [6.2 Autodoc](#62-autodoc) - * [6.3 Adapting the Gradle build](#63-adapting-the-gradle-build) - + * [0. Intended audience](#0-intended-audience) + * [1. Getting started](#1-getting-started) + * [1.1 Prerequisites](#11-prerequisites) + * [1.2 Terminology](#12-terminology) + * [1.3 Architectural and coding principles](#13-architectural-and-coding-principles) + * [2. The control plane](#2-the-control-plane) + * [2.1 Entities](#21-entities) + * [2.2 Programming Primitives](#22-programming-primitives) + * [2.3 Serialization via JSON-LD](#23-serialization-via-json-ld) + * [2.4 Extension model](#24-extension-model) + * [2.5 Dependency injection deep dive](#25-dependency-injection-deep-dive) + * [2.6 Service layers](#26-service-layers) + * [2.7 Policy Monitor](#27-policy-monitor) + * [2.8 Protocol extensions (DSP)](#28-protocol-extensions-dsp) + * [3. (Postgre-)SQL persistence](#3-postgre-sql-persistence) + * [4. The data plane](#4-the-data-plane) + * [4.1 Data plane signaling](#41-data-plane-signaling) + * [4.2 Data plane self-registration](#42-data-plane-self-registration) + * [4.3 Public API authentication](#43-public-api-authentication) + * [4.4 Writing a custom data plane extension (sink/source)](#44-writing-a-custom-data-plane-extension-sinksource) + * [4.5 Writing a custom data plane (using only DPS)](#45-writing-a-custom-data-plane-using-only-dps) + * [5. Development best practices](#5-development-best-practices) + * [5.1 Writing Unit-, Component-, Integration-, Api-, EndToEnd-Tests](#51-writing-unit--component--integration--api--endtoend-tests) + * [5.1 Other best practices](#51-other-best-practices) + * [6. Further concepts](#6-further-concepts) + * [6.2 Autodoc](#62-autodoc) + * [6.3 Adapting the Gradle build](#63-adapting-the-gradle-build) ## 0. Intended audience @@ -171,7 +169,7 @@ Detailed documentation about the policy monitor can be found [here](./control-pl ### 2.8 Protocol extensions (DSP) -### 3. (Postgre-)SQL persistence +## 3. (Postgre-)SQL persistence PostgreSQL is a very popular open-source database and it has a large community and vendor adoption. It is also EDCs data persistence technology of choice. @@ -192,6 +190,8 @@ Detailed documentation about EDCs PostgreSQL implementations can be found [here] ### 4.1 Data plane signaling +Data Plane Signaling (DPS) is the communication protocol that is used between control planes and data planes. + ### 4.2 Data plane self-registration ### 4.3 Public API authentication diff --git a/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling.md b/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling.md new file mode 100644 index 00000000..1fa703fc --- /dev/null +++ b/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling.md @@ -0,0 +1,311 @@ +# The Data Plane Signaling interface + + +* [The Data Plane Signaling interface](#the-data-plane-signaling-interface) + * [1. `DataAddress` and `EndpointDataReference`](#1-dataaddress-and-endpointdatareference) + * [2. Signaling protocol messages and API endpoints](#2-signaling-protocol-messages-and-api-endpoints) + * [2.1 `START`](#21-start) + * [2.2 `SUSPEND`](#22-suspend) + * [2.3 `TERMINATE`](#23-terminate) + * [3. Data plane public API](#3-data-plane-public-api) + * [3.1 Endpoints and endpoint resolution](#31-endpoints-and-endpoint-resolution) + * [3.2 Public API Access Control](#32-public-api-access-control) + * [3.3 Token expiry and renewal](#33-token-expiry-and-renewal) + * [4. Data plane registration](#4-data-plane-registration) + * [5. Data plane selection](#5-data-plane-selection) + + +Data plane signaling (DPS) defines a set of API endpoints and message types which are used for communication between a +control plane and dataplane to control data flows. + +## 1. `DataAddress` and `EndpointDataReference` + +When the control plane signals to the data plane to start a client pull transfer process, the data plane returns a +`DataAddress`. This is only true for consumer-pull transfers - provider push transfers **do not return** a +`DataAddress`. This `DataAddress` contains information the client can use to resolve the provider's data plane endpoint. +It also contain an access token (cf. [authorization](#52-public-api-authorization)). + +This `DataAddress` is returned by the provider control plane to the consumer in a `TransferProcessStarted` DSP message. +Its purpose is to inform the consumer where they can obtain the data, and which authorization token to use. + +The `EndpointDataReference` is a data structure that is used on the consumer side to contain all the relevant +information of the `DataAddress` and some additional information associated with the transfer, such as asset ID and +contract ID. Note that is is only the case if the consumer is implemented using EDC. + +A transfer process may be `STARTED` multiple times (e.g., after it is temporarily `SUSPENDED`), the consumer may receive +a different `DataAddress` objects as part of each start message. The consumer must **always** create a new `EDR` from +these messages and remove the previous EDR. Data plane implementations may choose to pass the same `DataAddress` or an +updated one. + +This start signaling pattern can be used to change a data plane's endpoint address, for example, after a software +upgrade, or a load balancer switch-over. + +## 2. Signaling protocol messages and API endpoints + +All requests support idempotent behavior. Data planes must therefore perform request de-duplication. After a data plane +commits a request, it will return an ack to the control plane, which will transition the `TransferProcess` to its next +state (e.g., `STARTED`, `SUSPENDED`, `TERMINATED`). If a successful ack is not received, the control plane will resend +the request during a subsequent tick period. + +### 2.1 `START` + +During the transfer process `STARTING` phase, the provider control plane selects a data plane using the +`DataFlowController` implementations it has available, which will then send a `DataFlowStartMessage` to the data plane. + +The control plane (i.e. the `DataFlowController`) records which data plane was selected for the transfer process so that +it can properly route subsequent, start, stop, and terminate requests. + +For client pull transfers, the data plane returns a `DataAddress` with an access token. + +If the data flow was previously `SUSPENDED`, the data plane may elect to return the same `DataAddress` or create a new +one. + +The provider control plane sends a `DataFlowStartMessage` to the provider data plane: + +```http request +POST https://dataplane-host:port/api/signaling/v1/dataflows +Content-Type: application/json + +{ + "@context": { "@vocab": "https://w3id.org/edc/v0.0.1/ns/" }, + "@id": "transfer-id", + "@type": "DataFlowStartMessage", + "processId": "process-id", + "datasetId": "dataset-id", + "participantId": "participant-id", + "agreementId": "agreement-id", + "transferType": "HttpData-PULL", + "sourceDataAddress": { + "type": "HttpData", + "baseUrl": "https://jsonplaceholder.typicode.com/todos" + }, + "destinationDataAddress": { + "type": "HttpData", + "baseUrl": "https://jsonplaceholder.typicode.com/todos" + }, + "callbackAddress" : "http://control-plane", + "properties": { + "key": "value" + } +} +``` + +The data plane responds with a `DataFlowResponseMessage`, that contains the public endpoint, the authorization token and +possibly other information in the form of a `DataAddress`. For more information about how access tokens are generated, +please refer to [this chapter](#52-public-api-access-control). + +### 2.2 `SUSPEND` + +During the transfer process `SUSPENDING` phase, the `DataFlowController` will send a `DataFlowSuspendMessage` to the +data plane. The data plane will transition the data flow to the `SUSPENDED` state and invalidate the associated access +token. + +```http request +POST https://dataplane-host:port/api/signaling/v1/dataflows +Content-Type: application/json + +{ + "@context": { "@vocab": "https://w3id.org/edc/v0.0.1/ns/" }, + "@type": "DataFlowSuspendMessage", + "reason": "reason" +} +``` + +### 2.3 `TERMINATE` + +During the transfer process `TERMINATING` phase, the `DataFlowController` will send a `DataFlowTerminateMessage` to the +data plane. The data plane will transition the data flow to the `TERMINATED` state and invalidate the associated access +token. + +```http request +POST https://dataplane-host:port/api/signaling/v1/dataflows +Content-Type: application/json + +{ + "@context": { "@vocab": "https://w3id.org/edc/v0.0.1/ns/" }, + "@type": "DataFlowTerminateMessage", + "reason": "reason" +} +``` + + +## 3. Data plane public API + +One popular use case for data transmission is where the provider organization exposes a REST API where consumers can +download data. We call this a "Http-PULL" transfer. This is especially useful for structured data, such as JSON and it +can even be used to model _streaming_ data. + +To achieve that, the provider data plane can expose a "public API" that takes REST requests and satisfies them by +pulling data out of a `DataSource` which it obtains by verifying and parsing the `Authorization` token (see [this +chapter](#32-public-api-access-control) for details). + +### 3.1 Endpoints and endpoint resolution + +### 3.2 Public API Access Control + +The design of the EDC Data Plane Framework is based on **non-renewable** access tokens. One access token will be +maintained for the period a transfer process is in the `STARTED` state. This duration may be a single request or a +series of requests spanning an indefinite period of time ("streaming"). + +Other data plane implementations my chose to support renewable tokens. Token renewal is often used as a strategy for +controlling access duration and mitigating leaked tokens. The EDC implementation will handle access duration and +mitigate against leaked tokens in the following ways. + +#### 3.2.1 Access Duration + +Access duration is controlled by the transfer process and contract agreement, not the token. If a transfer processes is +moved from the `STARTED` to the `SUSPENDED`, `TERMINATED`, or `COMPLETED` state, the access token will no longer be +valid. Similarly, if a contract agreement is violated or otherwise invalidated, a cascade operation will terminate all +associated transfer processes. + +To achieve that, the data plane maintains a list of currently active/valid tokens. + +#### 3.2.2 Leaked Access Tokens + +If an access token is leaked or otherwise compromised, its associated transfer process is placed in the `TERMINATED` +state and a new one is started. In order to mitigate the possibility of ongoing data access when a leak is not +discovered, a data plane may implement token renewal. Limited-duration contract agreements and transfer processes may +also be used. For example, a transfer process could be terminated after a period of time by the provider and the +consumer can initiate a new process before or after that period. + +#### 3.2.3 Access Token Generation + +When the `DataFlowManager` receives a `DataFlowStartMessage` to start the data transmission, it uses the +`DataPlaneAuthorizationService` to generate an access token (in JWT format) and a `DataAddress`, that contains the +follwing information: + +- `endpoint`: the URL of the public API +- `endpointType`: should be `https://w3id.org/idsa/v4.1/HTTP` for HTTP pull transfers +- `authorization`: the newly generated access token. + +
+ DataAddress with access token + + ```json + { + "dspace:dataAddress": { + "@type": "dspace:DataAddress", + "dspace:endpointType": "https://w3id.org/idsa/v4.1/HTTP", + "dspace:endpoint": "http://example.com", + "dspace:endpointProperties": [ + { + "@type": "dspace:EndpointProperty", + "dspace:name": "https://w3id.org/edc/v0.0.1/ns/authorization", + "dspace:value": "token" + }, + { + "@type": "dspace:EndpointProperty", + "dspace:name": "https://w3id.org/edc/v0.0.1/ns/authType", + "dspace:value": "bearer" + } + ] + } + } + ``` +

+ +This `DataAddress` is returned in the `DataFlowResponse` as mentioned [here](#21-start). With that alone, the data plane +would not be able to determine token revocation or invalidation, so it must also _record_ the access token. + +To that end, the EDC data plane stores an `AccessTokenData` object that contains the token, the source `DataAddress` and +some information about the bearer of the token, specifically: + +- agreement ID +- asset ID +- transfer process ID +- flow type (`push` or `pull`) +- participant ID (of the consumer) +- transfer type (see [later sections](#4-data-plane-registration) for details) + +The token creation flow is illustrated by the following sequence diagram: + +![](./data-plane-signaling_create-token.png) + +#### 3.2.4 Access Token Validation and Revocation + +When the consumer executes a REST request against the provider data plane's public API, it must send the previously +received access token (inside the `DataAddress`) in the `Authorization` header. + +The data plane then attempts to resolve the `AccessTokenData` object associated with that token and checks that the +token is valid. + +The authorization flow is illustrated by the following sequence diagram: + +![](data-plane-signaling_authorize.png) + +A default implementation will be provided that always returns `true`. Extensions can supply alternative implementations +that perform use-case-specific authorization checks. + +> Please note that `DataPlaneAccessControlService` implementation must handle all request types (including transport +> types) in a data plane runtime. If multiple access check implementations are required, creating a multiplexer or +> individual data plane runtimes is recommended. + +> Note that in EDC, the access control check (step 8) always returns `true`! + +In order to _revoke_ the token with immediate effect, it is enough to delete the `AccessTokenData` object from the +database. This is done using the `DataPlaneAuthorizationService` as well. + +### 3.3 Token expiry and renewal + +EDC does **not currently implement** token expiry and renewal, so this section is intended for developers who wish to +provide a custom data plane. + +To implement token renewal, the recommended way is to create an extension, that exposes a refresh endpoint which can be +used by consumers. The URL of this refresh endpoint could be encoded in the original `DataAddress` in the +`dspace:endpointProperties` field. +> In any case, this will be a dataspace-specific solution, so administrative steps are +required to achieve interoperability. + +## 4. Data plane registration + +The life cycle of a data plane is decoupled from the life cycle of a control plane. That means, they could be started, +paused/resumed and stopped at different points in time. In clustered deployments, this is very likely the default +situation. With this, it is also possible to add or remove individual data planes anytime. + +When data planes come online, they _register_ with the control plane using the `DataPlaneSelectorControlApi`. Each +dataplane sends a `DataPlaneInstance` object that contains information about its supported transfer types, supported +source types, URL, the data plane's `component ID` and other properties. + +From then on, the control plane sends periodic heart-beats to the dataplane. + +## 5. Data plane selection + +During data plane self-registration, the control plane builds a list of `DataPlaneInstance` objects, each of which +represents one (logical) data plane component. Note that these are _logical_ instances, that means, even replicated +runtimes would still only count as _one_ instance. + +In a periodic task the control plane engages a state machine `DataPlaneSelectorManager` to manage the state of each +registered data plane. To do that, it simply sends a REST request to the `/v1/dataflows/check` endpoint of the data +plane. If that returns successfully, the dataplane is still up and running. +If not, the control plane will consider the data plane as "unavailable". + +In addition to availability, the control plane also records the _capabilities_ of each data plane, i.e. which which +source data types and transfer types are supported. Each data plane must declare where it can transfer data _from_ +(source type, e.g. `AmazonS3`) and _how_ it can transfer data (transfer type, e.g. `Http-PULL`). + + +### 5.1 Building the catalog + +The data plane selection directly influences the contents of the catalog: for example, let say that a particular +provider can transmit an asset either via HTTP (pull), or via S3 (push), then each one of these variants would be +represented in the catalog as individual `Distribution`. + +Upon building the catalog, the control plane checks for each `Asset`, whether the `Asset.dataAddress.type` field is +contained in the list of `allowedTransferTypes` of each `DataPlaneInstance` + +In the example above, at least one data plane has to have `Http-PULL` in its `allowedTransferTypes`, and at least one +has to have `AmazonS3-PUSH`. Note that one data plane could have _both_ entries. + +### 5.2 Fulfilling data requests + +When a `START` message is sent from the control plane to the data plane via the Signaling API, the data plane first +checks whether it can fulfill the request. If multiple data planes can fulfill the request, the `selectionStrategy` is +employed to determine the actual data plane. + +This check is necessary, because a `START` message could contain a transfer type, that is not supported by any of the +data planes, or all data planes, that could fulfill the request are unavailable. + +This algorithm is called _data plane selection_. + +> Selection strategies can be added via extensions, using the `SelectionStrategyRegistry`. By default, a data plane is +> selected at random. \ No newline at end of file diff --git a/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_authorize.png b/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_authorize.png new file mode 100644 index 0000000000000000000000000000000000000000..33461b97338c5d95c00926fa2fde9c156d4ae2fe GIT binary patch literal 36753 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
H_34YHsV;a4yu8 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 dpauths: <> +activate dpauths +dpauths -> tvs: validate token w/ own public key +activate tvs +return Result +dpauths -> dpats: <> +activate dpats +dpats -> dpats: restore AccessTokenData \nfrom raw token +return AccessTokenData +dpauths -> dpacs: <> +dpacs --> dpacs: perform access control +dpacs -> dpauths: return true | false + + +return Result +deactivate dpauths +@enduml \ No newline at end of file diff --git a/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_create-token.png b/developer/wip/for-contributors/data-plane/data-plane-signaling/data-plane-signaling_create-token.png new file mode 100644 index 0000000000000000000000000000000000000000..e693b72d1ad5a961a2bc0e2c40267de658d33853 GIT binary patch literal 37042 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 aftjH0RW(j+5>`RPAL#2CYZq%ep8j7D dpauths: <> +activate dpauths +dpauths -> dpauths: convert DataFlowStartMessage to \nTokenParameters + DataAddress +dpauths -> dpats: <> +activate dpats + +dpats->dpats: convert TokenParameters -> TokenDecorator[] + +dpats -> tgs: <> +activate tgs +return TokenRepresentation + +dpats --> dpauths: return TokenRepresentation \n(containing serialized JWT) +deactivate dpats +[<-- dpauths: return serialized JWT +deactivate dpauths + +@enduml \ No newline at end of file