From 124160c9b7cf4c0fa09915b5fd4d5cd847a220fd Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Thu, 14 Dec 2023 09:34:42 +0100 Subject: [PATCH] refactor: cleanup DAPS references --- DEPENDENCIES | 4 +- docs/README.md | 62 ++- docs/development/README.md | 10 + .../data-plane-http-oauth2.md | 0 .../edr-api-overview.md | 6 +- docs/development/run-config.png | Bin 59867 -> 0 bytes docs/kit/Adoption View/00_adoption-view.md | 4 +- .../00_local_setup_controlplane.md | 6 - docs/samples/README.md | 15 - docs/samples/Transfer Data.md | 373 ------------------ docs/samples/diagrams/transfer_sequence_1.png | Bin 28233 -> 0 bytes .../samples/diagrams/transfer_sequence_1.puml | 34 -- docs/samples/diagrams/transfer_sequence_2.png | Bin 27684 -> 0 bytes .../samples/diagrams/transfer_sequence_2.puml | 28 -- docs/samples/diagrams/transfer_sequence_3.png | Bin 32718 -> 0 bytes .../samples/diagrams/transfer_sequence_3.puml | 33 -- docs/samples/diagrams/transfer_sequence_4.png | Bin 56765 -> 0 bytes .../samples/diagrams/transfer_sequence_4.puml | 44 --- docs/samples/diagrams/transfer_sequence_5.png | Bin 21142 -> 0 bytes .../samples/diagrams/transfer_sequence_5.puml | 27 -- docs/samples/example-dataspace/README.md | 136 ------- .../example-dataspace/plato-values.yaml | 77 ---- .../example-dataspace/sokrates-values.yaml | 76 ---- .../README.md | 10 - .../README.md | 10 - edc-controlplane/edc-runtime-memory/README.md | 10 - .../edc-dataplane-azure-vault/README.md | 1 - .../edc-dataplane-hashicorp-vault/README.md | 1 - edc-extensions/build.gradle.kts | 1 - edc-extensions/cx-oauth2/README.md | 47 --- edc-extensions/cx-oauth2/build.gradle.kts | 35 -- .../cx-oauth2/diagrams/sequence.png | Bin 37872 -> 0 bytes .../cx-oauth2/diagrams/sequence.puml | 24 -- .../edc/oauth2/CxOauth2Extension.java | 39 -- .../edc/oauth2/CxParticipantExtension.java | 75 ---- ...rg.eclipse.edc.spi.system.ServiceExtension | 22 -- .../oauth2/CxParticipantExtensionTest.java | 90 ----- .../tractusx-connector-azure-vault-test.yaml | 15 - .../helm/tractusx-connector-memory-test.yaml | 12 - .../edc/lifecycle/ParticipantRuntime.java | 4 +- .../edc/lifecycle/PgParticipantRuntime.java | 3 - ...rvice.java => MockBpnIdentityService.java} | 15 +- .../runtime-memory-ssi/build.gradle.kts | 3 - .../runtime/runtime-memory/build.gradle.kts | 6 - .../build.gradle.kts | 2 - .../runtime-postgresql/build.gradle.kts | 2 - gradle/libs.versions.toml | 2 - samples/multi-tenancy/build.gradle.kts | 2 +- settings.gradle.kts | 1 - 49 files changed, 53 insertions(+), 1314 deletions(-) create mode 100644 docs/development/README.md rename docs/{samples => development}/data-plane-http-oauth2.md (100%) rename docs/{samples/edr-api-overview => development}/edr-api-overview.md (97%) delete mode 100644 docs/development/run-config.png delete mode 100644 docs/samples/README.md delete mode 100644 docs/samples/Transfer Data.md delete mode 100644 docs/samples/diagrams/transfer_sequence_1.png delete mode 100644 docs/samples/diagrams/transfer_sequence_1.puml delete mode 100644 docs/samples/diagrams/transfer_sequence_2.png delete mode 100644 docs/samples/diagrams/transfer_sequence_2.puml delete mode 100644 docs/samples/diagrams/transfer_sequence_3.png delete mode 100644 docs/samples/diagrams/transfer_sequence_3.puml delete mode 100644 docs/samples/diagrams/transfer_sequence_4.png delete mode 100644 docs/samples/diagrams/transfer_sequence_4.puml delete mode 100644 docs/samples/diagrams/transfer_sequence_5.png delete mode 100644 docs/samples/diagrams/transfer_sequence_5.puml delete mode 100644 docs/samples/example-dataspace/README.md delete mode 100644 docs/samples/example-dataspace/plato-values.yaml delete mode 100644 docs/samples/example-dataspace/sokrates-values.yaml delete mode 100644 edc-extensions/cx-oauth2/README.md delete mode 100644 edc-extensions/cx-oauth2/build.gradle.kts delete mode 100644 edc-extensions/cx-oauth2/diagrams/sequence.png delete mode 100644 edc-extensions/cx-oauth2/diagrams/sequence.puml delete mode 100644 edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxOauth2Extension.java delete mode 100644 edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtension.java delete mode 100644 edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension delete mode 100644 edc-extensions/cx-oauth2/src/test/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtensionTest.java rename edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/{MockDapsService.java => MockBpnIdentityService.java} (71%) diff --git a/DEPENDENCIES b/DEPENDENCIES index 665363136..f76cf020a 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -10,7 +10,7 @@ maven/mavencentral/com.azure/azure-core/1.43.0, MIT AND Apache-2.0, approved, #1 maven/mavencentral/com.azure/azure-core/1.44.1, MIT, approved, clearlydefined maven/mavencentral/com.azure/azure-core/1.45.1, MIT AND Apache-2.0, approved, #11845 maven/mavencentral/com.azure/azure-identity/1.10.1, MIT AND Apache-2.0, approved, #10086 -maven/mavencentral/com.azure/azure-identity/1.11.1, , restricted, clearlydefined +maven/mavencentral/com.azure/azure-identity/1.11.1, MIT, approved, clearlydefined maven/mavencentral/com.azure/azure-json/1.1.0, MIT AND Apache-2.0, approved, #10547 maven/mavencentral/com.azure/azure-security-keyvault-secrets/4.7.0, MIT, approved, #10868 maven/mavencentral/com.azure/azure-security-keyvault-secrets/4.7.3, MIT, approved, #10868 @@ -244,7 +244,7 @@ maven/mavencentral/org.bouncycastle/bcutil-jdk18on/1.77, MIT, approved, #11596 maven/mavencentral/org.ccil.cowan.tagsoup/tagsoup/1.2.1, Apache-2.0, approved, clearlydefined maven/mavencentral/org.checkerframework/checker-qual/3.12.0, MIT, approved, clearlydefined maven/mavencentral/org.checkerframework/checker-qual/3.31.0, MIT, approved, clearlydefined -maven/mavencentral/org.checkerframework/checker-qual/3.41.0, , restricted, clearlydefined +maven/mavencentral/org.checkerframework/checker-qual/3.41.0, MIT, approved, #12032 maven/mavencentral/org.codehaus.woodstox/stax2-api/4.2.1, BSD-2-Clause, approved, #2670 maven/mavencentral/org.eclipse.edc/api-core/0.4.1, Apache-2.0, approved, technology.edc maven/mavencentral/org.eclipse.edc/api-observability/0.4.1, Apache-2.0, approved, technology.edc diff --git a/docs/README.md b/docs/README.md index 1ac9bcd7d..560e39e5f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,10 @@ # Tractus-X EDC -The Tractus-X EDC repository creates runnable applications out of EDC extensions from -the [Eclipse DataSpace Connector](https://github.com/eclipse-edc/Connector) repository. +The Tractus-X EDC repository creates runnable applications out of EDC extensions from the +[EDC Connector](https://github.com/eclipse-edc/Connector) platform. -When running a EDC connector from the Tractus-X EDC repository there are three setups to choose from. They only vary by -using different extensions for +When running an EDC connector from the Tractus-X EDC repository there are three different setups to choose from. They +only vary by using different extensions for - Resolving of Connector-Identities - Persistence of the Control-Plane-State @@ -15,43 +15,33 @@ using different extensions for The three supported setups are. - Setup 1: Pure in Memory **Not intended for production use!** - - [Control Plane](../edc-controlplane/edc-runtime-memory/README.md) - - [IDS DAPS Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/iam/oauth2/daps) - - In Memory Persistence done by using no extension - - In Memory Keyvault with seedable secrets. - - [Data Plane](../edc-dataplane/edc-dataplane-azure-vault/README.md) - - [Azure Key Vault Extension](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/vault/azure-vault) -- Setup 2: PostgreSQL & Azure Vault - - [Control Plane](../edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md) - - [IDS DAPS Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/iam/oauth2/daps) - - [PostgreSQL Persistence Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql) - - [Azure Key Vault Extension](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/vault/azure-vault) - - [Data Plane](../edc-dataplane/edc-dataplane-azure-vault/README.md) - - [Azure Key Vault Extension](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/vault/azure-vault) -- Setup 3: PostgreSQL & HashiCorp Vault - - [Control Plane](../edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md) - - [IDS DAPS Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/iam/oauth2/daps) - - [PostgreSQL Persistence Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql) - - [HashiCorp Vault Extension](../edc-extensions/hashicorp-vault/README.md) - - [Data Plane](../edc-dataplane/edc-dataplane-hashicorp-vault/README.md) - - [HashiCorp Vault Extension](../edc-extensions/hashicorp-vault/README.md) + - In Memory persistence + - In Memory KeyVault with seedable secrets. + - Planes: + - [Control Plane](../edc-controlplane/edc-runtime-memory/README.md) + - [Data Plane](../edc-dataplane/edc-dataplane-base/README.md) +- Setup 2: PostgreSQL & HashiCorp Vault + - PostgreSQL persistence + - HashiCorp Vault + - Planes: + - [Control Plane](../edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md) + - [Data Plane](../edc-dataplane/edc-dataplane-hashicorp-vault/README.md) +- Setup 3: PostgreSQL & Azure Vault + - PostgreSQL persistence + - Azure Key Vault + - Planes: + - [Control Plane](../edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md) + - [Data Plane](../edc-dataplane/edc-dataplane-azure-vault/README.md) ## Recommended Documentation -### This Repository - -- [Update EDC Version from 0.0.x - 0.1.x](migration/Version_0.0.x_0.1.x.md) +- [MXD: Minimum viable tractusX Dataspace](https://github.com/eclipse-tractusx/tutorial-resources/tree/main/mxd) +- [Migration guides](migration) +- [Development](development/README.md) - [Application: Control Plane](../edc-controlplane) - [Application: Data Plane](../edc-dataplane) -- [Extension: Business Partner Numbers](../edc-extensions/business-partner-validation/README.md) -- [Example: Local TXDC Setup](samples/Local%20TXDC%20Setup.md) -- [Example: Data Transfer](samples/Transfer%20Data.md) - -### Eclipse Dataspace Connector - -- [EDC Domain Model](https://github.com/eclipse-edc/Connector/blob/main/docs/developer/architecture/domain-model.md) -- [EDC Open API Spec](https://github.com/eclipse-edc/Connector/blob/main/resources/openapi/openapi.yaml) -- [HTTP Receiver Extension](https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/http-receiver) +- [Extension: Business Partner Numbers validation](../edc-extensions/bpn-validation/README.md) +- [Eclipse Dataspace Components](https://eclipse-edc.github.io/docs/#/) ## NOTICE diff --git a/docs/development/README.md b/docs/development/README.md new file mode 100644 index 000000000..7887c3f44 --- /dev/null +++ b/docs/development/README.md @@ -0,0 +1,10 @@ +# Development Documentation + +- [Coding principles](coding-principles.md) +- [Decision Records](decision-records) +- [Release](Release.md) + +## Deep Dives +- [Data Plane Http OAuth2](data-plane-http-oauth2.md) +- [EDR Api Overview](edr-api-overview.md) + diff --git a/docs/samples/data-plane-http-oauth2.md b/docs/development/data-plane-http-oauth2.md similarity index 100% rename from docs/samples/data-plane-http-oauth2.md rename to docs/development/data-plane-http-oauth2.md diff --git a/docs/samples/edr-api-overview/edr-api-overview.md b/docs/development/edr-api-overview.md similarity index 97% rename from docs/samples/edr-api-overview/edr-api-overview.md rename to docs/development/edr-api-overview.md index b69e604c4..e86290517 100644 --- a/docs/samples/edr-api-overview/edr-api-overview.md +++ b/docs/development/edr-api-overview.md @@ -112,7 +112,7 @@ associated to it in the configured datasource for future querying. Since `tractusx-edc` [v0.5.1](https://github.com/eclipse-tractusx/tractusx-edc/releases/tag/0.5.1) the cached EDRs also come with a state machine that will manage the lifecycle of an EDR on the consumer side. That means that it will auto-renew it is nearing its expiration date by firing another transfer process request with the same parameters as the original one. Once renewed, the old EDR -will transition to the `EXPIRED` state, and it will be removed from the database and the vault according to the [configuration](../../../core/edr-core/README.md). +will transition to the `EXPIRED` state, and it will be removed from the database and the vault according to the [configuration](../../core/edr-core/README.md). ### EDR Management | Fetch cached EDRs @@ -219,7 +219,7 @@ curl --request GET \ #### Consumer data-plane (proxy) The Consumer data-plane proxy is an extension available in `tractusx-edc` that will use the EDR store to simplify -the data request on consumer side. The documentation is available [here](../../../edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/README.md). +the data request on consumer side. The documentation is available [here](../../edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/README.md). The only API is: @@ -228,7 +228,7 @@ The only API is: | `/aas/request` | POST | [OpenApi](https://app.swaggerhub.com/apis/eclipse-tractusx-bot/tractusx-edc/0.5.1#/Data%20Plane%20Proxy%20API/requestAsset) | which fetches the data according to the input body. The body should contain the `assetId` plus `providerId` or the `transferProcessId`, -which identifies the EDR to use for fetching data and an `endpointUrl` which is the [provider gateway](../../../edc-extensions/dataplane-proxy/edc-dataplane-proxy-provider-api/README.md) +which identifies the EDR to use for fetching data and an `endpointUrl` which is the [provider gateway](../../edc-extensions/dataplane-proxy/edc-dataplane-proxy-provider-api/README.md) on which the data is available. Example: diff --git a/docs/development/run-config.png b/docs/development/run-config.png deleted file mode 100644 index 4be2d85ad69f9646e1c3b67f06e2a74f2b492a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59867 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 z 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 diff --git a/docs/kit/Adoption View/00_adoption-view.md b/docs/kit/Adoption View/00_adoption-view.md index 4ccb3494a..4e850b530 100644 --- a/docs/kit/Adoption View/00_adoption-view.md +++ b/docs/kit/Adoption View/00_adoption-view.md @@ -31,7 +31,7 @@ The main difference between the EDC and the previous connectors of the [IDSA][id The architecture of the EDC combines various services that are necessary for the above principles: -- An interface to the Identity Provider service, currently [IDSA][idsa-url]'s [Dynamic Attribute Provisioning System][daps-url]. This central service provides the identity and the corresponding authentication of the participants in the data exchange. (There is no authorization at this point). Decentralized solutions will also be supported in the future. +- An interface to the Identity Provider service, currently [IDSA][idsa-url]'s [Identity And Trust Protocol][iatp-url]. This central service provides the identity and the corresponding authentication of the participants in the data exchange. (There is no authorization at this point). Decentralized solutions will also be supported in the future. - The provision of possible offers (contract offering) which, on the one hand, stipulates the data offered and the associated terms of use (policies) in corresponding contracts. - An interface for manual selection of data and associated contract offers. - The actual data transfer via the data plane extension @@ -40,7 +40,7 @@ The architecture of the EDC combines various services that are necessary for the [edc-url]: https://github.com/eclipse-edc/Connector [gaiax-url]: https://www.data-infrastructure.eu/GAIAX/Navigation/EN/Home/home.html [idsa-url]: https://internationaldataspaces.org/ -[daps-url]: https://www.dataspaces.fraunhofer.de/en/software/identity_provider.html +[iatp-url]: https://github.com/eclipse-tractusx/ssi-docu ## NOTICE diff --git a/docs/kit/Operation View/02_Local Setup/00_local_setup_controlplane.md b/docs/kit/Operation View/02_Local Setup/00_local_setup_controlplane.md index d40432384..1ee5059a8 100644 --- a/docs/kit/Operation View/02_Local Setup/00_local_setup_controlplane.md +++ b/docs/kit/Operation View/02_Local Setup/00_local_setup_controlplane.md @@ -62,12 +62,6 @@ edc.hostname=localhost edc.api.auth.key=password -# OAuth / DAPS related configuration -edc.oauth.token.url=https://daps.example.net -edc.oauth.certificate.alias=key-to-daps-certificate-in-keyvault -edc.oauth.private.key.alias=key-to-private-key-in-keyvault -edc.oauth.client.id=daps-oauth-client-id - # HashiCorp vault related configuration edc.vault.hashicorp.url=http://vault edc.vault.hashicorp.token=55555555-6666-7777-8888-999999999999 diff --git a/docs/samples/README.md b/docs/samples/README.md deleted file mode 100644 index 4621e8a90..000000000 --- a/docs/samples/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Samples - -In this folder are listed some documents that will help you setting up a connector execute some use cases. - -- [Local setup](./example-dataspace/README.md) -- [Transfer data](./Transfer%20Data.md) -- [Data Plane HTTP OAuth2](./data-plane-http-oauth2.md) - -## NOTICE - -This work is licensed under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0). - -- SPDX-License-Identifier: Apache-2.0 -- SPDX-FileCopyrightText: 2021,2022,2023 Contributors to the Eclipse Foundation -- Source URL: diff --git a/docs/samples/Transfer Data.md b/docs/samples/Transfer Data.md deleted file mode 100644 index a9444557a..000000000 --- a/docs/samples/Transfer Data.md +++ /dev/null @@ -1,373 +0,0 @@ -# Transfer Data - -This document will showcase a data transfer between two connectors. - -For this transfer connector **Bob** will act as data provider, and connector **Alice** will act as data -consumer. But the roles could be inverse as well. - -> Please note: Before running the examples the corresponding environment variables must be set. -> How such an environment can be setup locally is documented in [chapter 1](#1-optional---local-setup). - -## Table of Content - -1. [Optional - Local Setup](#1-optional---local-setup) -2. [Setup Data Offer](#2-setup-data-offer) -3. [Request Contract Offers](#3-request-contract-offer-catalog) -4. [Negotiate Contract](#4-negotiate-contract) -5. [Transfer Data](#5-transfer-data) -6. [Verify Data Transfer](#6-verify-data-transfer) - -## 1. Optional - Local Setup - -To create a local setup with two connectors have a look at -the [Local TXDC Setup Documentation](Local%20TXDC%20Setup.md). -It creates two connectors (Plato & Sokrates) with exposed Node Ports. - -### See Node Ports using Minikube - -Run the following command. - -```shell -minkube service list -``` - -Minikube will then print out something like this: - -```plain -|-------------|-----------------------|-----------------|---------------------------| -| NAMESPACE | NAME | TARGET PORT | URL | -|-------------|-----------------------|-----------------|---------------------------| -| cx | backend | frontend/8080 | http://192.168.49.2:31918 | -| | | backend/8081 | http://192.168.49.2:30193 | < Transfer Backend API -| cx | ids-daps | No node port | -| cx | plato-controlplane | default/8080 | http://192.168.49.2:31016 | -| | | control/8083 | http://192.168.49.2:32510 | -| | | data/8081 | http://192.168.49.2:30423 | < Plato Data Management API -| | | validation/8082 | http://192.168.49.2:30997 | -| | | ids/8084 | http://192.168.49.2:32709 | < Plato IDS API -| | | metrics/8085 | http://192.168.49.2:31124 | -| cx | plato-dataplane | No node port | -| cx | sokrates-controlplane | default/8080 | http://192.168.49.2:32297 | -| | | control/8083 | http://192.168.49.2:32671 | -| | | data/8081 | http://192.168.49.2:31772 | < Sokrates Data Management API -| | | validation/8082 | http://192.168.49.2:30540 | -| | | ids/8084 | http://192.168.49.2:32543 | < Sokrates IDS API -| | | metrics/8085 | http://192.168.49.2:30247 | -| cx | sokrates-dataplane | No node port | -| cx | vault | No node port | -| cx | vault-internal | No node port | -| cx | vault-ui | No node port | -| default | kubernetes | No node port | -| kube-system | kube-dns | No node port | -|-------------|-----------------------|-----------------|---------------------------| -``` - -The most important APIs, used by this example, are highlighted. How they are used is described in subchapter ['Set -Environment Variables](#set-environment-variables-used-by-this-example), used by this example below. - -### See Node Ports using Kubernetes - -Using Kubernetes only the Node Ports of each Service must be checked separately. - -Run - -```shell -kubectl describe service -n cx plato-controlplane -``` - -or - -```shell -kubectl describe service -n cx sokrates-controlplane -``` - -Kubernetes will then print out something like this. - -```plain -Name: plato-controlplane -Namespace: cx -Labels: app.kubernetes.io/component=edc-controlplane - app.kubernetes.io/instance=plato-controlplane - app.kubernetes.io/managed-by=Helm - app.kubernetes.io/name=tractusx-connector-controlplane - app.kubernetes.io/part-of=edc - app.kubernetes.io/version=0.2.0 - helm.sh/chart=tractusx-connector-0.2.0 -Annotations: meta.helm.sh/release-name: plato - meta.helm.sh/release-namespace: cx -Selector: app.kubernetes.io/instance=plato-controlplane,app.kubernetes.io/name=tractusx-connector-controlplane -Type: NodePort -IP Family Policy: SingleStack -IP Families: IPv4 -IP: 10.110.180.57 -IPs: 10.110.180.57 -Port: default 8080/TCP -TargetPort: default/TCP -NodePort: default 31016/TCP -Endpoints: 172.17.0.6:8080 -Port: control 8083/TCP -TargetPort: control/TCP -NodePort: control 32510/TCP -Endpoints: 172.17.0.6:8083 -Port: data 8081/TCP -TargetPort: data/TCP -NodePort: data 30423/TCP < Plato Data Manamgent API -Endpoints: 172.17.0.6:8081 -Port: validation 8082/TCP -TargetPort: validation/TCP -NodePort: validation 30997/TCP -Endpoints: 172.17.0.6:8082 -Port: ids 8084/TCP -TargetPort: ids/TCP -NodePort: ids 32709/TCP < Plato IDS API -Endpoints: 172.17.0.6:8084 -Port: metrics 8085/TCP -TargetPort: metrics/TCP -NodePort: metrics 31124/TCP -Endpoints: 172.17.0.6:8085 -Session Affinity: None -External Traffic Policy: Cluster -Events: -``` - -The most important APIs, used by this example, are highlighted. How they are used is described in subchapter ['Set -Environment Variables](#set-environment-variables-used-by-this-example), used by this example below. -In comparison to the Minikube example this call shows only the ports. To call the ports the Kubernetes Node IP / URL is -required. Where to get the IP may vary depending on how Kubernetes is deployed. - -### Set Environment Variables, used by this example - -Environment Variables, containing a URL, used by this example are - -- BOB_DATAMGMT_URL -- ALICE_DATAMGMT_URL -- BOB_IDS_URL -- ALICE_BACKEND_URL - -Let's assume we will use Sokrates as Bob, and Plato as Alice. - -**BOB_DATAMGMT_URL** must be the Node URL. In this local setup it would be `http://192.168.49.2:31772` - -**ALICE_DATAMGMT_URL** must be the Node URL. In this local setup it would be `http://192.168.49.2:30423` - -**BOB_IDS_URL** must be internal Kubernetes URL. In this local setup `http://sokrates-controlplane:8084` - -**ALICE_BACKEND_URL** must the Node URL. In this local setup it would be `http://192.168.49.2:30193` - -## 2. Setup Data Offer - -Set up a data offer in **Bob**, so that **Alice** has something to consume. - -In case you are unfamiliar with the EDC terms `Asset`, `Policy` or `ContractDefinition` please have a look at the -official open source documentation ([link](https://github.com/eclipse-edc/Connector/blob/main/docs/developer/architecture/domain-model.md)). - -![Sequence 1](diagrams/transfer_sequence_1.png) - -The following commands will create an Asset, a Policy and a Contract Definition. -For simplicity `https://jsonplaceholder.typicode.com/todos/1` is used as data source of the asset, but could be any -other API, that is reachable from the Provider Data Plane. - -```bash -curl -X POST "${BOB_DATAMGMT_URL}/data/assets" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - --data '{ - "asset": { - "properties": { - "asset:prop:id": "1", - "asset:prop:description": "Tractus-X EDC Demo Asset" - } - }, - "dataAddress": { - "properties": { - "type": "HttpData", - "baseUrl": "https://jsonplaceholder.typicode.com/todos/1" - } - } - }' \ - -s -o /dev/null -w 'Response Code: %{http_code}\n' -``` - -```bash -curl -X POST "${BOB_DATAMGMT_URL}/data/policydefinitions" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - --data '{ - "id": "1", - "policy": { - "prohibitions": [], - "obligations": [], - "permissions": [ - { - "edctype": "dataspaceconnector:permission", - "action": { "type": "USE" }, - "constraints": [] - } - ] - } - }' \ - -s -o /dev/null -w 'Response Code: %{http_code}\n' -``` - -```bash -curl -X POST "${BOB_DATAMGMT_URL}/data/contractdefinitions" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - --data '{ - "id": "1", - "criteria": [ - { - "operandLeft": "asset:prop:id", - "operator": "=", - "operandRight": "1" - } - ], - "accessPolicyId": "1", - "contractPolicyId": "1" - }' \ - -s -o /dev/null -w 'Response Code: %{http_code}\n' -``` - -## 3. Request Contract Offer Catalog - -In this step Alice gets told to request contract offers from another connector (in this case Bob). Alice will -then request the catalog over IDS messaging. - -For IDS messaging connectors will identify each other using the configured IDS DAPS. Therefore, it is important that -connectors, that intent to send messages to each other, have the same DAPS instance configured. - -![Sequence 1](diagrams/transfer_sequence_2.png) - -Run: - -```bash -curl -G -X GET "${ALICE_DATAMGMT_URL}/data/catalog" \ - --data-urlencode "providerUrl=${BOB_IDS_URL}/api/v1/ids/data" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - -s | jq -``` - -## 4. Negotiate Contract - -Initiate a contract negotiation for the asset (from step 1). Part of the negotiation payload is the contract -offer (received in step 2). - -In the diagram the IDS contract negotiation is marked as simplified, because the EDC is exchanging multiple messages -during contract negotiation. But the inter-controlplane communication is not in the scope of this document. - -After the negotiation is initiated ensure that is has concluded. This is done by requesting the negotiation from the API -and checking whether the `contractAgreementId` is set. This might take a few seconds. - -![Sequence 1](diagrams/transfer_sequence_3.png) - -Run: - -```bash -export NEGOTIATION_ID=$( \ - curl -X POST "${ALICE_DATAMGMT_URL}/data/contractnegotiations" \ - --header "X-Api-Key: password" \ - --header "Content-Type: application/json" \ - --data "{ - \"connectorId\": \"foo\", - \"connectorAddress\": \"${BOB_IDS_URL}/api/v1/ids/data\", - \"offer\": { - \"offerId\": \"1:foo\", - \"assetId\": \"1\", - \"policy\": { - \"uid\": \"1\", - \"prohibitions\": [], - \"obligations\": [], - \"permissions\": [ - { - \"edctype\": \"dataspaceconnector:permission\", - \"action\": { \"type\": \"USE\" }, - \"target\": \"1\", - \"constraints\": [] - } - ] - } - } - }" \ - -s | jq -r '.id') -``` - -```bash -curl -X GET "${ALICE_DATAMGMT_URL}/data/contractnegotiations/${NEGOTIATION_ID}" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - -s | jq -``` - -## 5. Transfer Data - -Initiate a data transfer using the contract agreement from the negotiation (from step 3). Then wait until the state of -the transfer process is `COMPLETED`. - -![Sequence 1](diagrams/transfer_sequence_4.png) - -Run: - -```bash -export CONTRACT_AGREEMENT_ID=$( \ - curl -X GET "$ALICE_DATAMGMT_URL/data/contractnegotiations/$NEGOTIATION_ID" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - -s | jq -r '.contractAgreementId') -``` - -```bash -export TRANSFER_PROCESS_ID=$(tr -dc '[:alnum:]' < /dev/urandom | head -c20) -export TRANSFER_ID=$( \ - curl -X POST "${ALICE_DATAMGMT_URL}/data/transferprocess" \ - --header "X-Api-Key: password" \ - --header "Content-Type: application/json" \ - --data "{ - \"id\": \"${TRANSFER_PROCESS_ID}\", - \"connectorId\": \"foo\", - \"connectorAddress\": \"${BOB_IDS_URL}/api/v1/ids/data\", - \"contractId\": \"${CONTRACT_AGREEMENT_ID}\", - \"assetId\": \"1\", - \"managedResources\": \"false\", - \"dataDestination\": { \"type\": \"HttpProxy\" } - }" \ - -s | jq -r '.id') -``` - -```bash -curl -X GET "${ALICE_DATAMGMT_URL}/data/transferprocess/${TRANSFER_ID}" \ - --header 'X-Api-Key: password' \ - --header 'Content-Type: application/json' \ - -s | jq -``` - -## 6. Verify Data Transfer - -After the transfer is complete the Backend Application has downloaded the data. The Backend Application stores the data -locally. In this demo the transfer can be verified by executing a simple `cat` call in the Pod. - -![Sequence 1](diagrams/transfer_sequence_5.png) - -```bash -curl -X GET "${ALICE_BACKEND_URL}/${TRANSFER_PROCESS_ID}" \ - --header 'Accept: application/octet-stream' \ - -s | jq -``` - -## Delete All Data - -```bash -minikube kubectl -- delete pvc -n edc-all-in-one --all -``` - -```bash -minikube kubectl -- delete pv -n edc-all-in-one --all -``` - -## NOTICE - -This work is licensed under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0). - -- SPDX-License-Identifier: Apache-2.0 -- SPDX-FileCopyrightText: 2021,2022,2023 Contributors to the Eclipse Foundation -- Source URL: diff --git a/docs/samples/diagrams/transfer_sequence_1.png b/docs/samples/diagrams/transfer_sequence_1.png deleted file mode 100644 index 22500abc3cf28c375dc580e0abedb524989ed12d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28233 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 diff --git a/docs/samples/diagrams/transfer_sequence_1.puml b/docs/samples/diagrams/transfer_sequence_1.puml deleted file mode 100644 index b49733a01..000000000 --- a/docs/samples/diagrams/transfer_sequence_1.puml +++ /dev/null @@ -1,34 +0,0 @@ -@startuml - -!define aliceColor 66CCFF -!define bobColor CCFF99 -!define dapsColor FFFF99 -!define noteColor 9999FF - -actor User as "User" - -box Alice - participant AliceControlPlane as "Control Plane" #aliceColor - participant AliceBackendService as "Backend Application" #aliceColor - participant AliceDataPlane as "Data Plane" #aliceColor -end box - -box Bob - participant BobControlPlane as "Control Plane" #bobColor - participant BobDataPlane as "Data Plane" #bobColor -end box - -participant JsonPlaceHolder as "JsonPlaceHolder" - - -User -> BobControlPlane ++ : Create Asset -return 204 - -User -> BobControlPlane ++ : Create Policy -return 204 - -User -> BobControlPlane ++ : Create Contract Definition -return 204 - - -@enduml diff --git a/docs/samples/diagrams/transfer_sequence_2.png b/docs/samples/diagrams/transfer_sequence_2.png deleted file mode 100644 index 95b6eeced3a681dc04de023023d69ba0e2adae49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27684 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 diff --git a/docs/samples/diagrams/transfer_sequence_2.puml b/docs/samples/diagrams/transfer_sequence_2.puml deleted file mode 100644 index 2d078607d..000000000 --- a/docs/samples/diagrams/transfer_sequence_2.puml +++ /dev/null @@ -1,28 +0,0 @@ -@startuml - -!define aliceColor 66CCFF -!define bobColor CCFF99 -!define dapsColor FFFF99 -!define noteColor 9999FF - -actor User as "User" - -box Alice - participant AliceControlPlane as "Control Plane" #aliceColor - participant AliceBackendService as "Backend Application" #aliceColor - participant AliceDataPlane as "Data Plane" #aliceColor -end box - -box Bob - participant BobControlPlane as "Control Plane" #bobColor - participant BobDataPlane as "Data Plane" #bobColor -end box - -participant JsonPlaceHolder as "JsonPlaceHolder" - -User -> AliceControlPlane ++ : Request Contract Offers from Bob - AliceControlPlane -> BobControlPlane ++ : IDS Description Request Message - return Description -return Contract Offers - -@enduml diff --git a/docs/samples/diagrams/transfer_sequence_3.png b/docs/samples/diagrams/transfer_sequence_3.png deleted file mode 100644 index 14a30c9a9155109ee92a4baa939cc8d2f9c3e8c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32718 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 AliceControlPlane ++ : Negotiate Contract for Offer X -AliceControlPlane --> User: Negotiation ID - AliceControlPlane -> BobControlPlane ++ : IDS Contract Negotiation (simplified) - return Contract Agreement -deactivate AliceControlPlane - -User -> AliceControlPlane ++ : Request Negotiation by ID -return Contract Negotiation - -@enduml diff --git a/docs/samples/diagrams/transfer_sequence_4.png b/docs/samples/diagrams/transfer_sequence_4.png deleted file mode 100644 index e3630e70affabe09a7edeb8df1f48e04716f066a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56765 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
p8&};4ezXF)nRpvazm85djzNlJ@@| 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 diff --git a/docs/samples/diagrams/transfer_sequence_4.puml b/docs/samples/diagrams/transfer_sequence_4.puml deleted file mode 100644 index 6d4e936ed..000000000 --- a/docs/samples/diagrams/transfer_sequence_4.puml +++ /dev/null @@ -1,44 +0,0 @@ -@startuml - -!define aliceColor 66CCFF -!define bobColor CCFF99 -!define dapsColor FFFF99 -!define noteColor 9999FF - -actor User as "User" - -box Alice - participant AliceControlPlane as "Control Plane" #aliceColor - participant AliceBackendService as "Backend Application" #aliceColor - participant AliceDataPlane as "Data Plane" #aliceColor -end box - -box Bob - participant BobControlPlane as "Control Plane" #bobColor - participant BobDataPlane as "Data Plane" #bobColor -end box - -participant JsonPlaceHolder as "JsonPlaceHolder" - -User -> AliceControlPlane ++ : Request Negotiation by ID -return Contract Negotiation\n(containing Contract Agreement ID) - -User -> AliceControlPlane ++ : Initiate Transfer with Agreement ID -AliceControlPlane --> User : Transfer Process ID - AliceControlPlane -> BobControlPlane ++ : IDS Data Transfer (simplified) -return -AliceControlPlane -> AliceBackendService ++ : Data Plane Endpoint + Token - AliceBackendService -> AliceDataPlane ++ : Request Data with Token - AliceDataPlane -> BobDataPlane ++ : Request Data - BobDataPlane -> JsonPlaceHolder ++ : Request Data - return data - return data - return data - AliceBackendService -> AliceBackendService : Write Data to File -return ok -deactivate AliceControlPlane - -User -> AliceControlPlane ++ : Request Transfer Process by ID -return Transfer Process - -@enduml diff --git a/docs/samples/diagrams/transfer_sequence_5.png b/docs/samples/diagrams/transfer_sequence_5.png deleted file mode 100644 index 1a18b5be2d981dd319b16057473c0c7da3a7b4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21142 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 WY;x{cJenc=Ei0)gkt6={?f(UPEr_WA diff --git a/docs/samples/diagrams/transfer_sequence_5.puml b/docs/samples/diagrams/transfer_sequence_5.puml deleted file mode 100644 index 598b747b6..000000000 --- a/docs/samples/diagrams/transfer_sequence_5.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml - -!define aliceColor 66CCFF -!define bobColor CCFF99 -!define dapsColor FFFF99 -!define noteColor 9999FF - -actor User as "User" - -box Alice - participant AliceControlPlane as "Control Plane" #aliceColor - participant AliceBackendService as "Backend Application" #aliceColor - participant AliceDataPlane as "Data Plane" #aliceColor -end box - -box Bob - participant BobControlPlane as "Control Plane" #bobColor - participant BobDataPlane as "Data Plane" #bobColor -end box - -participant JsonPlaceHolder as "JsonPlaceHolder" - -User -> AliceBackendService ++ : Get File Content -return data - - -@enduml diff --git a/docs/samples/example-dataspace/README.md b/docs/samples/example-dataspace/README.md deleted file mode 100644 index 7650bd125..000000000 --- a/docs/samples/example-dataspace/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# How-To run two connectors and a DAPS - -## 1. Prepare environment - -This guide will bring up two connectors named "Sokrates" and "Plato", each alongside their dependencies (Hashicorp -Vault, PostgreSQL) and a DAPS instance that both share. - -We've tested this setup with [KinD](https://kind.sigs.k8s.io/), but other runtimes such -as [Minikube](https://minikube.sigs.k8s.io/docs/start/) may work as well, we just haven't tested them. - -This version of Tractus-X EDC _requires_ a running instance of the Managed Identity Wallet and KeyCloak, a connector -will not be able to communicate to another connector without it. - -Installation instructions for those are beyond the scope of this document, please refer to the respective manuals and -guides for information on how to set them up. - -Furthermore, this guide assumes: - -- the Tractus-X EDC repository is checked out, the working directory for this guide is `docs/samples/example-dataspace` -- a Kubernetes runtime (e.g. KinD) is already installed and ready-to-use -- basic knowledge about `helm` and Kubernetes -- the following tools are available: `yq`, `openssl`, `base64` -- a POSIX-compliant shell, e.g. `bash` or `zsh` unless stated otherwise - -### 1.1 Create secrets for both runtimes - -We'll need a x509 certificate in order to communicate with DAPS, as well as a private key and a Data Encryption signing -key. - -```shell -# SOKRATES aes encryption key -echo "aes_enckey_test" | base64 > sokrates.aes.key - -# PLATO aes encryption key -echo "aes_enckey_test" | base64 > plato.aes.key -``` - -Any arbitrary string can be used for the AES key, but it has to be 16, 24, or 32 characters in length, assuming UTF-8 -encoding. - -### 1.2 Obtain configuration for MiW and KeyCloak - -> The following information is _required_, your connectors will **not** work properly unless you -> modify the `ssi:` section of `sokrates-values.yaml` and `plato-values.yaml` accordingly! - -For communication with KeyCloak we need the following information - -- the `tokenurl`: URL where access tokens can be obtained -- the `client.id`: KeyCloak identifier of the connector - -Note that the OAuth2 client secret will be stored in the vault under the alias `client-secret`. - -In order to use MiW as credential backend we need the following information: - -- `url`: a URL where MiW is reachable -- `authorityId`: this is the `issuerIdentifier` for MiW REST requests, please refer to the respective documentation. - -Furthermore, we need the `endpoint.audience`, which is used to verify the `aud` claim of incoming requests. This does **not** have to be set explicitly, it defaults to each connector's callback address. - -## 2. Prepare Connectors - -Next, the certificates and private keys we created previously must be stored in each connector's vault by injecting -a `postStart` element to the chart's configuration file: - -```shell -# for sokrates -VALUES_FILE=sokrates-values.yaml -CLIENT_SECRET= -AES_KEY=$(cat sokrates.aes.key) -yq -i ".vault.server.postStart |= [\"sh\",\"-c\",\"{\nsleep 5\n -/bin/vault kv put secret/client-secret content=$CLIENT_SECRET\n -/bin/vault kv put secret/aes-keys content=$AES_KEY\n}\"]" "$VALUES_FILE" - -# for plato -VALUES_FILE=plato-values.yaml -CLIENT_SECRET= -AES_KEY=$(cat plato.aes.key) -yq -i ".vault.server.postStart |= [\"sh\",\"-c\",\"{\nsleep 5\n -/bin/vault kv put secret/client-secret content=$CLIENT_SECRET\n -/bin/vault kv put secret/aes-keys content=$AES_KEY\n}\"]" "$VALUES_FILE" -``` - -## 3 Install the connectors - -Use `helm` to install the Tractus-X EDC Helm charts. In this example we are using the _local_ charts, assuming you have -Tractus-X EDC checked out in your local filesystem at ``. - -```shell -# install sokrates -helm install tx-sokrates /charts/tractusx-connector \ - -f sokrates-values.yaml \ - --dependency-update - -# install plato -helm install tx-plato /charts/tractusx-connector \ - -f plato-values.yaml \ - --dependency-update -``` - -_Note: if you prefer to use the published version of the `tractusx-connector` chart, please add the Tractus-X Helm repo -first:_ - -```shell -helm repo add tractusx-edc https://eclipse-tractusx.github.io/charts/dev -helm install tx-[sokrates|plato] tractusx-edc/tractusx-connector \ - -f [sokrates|plato]-values.yaml \ - --dependency-update -``` - -## 3.1 [Optional] Verify the correct installation - -There is several ways of making sure everything worked out well: - -- simply look at the logs of the Helm releases, e.g. with a tool - like [stern](https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/) and look out for a log line similar to: - - ```shell - stern tx-sokrates - ``` - - then look out for something similar to: - - ```shell - tx-sokrates-controlplane-b9456f97b-s5jts tractusx-connector INFO 2023-05-31T07:24:53.020975888 tx-sokrates-controlplane ready - ``` - -- wait for the Kubernetes rollout to be successful, e.g. `kubectl rollout status deployment tx-plato-controlplane` -- use `helm test` to execute tests: `helm test tx-plato` - -## NOTICE - -This work is licensed under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0). - -- SPDX-License-Identifier: Apache-2.0 -- SPDX-FileCopyrightText: 2021,2022,2023 Contributors to the Eclipse Foundation -- Source URL: diff --git a/docs/samples/example-dataspace/plato-values.yaml b/docs/samples/example-dataspace/plato-values.yaml deleted file mode 100644 index c016d9a0e..000000000 --- a/docs/samples/example-dataspace/plato-values.yaml +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 2023 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# 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 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - - -install: - daps: false -fullnameOverride: tx-plato -################################ -# EDC ControlPlane + DataPlane # -################################ -participant: - id: "BPNPLATO" -controlplane: - service: - type: NodePort - endpoints: - management: - authKey: password - image: - pullPolicy: Never - tag: "latest" - repository: "edc-controlplane-postgresql-hashicorp-vault" - securityContext: - # SSI configuration - ssi: - miw: - url: "" - authorityId: "" - oauth: - tokenurl: "" - client: - id: "" - secretAlias: "client-secret" -dataplane: - endpoints: - management: - authKey: password - image: - pullPolicy: Never - tag: "latest" - repository: "edc-dataplane-hashicorp-vault" - aws: - endpointOverride: http://minio:9000 - secretAccessKey: qwerty123 - accessKeyId: qwerty123 -postgresql: - fullnameOverride: "plato-postgresql" - username: user - password: password - jdbcUrl: jdbc:postgresql://plato-postgresql:5432/edc -vault: - fullnameOverride: "plato-vault" - hashicorp: - url: http://plato-vault:8200 - token: root - secretNames: - transferProxyTokenEncryptionAesKey: aes-keys - secrets: - server: -backendService: - httpProxyTokenReceiverUrl: "http://backend:8080" diff --git a/docs/samples/example-dataspace/sokrates-values.yaml b/docs/samples/example-dataspace/sokrates-values.yaml deleted file mode 100644 index c21948a16..000000000 --- a/docs/samples/example-dataspace/sokrates-values.yaml +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 2023 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# 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 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -install: - daps: false -fullnameOverride: tx-sokrates -################################ -# EDC ControlPlane + DataPlane # -################################ -participant: - id: "BPNSOKRATES" -controlplane: - service: - type: NodePort - endpoints: - management: - authKey: password - image: - pullPolicy: Never - tag: "latest" - repository: "edc-controlplane-postgresql-hashicorp-vault" - # SSI configuration - ssi: - miw: - url: "" - authorityId: "" - oauth: - tokenurl: "" - client: - id: "" - secretAlias: "client-secret" -dataplane: - endpoints: - proxy: - authKey: password - image: - pullPolicy: Never - tag: "latest" - repository: "edc-dataplane-hashicorp-vault" - securityContext: - aws: - endpointOverride: http://minio:9000 - secretAccessKey: qwerty123 - accessKeyId: qwerty123 -postgresql: - fullnameOverride: "sokrates-postgresql" - username: user - password: password - jdbcUrl: jdbc:postgresql://sokrates-postgresql:5432/edc -vault: - fullnameOverride: "sokrates-vault" - hashicorp: - url: http://sokrates-vault:8200 - token: root - secretNames: - transferProxyTokenEncryptionAesKey: aes-keys - secrets: - server: -backendService: - httpProxyTokenReceiverUrl: "http://backend:8080" diff --git a/edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md b/edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md index 38a2b2bd4..ac6275657 100644 --- a/edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md +++ b/edc-controlplane/edc-controlplane-postgresql-azure-vault/README.md @@ -37,10 +37,6 @@ Details regarding each configuration property can be found at the [documentary s | edc.ids.catalog.id | | urn:catalog:default | | | ids.webhook.address | | | | | edc.hostname | | localhost | | -| edc.oauth.token.url | X | | | -| edc.oauth.public.key.alias | X | key-to-daps-certificate-in-keyvault | | -| edc.oauth.private.key.alias | X | key-to-private-key-in-keyvault | | -| edc.oauth.client.id | X | daps-oauth-client-id | | | edc.vault.clientid | X | 00000000-1111-2222-3333-444444444444 | | | edc.vault.tenantid | X | 55555555-6666-7777-8888-999999999999 | | | edc.vault.name | X | my-vault-name | | @@ -104,12 +100,6 @@ edc.hostname=localhost edc.api.auth.key=password -# OAuth / DAPS related configuration -edc.oauth.token.url=https://daps.example.net -edc.oauth.public.key.alias=key-to-daps-certificate-in-keyvault -edc.oauth.private.key.alias=key-to-private-key-in-keyvault -edc.oauth.client.id=daps-oauth-client-id - # Azure vault related configuration edc.vault.clientid=00000000-1111-2222-3333-444444444444 edc.vault.tenantid=55555555-6666-7777-8888-999999999999 diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md index f06c4d127..564ac7101 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md @@ -37,10 +37,6 @@ Details regarding each configuration property can be found at the [documentary s | edc.ids.catalog.id | | urn:catalog:default | | | ids.webhook.address | | | | | edc.hostname | | localhost | | -| edc.oauth.token.url | X | | | -| edc.oauth.public.key.alias | X | key-to-daps-certificate-in-keyvault | | -| edc.oauth.private.key.alias | X | key-to-private-key-in-keyvault | | -| edc.oauth.client.id | X | daps-oauth-client-id | | | edc.vault.hashicorp.url | X | | | | edc.vault.hashicorp.token | X | 55555555-6666-7777-8888-999999999999 | | | edc.vault.hashicorp.timeout.seconds | | 30 | | @@ -103,12 +99,6 @@ edc.hostname=localhost edc.api.auth.key=password -# OAuth / DAPS related configuration -edc.oauth.token.url=https://daps.example.net -edc.oauth.public.key.alias=key-to-daps-certificate-in-keyvault -edc.oauth.private.key.alias=key-to-private-key-in-keyvault -edc.oauth.client.id=daps-oauth-client-id - # HashiCorp vault related configuration edc.vault.hashicorp.url=http://vault edc.vault.hashicorp.token=55555555-6666-7777-8888-999999999999 diff --git a/edc-controlplane/edc-runtime-memory/README.md b/edc-controlplane/edc-runtime-memory/README.md index 150a8f680..377f566c2 100644 --- a/edc-controlplane/edc-runtime-memory/README.md +++ b/edc-controlplane/edc-runtime-memory/README.md @@ -48,10 +48,6 @@ the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tr | edc.ids.catalog.id | | urn:catalog:default | | | ids.webhook.address | | | | | edc.hostname | | localhost | | -| edc.oauth.token.url | X | | | -| edc.oauth.public.key.alias | X | key-to-daps-certificate-in-keyvault | | -| edc.oauth.private.key.alias | X | key-to-private-key-in-keyvault | | -| edc.oauth.client.id | X | daps-oauth-client-id | | | edc.transfer.proxy.endpoint | X | | | | edc.transfer.proxy.token.signer.privatekey.alias | X | | | @@ -92,12 +88,6 @@ edc.hostname=localhost edc.api.auth.key=password -# OAuth / DAPS related configuration -edc.oauth.token.url=https://daps.example.net -edc.oauth.public.key.alias=key-to-daps-certificate-in-keyvault -edc.oauth.private.key.alias=key-to-private-key-in-keyvault -edc.oauth.client.id=daps-oauth-client-id - # Control- / Data- Plane configuration edc.transfer.proxy.endpoint=http://dataplane-public-endpoint/public edc.transfer.proxy.token.signer.privatekey.alias=azure-vault-token-signer-private-key diff --git a/edc-dataplane/edc-dataplane-azure-vault/README.md b/edc-dataplane/edc-dataplane-azure-vault/README.md index 21404d8d0..255adfa26 100644 --- a/edc-dataplane/edc-dataplane-azure-vault/README.md +++ b/edc-dataplane/edc-dataplane-azure-vault/README.md @@ -23,7 +23,6 @@ Details regarding each configuration property can be found at the [documentary s | web.http.control.path | X | /api/controlplane/control | | | edc.receiver.http.endpoint | X | | | | edc.hostname | | localhost | | -| edc.oauth.client.id | X | daps-oauth-client-id | | | edc.vault.clientid | X | 00000000-1111-2222-3333-444444444444 | | | edc.vault.tenantid | X | 55555555-6666-7777-8888-999999999999 | | | edc.vault.name | X | my-vault-name | | diff --git a/edc-dataplane/edc-dataplane-hashicorp-vault/README.md b/edc-dataplane/edc-dataplane-hashicorp-vault/README.md index 799d5dd1f..49da83d76 100644 --- a/edc-dataplane/edc-dataplane-hashicorp-vault/README.md +++ b/edc-dataplane/edc-dataplane-hashicorp-vault/README.md @@ -23,7 +23,6 @@ Details regarding each configuration property can be found at the [documentary s | web.http.control.path | X | /api/controlplane/control | | | edc.receiver.http.endpoint | X | | | | edc.hostname | | localhost | | -| edc.oauth.client.id | X | daps-oauth-client-id | | | edc.vault.hashicorp.url | X | | | | edc.vault.hashicorp.token | X | 55555555-6666-7777-8888-999999999999 | | | edc.vault.hashicorp.timeout.seconds | | 30 | | diff --git a/edc-extensions/build.gradle.kts b/edc-extensions/build.gradle.kts index a6769cfcd..5f8b652f7 100644 --- a/edc-extensions/build.gradle.kts +++ b/edc-extensions/build.gradle.kts @@ -23,7 +23,6 @@ plugins { dependencies { implementation(project(":edc-extensions:bpn-validation")) - implementation(project(":edc-extensions:cx-oauth2")) implementation(project(":edc-extensions:data-encryption")) implementation(project(":edc-extensions:dataplane-selector-configuration")) implementation(project(":edc-extensions:postgresql-migration")) diff --git a/edc-extensions/cx-oauth2/README.md b/edc-extensions/cx-oauth2/README.md deleted file mode 100644 index c796ac245..000000000 --- a/edc-extensions/cx-oauth2/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Tractus-X OAuth2 Extension - -## Why Tractus-X needs this extension - -In IDS the DAPS token audience is always `idsc:IDS_CONNECTORS_ALL`. At first glance this makes it possible for other connectors to steal and reuse an received token. To mitigate this security risk IDS introduces something called `transportCertsSha256`, which couples the connector audience with its corresponding TLS/SSL certificate. - -From [GitHub IDS-G](https://github.com/International-Data-Spaces-Association/IDS-G/tree/main/Components/IdentityProvider/DAPS) - -> - **transportCertsSha256** Contains the public keys of the used transport certificates, hashed using SHA256. The identifying X509 certificate should not be used for the communication encryption. Therefore, the receiving party needs to connect the identity of a connector by relating its hostname (from the communication encryption layer) and the used private/public key pair, with its IDS identity claim of the DAT. The public transportation key must be one of the `transportCertsSha256` values. Otherwise, the receiving connector must expect that the requesting connector is using a false identity claim. In general, this claim holds an Array of Strings, but it may optionally hold a single String instead if the Array would have exactly one element. - -The reason IDS did this is to prevent the IDS DAPS to know, which connectors talk to each other. But this solution introduces a new level of complexity for different deployment scenarios. The OAuth2 Extension introduces the classic audience validation again, so that users do not have to deal with these things for now. - -## Configuration - -| Key | Description | Mandatory | Default | -|:--------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|------------| -| edc.oauth.token.url | Token URL of the DAPS | X | | -| edc.oauth.public.key.alias | Vault alias of the public key | X | | -| edc.oauth.client.id | DAPS client id of the connector | X | | -| edc.oauth.private.key.alias | Vault lias of the private key | X | | -| edc.oauth.token.expiration.seconds | | | 5 minutes | -| edc.oauth.validation.nbf.leeway | DAPS token request leeway | | 10 seconds | -| edc.oauth.provider.jwks.refresh | Time between refresh of the DAPS json web key set | | 5 minutes | -| edc.ids.endpoint.audience | The audience the connector requests from the DAPS. Should be the IDS URL of the connector, e.g. `http://plato-edc-controlplane:8282/api/v1/ids/data` | X | | -| edc.ids.validation.referringconnector | Adds checks to the DAPS token. Validation that the `referringConnector` equals the `issuerConnector` and the `securityProfile` of the token is equal to the profile of the IDS message | | false | - -## Audience Validation - -Instead of the `idsc:IDS_CONNECTORS_ALL` the connector requests a specific audience from the DAPS. This audience will be the IDS URL, the connector intends to call. - -When a connector receives a message, it will checks the token audience is equal to the configured value in `edc.ids.endpoint.audience`. - -![sequence diagram](./diagrams/sequence.png) - -## Participant Extension - -Starting from `0.0.1-milestone-9` EDC requires a mandatory setting `edc.participant.id`, which in this case should be the BPN number which is transmitted over the wire to identifying the participants IDs. -To verify that in the DAPS token an extension has been created, that extract from the `ClaimToken` the BPN number and then EDC compare that identity with the one provided over the wire, for security reason. - -By default, the extension parse the `referringConnector` url and extract the BPN number as the last parameter in the URL eg (). - -### Configuration - -| Key | Description | Mandatory | Default | -|:--------------------------------------|:----------------------------------------------------------|-----------|---------------| -| tx.participant.id.regex | Regex for extracting the BPN from the referringConnector | | [^/]+(?=/$|$) | -| tx.participant.id.regexGroup | Group number for the regex match | | 0 | diff --git a/edc-extensions/cx-oauth2/build.gradle.kts b/edc-extensions/cx-oauth2/build.gradle.kts deleted file mode 100644 index 772c60f47..000000000 --- a/edc-extensions/cx-oauth2/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * 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 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ - - -plugins { - `java-library` - `maven-publish` -} - -dependencies { - implementation(libs.edc.spi.core) - implementation(libs.edc.spi.oauth2) - implementation(libs.edc.spi.jwt) - implementation(libs.slf4j.api) - implementation(libs.nimbus.jwt) - implementation(libs.okhttp) - - testImplementation(libs.edc.junit) -} diff --git a/edc-extensions/cx-oauth2/diagrams/sequence.png b/edc-extensions/cx-oauth2/diagrams/sequence.png deleted file mode 100644 index 784441b4e7d2eb43afebeef0548ad15ba572dd48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37872 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 diff --git a/edc-extensions/cx-oauth2/diagrams/sequence.puml b/edc-extensions/cx-oauth2/diagrams/sequence.puml deleted file mode 100644 index d2f20f278..000000000 --- a/edc-extensions/cx-oauth2/diagrams/sequence.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml - -title CX-DAPS Audience Validation - -participant ConnectorA as "Connector A" -participant DAPS as "IDS DAPS" -participant ConnectorB as "Connector B" - -== Configuration == - -ConnectorB <-? : Configure //edc.ids.endpoint.audience//\nto ///api/v1/ids/data// - -== Request == - -?-> ConnectorA ++: Initiate Catalog Request\n/data/catalog?providerUrl=///api/v1/ids/data// - ConnectorA -> DAPS ++: Request Token for audience\n///api/v1/ids/data// - return DAPS Token - ConnectorA -> ConnectorB ++ : Send Request with Token - ConnectorB -> ConnectorB : Check Audience equals\n/api/v1/ids/data - ... continue request processing ... - return Catalog Response -return Catalog - -@enduml \ No newline at end of file diff --git a/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxOauth2Extension.java b/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxOauth2Extension.java deleted file mode 100644 index 338784ef3..000000000 --- a/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxOauth2Extension.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH - * Copyright (c) 2021,2022 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * 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 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.eclipse.tractusx.edc.oauth2; - -import org.eclipse.edc.iam.oauth2.spi.CredentialsRequestAdditionalParametersProvider; -import org.eclipse.edc.runtime.metamodel.annotation.Provider; -import org.eclipse.edc.spi.system.ServiceExtension; - -import java.util.Map; - -public class CxOauth2Extension implements ServiceExtension { - - @Override - public String name() { - return "CX OAuth2"; - } - - @Provider - public CredentialsRequestAdditionalParametersProvider credentialsRequestAdditionalParametersProvider() { - return tokenParameters -> Map.of("resource", tokenParameters.getAudience()); - } -} diff --git a/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtension.java b/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtension.java deleted file mode 100644 index 037851bcd..000000000 --- a/edc-extensions/cx-oauth2/src/main/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtension.java +++ /dev/null @@ -1,75 +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.tractusx.edc.oauth2; - -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Setting; -import org.eclipse.edc.spi.agent.ParticipantAgentService; -import org.eclipse.edc.spi.agent.ParticipantAgentServiceExtension; -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.monitor.Monitor; -import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.regex.Pattern; - -import static org.eclipse.edc.spi.agent.ParticipantAgent.PARTICIPANT_IDENTITY; - -public class CxParticipantExtension implements ServiceExtension, ParticipantAgentServiceExtension { - - public static final String REFERRING_CONNECTOR_CLAIM = "referringConnector"; - - private static final String DEFAULT_PARTICIPANT_ID_REGEX = "[^/]+(?=/$|$)"; - private static final int DEFAULT_PARTICIPANT_ID_REGEX_GROUP = 0; - - @Setting(value = "Participant Extractor from referringConnector regex", defaultValue = CxParticipantExtension.DEFAULT_PARTICIPANT_ID_REGEX) - private static final String PARTICIPANT_ID_REGEX = "tx.participant.id.regex"; - - @Setting(value = "Participant Extractor from referringConnector regex group", defaultValue = "0") - private static final String PARTICIPANT_ID_REGEX_GROUP = "tx.participant.id.regexGroup"; - @Inject - private ParticipantAgentService agentService; - - private Pattern participantRegex; - - private int participantRegexGroup; - - @Inject - private Monitor monitor; - - @Override - public void initialize(ServiceExtensionContext context) { - this.participantRegex = Pattern.compile(context.getConfig().getString(PARTICIPANT_ID_REGEX, DEFAULT_PARTICIPANT_ID_REGEX)); - this.participantRegexGroup = context.getConfig().getInteger(PARTICIPANT_ID_REGEX_GROUP, DEFAULT_PARTICIPANT_ID_REGEX_GROUP); - - agentService.register(this); - } - - @Override - public @NotNull Map attributesFor(ClaimToken token) { - var referringConnector = token.getClaim(REFERRING_CONNECTOR_CLAIM); - if (referringConnector instanceof String referringConnectorUrl) { - var matcher = participantRegex.matcher(referringConnectorUrl); - if (matcher.find()) { - var id = matcher.group(participantRegexGroup); - return Map.of(PARTICIPANT_IDENTITY, id); - } - monitor.warning("Unable to extract the participant id from the referring connector claim"); - } - return Map.of(); - } -} diff --git a/edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension deleted file mode 100644 index d3d98beb2..000000000 --- a/edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH -# Copyright (c) 2021,2022 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# 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 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -org.eclipse.tractusx.edc.oauth2.CxOauth2Extension -org.eclipse.tractusx.edc.oauth2.CxParticipantExtension diff --git a/edc-extensions/cx-oauth2/src/test/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtensionTest.java b/edc-extensions/cx-oauth2/src/test/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtensionTest.java deleted file mode 100644 index aabbe35e1..000000000 --- a/edc-extensions/cx-oauth2/src/test/java/org/eclipse/tractusx/edc/oauth2/CxParticipantExtensionTest.java +++ /dev/null @@ -1,90 +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.tractusx.edc.oauth2; - -import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; -import org.eclipse.edc.spi.agent.ParticipantAgentService; -import org.eclipse.edc.spi.iam.ClaimToken; -import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.system.injection.ObjectFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; - -import java.util.Map; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.edc.spi.agent.ParticipantAgent.PARTICIPANT_IDENTITY; -import static org.eclipse.tractusx.edc.oauth2.CxParticipantExtension.REFERRING_CONNECTOR_CLAIM; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - -@ExtendWith(DependencyInjectionExtension.class) -public class CxParticipantExtensionTest { - - CxParticipantExtension extension; - - ParticipantAgentService agentService = mock(ParticipantAgentService.class); - - ServiceExtensionContext context; - - @BeforeEach - void setUp(ObjectFactory factory, ServiceExtensionContext context) { - this.context = spy(context); - context.registerService(ParticipantAgentService.class, agentService); - extension = factory.constructInstance(CxParticipantExtension.class); - } - - @Test - void initialize() { - extension.initialize(context); - verify(agentService).register(isA(CxParticipantExtension.class)); - } - - - @ParameterizedTest - @ArgumentsSource(ClaimProvider.class) - void attributesFor_shouldMatchTheId(Map claims) { - var attributes = Map.of(PARTICIPANT_IDENTITY, "BPNSOKRATES"); - extension.initialize(context); - var claimToken = ClaimToken.Builder.newInstance().claims(claims).build(); - assertThat(extension.attributesFor(claimToken)).containsExactlyEntriesOf(attributes); - } - - static class ClaimProvider implements ArgumentsProvider { - ClaimProvider() { - } - - @Override - public Stream provideArguments(ExtensionContext context) { - return Stream.of( - Map.of(REFERRING_CONNECTOR_CLAIM, "http://sokrates-controlplane/BPNSOKRATES"), - Map.of(REFERRING_CONNECTOR_CLAIM, "http://sokrates-controlplane/BPNSOKRATES/"), - Map.of(REFERRING_CONNECTOR_CLAIM, "http://sokrates-controlplane/test/path/BPNSOKRATES"), - Map.of(REFERRING_CONNECTOR_CLAIM, "https://sokrates-controlplane/test/path/BPNSOKRATES"), - Map.of(REFERRING_CONNECTOR_CLAIM, "BPNSOKRATES") - ).map(Arguments::arguments); - } - } -} - diff --git a/edc-tests/deployment/src/main/resources/helm/tractusx-connector-azure-vault-test.yaml b/edc-tests/deployment/src/main/resources/helm/tractusx-connector-azure-vault-test.yaml index 757cd64c9..8f4c6da4a 100644 --- a/edc-tests/deployment/src/main/resources/helm/tractusx-connector-azure-vault-test.yaml +++ b/edc-tests/deployment/src/main/resources/helm/tractusx-connector-azure-vault-test.yaml @@ -17,21 +17,6 @@ # SPDX-License-Identifier: Apache-2.0 # -## This file can be used to verify that the chart is working properly. It provides an exemplary configuration -## that is intended to be used with the supporting infrastructure. -## 1. install DAPS: -## helm install infrastructure edc-tests/deployment/src/main/resources/helm/test-infrastructure --wait-for-jobs -## -## 2. set Azure KevVault secrets, either through the Azure Portal or through az cli: -## az keyvault secret set --vault-name --name daps-crt --value -## az keyvault secret set --vault-name --name daps-key --value -## az keyvault secret set --vault-name --name aes-keys --value -## -## 3. install the connector plus its third-party dependencies (Postgres): -## helm install tx-prod charts/tractusx-connector-azure-vault-app -f charts/tractusx-connector-azure-vault-app/example.yaml --dependency-update \ -## --set vault.azure.client= \ -## --set vault.azure.tenant= \ -## --set vault.azure.secret= fullnameOverride: tx-prod ################################ diff --git a/edc-tests/deployment/src/main/resources/helm/tractusx-connector-memory-test.yaml b/edc-tests/deployment/src/main/resources/helm/tractusx-connector-memory-test.yaml index 90120c220..bb60ea652 100644 --- a/edc-tests/deployment/src/main/resources/helm/tractusx-connector-memory-test.yaml +++ b/edc-tests/deployment/src/main/resources/helm/tractusx-connector-memory-test.yaml @@ -18,18 +18,6 @@ # SPDX-License-Identifier: Apache-2.0 # -## This file can be used to verify that the chart is working properly. It provides an exemplary configuration -## that is intended to be used with the supporting infrastructure. -## 1. install DAPS: -## helm install infrastructure edc-tests/deployment/src/main/resources/helm/test-infrastructure \ ─╯ -## --wait-for-jobs -## -## 2. install in-mem runtime. Note that the key and crt must match exactly the DAPS setup, c.f. edc-tests/deployment/src/main/resources/helm/test-infrastructure/values.yaml -## export DAPSKEY="" -## export DAPSCRT="" -## export YOUR_VAULT_SECRETS="daps-key:$DAPSKEY;daps-crt:$DAPSCRT" -## helm install trudy charts/tractusx-connector-memory -f edc-tests/deployment/src/main/resources/helm/tractusx-connector-memory-test.yaml --set vault.secrets=$YOUR_VAULT_SECRETS - --- fullnameOverride: tx-inmem participant: diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/ParticipantRuntime.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/ParticipantRuntime.java index 9feae6c68..10fab82af 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/ParticipantRuntime.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/ParticipantRuntime.java @@ -19,7 +19,7 @@ import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.system.injection.InjectionContainer; -import org.eclipse.tractusx.edc.token.MockDapsService; +import org.eclipse.tractusx.edc.token.MockBpnIdentityService; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -35,7 +35,7 @@ public class ParticipantRuntime extends EdcRuntimeExtension implements BeforeAll public ParticipantRuntime(String moduleName, String runtimeName, String bpn, Map properties) { super(moduleName, runtimeName, properties); if (!properties.containsKey("tx.ssi.miw.url")) { - this.registerServiceMock(IdentityService.class, new MockDapsService(bpn)); + this.registerServiceMock(IdentityService.class, new MockBpnIdentityService(bpn)); } } diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/PgParticipantRuntime.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/PgParticipantRuntime.java index 106a929bb..8cd68ed4c 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/PgParticipantRuntime.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/PgParticipantRuntime.java @@ -15,7 +15,6 @@ package org.eclipse.tractusx.edc.lifecycle; import org.eclipse.edc.connector.core.vault.InMemoryVault; -import org.eclipse.edc.spi.iam.IdentityService; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.result.Result; import org.eclipse.edc.spi.security.Vault; @@ -23,7 +22,6 @@ import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.system.injection.InjectionContainer; import org.eclipse.edc.sql.testfixtures.PostgresqlLocalInstance; -import org.eclipse.tractusx.edc.token.MockDapsService; import org.junit.jupiter.api.extension.ExtensionContext; import org.testcontainers.containers.PostgreSQLContainer; @@ -46,7 +44,6 @@ public class PgParticipantRuntime extends ParticipantRuntime { public PgParticipantRuntime(String moduleName, String runtimeName, String bpn, Map properties) { super(moduleName, runtimeName, bpn, properties); this.dbName = runtimeName.toLowerCase(); - this.registerServiceMock(IdentityService.class, new MockDapsService(bpn)); mockVault(); postgreSqlContainer = new PostgreSQLContainer<>(POSTGRES_IMAGE_NAME) diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockDapsService.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockBpnIdentityService.java similarity index 71% rename from edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockDapsService.java rename to edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockBpnIdentityService.java index c833b5c8a..7db813b43 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockDapsService.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/token/MockBpnIdentityService.java @@ -26,17 +26,16 @@ import static java.lang.String.format; /** - * An {@link IdentityService} that will mimic the behaviour of DAPS by inserting the "referringConnector" claim into any token. + * An {@link IdentityService} that will inject the BPN claim in every token. * Please only use in testing scenarios! */ -public class MockDapsService implements IdentityService { +public class MockBpnIdentityService implements IdentityService { private static final String BUSINESS_PARTNER_NUMBER_CLAIM = "BusinessPartnerNumber"; - private static final String REFERRING_CONNECTOR_CLAIM = "referringConnector"; private final String businessPartnerNumber; - private TypeManager typeManager = new TypeManager(); + private final TypeManager typeManager = new TypeManager(); - public MockDapsService(String businessPartnerNumber) { + public MockBpnIdentityService(String businessPartnerNumber) { this.businessPartnerNumber = businessPartnerNumber; } @@ -44,7 +43,7 @@ public MockDapsService(String businessPartnerNumber) { public Result obtainClientCredentials(TokenParameters parameters) { var token = Map.of(BUSINESS_PARTNER_NUMBER_CLAIM, businessPartnerNumber); - TokenRepresentation tokenRepresentation = TokenRepresentation.Builder.newInstance() + var tokenRepresentation = TokenRepresentation.Builder.newInstance() .token(typeManager.writeValueAsString(token)) .build(); return Result.success(tokenRepresentation); @@ -57,9 +56,9 @@ public Result verifyJwtToken(TokenRepresentation tokenRepresentation if (token.containsKey(BUSINESS_PARTNER_NUMBER_CLAIM)) { return Result.success(ClaimToken.Builder.newInstance() .claim(BUSINESS_PARTNER_NUMBER_CLAIM, token.get(BUSINESS_PARTNER_NUMBER_CLAIM)) - .claim(REFERRING_CONNECTOR_CLAIM, token.get(BUSINESS_PARTNER_NUMBER_CLAIM)).build()); + .build()); } - return Result.failure(format("Expected %s and %s claims, but token did not contain them", BUSINESS_PARTNER_NUMBER_CLAIM, REFERRING_CONNECTOR_CLAIM)); + return Result.failure(format("Expected %s claim, but token did not contain them", BUSINESS_PARTNER_NUMBER_CLAIM)); } } diff --git a/edc-tests/runtime/runtime-memory-ssi/build.gradle.kts b/edc-tests/runtime/runtime-memory-ssi/build.gradle.kts index ffd3d0aaa..6a67086f2 100644 --- a/edc-tests/runtime/runtime-memory-ssi/build.gradle.kts +++ b/edc-tests/runtime/runtime-memory-ssi/build.gradle.kts @@ -22,8 +22,6 @@ dependencies { // use basic (all in-mem) control plane implementation(project(":edc-controlplane:edc-controlplane-base")) { - exclude("org.eclipse.edc", "oauth2-core") - exclude("org.eclipse.edc", "oauth2-daps") exclude(module = "data-encryption") } implementation(project(":core:json-ld-core")) @@ -51,7 +49,6 @@ application { mainClass.set("org.eclipse.edc.boot.system.runtime.BaseRuntime") } -// do not publish edcBuild { publish.set(false) } diff --git a/edc-tests/runtime/runtime-memory/build.gradle.kts b/edc-tests/runtime/runtime-memory/build.gradle.kts index 8be6581c4..0022efd34 100644 --- a/edc-tests/runtime/runtime-memory/build.gradle.kts +++ b/edc-tests/runtime/runtime-memory/build.gradle.kts @@ -22,10 +22,6 @@ dependencies { // use basic (all in-mem) control plane implementation(project(":edc-controlplane:edc-controlplane-base")) { - exclude("org.eclipse.edc", "oauth2-core") - exclude("org.eclipse.edc", "oauth2-daps") - -// exclude(module = "data-encryption") exclude(module = "json-ld-core") exclude(module = "ssi-identity-core") exclude(module = "ssi-miw-credential-client") @@ -40,7 +36,6 @@ dependencies { exclude("org.eclipse.edc", "api-observability") } - implementation(libs.edc.core.controlplane) // for the controller implementation(libs.jakarta.rsApi) @@ -50,7 +45,6 @@ application { mainClass.set("org.eclipse.edc.boot.system.runtime.BaseRuntime") } -// do not publish edcBuild { publish.set(false) } diff --git a/edc-tests/runtime/runtime-postgresql-hashicorp/build.gradle.kts b/edc-tests/runtime/runtime-postgresql-hashicorp/build.gradle.kts index 512d8dd92..f1e1beca2 100644 --- a/edc-tests/runtime/runtime-postgresql-hashicorp/build.gradle.kts +++ b/edc-tests/runtime/runtime-postgresql-hashicorp/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { exclude("org.eclipse.edc", "api-observability") } - implementation(libs.edc.core.controlplane) // for the controller implementation(libs.jakarta.rsApi) @@ -47,7 +46,6 @@ application { mainClass.set("org.eclipse.edc.boot.system.runtime.BaseRuntime") } -// do not publish edcBuild { publish.set(false) } diff --git a/edc-tests/runtime/runtime-postgresql/build.gradle.kts b/edc-tests/runtime/runtime-postgresql/build.gradle.kts index fd07930c8..32000816e 100644 --- a/edc-tests/runtime/runtime-postgresql/build.gradle.kts +++ b/edc-tests/runtime/runtime-postgresql/build.gradle.kts @@ -38,7 +38,6 @@ dependencies { exclude("org.eclipse.edc", "api-observability") } - implementation(libs.edc.core.controlplane) // for the controller implementation(libs.jakarta.rsApi) @@ -48,7 +47,6 @@ application { mainClass.set("org.eclipse.edc.boot.system.runtime.BaseRuntime") } -// do not publish edcBuild { publish.set(false) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 61b2c381b..3df0f9ddf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,8 +73,6 @@ edc-dsp = { module = "org.eclipse.edc:dsp", version.ref = "edc" } edc-iam-mock = { module = "org.eclipse.edc:iam-mock", version.ref = "edc" } edc-policy-engine = { module = "org.eclipse.edc:policy-engine", version.ref = "edc" } edc-auth-tokenbased = { module = "org.eclipse.edc:auth-tokenbased", version.ref = "edc" } -edc-auth-oauth2-core = { module = "org.eclipse.edc:oauth2-core", version.ref = "edc" } -edc-auth-oauth2-daps = { module = "org.eclipse.edc:oauth2-daps", version.ref = "edc" } edc-auth-oauth2-client = { module = "org.eclipse.edc:oauth2-client", version.ref = "edc" } edc-transaction-local = { module = "org.eclipse.edc:transaction-local", version.ref = "edc" } edc-ext-http = { module = "org.eclipse.edc:http", version.ref = "edc" } diff --git a/samples/multi-tenancy/build.gradle.kts b/samples/multi-tenancy/build.gradle.kts index 2303cf86d..1da912fda 100644 --- a/samples/multi-tenancy/build.gradle.kts +++ b/samples/multi-tenancy/build.gradle.kts @@ -21,13 +21,13 @@ plugins { dependencies { implementation(libs.edc.boot) + implementation(libs.edc.iam.mock) implementation(project(":edc-controlplane:edc-controlplane-base")) { exclude("org.eclipse.tractusx.edc", "data-encryption") exclude(module = "ssi-miw-credential-client") exclude(module = "ssi-identity-core") exclude(module = "auth-tokenbased") } - implementation(libs.edc.iam.mock) implementation(libs.edc.core.controlplane) } diff --git a/settings.gradle.kts b/settings.gradle.kts index d6c0b6543..35c9e4497 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,7 +37,6 @@ include(":edc-extensions:bpn-validation:bpn-validation-api") include(":edc-extensions:bpn-validation:bpn-validation-spi") include(":edc-extensions:bpn-validation:bpn-validation-core") include(":edc-extensions:bpn-validation:business-partner-store-sql") -include(":edc-extensions:cx-oauth2") include(":edc-extensions:data-encryption") include(":edc-extensions:dataplane-selector-configuration") include(":edc-extensions:postgresql-migration")