diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ac8a05390..96665fa35 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -14,6 +14,8 @@ on: pull_request: paths-ignore: - 'charts/**' + - 'docs/**' + - '**/*.md' branches: - '*' workflow_dispatch: @@ -38,12 +40,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -61,12 +63,12 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -100,10 +102,10 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -132,7 +134,7 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Login to GitHub Container Registry if: | @@ -144,7 +146,7 @@ jobs: password: ${{ secrets.CXNG_GHCR_PAT }} - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -172,7 +174,7 @@ jobs: type=sha - name: Build Docker Image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . file: edc-controlplane/${{ matrix.name }}/src/main/docker/Dockerfile @@ -197,7 +199,7 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Login to GitHub Container Registry if: | @@ -209,7 +211,7 @@ jobs: password: ${{ secrets.CXNG_GHCR_PAT }} - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -237,7 +239,7 @@ jobs: type=sha - name: Build Docker Image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . file: edc-dataplane/${{ matrix.name }}/src/main/docker/Dockerfile diff --git a/.github/workflows/business-tests.yaml b/.github/workflows/business-tests.yaml index 45814d29a..7de1b38cc 100644 --- a/.github/workflows/business-tests.yaml +++ b/.github/workflows/business-tests.yaml @@ -4,7 +4,8 @@ name: "Business Tests" on: pull_request: paths-ignore: - - docs/** + - 'docs/**' + - '**/*.md' branches: - develop - release/** @@ -20,10 +21,10 @@ jobs: ############## - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Set-Up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -36,10 +37,10 @@ jobs: key: ${{ runner.os }}-io.containerd.snapshotter.v1.overlayfs - name: Set-Up Kubectl - uses: azure/setup-kubectl@v3.0 + uses: azure/setup-kubectl@v3.2 - name: Helm Set-Up - uses: azure/setup-helm@v3.4 + uses: azure/setup-helm@v3.5 with: version: v3.8.1 - @@ -62,7 +63,7 @@ jobs: EOF - name: Create k8s Kind Cluster - uses: helm/kind-action@v1.4.0 + uses: helm/kind-action@v1.5.0 with: config: kind.config.yaml @@ -130,6 +131,7 @@ jobs: sleep 5s # Wait for supporting infrastructure to become ready (control-/data-plane, backend service) + kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=backend --timeout=120s || ( kubectl logs -l app.kubernetes.io/name=backend --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=idsdaps --timeout=120s || ( kubectl logs -l app.kubernetes.io/name=idsdaps --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=vault --timeout=120s || ( kubectl logs -l app.kubernetes.io/name=vault --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=sokrates-postgresql --timeout=120s || ( kubectl logs -l app.kubernetes.io/name=sokrates-postgresql --tail 500 && exit 1 ) @@ -153,6 +155,7 @@ jobs: --set postgresql.username=user \ --set postgresql.password=password \ --set postgresql.jdbcUrl=jdbc:postgresql://plato-postgresql:5432/edc \ + --set vault.hashicorp.enabled=true \ --set vault.hashicorp.url=http://vault:8200 \ --set vault.hashicorp.token=root \ --set vault.secretNames.transferProxyTokenSignerPublicKey=plato/daps/my-plato-daps-crt \ @@ -165,7 +168,7 @@ jobs: --set dataplane.aws.endpointOverride=http://minio:9000 \ --set dataplane.aws.secretAccessKey=platoqwerty123 \ --set dataplane.aws.accessKeyId=platoqwerty123 \ - --set backendService.httpProxyTokenReceiverUrl=http://example.com \ + --set backendService.httpProxyTokenReceiverUrl=http://backend:8080 \ --wait-for-jobs --timeout=120s # Install Sokrates @@ -185,6 +188,7 @@ jobs: --set postgresql.username=user \ --set postgresql.password=password \ --set postgresql.jdbcUrl=jdbc:postgresql://sokrates-postgresql:5432/edc \ + --set vault.hashicorp.enabled=true \ --set vault.hashicorp.url=http://vault:8200 \ --set vault.hashicorp.token=root \ --set vault.secretNames.transferProxyTokenSignerPublicKey=sokrates/daps/my-sokrates-daps-crt \ @@ -197,15 +201,13 @@ jobs: --set dataplane.aws.endpointOverride=http://minio:9000 \ --set dataplane.aws.secretAccessKey=sokratesqwerty123 \ --set dataplane.aws.accessKeyId=sokratesqwerty123 \ - --set backendService.httpProxyTokenReceiverUrl=http://example.com \ + --set backendService.httpProxyTokenReceiverUrl=http://backend:8080 \ --wait-for-jobs --timeout=120s # GH pipelines constrained by cpu, so give helm some time to register all resources \w k8s sleep 5s # Wait for Control-/DataPlane and backend-service to become ready - #kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=sokratesbackendapplication --timeout=120s || ( kubectl logs -l app.kubernetes.io/instance=sokratesbackendapplication --tail 500 && exit 1 ) - #kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=platobackendapplication --timeout=120s || ( kubectl logs -l app.kubernetes.io/instance=platobackendapplication --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=sokrates-controlplane --timeout=120s || ( kubectl logs -l app.kubernetes.io/instance=sokrates-controlplane --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=sokrates-dataplane --timeout=120s || ( kubectl logs -l app.kubernetes.io/instance=sokrates-dataplane --tail 500 && exit 1 ) kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=plato-controlplane --timeout=600s || ( kubectl logs -l app.kubernetes.io/instance=plato-controlplane --tail 500 && exit 1 ) @@ -241,14 +243,14 @@ jobs: {"name": "SOKRATES_DATA_MANAGEMENT_URL", "value": "${SOKRATES_DATA_MANAGEMENT_URL}"}, {"name": "SOKRATES_IDS_URL", "value": "${SOKRATES_IDS_URL}"}, {"name": "SOKRATES_DATA_PLANE_URL", "value": "${SOKRATES_DATA_PLANE_URL}"}, - {"name": "SOKRATES_BACKEND_SERVICE_BACKEND_API_URL", "value": "http://sokrates-backend-application:8081" }, + {"name": "SOKRATES_BACKEND_SERVICE_BACKEND_API_URL", "value": "http://backend:8081" }, {"name": "SOKRATES_DATABASE_URL", "value": "${SOKRATES_DATABASE_URL}"}, {"name": "SOKRATES_DATABASE_USER", "value": "${SOKRATES_DATABASE_USER}"}, {"name": "SOKRATES_DATABASE_PASSWORD", "value": "${SOKRATES_DATABASE_PASSWORD}"}, {"name": "PLATO_DATA_MANAGEMENT_URL", "value": "${PLATO_DATA_MANAGEMENT_URL}"}, {"name": "PLATO_IDS_URL", "value": "${PLATO_IDS_URL}"}, {"name": "PLATO_DATA_PLANE_URL", "value": "${PLATO_DATA_PLANE_URL}"}, - {"name": "PLATO_BACKEND_SERVICE_BACKEND_API_URL", "value": "http://plato-backend-application:8081"}, + {"name": "PLATO_BACKEND_SERVICE_BACKEND_API_URL", "value": "http://backend:8081"}, {"name": "PLATO_DATABASE_URL", "value": "${PLATO_DATABASE_URL}"}, {"name": "PLATO_DATABASE_USER", "value": "${PLATO_DATABASE_USER}"}, {"name": "PLATO_DATABASE_PASSWORD", "value": "${PLATO_DATABASE_PASSWORD}"}, diff --git a/.github/workflows/draft-new-release.yaml b/.github/workflows/draft-new-release.yaml index 03ba5ace4..ec7a78e45 100644 --- a/.github/workflows/draft-new-release.yaml +++ b/.github/workflows/draft-new-release.yaml @@ -13,7 +13,7 @@ jobs: name: "Draft a new release" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v3.3.0 - name: Create release branch run: git checkout -b release/${{ github.event.inputs.version }} @@ -29,7 +29,7 @@ jobs: git config user.email noreply@github.com - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -43,7 +43,7 @@ jobs: GITHUB_PACKAGE_PASSWORD: ${{ secrets.CXNG_GHCR_PAT }} - name: Bump version in /charts - uses: mikefarah/yq@v4.30.5 + uses: mikefarah/yq@v4.30.8 with: cmd: |- find charts -name Chart.yaml | xargs -n1 yq -i '.appVersion = "${{ github.event.inputs.version }}" | .version = "${{ github.event.inputs.version }}"' @@ -68,7 +68,7 @@ jobs: run: git push origin release/${{ github.event.inputs.version }} - name: Create pull request - uses: thomaseizinger/create-pull-request@1.2.2 + uses: thomaseizinger/create-pull-request@1.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/helm-lint.yaml b/.github/workflows/helm-lint.yaml index 9318fd528..624607533 100644 --- a/.github/workflows/helm-lint.yaml +++ b/.github/workflows/helm-lint.yaml @@ -27,12 +27,12 @@ jobs: ############## - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: helm (setup) - uses: azure/setup-helm@v3.4 + uses: azure/setup-helm@v3.5 with: version: v3.8.1 - diff --git a/.github/workflows/kics.yml b/.github/workflows/kics.yml index 8cf5e4ce5..4207b8237 100644 --- a/.github/workflows/kics.yml +++ b/.github/workflows/kics.yml @@ -20,7 +20,7 @@ jobs: security-events: write steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v3.3.0 - name: KICS scan uses: checkmarx/kics-github-action@master diff --git a/.github/workflows/publish-new-release.yml b/.github/workflows/publish-new-release.yml index efdfc6124..337e7b0ff 100644 --- a/.github/workflows/publish-new-release.yml +++ b/.github/workflows/publish-new-release.yml @@ -5,6 +5,7 @@ on: pull_request: branches: - main + - support/* types: - closed @@ -64,10 +65,10 @@ jobs: echo "RELEASE_VERSION=${{ needs.release-version.outputs.RELEASE_VERSION }}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -96,12 +97,12 @@ jobs: echo "RELEASE_VERSION=${{ needs.release-version.outputs.RELEASE_VERSION }}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: Install Helm - uses: azure/setup-helm@v3.4 + uses: azure/setup-helm@v3.5 with: version: v3.8.1 - @@ -139,7 +140,7 @@ jobs: echo "RELEASE_VERSION=${{ needs.release-version.outputs.RELEASE_VERSION }}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: # 0 to fetch the full history due to upcoming merge of main into develop branch fetch-depth: 0 @@ -172,13 +173,14 @@ jobs: prerelease: false - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' cache: 'maven' - name: Merge main back into develop and set new snapshot version + if: github.event.pull_request.base.ref == 'main' run: | # Prepare git env git config user.name "GitHub actions" diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index e1af5ae69..b82acaf66 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -39,7 +39,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Run Trivy vulnerability scanner in repo mode uses: aquasecurity/trivy-action@master @@ -78,7 +78,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Run Trivy vulnerability scanner if: always() @@ -89,6 +89,7 @@ jobs: output: "trivy-results-${{ matrix.image }}.sarif" exit-code: "1" severity: "CRITICAL,HIGH" + timeout: "10m0s" - name: Upload Trivy scan results to GitHub Security tab if: always() diff --git a/.github/workflows/veracode.yaml b/.github/workflows/veracode.yaml index e67376dbf..7479f2872 100644 --- a/.github/workflows/veracode.yaml +++ b/.github/workflows/veracode.yaml @@ -26,12 +26,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -55,10 +55,10 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' @@ -102,10 +102,10 @@ jobs: # Set-Up - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3.3.0 - name: Set up JDK 11 - uses: actions/setup-java@v3.6.0 + uses: actions/setup-java@v3.10.0 with: java-version: '11' distribution: 'adopt' diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 33a54be2c..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "edc"] - path = edc - url = https://github.com/eclipse-dataspaceconnector/DataSpaceConnector.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 83ede2c53..5ec0476e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,120 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2023-02-20 + +### Added +- Add contract id to data source http call (#732) +- Support also support releases in ci pipeline +- Introduce typed object for oauth2 provisioning +- Add documentation +- Add test case +- Add client to omejdn +- add hydra deployment +- Configure dynamically HTTP Receiver callback endpoints. (#685) +- cp-adapter : code review, rollbacke name change (#664) +- Feature/cp adapter task 355 356 357 (#621) +- Add Validity Mapping in ContractDefinitionStepDefs class +- Add feature and create SendAnOfferwithoutConstraints method in class negotiationSteps +- Add validity attribute in class ContractDefinition +- Add Validity Mapping in ContractDefinitionStepDefs class +- Add feature and create SendAnOfferwithoutConstraints method in class negotiationSteps +- Add validity attribute in class ContractDefinition +- Local TXDC Setup Documentation (#618) +- Feature: Sftp Provisioner and Client (#554) + +### Changed +- Support horizontal edc scaling in cp adapter extension (#678) +- Use upstream jackson version (#741) +- Replace provision-oauth2 with data-plane-http-oauth2 +- docs: Update sample documentation (#671) +- chore: Disable build ci pipeline if just docu was updated (#705) +- Increase trivy timeout +- Remove not useful anymore custom-jsonld extension (#683) +- update setup docu (#654) +- remove trailing slash (#652) +- update alpine from 3.17.0 to 3.17.1 for controlplane-memory-hashicorp-vault (#665) +- Feature/set charts deprecated (#628) +- update setup docu (#627) +- Feature/update txdc deployment downward capabilities (#625) +- remove git submodule (#619) +- Feature/update postman (#624) +- update control plane docu (#623) +- update postgresql version in Chart.yaml supporting-infrastructure (#622) +- update link to edc logo in README.md (#612) +- update description of supporting infrastructure deployment (#616) + +### Fixed +- bugfix: Fix slow AES encryption (#746) +- Fix typo in tractusx-connector values.yaml comment +- Fix not working docu link in README.md +- Fix typo in control-plane adapter README + +### Dependency updates +- Bump EDC to 20220220 (#767) +- Bump alpine (#749) +- Bump alpine (#750) +- Bump alpine (#752) +- Bump alpine in /edc-controlplane/edc-controlplane-memory/src/main/docker (#753) +- Bump maven-deploy-plugin from 3.0.0 to 3.1.0 (#735) +- Bump actions/setup-java from 3.9.0 to 3.10.0 (#730) +- Bump s3 from 2.19.33 to 2.20.0 +- Bump s3 from 2.19.27 to 2.19.33 +- Bump jaxb-runtime from 4.0.1 to 4.0.2 +- Bump spotless-maven-plugin from 2.31.0 to 2.32.0 +- Bump postgresql from 42.5.1 to 42.5.3 +- Bump nimbus-jose-jwt from 9.30 to 9.30.1 +- Bump lombok from 1.18.24 to 1.18.26 +- Bump flyway-core from 9.12.0 to 9.14.1 +- Bump jackson-bom from 2.14.0-rc2 to 2.14.2 +- Bump cucumber.version from 7.11.0 to 7.11.1 +- Bump azure-sdk-bom from 1.2.8 to 1.2.9 +- Bump mockito-bom from 5.0.0 to 5.1.1 +- Bump edc version to 0.0.1-20230131-SNAPSHOT +- Bump s3 from 2.19.18 to 2.19.27 +- Bump docker/build-push-action from 3 to 4 +- Bump nimbus-jose-jwt from 9.29 to 9.30 +- Bump spotless-maven-plugin from 2.30.0 to 2.31.0 +- Bump nimbus-jose-jwt from 9.28 to 9.29 +- Bump mockito-bom from 4.11.0 to 5.0.0 +- Bump edc version to 0.0.1-20230125-SNAPSHOT +- Bump flyway-core from 9.11.0 to 9.12.0 +- Bump s3 from 2.19.15 to 2.19.18 (#684) +- Bump mikefarah/yq from 4.30.6 to 4.30.8 (#682) +- Bump spotless-maven-plugin from 2.29.0 to 2.30.0 +- Bump edc version to 0.0.1-20230115-SNAPSHOT +- Bump cucumber.version from 7.10.1 to 7.11.0 (#672) +- Bump maven-dependency-plugin from 3.4.0 to 3.5.0 (#669) +- Bump s3 from 2.19.11 to 2.19.15 (#668) +- Bump maven-surefire-plugin from 3.0.0-M7 to 3.0.0-M8 (#670) +- Bump edc version to 0.0.1-20230109-SNAPSHOT (#666) +- Bump alpine in /edc-controlplane/edc-controlplane-memory/src/main/docker (#659) +- Bump alpine in /edc-dataplane/edc-dataplane-azure-vault/src/main/docker (#660) +- Bump alpine (#658) +- Bump alpine (#661) +- Bump alpine (#662) +- Bump azure/setup-kubectl from 3.1 to 3.2 (#655) +- Bump junit-bom from 5.9.1 to 5.9.2 (#657) +- Bump s3 from 2.19.2 to 2.19.11 (#648) +- Bump actions/checkout from 3.2.0 to 3.3.0 (#647) +- Bump flyway-core from 9.10.2 to 9.11.0 (#646) +- Bump spotless-maven-plugin from 2.28.0 to 2.29.0 (#641) +- Bump mockito-bom from 4.10.0 to 4.11.0 (#637) +- Bump flyway-core from 9.10.1 to 9.10.2 (#632) +- Bump s3 from 2.19.1 to 2.19.2 (#631) +- Bump s3 from 2.18.41 to 2.19.1 (#626) +- Bump mikefarah/yq from 4.30.5 to 4.30.6 (#613) +- Bump cucumber.version from 7.10.0 to 7.10.1 (#614) +- Bump s3 from 2.18.40 to 2.18.41 (#615) +- Bump azure/setup-helm from 3.4 to 3.5 (#596) +- Bump actions/checkout from 3.1.0 to 3.2.0 (#598) +- Bump mockito-bom from 4.9.0 to 4.10.0 (#607) +- Bump s3 from 2.18.39 to 2.18.40 (#609) +- Bump flyway-core from 9.10.0 to 9.10.1 (#610) +- Bump actions/setup-java from 3.8.0 to 3.9.0 (#605) +- Bump s3 from 2.18.35 to 2.18.39 (#606) + + ## [0.2.0] - 2022-12-15 ### Fixed @@ -57,7 +171,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Connectors with Azure Vault extension are now starting again [link](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1892) +- Connectors with Azure Vault extension are now starting again [link](https://github.com/eclipse-edc/Connector/issues/1892) ## [0.1.0] - 2022-08-19 @@ -66,11 +180,11 @@ corresponding [documentation](/docs/migration/Version_0.0.x_0.1.x.md). ### Added -- Control-Plane extension ([data-plane-selector-client](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/v0.0.1-milestone-5/extensions/data-plane-selector/selector-client)) +- Control-Plane extension ([data-plane-selector-client](https://github.com/eclipse-edc/Connector/tree/v0.0.1-milestone-5/extensions/data-plane-selector/selector-client)) - run the EDC with multiple data planes at once - Control-Plane extension ([dataplane-selector-configuration](edc-extensions/dataplane-selector-configuration)) - add data plane instances to the control plane by configuration -- Data-Plane extension ([s3-data-plane](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/aws/data-plane-s3)) +- Data-Plane extension ([s3-data-plane](https://github.com/eclipse-edc/Connector/tree/main/extensions/aws/data-plane-s3)) - transfer from and to AWS S3 buckets - Control-Plane extension ([data-encryption](edc-extensions/data-encryption)) - Data-Plane authentication attribute transmitted during data-plane-transfer can be encrypted symmetrically (AES) @@ -82,15 +196,15 @@ corresponding [documentation](/docs/migration/Version_0.0.x_0.1.x.md). ### Fixed -- Contract-Offer-Receiving-Connectors must also pass the ContractPolicy of the ContractDefinition before receiving offers([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1331)) -- Deletion of Asset becomes impossible when Contract Negotiation exists([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1403)) -- Deletion of Policy becomes impossible when Contract Definition exists([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1410)) +- Contract-Offer-Receiving-Connectors must also pass the ContractPolicy of the ContractDefinition before receiving offers([issue](https://github.com/eclipse-edc/Connector/issues/1331)) +- Deletion of Asset becomes impossible when Contract Negotiation exists([issue](https://github.com/eclipse-edc/Connector/issues/1403)) +- Deletion of Policy becomes impossible when Contract Definition exists([issue](https://github.com/eclipse-edc/Connector/issues/1410)) ## [0.0.6] - 2022-07-29 ### Fixed -- Fixes [release 0.0.5](https://github.com/catenax-ng/product-edc/releases/tag/0.0.5), which introduced classpath issues due to usage of [net.jodah:failsafe:2.4.3](https://search.maven.org/artifact/net.jodah/failsafe/2.4.3/jar) library +- Fixes [release 0.0.5](https://github.com/catenax-ng/product-edc/releases/tag/0.0.5), which introduced classpath issues due to usage of [net.jodah:failsafe:2.4.3](https://search.maven.org/artifact/net.jodah/failsafe/2.4.3/jar) library ## [0.0.5] - 2022-07-28 @@ -117,7 +231,7 @@ corresponding [documentation](/docs/migration/Version_0.0.x_0.1.x.md). ### Fixed -- [#1515](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1515) SQL: Connector sends out 50 +- [#1515](https://github.com/eclipse-edc/Connector/issues/1515) SQL: Connector sends out 50 contract offers max. ### Removed @@ -131,7 +245,9 @@ corresponding [documentation](/docs/migration/Version_0.0.x_0.1.x.md). ## [0.0.1] - 2022-05-13 -[Unreleased]: https://github.com/catenax-ng/product-edc/compare/0.2.0...HEAD +[Unreleased]: https://github.com/catenax-ng/product-edc/compare/0.3.0...HEAD + +[0.3.0]: https://github.com/catenax-ng/product-edc/compare/0.2.0...0.3.0 [0.2.0]: https://github.com/catenax-ng/product-edc/compare/0.1.3...0.2.0 diff --git a/DEPENDENCIES b/DEPENDENCIES index 5e00bd93f..3479de982 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,18 +1,17 @@ -maven/mavencentral/com.azure/azure-core-http-netty/1.12.5, MIT, approved, clearlydefined -maven/mavencentral/com.azure/azure-core/1.32.0, MIT, approved, clearlydefined -maven/mavencentral/com.azure/azure-identity/1.6.0, MIT, approved, clearlydefined -maven/mavencentral/com.azure/azure-security-keyvault-secrets/4.5.0, MIT, approved, clearlydefined -maven/mavencentral/com.electronwill.night-config/core/3.6.6, LGPL-3.0-only, approved, #3767 -maven/mavencentral/com.electronwill.night-config/toml/3.6.6, LGPL-3.0-only, approved, #3766 -maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.14.0-rc2, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.azure/azure-core-http-netty/1.12.7, MIT, approved, clearlydefined +maven/mavencentral/com.azure/azure-core/1.34.0, MIT, approved, clearlydefined +maven/mavencentral/com.azure/azure-identity/1.7.0, MIT, approved, clearlydefined +maven/mavencentral/com.azure/azure-security-keyvault-secrets/4.5.2, , restricted, clearlydefined +maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.14.0-rc2, Apache-2.0, approved, #5303 maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.14.0-rc2, Apache-2.0 AND MIT, approved, #4303 maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.14.0-rc2, Apache-2.0, approved, #4105 +maven/mavencentral/com.fasterxml.jackson.dataformat/jackson-dataformat-toml/2.14.0-rc2, Apache-2.0, restricted, clearlydefined maven/mavencentral/com.fasterxml.jackson.dataformat/jackson-dataformat-xml/2.14.0-rc2, Apache-2.0, approved, #4300 -maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.14.0-rc2, Apache-2.0, approved, clearlydefined -maven/mavencentral/com.fasterxml.woodstox/woodstox-core/6.3.1, Apache-2.0, approved, #4302 +maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.14.0-rc2, Apache-2.0, approved, #4699 +maven/mavencentral/com.fasterxml.woodstox/woodstox-core/6.4.0, Apache-2.0, approved, #5309 maven/mavencentral/com.github.stephenc.jcip/jcip-annotations/1.0-1, Apache-2.0, approved, CQ21949 maven/mavencentral/com.microsoft.azure/msal4j-persistence-extension/1.1.0, MIT, approved, clearlydefined -maven/mavencentral/com.microsoft.azure/msal4j/1.13.1, MIT, approved, clearlydefined +maven/mavencentral/com.microsoft.azure/msal4j/1.13.3, MIT, approved, clearlydefined maven/mavencentral/com.nimbusds/content-type/2.2, Apache-2.0, approved, clearlydefined maven/mavencentral/com.nimbusds/lang-tag/1.6, Apache-2.0, approved, clearlydefined maven/mavencentral/com.nimbusds/nimbus-jose-jwt/8.23, Apache-2.0, approved, clearlydefined @@ -23,30 +22,30 @@ maven/mavencentral/de.fraunhofer.iais.eis.ids.infomodel/java/4.1.3, Apache-2.0, maven/mavencentral/de.fraunhofer.iais.eis.infomodel/util/4.1.3, Apache-2.0, approved, #3780 maven/mavencentral/dev.failsafe/failsafe/3.2.4, Apache-2.0, approved, clearlydefined maven/mavencentral/io.micrometer/micrometer-core/1.8.2, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.netty/netty-buffer/4.1.79.Final, Apache-2.0, approved, CQ21842 -maven/mavencentral/io.netty/netty-codec-dns/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-codec-http/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-codec-http2/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-codec-socks/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-codec/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-common/4.1.79.Final, Apache-2.0 AND MIT AND CC0-1.0, approved, CQ21843 -maven/mavencentral/io.netty/netty-handler-proxy/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-handler/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-resolver-dns-classes-macos/4.1.79.Final, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.netty/netty-resolver-dns-native-macos/4.1.79.Final, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.netty/netty-resolver-dns/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-resolver/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-tcnative-boringssl-static/2.0.53.Final, Apache-2.0 OR LicenseRef-Public-Domain OR BSD-2-Clause OR MIT, approved, CQ15280 -maven/mavencentral/io.netty/netty-tcnative-classes/2.0.53.Final, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.netty/netty-transport-classes-epoll/4.1.79.Final, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.netty/netty-transport-classes-kqueue/4.1.79.Final, Apache-2.0, approved, #4107 -maven/mavencentral/io.netty/netty-transport-native-epoll/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-transport-native-kqueue/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-transport-native-unix-common/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.netty/netty-transport/4.1.79.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 -maven/mavencentral/io.projectreactor.netty/reactor-netty-core/1.0.22, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.projectreactor.netty/reactor-netty-http/1.0.22, Apache-2.0, approved, clearlydefined -maven/mavencentral/io.projectreactor/reactor-core/3.4.22, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.netty/netty-buffer/4.1.82.Final, Apache-2.0, approved, CQ21842 +maven/mavencentral/io.netty/netty-codec-dns/4.1.81.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-codec-http/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-codec-http2/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-codec-socks/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-codec/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-common/4.1.82.Final, Apache-2.0 AND MIT AND CC0-1.0, approved, CQ21843 +maven/mavencentral/io.netty/netty-handler-proxy/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-handler/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-resolver-dns-classes-macos/4.1.81.Final, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.netty/netty-resolver-dns-native-macos/4.1.81.Final, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.netty/netty-resolver-dns/4.1.81.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-resolver/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-tcnative-boringssl-static/2.0.54.Final, Apache-2.0 OR LicenseRef-Public-Domain OR BSD-2-Clause OR MIT, approved, CQ15280 +maven/mavencentral/io.netty/netty-tcnative-classes/2.0.54.Final, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.netty/netty-transport-classes-epoll/4.1.82.Final, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.netty/netty-transport-classes-kqueue/4.1.82.Final, Apache-2.0, approved, #4107 +maven/mavencentral/io.netty/netty-transport-native-epoll/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-transport-native-kqueue/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-transport-native-unix-common/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.netty/netty-transport/4.1.82.Final, Apache-2.0 AND BSD-3-Clause AND MIT, approved, CQ20926 +maven/mavencentral/io.projectreactor.netty/reactor-netty-core/1.0.23, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.projectreactor.netty/reactor-netty-http/1.0.23, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.projectreactor/reactor-core/3.4.23, Apache-2.0, approved, clearlydefined maven/mavencentral/jakarta.ws.rs/jakarta.ws.rs-api/3.1.0, EPL-2.0 OR GPL-2.0-only with Classpath-exception-2.0, approved, ee4j.rest maven/mavencentral/javax.validation/validation-api/2.0.1.Final, Apache-2.0, approved, CQ15302 maven/mavencentral/net.java.dev.jna/jna-platform/5.6.0, Apache-2.0 OR LGPL-2.1-or-later, approved, CQ22390 @@ -57,116 +56,93 @@ maven/mavencentral/org.bouncycastle/bcpkix-jdk15on/1.70, MIT, approved, clearlyd maven/mavencentral/org.bouncycastle/bcprov-jdk15on/1.70, MIT, approved, #1712 maven/mavencentral/org.bouncycastle/bcutil-jdk15on/1.70, MIT, approved, clearlydefined maven/mavencentral/org.codehaus.woodstox/stax2-api/4.2.1, BSD-2-Clause, approved, #2670 -maven/mavencentral/org.eclipse.dataspaceconnector/apache-commons-pool-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/api-configuration/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/api-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/asset-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/asset-index-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/auth-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/auth-tokenbased/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/azure-vault/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/catalog-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/catalog-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/common-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/common-util/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contract-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contract/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contractagreement-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contractdefinition-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contractdefinition-store-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contractnegotiation-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/contractnegotiation-store-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/control-plane-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/control-plane-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/core-base/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/core-boot/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/core-micrometer/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/core-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-management-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-framework/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-http/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-s3/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-selector-client/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-selector-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-selector-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-transfer-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/data-plane-transfer-sync/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/filesystem-configuration/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/http-receiver/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/http/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/iam-daps/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-api-configuration/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-api-multipart-dispatcher-v1/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-api-multipart-endpoint-v1/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-api-transform-v1/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/ids-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jdk-logger-monitor/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jersey-micrometer/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jersey/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jetty-micrometer/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jetty/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/jwt-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/oauth2-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/oauth2-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/observability-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-engine-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-engine/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-evaluator/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-model/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policy-store-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/policydefinition-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/runtime-metamodel/0.0.1-20221025.153030-25, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/s3-core/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transaction-datasource-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transaction-local/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transaction-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transfer-process-store-sql/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transfer-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transfer/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transferprocess-api/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/transport-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.dataspaceconnector/web-spi/0.0.1-20221006-20221006.060025-1, Apache-2.0, approved, technology.dataspaceconnector -maven/mavencentral/org.eclipse.tractusx.edc.extensions/business-partner-validation/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc.extensions/cx-oauth2/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc.extensions/data-encryption/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc.extensions/dataplane-selector-configuration/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc.extensions/hashicorp-vault/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc.extensions/postgresql-migration/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc/edc-controlplane-base/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc/edc-controlplane-postgresql/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.eclipse.tractusx.edc/edc-dataplane-base/0.1.3-SNAPSHOT, Apache-2.0, approved, automotive.tractusx -maven/mavencentral/org.flywaydb/flyway-core/9.6.0, Apache-2.0, approved, #4301 +maven/mavencentral/org.eclipse.edc/aggregate-service-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/api-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/api-observability/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/asset-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/asset-index-sql/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/auth-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/auth-tokenbased/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/boot/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/catalog-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/catalog-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/configuration-filesystem/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/connector-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-agreement-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-definition-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-definition-store-sql/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-negotiation-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-negotiation-store-sql/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/contract-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/control-plane-api-client-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/control-plane-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/control-plane-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/core-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-aws-s3/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-framework/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-http/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-selector-client/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-selector-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-selector-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-transfer-client/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-transfer-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/data-plane-transfer-sync/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/http-receiver/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/http/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-api-configuration/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-api-multipart-dispatcher-v1/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-api-multipart-endpoint-v1/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/ids-transform-v1/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/jersey-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/jersey-micrometer/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/jetty-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/jetty-micrometer/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/jwt-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/management-api-configuration/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/management-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/micrometer-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/monitor-jdk-logger/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/oauth2-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/oauth2-daps/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/oauth2-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/policy-definition-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/policy-definition-store-sql/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/policy-engine-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/policy-model/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/policy-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/runtime-metamodel/0.0.1-20221208.055231-48, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/sql-core/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/sql-pool-apache-commons/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transaction-datasource-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transaction-local/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transaction-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transfer-process-api/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transfer-process-store-sql/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transfer-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/transform-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/util/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/vault-azure/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.edc/web-spi/0.0.1-20221201-20221201.072646-1, Apache-2.0, approved, technology.edc +maven/mavencentral/org.eclipse.tractusx.edc.extensions/business-partner-validation/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc.extensions/cx-oauth2/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc.extensions/data-encryption/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc.extensions/dataplane-selector-configuration/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc.extensions/hashicorp-vault/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc.extensions/postgresql-migration/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc/edc-controlplane-base/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.eclipse.tractusx.edc/edc-dataplane-base/0.1.4-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.flywaydb/flyway-core/9.8.3, , restricted, clearlydefined maven/mavencentral/org.hdrhistogram/HdrHistogram/2.1.12, , approved, CQ13192 maven/mavencentral/org.jetbrains.kotlin/kotlin-stdlib-common/1.4.0, Apache-2.0, approved, clearlydefined maven/mavencentral/org.jetbrains.kotlin/kotlin-stdlib/1.4.10, Apache-2.0, approved, clearlydefined maven/mavencentral/org.jetbrains/annotations/15.0, Apache-2.0, approved, clearlydefined maven/mavencentral/org.ow2.asm/asm/9.1, BSD-3-Clause, approved, CQ23029 maven/mavencentral/org.ow2.asm/asm/9.3, BSD-3-Clause, approved, CQ24052 -maven/mavencentral/org.postgresql/postgresql/42.5.0, BSD-2-Clause, approved, #3416 +maven/mavencentral/org.postgresql/postgresql/42.5.1, BSD-2-Clause, approved, #3416 maven/mavencentral/org.projectlombok/lombok/1.18.24, MIT AND LicenseRef-Public-Domain, approved, CQ23907 -maven/mavencentral/org.reactivestreams/reactive-streams/1.0.3, CC0-1.0, approved, CQ16332 maven/mavencentral/org.reactivestreams/reactive-streams/1.0.4, CC0-1.0, approved, CQ16332 -maven/mavencentral/org.slf4j/slf4j-api/2.0.3, MIT, approved, CQ24150 -maven/mavencentral/software.amazon.awssdk/annotations/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/arns/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/auth/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/aws-core/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/aws-query-protocol/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/aws-xml-protocol/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/http-client-spi/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/iam/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/json-utils/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/metrics-spi/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/profiles/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/protocol-core/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/regions/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/s3/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/sdk-core/2.17.278, Apache-2.0, approved, #3167 -maven/mavencentral/software.amazon.awssdk/sts/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.awssdk/third-party-jackson-core/2.17.278, Apache-2.0, approved, #3166 -maven/mavencentral/software.amazon.awssdk/utils/2.17.278, Apache-2.0, approved, clearlydefined -maven/mavencentral/software.amazon.eventstream/eventstream/1.0.1, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.slf4j/slf4j-api/2.0.3, MIT, approved, CQ24285 diff --git a/README.md b/README.md index e2fbce7d9..5d2dd0daa 100644 --- a/README.md +++ b/README.md @@ -9,20 +9,20 @@
- - Logo + + Logo

Product Eclipse Dataspace Connector

Catena-X

- Container images and deployments of the Eclipse Dataspace Connector open source project. + Container images and deployments of the Eclipse Dataspace Components open source project.
- Explore the docs » + Explore the docs »

- View Eclipse Dataspace Connector + View Eclipse Dataspace Components · Releases · @@ -53,7 +53,7 @@ ## About The Project -The project provides pre-built control- and data-plane [docker](https://www.docker.com/) images and [helm](https://helm.sh/) charts of the [Eclipse DataSpaceConnector Project](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector). +The project provides pre-built control- and data-plane [docker](https://www.docker.com/) images and [helm](https://helm.sh/) charts of the [Eclipse DataSpaceConnector Project](https://github.com/eclipse-edc/Connector).

(back to top)

@@ -90,17 +90,7 @@ Derivatives of the Data-Plane can be found here ### Build -1. Build EDC Submodule Dependencies -```shell -git submodule update --init - -#Unix -cd edc && ./gradlew publishToMavenLocal -Pskip.signing=true -PedcVersion=0.0.1-20220902-SNAPSHOT -xjavadoc && cd .. -#windows -cd edc && ./gradlew.bat publishToMavenLocal --project-prop skip.signing=true --project-prop edcVersion=0.0.1-20220902-SNAPSHOT && cd.. -``` - -2. Build Product-EDC Container Images +Build Product-EDC together with its Container Images ```shell ./mvnw package -Pwith-docker-image ``` diff --git a/charts/edc-controlplane/Chart.yaml b/charts/edc-controlplane/Chart.yaml index 23b159e75..972f4249d 100644 --- a/charts/edc-controlplane/Chart.yaml +++ b/charts/edc-controlplane/Chart.yaml @@ -5,6 +5,7 @@ description: >- EDC Control-Plane - The Eclipse DataSpaceConnector administration layer with responsibility of resource management and govern contracts and data transfers home: https://github.com/catenax-ng/product-edc/charts/edc-controlplane type: application -appVersion: "0.2.0" -version: 0.2.0 +appVersion: "0.3.0" +version: 0.3.0 +deprecated: true maintainers: [] diff --git a/charts/edc-controlplane/README.md b/charts/edc-controlplane/README.md index 09ded5808..0ae4720aa 100644 --- a/charts/edc-controlplane/README.md +++ b/charts/edc-controlplane/README.md @@ -1,6 +1,8 @@ # edc-controlplane -![Version: 0.2.0](https://img.shields.io/badge/Version-0.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.2.0](https://img.shields.io/badge/AppVersion-0.2.0-informational?style=flat-square) +> **:exclamation: This Helm Chart is deprecated!** + +![Version: 0.3.0](https://img.shields.io/badge/Version-0.3.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.3.0](https://img.shields.io/badge/AppVersion-0.3.0-informational?style=flat-square) EDC Control-Plane - The Eclipse DataSpaceConnector administration layer with responsibility of resource management and govern contracts and data transfers @@ -9,7 +11,7 @@ EDC Control-Plane - The Eclipse DataSpaceConnector administration layer with res ## TL;DR ```shell $ helm repo add catenax-ng-product-edc https://catenax-ng.github.io/product-edc -$ helm install my-release catenax-ng-product-edc/edc-controlplane --version 0.2.0 +$ helm install my-release catenax-ng-product-edc/edc-controlplane --version 0.3.0 ``` ## Values @@ -23,7 +25,7 @@ $ helm install my-release catenax-ng-product-edc/edc-controlplane --version 0.2. | autoscaling.minReplicas | int | `1` | Minimal replicas if resource consumption falls below resource threshholds | | autoscaling.targetCPUUtilizationPercentage | int | `80` | targetAverageUtilization of cpu provided to a pod | | autoscaling.targetMemoryUtilizationPercentage | int | `80` | targetAverageUtilization of memory provided to a pod | -| configuration.properties | string | `"# edc.api.auth.key=\n# edc.atomikos.checkpoint.interval=\n# edc.atomikos.directory=\n# edc.atomikos.logging=\n# edc.atomikos.threaded2pc=\n# edc.atomikos.timeout=\n# edc.aws.access.key=\n# edc.aws.provision.retry.retries.max=\n# edc.aws.provision.role.duration.session.max=\n# edc.aws.secret.access.key=\n# edc.blobstore.endpoint=\n# edc.dataplane.token.validation.endpoint=\n# edc.core.retry.backoff.max=\n# edc.core.retry.backoff.min=\n# edc.core.retry.retries.max=\n# edc.core.system.health.check.liveness-period=\n# edc.core.system.health.check.readiness-period=\n# edc.core.system.health.check.startup-period=\n# edc.core.system.health.check.threadpool-size=\n# edc.dataplane.queue.capacity=\n# edc.dataplane.wait=\n# edc.dataplane.workers=\n# edc.datasource.asset.name=\"default\"\n# edc.datasource.contractdefinition.name=\"default\"\n# edc.datasource.contractnegotiation.name=\"default\"\n# edc.datasource.policy.name=\"default\"\n# edc.datasource.transferprocess.name=\"default\"\n# edc.datasource.default.pool.maxIdleConnections=\n# edc.datasource.default.pool.maxTotalConnections=\n# edc.datasource.default.pool.minIdleConnections=\n# edc.datasource.default.pool.testConnectionOnBorrow=\n# edc.datasource.default.pool.testConnectionOnCreate=\n# edc.datasource.default.pool.testConnectionOnReturn=\n# edc.datasource.default.pool.testConnectionWhileIdle=\n# edc.datasource.default.pool.testQuery=\n# edc.datasource.default.url=\n# edc.datasource.default.user=\n# edc.datasource.default.password=\n# edc.dpf.selector.url=\n# edc.events.topic.endpoint=\n# edc.events.topic.name=\n# edc.fs.config=\n# edc.hostname=\n# edc.identity.did.url=\n# edc.ids.catalog.id=\n# edc.ids.curator=\n# edc.ids.description=\n# edc.ids.endpoint=\n# edc.ids.id=\n# edc.ids.maintainer=\n# edc.ids.security.profile=\n# edc.ids.title=\n# edc.ids.validation.referringconnector=\n# edc.ion.crawler.did-type=\n# edc.ion.crawler.interval-minutes=\n# edc.ion.crawler.ion.url=\n# edc.metrics.enabled=\n# edc.metrics.executor.enabled=\n# edc.metrics.jersey.enabled=\n# edc.metrics.jetty.enabled=\n# edc.metrics.okhttp.enabled=\n# edc.metrics.system.enabled=\n# edc.negotiation.consumer.state-machine.batch-size=\n# edc.negotiation.provider.state-machine.batch-size=\n# edc.oauth.client.id=\n# edc.oauth.private.key.alias=\n# edc.oauth.provider.audience=\n# edc.oauth.provider.jwks.refresh=\n# edc.oauth.provider.jwks.url=\n# edc.oauth.public.key.alias=\n# edc.oauth.token.url=\n# edc.oauth.validation.nbf.leeway=\n# edc.receiver.http.auth-code=\n# edc.receiver.http.auth-key=\n# edc.receiver.http.endpoint=\n# edc.transfer.proxy.endpoint=\n# edc.transfer.proxy.token.validity.seconds=\n# edc.transfer.proxy.token.signer.privatekey.alias=\n# edc.transfer.functions.check.endpoint=\n# edc.transfer.functions.enabled.protocols=\n# edc.transfer.functions.transfer.endpoint=\n# edc.transfer-process-store.database.name=\n# edc.transfer.state-machine.batch-size=\n# edc.vault=\n# edc.vault.certificate=\n# edc.vault.clientid=\n# edc.vault.clientsecret=\n# edc.vault.name=\n# edc.vault.tenantid=\n# edc.vault.hashicorp.url=\n# edc.vault.hashicorp.token=\n# edc.vault.hashicorp.timeout.seconds=\n# edc.webdid.doh.url=\n# edc.web.rest.cors.enabled=\n# edc.web.rest.cors.headers=\n# edc.web.rest.cors.methods=\n# edc.web.rest.cors.origins=\n# ids.webhook.address="` | EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector) | +| configuration.properties | string | `"# edc.api.auth.key=\n# edc.atomikos.checkpoint.interval=\n# edc.atomikos.directory=\n# edc.atomikos.logging=\n# edc.atomikos.threaded2pc=\n# edc.atomikos.timeout=\n# edc.aws.access.key=\n# edc.aws.provision.retry.retries.max=\n# edc.aws.provision.role.duration.session.max=\n# edc.aws.secret.access.key=\n# edc.blobstore.endpoint=\n# edc.dataplane.token.validation.endpoint=\n# edc.core.retry.backoff.max=\n# edc.core.retry.backoff.min=\n# edc.core.retry.retries.max=\n# edc.core.system.health.check.liveness-period=\n# edc.core.system.health.check.readiness-period=\n# edc.core.system.health.check.startup-period=\n# edc.core.system.health.check.threadpool-size=\n# edc.dataplane.queue.capacity=\n# edc.dataplane.wait=\n# edc.dataplane.workers=\n# edc.datasource.asset.name=\"default\"\n# edc.datasource.contractdefinition.name=\"default\"\n# edc.datasource.contractnegotiation.name=\"default\"\n# edc.datasource.policy.name=\"default\"\n# edc.datasource.transferprocess.name=\"default\"\n# edc.datasource.default.pool.maxIdleConnections=\n# edc.datasource.default.pool.maxTotalConnections=\n# edc.datasource.default.pool.minIdleConnections=\n# edc.datasource.default.pool.testConnectionOnBorrow=\n# edc.datasource.default.pool.testConnectionOnCreate=\n# edc.datasource.default.pool.testConnectionOnReturn=\n# edc.datasource.default.pool.testConnectionWhileIdle=\n# edc.datasource.default.pool.testQuery=\n# edc.datasource.default.url=\n# edc.datasource.default.user=\n# edc.datasource.default.password=\n# edc.dpf.selector.url=\n# edc.events.topic.endpoint=\n# edc.events.topic.name=\n# edc.fs.config=\n# edc.hostname=\n# edc.identity.did.url=\n# edc.ids.catalog.id=\n# edc.ids.curator=\n# edc.ids.description=\n# edc.ids.endpoint=\n# edc.ids.id=\n# edc.ids.maintainer=\n# edc.ids.security.profile=\n# edc.ids.title=\n# edc.ids.validation.referringconnector=\n# edc.ion.crawler.did-type=\n# edc.ion.crawler.interval-minutes=\n# edc.ion.crawler.ion.url=\n# edc.metrics.enabled=\n# edc.metrics.executor.enabled=\n# edc.metrics.jersey.enabled=\n# edc.metrics.jetty.enabled=\n# edc.metrics.okhttp.enabled=\n# edc.metrics.system.enabled=\n# edc.negotiation.consumer.state-machine.batch-size=\n# edc.negotiation.provider.state-machine.batch-size=\n# edc.oauth.client.id=\n# edc.oauth.private.key.alias=\n# edc.oauth.provider.audience=\n# edc.oauth.provider.jwks.refresh=\n# edc.oauth.provider.jwks.url=\n# edc.oauth.public.key.alias=\n# edc.oauth.token.url=\n# edc.oauth.validation.nbf.leeway=\n# edc.receiver.http.auth-code=\n# edc.receiver.http.auth-key=\n# edc.receiver.http.endpoint=\n# edc.transfer.proxy.endpoint=\n# edc.transfer.proxy.token.validity.seconds=\n# edc.transfer.proxy.token.signer.privatekey.alias=\n# edc.transfer.functions.check.endpoint=\n# edc.transfer.functions.enabled.protocols=\n# edc.transfer.functions.transfer.endpoint=\n# edc.transfer-process-store.database.name=\n# edc.transfer.state-machine.batch-size=\n# edc.vault=\n# edc.vault.certificate=\n# edc.vault.clientid=\n# edc.vault.clientsecret=\n# edc.vault.name=\n# edc.vault.tenantid=\n# edc.vault.hashicorp.url=\n# edc.vault.hashicorp.token=\n# edc.vault.hashicorp.timeout.seconds=\n# edc.webdid.doh.url=\n# edc.web.rest.cors.enabled=\n# edc.web.rest.cors.headers=\n# edc.web.rest.cors.methods=\n# edc.web.rest.cors.origins=\n# ids.webhook.address="` | EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-edc/Connector) | | customLabels | object | `{}` | Additional custom Labels to add | | edc.endpoints.control.path | string | `"/api/controlplane/control"` | The path mapping the "control" api is going to be exposed at | | edc.endpoints.control.port | string | `"9999"` | The network port, which the "control" api is going to be exposed by the container, pod and service | @@ -66,7 +68,7 @@ $ helm install my-release catenax-ng-product-edc/edc-controlplane --version 0.2. | ingresses[1].tls.enabled | bool | `false` | Enables TLS on the ingress resource | | ingresses[1].tls.secretName | string | `""` | If present overwrites the default secret name | | livenessProbe.enabled | bool | `true` | Whether to enable kubernetes [liveness-probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | -| logging.properties | string | `".level=INFO\norg.eclipse.dataspaceconnector.level=ALL\nhandlers=java.util.logging.ConsoleHandler\njava.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.ConsoleHandler.level=ALL\njava.util.logging.SimpleFormatter.format=[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS] [%4$-7s] %5$s%6$s%n"` | EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) | +| logging.properties | string | `".level=INFO\norg.eclipse.edc.level=ALL\nhandlers=java.util.logging.ConsoleHandler\njava.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.ConsoleHandler.level=ALL\njava.util.logging.SimpleFormatter.format=[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS] [%4$-7s] %5$s%6$s%n"` | EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) | | nameOverride | string | `""` | Overrides the charts name | | nodeSelector | object | `{}` | [Node-Selector](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) to constrain the Pod to nodes with specific labels. | | opentelemetry.properties | string | `"otel.javaagent.enabled=true\notel.javaagent.debug=false"` | opentelemetry.properties configuring the [opentelemetry agent](https://opentelemetry.io/docs/instrumentation/java/automatic/agent-config/) | diff --git a/charts/edc-controlplane/values.yaml b/charts/edc-controlplane/values.yaml index 395a47358..73c47d097 100644 --- a/charts/edc-controlplane/values.yaml +++ b/charts/edc-controlplane/values.yaml @@ -242,7 +242,7 @@ logging: # -- EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) properties: |- .level=INFO - org.eclipse.dataspaceconnector.level=ALL + org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL @@ -255,7 +255,7 @@ opentelemetry: otel.javaagent.debug=false configuration: - # -- EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector) + # -- EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-edc/Connector) properties: |- # edc.api.auth.key= # edc.atomikos.checkpoint.interval= diff --git a/charts/edc-dataplane/Chart.yaml b/charts/edc-dataplane/Chart.yaml index a1d43a3c9..5c9d0c3cb 100644 --- a/charts/edc-dataplane/Chart.yaml +++ b/charts/edc-dataplane/Chart.yaml @@ -5,6 +5,7 @@ description: >- EDC Data-Plane - The Eclipse DataSpaceConnector data layer with responsibility of transferring and receiving data streams home: https://github.com/catenax-ng/product-edc/charts/edc-dataplane type: application -appVersion: "0.2.0" -version: 0.2.0 +appVersion: "0.3.0" +version: 0.3.0 +deprecated: true maintainers: [] diff --git a/charts/edc-dataplane/README.md b/charts/edc-dataplane/README.md index 0c3cbe328..27ca63389 100644 --- a/charts/edc-dataplane/README.md +++ b/charts/edc-dataplane/README.md @@ -1,6 +1,8 @@ # edc-dataplane -![Version: 0.2.0](https://img.shields.io/badge/Version-0.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.2.0](https://img.shields.io/badge/AppVersion-0.2.0-informational?style=flat-square) +> **:exclamation: This Helm Chart is deprecated!** + +![Version: 0.3.0](https://img.shields.io/badge/Version-0.3.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.3.0](https://img.shields.io/badge/AppVersion-0.3.0-informational?style=flat-square) EDC Data-Plane - The Eclipse DataSpaceConnector data layer with responsibility of transferring and receiving data streams @@ -9,7 +11,7 @@ EDC Data-Plane - The Eclipse DataSpaceConnector data layer with responsibility o ## TL;DR ```shell $ helm repo add catenax-ng-product-edc https://catenax-ng.github.io/product-edc -$ helm install my-release catenax-ng-product-edc/edc-dataplane --version 0.2.0 +$ helm install my-release catenax-ng-product-edc/edc-dataplane --version 0.3.0 ``` ## Values @@ -23,7 +25,7 @@ $ helm install my-release catenax-ng-product-edc/edc-dataplane --version 0.2.0 | autoscaling.minReplicas | int | `1` | Minimal replicas if resource consumption falls below resource threshholds | | autoscaling.targetCPUUtilizationPercentage | int | `80` | targetAverageUtilization of cpu provided to a pod | | autoscaling.targetMemoryUtilizationPercentage | int | `80` | targetAverageUtilization of memory provided to a pod | -| configuration.properties | string | `"# edc.atomikos.checkpoint.interval=\n# edc.atomikos.directory=\n# edc.atomikos.logging=\n# edc.atomikos.threaded2pc=\n# edc.atomikos.timeout=\n# edc.aws.access.key=\n# edc.aws.provision.retry.retries.max=\n# edc.aws.provision.role.duration.session.max=\n# edc.aws.secret.access.key=\n# edc.blobstore.endpoint=\n# edc.dataplane.token.validation.endpoint=\n# edc.core.retry.backoff.max=\n# edc.core.retry.backoff.min=\n# edc.core.retry.retries.max=\n# edc.core.system.health.check.liveness-period=\n# edc.core.system.health.check.readiness-period=\n# edc.core.system.health.check.startup-period=\n# edc.core.system.health.check.threadpool-size=\n# edc.dataplane.queue.capacity=\n# edc.dataplane.wait=\n# edc.dataplane.workers=\n# edc.datasource.asset.name=\"default\"\n# edc.datasource.contractdefinition.name=\"default\"\n# edc.datasource.contractnegotiation.name=\"default\"\n# edc.datasource.policy.name=\"default\"\n# edc.datasource.transferprocess.name=\"default\"\n# edc.datasource.default.pool.maxIdleConnections=\n# edc.datasource.default.pool.maxTotalConnections=\n# edc.datasource.default.pool.minIdleConnections=\n# edc.datasource.default.pool.testConnectionOnBorrow=\n# edc.datasource.default.pool.testConnectionOnCreate=\n# edc.datasource.default.pool.testConnectionOnReturn=\n# edc.datasource.default.pool.testConnectionWhileIdle=\n# edc.datasource.default.pool.testQuery=\n# edc.datasource.default.url=\n# edc.datasource.default.user=\n# edc.datasource.default.password=\n# edc.dpf.selector.url=\n# edc.events.topic.endpoint=\n# edc.events.topic.name=\n# edc.fs.config=\n# edc.hostname=\n# edc.identity.did.url=\n# edc.ids.catalog.id=\n# edc.ids.curator=\n# edc.ids.description=\n# edc.ids.endpoint=\n# edc.ids.endpoint.audience=\n# edc.ids.id=\n# edc.ids.maintainer=\n# edc.ids.security.profile=\n# edc.ids.title=\n# edc.ids.validation.referringconnector=\n# edc.ion.crawler.did-type=\n# edc.ion.crawler.interval-minutes=\n# edc.ion.crawler.ion.url=\n# edc.metrics.enabled=\n# edc.metrics.executor.enabled=\n# edc.metrics.jersey.enabled=\n# edc.metrics.jetty.enabled=\n# edc.metrics.okhttp.enabled=\n# edc.metrics.system.enabled=\n# edc.negotiation.consumer.state-machine.batch-size=\n# edc.negotiation.provider.state-machine.batch-size=\n# edc.oauth.client.id=\n# edc.oauth.private.key.alias=\n# edc.oauth.provider.jwks.refresh=\n# edc.oauth.provider.jwks.url=\n# edc.oauth.public.key.alias=\n# edc.oauth.token.url=\n# edc.oauth.validation.nbf.leeway=\n# edc.receiver.http.auth-code=\n# edc.receiver.http.auth-key=\n# edc.receiver.http.endpoint=\n# edc.transfer.functions.check.endpoint=\n# edc.transfer.functions.enabled.protocols=\n# edc.transfer.functions.transfer.endpoint=\n# edc.transfer-process-store.database.name=\n# edc.transfer.state-machine.batch-size=\n# edc.vault=\n# edc.vault.certificate=\n# edc.vault.clientid=\n# edc.vault.clientsecret=\n# edc.vault.name=\n# edc.vault.tenantid=\n# edc.vault.hashicorp.url=\n# edc.vault.hashicorp.token=\n# edc.vault.hashicorp.timeout.seconds=\n# edc.webdid.doh.url=\n# edc.web.rest.cors.enabled=\n# edc.web.rest.cors.headers=\n# edc.web.rest.cors.methods=\n# edc.web.rest.cors.origins="` | EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector) | +| configuration.properties | string | `"# edc.atomikos.checkpoint.interval=\n# edc.atomikos.directory=\n# edc.atomikos.logging=\n# edc.atomikos.threaded2pc=\n# edc.atomikos.timeout=\n# edc.aws.access.key=\n# edc.aws.provision.retry.retries.max=\n# edc.aws.provision.role.duration.session.max=\n# edc.aws.secret.access.key=\n# edc.blobstore.endpoint=\n# edc.dataplane.token.validation.endpoint=\n# edc.core.retry.backoff.max=\n# edc.core.retry.backoff.min=\n# edc.core.retry.retries.max=\n# edc.core.system.health.check.liveness-period=\n# edc.core.system.health.check.readiness-period=\n# edc.core.system.health.check.startup-period=\n# edc.core.system.health.check.threadpool-size=\n# edc.dataplane.queue.capacity=\n# edc.dataplane.wait=\n# edc.dataplane.workers=\n# edc.datasource.asset.name=\"default\"\n# edc.datasource.contractdefinition.name=\"default\"\n# edc.datasource.contractnegotiation.name=\"default\"\n# edc.datasource.policy.name=\"default\"\n# edc.datasource.transferprocess.name=\"default\"\n# edc.datasource.default.pool.maxIdleConnections=\n# edc.datasource.default.pool.maxTotalConnections=\n# edc.datasource.default.pool.minIdleConnections=\n# edc.datasource.default.pool.testConnectionOnBorrow=\n# edc.datasource.default.pool.testConnectionOnCreate=\n# edc.datasource.default.pool.testConnectionOnReturn=\n# edc.datasource.default.pool.testConnectionWhileIdle=\n# edc.datasource.default.pool.testQuery=\n# edc.datasource.default.url=\n# edc.datasource.default.user=\n# edc.datasource.default.password=\n# edc.dpf.selector.url=\n# edc.events.topic.endpoint=\n# edc.events.topic.name=\n# edc.fs.config=\n# edc.hostname=\n# edc.identity.did.url=\n# edc.ids.catalog.id=\n# edc.ids.curator=\n# edc.ids.description=\n# edc.ids.endpoint=\n# edc.ids.endpoint.audience=\n# edc.ids.id=\n# edc.ids.maintainer=\n# edc.ids.security.profile=\n# edc.ids.title=\n# edc.ids.validation.referringconnector=\n# edc.ion.crawler.did-type=\n# edc.ion.crawler.interval-minutes=\n# edc.ion.crawler.ion.url=\n# edc.metrics.enabled=\n# edc.metrics.executor.enabled=\n# edc.metrics.jersey.enabled=\n# edc.metrics.jetty.enabled=\n# edc.metrics.okhttp.enabled=\n# edc.metrics.system.enabled=\n# edc.negotiation.consumer.state-machine.batch-size=\n# edc.negotiation.provider.state-machine.batch-size=\n# edc.oauth.client.id=\n# edc.oauth.private.key.alias=\n# edc.oauth.provider.jwks.refresh=\n# edc.oauth.provider.jwks.url=\n# edc.oauth.public.key.alias=\n# edc.oauth.token.url=\n# edc.oauth.validation.nbf.leeway=\n# edc.receiver.http.auth-code=\n# edc.receiver.http.auth-key=\n# edc.receiver.http.endpoint=\n# edc.transfer.functions.check.endpoint=\n# edc.transfer.functions.enabled.protocols=\n# edc.transfer.functions.transfer.endpoint=\n# edc.transfer-process-store.database.name=\n# edc.transfer.state-machine.batch-size=\n# edc.vault=\n# edc.vault.certificate=\n# edc.vault.clientid=\n# edc.vault.clientsecret=\n# edc.vault.name=\n# edc.vault.tenantid=\n# edc.vault.hashicorp.url=\n# edc.vault.hashicorp.token=\n# edc.vault.hashicorp.timeout.seconds=\n# edc.webdid.doh.url=\n# edc.web.rest.cors.enabled=\n# edc.web.rest.cors.headers=\n# edc.web.rest.cors.methods=\n# edc.web.rest.cors.origins="` | EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-edc/Connector) | | customLabels | object | `{}` | Additional custom Labels to add | | edc.endpoints.control.path | string | `"/api/dataplane/control"` | The path mapping the "control" api is going to be exposed by | | edc.endpoints.control.port | string | `"9999"` | The network port, which the "control" api is going to be exposed by the container, pod and service | @@ -52,7 +54,7 @@ $ helm install my-release catenax-ng-product-edc/edc-dataplane --version 0.2.0 | ingresses[0].tls.enabled | bool | `false` | Enables TLS on the ingress resource | | ingresses[0].tls.secretName | string | `""` | If present overwrites the default secret name | | livenessProbe.enabled | bool | `true` | Whether to enable kubernetes [liveness-probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | -| logging.properties | string | `".level=INFO\norg.eclipse.dataspaceconnector.level=ALL\nhandlers=java.util.logging.ConsoleHandler\njava.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.ConsoleHandler.level=ALL\njava.util.logging.SimpleFormatter.format=[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS] [%4$-7s] %5$s%6$s%n"` | EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) | +| logging.properties | string | `".level=INFO\norg.eclipse.edc.level=ALL\nhandlers=java.util.logging.ConsoleHandler\njava.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.ConsoleHandler.level=ALL\njava.util.logging.SimpleFormatter.format=[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS] [%4$-7s] %5$s%6$s%n"` | EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) | | nameOverride | string | `""` | Overrides the charts name | | nodeSelector | object | `{}` | [Node-Selector](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) to constrain the Pod to nodes with specific labels. | | opentelemetry.properties | string | `"otel.javaagent.enabled=true\notel.javaagent.debug=false"` | opentelemetry.properties configuring the [opentelemetry agent](https://opentelemetry.io/docs/instrumentation/java/automatic/agent-config/) | diff --git a/charts/edc-dataplane/values.yaml b/charts/edc-dataplane/values.yaml index 725f10413..4f0217a19 100644 --- a/charts/edc-dataplane/values.yaml +++ b/charts/edc-dataplane/values.yaml @@ -199,7 +199,7 @@ logging: # -- EDC logging.properties configuring the [java.util.logging subsystem](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html#a1.8) properties: |- .level=INFO - org.eclipse.dataspaceconnector.level=ALL + org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL @@ -212,7 +212,7 @@ opentelemetry: otel.javaagent.debug=false configuration: - # -- EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector) + # -- EDC configuration.properties configuring aspects of the [eclipse-dataspaceconnector](https://github.com/eclipse-edc/Connector) properties: |- # edc.atomikos.checkpoint.interval= # edc.atomikos.directory= diff --git a/charts/tractusx-connector/Chart.yaml b/charts/tractusx-connector/Chart.yaml index f84f2d5a7..7057f1599 100644 --- a/charts/tractusx-connector/Chart.yaml +++ b/charts/tractusx-connector/Chart.yaml @@ -14,9 +14,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.2.0 +version: 0.3.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.2.0" +appVersion: "0.3.0" diff --git a/charts/tractusx-connector/README.md b/charts/tractusx-connector/README.md index b32eb3759..0624381bf 100644 --- a/charts/tractusx-connector/README.md +++ b/charts/tractusx-connector/README.md @@ -1,13 +1,13 @@ # tractusx-connector -![Version: 0.2.0](https://img.shields.io/badge/Version-0.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.2.0](https://img.shields.io/badge/AppVersion-0.2.0-informational?style=flat-square) +![Version: 0.3.0](https://img.shields.io/badge/Version-0.3.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.3.0](https://img.shields.io/badge/AppVersion-0.3.0-informational?style=flat-square) A Helm chart for Tractus-X Eclipse Data Space Connector ## TL;DR ```shell $ helm repo add catenax-ng-product-edc https://catenax-ng.github.io/product-edc -$ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector --version 0.2.0 +$ helm install tractusx-connector catenax-ng-product-edc/tractusx-connector --version 0.3.0 ``` ## Values @@ -50,7 +50,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | controlplane.envValueFrom | object | `{}` | | | controlplane.image.pullPolicy | string | `"IfNotPresent"` | [Kubernetes image pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy) to use | | controlplane.image.repository | string | `""` | Which derivate of the control plane to use. when left empty the deployment will select the correct image automatically | -| controlplane.image.tag | string | `"0.1.2"` | Overrides the image tag whose default is the chart appVersion | +| controlplane.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion | | controlplane.ingresses[0].annotations | object | `{}` | Additional ingress annotations to add | | controlplane.ingresses[0].certManager.clusterIssuer | string | `""` | If preset enables certificate generation via cert-manager cluster-wide issuer | | controlplane.ingresses[0].certManager.issuer | string | `""` | If preset enables certificate generation via cert-manager namespace scoped issuer | @@ -112,7 +112,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | controlplane.service.type | string | `"ClusterIP"` | [Service type](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) to expose the running application on a set of Pods as a network service. | | controlplane.tolerations | list | `[]` | | | controlplane.url.ids | string | `""` | Explicitly declared url for reaching the ids api (e.g. if ingresses not used) | -| controlplane.volumeMounts | list | `[]` | declare where to mount [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) into the container | +| controlplane.volumeMounts | list | `[]` | declare where to mount [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) into the container | | controlplane.volumes | list | `[]` | [volume](https://kubernetes.io/docs/concepts/storage/volumes/) directories | | customLabels | object | `{}` | | | daps.clientId | string | `""` | | @@ -147,7 +147,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | dataplane.envValueFrom | object | `{}` | | | dataplane.image.pullPolicy | string | `"IfNotPresent"` | [Kubernetes image pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy) to use | | dataplane.image.repository | string | `""` | Which derivate of the data plane to use. when left empty the deployment will select the correct image automatically | -| dataplane.image.tag | string | `"0.1.2"` | Overrides the image tag whose default is the chart appVersion | +| dataplane.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion | | dataplane.ingresses[0].annotations | object | `{}` | Additional ingress annotations to add | | dataplane.ingresses[0].certManager.clusterIssuer | string | `""` | If preset enables certificate generation via cert-manager cluster-wide issuer | | dataplane.ingresses[0].certManager.issuer | string | `""` | If preset enables certificate generation via cert-manager namespace scoped issuer | @@ -193,7 +193,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | dataplane.service.type | string | `"ClusterIP"` | [Service type](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) to expose the running application on a set of Pods as a network service. | | dataplane.tolerations | list | `[]` | | | dataplane.url.public | string | `""` | Explicitly declared url for reaching the public api (e.g. if ingresses not used) | -| dataplane.volumeMounts | list | `[]` | declare where to mount [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) into the container | +| dataplane.volumeMounts | list | `[]` | declare where to mount [volumes](https://kubernetes.io/docs/concepts/storage/volumes/) into the container | | dataplane.volumes | list | `[]` | [volume](https://kubernetes.io/docs/concepts/storage/volumes/) directories | | fullnameOverride | string | `""` | | | imagePullSecrets | list | `[]` | Existing image pull secret to use to [obtain the container image from private registries](https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry) | @@ -204,7 +204,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | postgresql.username | string | `""` | | | serviceAccount.annotations | object | `{}` | | | serviceAccount.create | bool | `true` | | -| serviceAccount.imagePullSecrets | list | `[]` | Existing image pull secret bound to the servic eaccount to use to [obtain the container image from private registries](https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry) | +| serviceAccount.imagePullSecrets | list | `[]` | Existing image pull secret bound to the service account to use to [obtain the container image from private registries](https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry) | | serviceAccount.name | string | `""` | | | vault.azure.certificate | string | `""` | | | vault.azure.client | string | `""` | | @@ -212,7 +212,7 @@ $ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector -- | vault.azure.name | string | `""` | | | vault.azure.secret | string | `""` | | | vault.azure.tenant | string | `""` | | -| vault.hashicorp.enabled | bool | `true` | | +| vault.hashicorp.enabled | bool | `false` | | | vault.hashicorp.healthCheck.enabled | bool | `true` | | | vault.hashicorp.healthCheck.standbyOk | bool | `true` | | | vault.hashicorp.paths.health | string | `"/v1/sys/health"` | | diff --git a/charts/tractusx-connector/README.md.gotmpl b/charts/tractusx-connector/README.md.gotmpl index 51eecb90b..47ef15755 100644 --- a/charts/tractusx-connector/README.md.gotmpl +++ b/charts/tractusx-connector/README.md.gotmpl @@ -11,7 +11,7 @@ ## TL;DR ```shell $ helm repo add catenax-ng-product-edc https://catenax-ng.github.io/product-edc -$ helm install tractus-x-connector catenax-ng-product-edc/tractus-x-connector --version {{ .Version }} +$ helm install tractusx-connector catenax-ng-product-edc/tractusx-connector --version {{ .Version }} ``` {{ template "chart.maintainersSection" . }} diff --git a/charts/tractusx-connector/templates/_helpers.tpl b/charts/tractusx-connector/templates/_helpers.tpl index 6d821a6cf..74aa6a5d1 100644 --- a/charts/tractusx-connector/templates/_helpers.tpl +++ b/charts/tractusx-connector/templates/_helpers.tpl @@ -132,7 +132,7 @@ Control IDS URL Control IDS URL */}} {{- define "txdc.controlplane.url.validation" -}} -{{- printf "http://%s-controlplane:%v%s" ( include "txdc.fullname" $ ) $.Values.controlplane.endpoints.validation.port $.Values.controlplane.endpoints.validation.path -}} +{{- printf "http://%s-controlplane:%v%s/token" ( include "txdc.fullname" $ ) $.Values.controlplane.endpoints.validation.port $.Values.controlplane.endpoints.validation.path -}} {{- end }} {{/* diff --git a/charts/tractusx-connector/templates/deployment-controlplane.yaml b/charts/tractusx-connector/templates/deployment-controlplane.yaml index 27ac5d7e2..ccc0cbf00 100644 --- a/charts/tractusx-connector/templates/deployment-controlplane.yaml +++ b/charts/tractusx-connector/templates/deployment-controlplane.yaml @@ -39,7 +39,7 @@ spec: {{- toYaml .Values.controlplane.securityContext | nindent 12 }} {{- if .Values.controlplane.image.repository }} image: "{{ .Values.controlplane.image.repository }}:{{ .Values.controlplane.image.tag | default .Chart.AppVersion }}" - {{- else if and .Values.postgresql.enabled (not .Values.vault.azure.enabled) }} + {{- else if and .Values.postgresql.enabled .Values.vault.hashicorp.enabled }} image: "ghcr.io/catenax-ng/product-edc/edc-controlplane-postgresql-hashicorp-vault:{{ .Values.controlplane.image.tag | default .Chart.AppVersion }}" {{- else if and .Values.postgresql.enabled .Values.vault.azure.enabled }} image: "ghcr.io/catenax-ng/product-edc/edc-controlplane-postgresql-vault:{{ .Values.controlplane.image.tag | default .Chart.AppVersion }}" @@ -97,7 +97,7 @@ spec: ## DAPS CONFIGURATION ## ######################## - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/iam/oauth2/oauth2-core + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/iam/oauth2/oauth2-core - name: EDC_OAUTH_CLIENT_ID value: {{ .Values.daps.clientId | required ".Values.daps.clientId is required" | quote }} - name: EDC_OAUTH_PROVIDER_JWKS_URL @@ -118,10 +118,21 @@ spec: value: {{ .Values.controlplane.endpoints.default.port | quote }} - name: "WEB_HTTP_DEFAULT_PATH" value: {{ .Values.controlplane.endpoints.default.path | quote }} + {{- if or (eq (substr 0 3 .Values.controlplane.image.tag) "0.1") (eq (substr 0 3 .Values.controlplane.image.tag) "0.2") }} + # WEB_HTTP_DATA_PORT is renamed to WEB_HTTP_MANAGEMENT_PORT from version 0.2.1 and newer + # we will keep both settings for downward capabilities - name: "WEB_HTTP_DATA_PORT" value: {{ .Values.controlplane.endpoints.data.port | quote }} + # WEB_HTTP_DATA_PATH is renamed to WEB_HTTP_MANAGEMENT_PATH from version 0.2.1 and newer + # we will keep both settings for downward capabilities - name: "WEB_HTTP_DATA_PATH" value: {{ .Values.controlplane.endpoints.data.path | quote }} + {{- else }} + - name: "WEB_HTTP_MANAGEMENT_PORT" + value: {{ .Values.controlplane.endpoints.data.port | quote }} + - name: "WEB_HTTP_MANAGEMENT_PATH" + value: {{ .Values.controlplane.endpoints.data.path | quote }} + {{- end }} - name: "WEB_HTTP_VALIDATION_PORT" value: {{ .Values.controlplane.endpoints.validation.port | quote }} - name: "WEB_HTTP_VALIDATION_PATH" @@ -168,7 +179,7 @@ spec: ## POSTGRESQL ## ################ - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql/asset-index-sql + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql/asset-index-sql - name: "EDC_DATASOURCE_ASSET_NAME" value: "asset" - name: "EDC_DATASOURCE_ASSET_USER" @@ -178,7 +189,7 @@ spec: - name: "EDC_DATASOURCE_ASSET_URL" value: {{ .Values.postgresql.jdbcUrl | required ".Values.postgresql.jdbcUrl is required" | quote }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql/contract-definition-store-sql + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql/contract-definition-store-sql - name: "EDC_DATASOURCE_CONTRACTDEFINITION_NAME" value: "contractdefinition" - name: "EDC_DATASOURCE_CONTRACTDEFINITION_USER" @@ -188,7 +199,7 @@ spec: - name: "EDC_DATASOURCE_CONTRACTDEFINITION_URL" value: {{ .Values.postgresql.jdbcUrl | required ".Values.postgresql.jdbcUrl is required" | quote }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql/contract-negotiation-store-sql + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql/contract-negotiation-store-sql - name: "EDC_DATASOURCE_CONTRACTNEGOTIATION_NAME" value: "contractnegotiation" - name: "EDC_DATASOURCE_CONTRACTNEGOTIATION_USER" @@ -198,7 +209,7 @@ spec: - name: "EDC_DATASOURCE_CONTRACTNEGOTIATION_URL" value: {{ .Values.postgresql.jdbcUrl | required ".Values.postgresql.jdbcUrl is required" | quote }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql/policy-store-sql + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql/policy-store-sql - name: "EDC_DATASOURCE_POLICY_NAME" value: "policy" - name: "EDC_DATASOURCE_POLICY_USER" @@ -208,7 +219,7 @@ spec: - name: "EDC_DATASOURCE_POLICY_URL" value: {{ .Values.postgresql.jdbcUrl | required ".Values.postgresql.jdbcUrl is required" | quote }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql/transfer-process-store-sql + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/store/sql/transfer-process-store-sql - name: "EDC_DATASOURCE_TRANSFERPROCESS_NAME" value: "transferprocess" - name: "EDC_DATASOURCE_TRANSFERPROCESS_USER" @@ -232,17 +243,17 @@ spec: value: "HttpProxy,AmazonS3" - name: "EDC_DATAPLANE_SELECTOR_DEFAULTPLANE_PROPERTIES" value: |- - {{ printf "{ \"publicApiUrl\": \"%s/\" }" (include "txdc.dataplane.url.public" . ) }} + {{ printf "{ \"publicApiUrl\": \"%s\" }" (include "txdc.dataplane.url.public" . ) }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/data-plane-transfer + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/data-plane-transfer - name: "EDC_TRANSFER_PROXY_ENDPOINT" - value: {{ include "txdc.dataplane.url.public" . }}/ + value: {{ include "txdc.dataplane.url.public" . }} - name: "EDC_TRANSFER_PROXY_TOKEN_SIGNER_PRIVATEKEY_ALIAS" value: {{ .Values.vault.secretNames.transferProxyTokenSignerPrivateKey | quote }} - name: "EDC_TRANSFER_PROXY_TOKEN_VERIFIER_PUBLICKEY_ALIAS" value: {{ .Values.vault.secretNames.transferProxyTokenSignerPublicKey | quote }} - # see extension https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/http-receiver + # see extension https://github.com/eclipse-edc/Connector/tree/main/extensions/control-plane/http-receiver - name: "EDC_RECEIVER_HTTP_ENDPOINT" value: {{ .Values.backendService.httpProxyTokenReceiverUrl | required ".Values.backendService.httpProxyTokenReceiverUrl is required" | quote }} @@ -306,13 +317,13 @@ spec: {{- end }} {{- if and (or .Values.controlplane.envSecretNames .Values.controlplane.envConfigMapNames) (or (gt (len .Values.controlplane.envSecretNames) 0) (gt (len .Values.controlplane.envConfigMapNames) 0)) }} envFrom: - {{- with .Values.controlplane.envSecretNames }} + {{- range $value := .Values.controlplane.envSecretNames }} - secretRef: - name: {{ . | quote }} + name: {{ $value | quote }} {{- end }} - {{- with .Values.controlplane.envConfigMapNames }} + {{- range $value := .Values.controlplane.envConfigMapNames }} - configMapRef: - name: {{ . | quote }} + name: {{ $value | quote }} {{- end }} {{- end }} volumeMounts: diff --git a/charts/tractusx-connector/templates/deployment-dataplane.yaml b/charts/tractusx-connector/templates/deployment-dataplane.yaml index 4221b5a35..b7c57e166 100644 --- a/charts/tractusx-connector/templates/deployment-dataplane.yaml +++ b/charts/tractusx-connector/templates/deployment-dataplane.yaml @@ -169,24 +169,24 @@ spec: ###################################### ## Additional environment variables ## ###################################### - {{- range $key, $value := .Values.controlplane.envValueFrom }} + {{- range $key, $value := .Values.dataplane.envValueFrom }} - name: {{ $key | quote }} valueFrom: {{- tpl (toYaml $value) $ | nindent 16 }} {{- end }} - {{- range $key, $value := .Values.controlplane.env }} + {{- range $key, $value := .Values.dataplane.env }} - name: {{ $key | quote }} value: {{ $value | quote }} {{- end }} {{- if and (or .Values.dataplane.envSecretNames .Values.dataplane.envConfigMapNames) (or (gt (len .Values.dataplane.envSecretNames) 0) (gt (len .Values.dataplane.envConfigMapNames) 0)) }} envFrom: - {{- with .Values.controlplane.envSecretNames }} + {{- range $value := .Values.dataplane.envSecretNames }} - secretRef: - name: {{ . | quote }} - {{- end }} - {{- with .Values.controlplane.envConfigMapNames }} + name: {{ $value | quote }} + {{- end }} + {{- range $value := .Values.dataplane.envConfigMapNames }} - configMapRef: - name: {{ . | quote }} + name: {{ $value | quote }} {{- end }} {{- end }} volumeMounts: diff --git a/charts/tractusx-connector/values.yaml b/charts/tractusx-connector/values.yaml index 2c1163108..83502e3d3 100644 --- a/charts/tractusx-connector/values.yaml +++ b/charts/tractusx-connector/values.yaml @@ -18,7 +18,7 @@ controlplane: # -- [Kubernetes image pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy) to use pullPolicy: IfNotPresent # -- Overrides the image tag whose default is the chart appVersion - tag: "0.1.2" + tag: "" initContainers: [] debug: enabled: false @@ -264,7 +264,7 @@ dataplane: # -- [Kubernetes image pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy) to use pullPolicy: IfNotPresent # -- Overrides the image tag whose default is the chart appVersion - tag: "0.1.2" + tag: "" initContainers: [] debug: enabled: false @@ -459,7 +459,7 @@ postgresql: vault: hashicorp: - enabled: true + enabled: false url: "" token: "" timeout: 30 @@ -501,5 +501,5 @@ serviceAccount: # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: "" - # -- Existing image pull secret bound to the servic eaccount to use to [obtain the container image from private registries](https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry) + # -- Existing image pull secret bound to the service account to use to [obtain the container image from private registries](https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry) imagePullSecrets: [] diff --git a/docs/README.md b/docs/README.md index b5bb8d338..ebcc9942c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # Product EDC -The Catena-X Product EDC Repository creates runnable applications out of EDC extensions from the [Eclipse DataSpace Connector](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector) repository. +The Catena-X Product EDC Repository creates runnable applications out of EDC extensions from the [Eclipse DataSpace Connector](https://github.com/eclipse-edc/Connector) repository. When running a EDC connector from the Product EDC repository there are three setups to choose from. They only vary by using different extensions for - Resolving of Connector-Identities @@ -9,26 +9,33 @@ When running a EDC connector from the Product EDC repository there are three set ## Connector Setup -The three supported setups are. +The four supported setups are. - Setup 1: In Memory & Azure Vault - [Control Plane](../edc-controlplane/edc-controlplane-memory/README.md) - - [IDS DAPS Extensions](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/iam/oauth2/daps) + - [IDS DAPS Extensions](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/iam/oauth2/daps) - In Memory Persistence done by using no extension - - [Azure Key Vault Extension](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/vault/azure-vault) + - [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-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/vault/azure-vault) + - [Azure Key Vault Extension](https://github.com/eclipse-edc/Connector/tree/main/extensions/common/vault/azure-vault) +- Setup 2: In Memory & HashiCorp Vault +- [Control Plane](../edc-controlplane/edc-controlplane-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 + - [HashiCorp Vault Extension](../edc-extensions/hashicorp-vault/README.md) +- [Data Plane](../edc-dataplane/edc-dataplane-azure-vault/README.md) + - [HashiCorp Vault Extension](../edc-extensions/hashicorp-vault/README.md) - Setup 2: PostgreSQL & Azure Vault - [Control Plane](../edc-controlplane/edc-controlplane-postgresql/README.md) - - [IDS DAPS Extensions](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/iam/oauth2/daps) - - [PostgreSQL Persistence Extensions](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql) - - [Azure Key Vault Extension](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/vault/azure-vault) + - [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-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/vault/azure-vault) + - [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-dataspaceconnector/DataSpaceConnector/tree/main/extensions/common/iam/oauth2/daps) - - [PostgreSQL Persistence Extensions](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/store/sql) + - [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) @@ -42,13 +49,14 @@ The three supported setups are. - [Application: Data Plane](../edc-dataplane) - [Extension: Business Partner Numbers](../edc-extensions/business-partner-validation/README.md) - [Example: Connector Configuration (Helm)](../edc-tests/src/main/resources/deployment/helm/all-in-one/README.md) -- [Example: Data Transfer](./data-transfer/Transfer%20Data.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-dataspaceconnector/DataSpaceConnector/blob/main/docs/developer/architecture/domain-model.md) -- [EDC Open API Spec](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/blob/main/resources/openapi/openapi.yaml) -- [HTTP Receiver Extension](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/extensions/control-plane/http-receiver) +- [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) **Catena-X** diff --git a/docs/development/postman/collection.json b/docs/development/postman/collection.json index 1e002e92f..5f44e6ee5 100644 --- a/docs/development/postman/collection.json +++ b/docs/development/postman/collection.json @@ -1,8 +1,9 @@ { "info": { - "_postman_id": "0e923447-f09f-4cd9-8d2f-5bd4a09d378e", + "_postman_id": "b61c0075-e360-45df-9756-c9bc432fe76a", "name": "EDC", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "6134257" }, "item": [ { @@ -393,7 +394,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{CONSUMER_DATAMGMT_URL}}/data/catalog?providerUrl={{PROVIDER_IDS_URL}}/api/v1/ids/data", + "raw": "{{CONSUMER_DATAMGMT_URL}}/data/catalog?providerUrl={{PROVIDER_IDS_URL}}/api/v1/ids/data&size=50", "host": [ "{{CONSUMER_DATAMGMT_URL}}" ], @@ -405,7 +406,39 @@ { "key": "providerUrl", "value": "{{PROVIDER_IDS_URL}}/api/v1/ids/data" + }, + { + "key": "size", + "value": "50" + } + ] + } + }, + "response": [] + }, + { + "name": "Query Catalog", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"providerUrl\": \"{{PROVIDER_IDS_URL}}/api/v1/ids/data\",\r\n \"querySpec\": {\r\n \"offset\": 0,\r\n \"limit\": 100,\r\n \"filter\": \"\",\r\n \"range\": {\r\n \"from\": 0,\r\n \"to\": 100\r\n },\r\n \"sortOrder\": \"ASC\",\r\n \"sortField\": \"\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" } + } + }, + "url": { + "raw": "{{CONSUMER_DATAMGMT_URL}}/data/catalog/request", + "host": [ + "{{CONSUMER_DATAMGMT_URL}}" + ], + "path": [ + "data", + "catalog", + "request" ] } }, @@ -414,34 +447,28 @@ { "name": "Negotation", "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, { "listen": "test", "script": { "exec": [ - "pm.test(\"Body matches string\", function () {", - " var jsonData = pm.response.json();", - " pm.collectionVariables.set(\"AGREEMENT_ID\", jsonData.contractAgreementId);", - "});" + "" ], "type": "text/javascript" } } ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, "request": { "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"connectorId\": \"foo\",\n \"connectorAddress\": \"{{PROVIDER_IDS_URL}}/api/v1/ids/data\",\n \"offer\": {\n \"offerId\": \"{{POLICY_ID}}:foo\",\n \"assetId\": \"{{ASSET_ID}}\",\n \"policy\": {\n \"prohibitions\": [],\n \"obligations\": [],\n \"permissions\": [\n {\n \"edctype\": \"dataspaceconnector:permission\",\n \"action\": {\n \"type\": \"USE\"\n },\n \"target\": \"{{ASSET_ID}}\",\n \"constraints\": []\n }\n ]\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, "url": { "raw": "{{CONSUMER_DATAMGMT_URL}}/data/contractnegotiations/{{NEGOTIATION_ID}}", "host": [ @@ -478,7 +505,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"connectorId\": \"foo\",\n \"connectorAddress\": \"{{PROVIDER_IDS_URL}}/api/v1/ids/data\",\n \"offer\": {\n \"offerId\": \"{{POLICY_ID}}:foo\",\n \"assetId\": \"{{ASSET_ID}}\",\n \"policy\": {\n \"prohibitions\": [],\n \"obligations\": [],\n \"permissions\": [\n {\n \"edctype\": \"dataspaceconnector:permission\",\n \"action\": {\n \"type\": \"USE\"\n },\n \"target\": \"{{ASSET_ID}}\",\n \"constraints\": []\n }\n ]\n }\n }\n}", + "raw": "{\n \"connectorId\": \"foo\",\n \"connectorAddress\": \"{{PROVIDER_IDS_URL}}/api/v1/ids/data\",\n \"offer\": {\n \"offerId\": \"{{CONTRACT_DEFINITION_ID}}:foo\",\n \"assetId\": \"{{ASSET_ID}}\",\n \"policy\": {\n \"prohibitions\": [],\n \"obligations\": [],\n \"permissions\": [\n {\n \"edctype\": \"dataspaceconnector:permission\",\n \"action\": {\n \"type\": \"USE\"\n },\n \"target\": \"{{ASSET_ID}}\",\n \"constraints\": []\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -633,13 +660,13 @@ "response": [] }, { - "name": "Transfer", + "name": "Transfer dynamic http receiver", "event": [ { "listen": "prerequest", "script": { "exec": [ - "" + "pm.collectionVariables.set(\"TRANSFER_ID\", Math.random());" ], "type": "text/javascript" } @@ -648,47 +675,74 @@ "listen": "test", "script": { "exec": [ - "" + "pm.test(\"Body matches string\", function () {", + " var jsonData = pm.response.json();", + " pm.collectionVariables.set(\"TRANSFER_PROCESS_ID\", jsonData.id);", + "});" ], "type": "text/javascript" } } ], "request": { - "method": "GET", + "method": "POST", "header": [], + "body": { + "mode": "raw", + "raw": "{ \"id\": \"{{TRANSFER_ID}}\",\n \"connectorId\": \"foo\", \n \"connectorAddress\": \"{{PROVIDER_IDS_URL}}/api/v1/ids/data\", \n \"contractId\": \"{{AGREEMENT_ID}}\", \n \"assetId\": \"{{ASSET_ID}}\",\n \"managedResources\": \"false\", \n \"dataDestination\": { \"type\": \"HttpProxy\" },\n \"properties\": {\n \"receiver.http.endpoint\": \"{{BACKEND_SERVICE}}\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, "url": { - "raw": "{{CONSUMER_DATAMGMT_URL}}/data/transferprocess/{{TRANSFER_PROCESS_ID}}", + "raw": "{{CONSUMER_DATAMGMT_URL}}/data/transferprocess", "host": [ "{{CONSUMER_DATAMGMT_URL}}" ], "path": [ "data", - "transferprocess", - "{{TRANSFER_PROCESS_ID}}" + "transferprocess" ] } }, "response": [] }, { - "name": "Data (Test Setup Only)", + "name": "Transfer", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], "request": { "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/octet-stream", - "type": "default" - } - ], + "header": [], "url": { - "raw": "{{CONSUMER_BACKEND_URL}}/{{TRANSFER_ID}}", + "raw": "{{CONSUMER_DATAMGMT_URL}}/data/transferprocess/{{TRANSFER_PROCESS_ID}}", "host": [ - "{{CONSUMER_BACKEND_URL}}" + "{{CONSUMER_DATAMGMT_URL}}" ], "path": [ - "{{TRANSFER_ID}}" + "data", + "transferprocess", + "{{TRANSFER_PROCESS_ID}}" ] } }, @@ -700,7 +754,7 @@ "apikey": [ { "key": "value", - "value": "password", + "value": "", "type": "string" }, { @@ -733,20 +787,15 @@ "variable": [ { "key": "CONSUMER_DATAMGMT_URL", - "value": "http://192.168.49.2:31639" + "value": "https://sokrates-txdc.int.demo.catena-x.net" }, { "key": "PROVIDER_IDS_URL", - "value": "http://plato-edc-controlplane:8282" + "value": "https://plato-txdc.int.demo.catena-x.net" }, { "key": "PROVIDER_DATAMGMT_URL", - "value": "http://192.168.49.2:31495" - }, - { - "key": "CONSUMER_BACKEND_URL", - "value": "http://192.168.49.2:31612", - "type": "default" + "value": "https://plato-txdc.int.demo.catena-x.net" }, { "key": "ASSET_ID", @@ -793,6 +842,11 @@ { "key": "TRANSFER_PROCESS_ID", "value": "" + }, + { + "key": "BACKEND_SERVICE", + "value": "http://backend:8080", + "type": "string" } ] } \ No newline at end of file diff --git a/docs/release-notes/Version 0.1.5.md b/docs/release-notes/Version 0.1.5.md new file mode 100644 index 000000000..37bac446f --- /dev/null +++ b/docs/release-notes/Version 0.1.5.md @@ -0,0 +1,25 @@ +# Release Notes Version 0.1.5 + +13.02.2023 + +## 0. Summary + +1. [Version updates](#1-version-updates) + - Use patched EDC version: 0.0.1-20220922.2-SNAPSHOT +2. [Extensions](#2-extensions) + - [2.1 Data Encryption Extension](#22-data-encryption-extension) + - Fixed usage of a blocking algorithm + +## 1. Version Updates + +## 1.1 Use patched EDC version: 0.0.1-20220922.2-SNAPSHOT + +The version has been updated to the patched version `0.0.1-20220922.2-SNAPSHOT` that brings in a bugfix regarding the +catalog pagination. [GitHub issue](https://github.com/eclipse-edc/Connector/issues/2008) + +## 2. Extensions + +### 2.2 Data Encryption Extension + +The encryption of the `EndpointDataReference` took up to 3 minutes unter certain circumstances. +This was fixed by using a not blocking algorithm and setting the Java CMD flag `java.security.egd` correctly. \ No newline at end of file diff --git a/docs/samples/Local TXDC Setup.md b/docs/samples/Local TXDC Setup.md new file mode 100644 index 000000000..8117dc05d --- /dev/null +++ b/docs/samples/Local TXDC Setup.md @@ -0,0 +1,124 @@ +# Local TXDC Setup + +This document describes how to set up two TXDConnector instances locally. The Supporting Infrastructure Deployment, used +by this example, must never be used productively. The deployment of the two TXDConnector instances, done by this example, +is not suitable for productive deployment scenarios. + +## Prerequisites + +[![Helm][helm-shield]][helm-url] + +[![Kubernetes][kubernets-shield]][kubernets-url] + +## Local Deployment + +The Local TXDC Setup consists of three separate deployments. The Supporting Infrastructure, that is required to +run connectors, and two different TXDC Connector instances, that can communicate with each other. + +- [TXDC Supporting Infrastructure](../../edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md) +- [TXDC Connector](../../charts/tractusx-connector/README.md) Plato +- [TXDC Connector](../../charts/tractusx-connector/README.md) Sokrates + +[helm-shield]: https://img.shields.io/badge/Helm-URL-lightgrey + +[helm-url]: https://helm.sh + +[kubernets-shield]: https://img.shields.io/badge/Kubernetes-URL-lightgrey + +[kubernets-url]: https://kubernetes.io/ + +### Supporting Infrastructure + +Before the connectors can be setup, the Supporting Infrastructure must be in place. It comes with pre-configured everything +to run two connectors independently. + +For this local test scenario, +the [Supporting Infrastructure](../../edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md) +of the TXDC Business Tests can be used. + +Install the TXDC Supporting Infrastructure by running the following command from the project root directory. The Minio +set can be skipped, as it's only used by AWS S3 Transfer Business Tests. Also, the PostgreSQL Database is not really +mandatory to try out the EDC. So it can be disabled as well. + +```sh +helm dependency update edc-tests/src/main/resources/deployment/helm/supporting-infrastructure +``` + +```sh +helm install infrastructure edc-tests/src/main/resources/deployment/helm/supporting-infrastructure \ + --namespace cx \ + --create-namespace \ + --set install.minio=false \ + --set install.postgresql=false +``` + +### Plato Connector + +After the supporting infrastructure is deployed the Plato Connector can be added. The Supporting Infrastructure +Deployment has a DAPS Client and Vault Secrets configured accordingly. So that the TXDConnector can use them directly. + +Install Plato by running the following command from the project root directory. + +```sh +helm install plato charts/tractusx-connector \ + --namespace cx \ + --create-namespace \ + --set fullnameOverride=plato \ + --set controlplane.image.tag=0.2.0 \ + --set controlplane.service.type=NodePort \ + --set controlplane.endpoints.data.authKey=password \ + --set vault.hashicorp.enabled=true \ + --set vault.hashicorp.url=http://vault:8200 \ + --set vault.hashicorp.token=root \ + --set vault.secretNames.transferProxyTokenSignerPublicKey=plato/daps/my-plato-daps-crt \ + --set vault.secretNames.transferProxyTokenSignerPrivateKey=plato/daps/my-plato-daps-key \ + --set vault.secretNames.transferProxyTokenEncryptionAesKey=plato/data-encryption-aes-keys \ + --set vault.secretNames.dapsPrivateKey=plato/daps/my-plato-daps-key \ + --set vault.secretNames.dapsPublicKey=plato/daps/my-plato-daps-crt \ + --set daps.url=http://ids-daps:4567 \ + --set daps.clientId=99:83:A7:17:86:FF:98:93:CE:A0:DD:A1:F1:36:FA:F6:0F:75:0A:23:keyid:99:83:A7:17:86:FF:98:93:CE:A0:DD:A1:F1:36:FA:F6:0F:75:0A:23 \ + --set backendService.httpProxyTokenReceiverUrl=http://backend:8080 +``` + +The different settings are explained in the [TXDC Connector](../../charts/tractusx-connector/README.md) documentation. +Basically this deployment overrides the full name, to avoid naming conflicts, and sets a NodePort, to access the +containers from outside the local Kubernetes cluster. Then it configures a DAPS instance and the corresponding vault, +where the DAPS secrets are persisted, so that the connector has its own identity. + +### Sokrates Connector + +After Plato is set up the same can be done for Sokrates. The main difference will be, that Sokrates uses another DAPS +Client ID with different public-/private keys. + +Install Sokrates by running the following command from the project root directory. + +```shell +helm install sokrates charts/tractusx-connector \ + --namespace cx \ + --create-namespace \ + --set fullnameOverride=sokrates \ + --set controlplane.image.tag=0.2.0 \ + --set controlplane.service.type=NodePort \ + --set controlplane.endpoints.data.authKey=password \ + --set vault.hashicorp.enabled=true \ + --set vault.hashicorp.url=http://vault:8200 \ + --set vault.hashicorp.token=root \ + --set vault.secretNames.transferProxyTokenSignerPublicKey=sokrates/daps/my-sokrates-daps-crt \ + --set vault.secretNames.transferProxyTokenSignerPrivateKey=sokrates/daps/my-sokrates-daps-key \ + --set vault.secretNames.transferProxyTokenEncryptionAesKey=sokrates/data-encryption-aes-keys \ + --set vault.secretNames.dapsPrivateKey=sokrates/daps/my-sokrates-daps-key \ + --set vault.secretNames.dapsPublicKey=sokrates/daps/my-sokrates-daps-crt \ + --set daps.url=http://ids-daps:4567 \ + --set daps.clientId=E7:07:2D:74:56:66:31:F0:7B:10:EA:B6:03:06:4C:23:7F:ED:A6:65:keyid:E7:07:2D:74:56:66:31:F0:7B:10:EA:B6:03:06:4C:23:7F:ED:A6:65 \ + --set backendService.httpProxyTokenReceiverUrl=http://backend:8080 +``` + +## Uninstall + +```shell +helm uninstall --namespace cx infrastructure +helm uninstall --namespace cx plato +helm uninstall --namespace cx sokrates +``` + +> To try out the local setup, have a look at the [Transfer Example Documentation](Transfer%20Data.md) \ No newline at end of file diff --git a/docs/samples/README.md b/docs/samples/README.md new file mode 100644 index 000000000..fcd5fe8bd --- /dev/null +++ b/docs/samples/README.md @@ -0,0 +1,7 @@ +# Samples + +In this folder are listed some documents that will help you setting up a connector execute some use cases. + +- [Local setup](./Local%20TXDC%20Setup.md) +- [Transfer data](./Transfer%20Data.md) +- [Data Plane HTTP OAuth2](./data-plane-http-oauth2.md) diff --git a/docs/data-transfer/Transfer Data.md b/docs/samples/Transfer Data.md similarity index 50% rename from docs/data-transfer/Transfer Data.md rename to docs/samples/Transfer Data.md index 43ca66ebe..f07f685f9 100644 --- a/docs/data-transfer/Transfer Data.md +++ b/docs/samples/Transfer Data.md @@ -3,36 +3,173 @@ 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. +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 0](#0--optional--local-setup). **Contents** -1. Setup Data Offer -2. Request Contract Offers -3. Negotiate Contract -4. Transfer Data -5. Verify Data Transfer +0. [(optional) Local Setup](#0--optional--local-setup) +1. [Setup Data Offer](#1-setup-data-offer) +2. [Request Contract Offers](#2-request-contract-offer-catalog) +3. [Negotiate Contract](#3-negotiate-contract) +4. [Transfer Data](#4-transfer-data) +5. [Verify Data Transfer](#5-verify-data-transfer) + +## 0. (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: + +```shell +|-------------|-----------------------|-----------------|---------------------------| +| 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. + +```shell +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` ## 1. 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-dataspaceconnector/DataSpaceConnector/blob/main/docs/developer/architecture/domain-model.md)). +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) **Run** - 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" \ +curl -X POST "${BOB_DATAMGMT_URL}/data/assets" \ --header 'X-Api-Key: password' \ --header 'Content-Type: application/json' \ --data '{ @@ -73,7 +210,6 @@ curl -X POST "${BOB_DATAMGMT_URL}/data/policydefinitions" \ -s -o /dev/null -w 'Response Code: %{http_code}\n' ``` - ```bash curl -X POST "${BOB_DATAMGMT_URL}/data/contractdefinitions" \ --header 'X-Api-Key: password' \ @@ -157,7 +293,6 @@ export NEGOTIATION_ID=$( \ -s | jq -r '.id') ``` - ```bash curl -X GET "${ALICE_DATAMGMT_URL}/data/contractnegotiations/${NEGOTIATION_ID}" \ --header 'X-Api-Key: password' \ @@ -201,7 +336,7 @@ export TRANSFER_ID=$( \ ``` ```bash -curl -X GET "$ALICE_DATAMGMT_URL/data/transferprocess/$TRANSFER_ID" \ +curl -X GET "${ALICE_DATAMGMT_URL}/data/transferprocess/${TRANSFER_ID}" \ --header 'X-Api-Key: password' \ --header 'Content-Type: application/json' \ -s | jq diff --git a/docs/samples/data-plane-http-oauth2.md b/docs/samples/data-plane-http-oauth2.md new file mode 100644 index 000000000..f757b703a --- /dev/null +++ b/docs/samples/data-plane-http-oauth2.md @@ -0,0 +1,7 @@ +# Data Plane HTTP OAuth2 + +The Data Plane HTTP OAuth2 extension permits the data-plane to fetch the data requested from a consumer from an HTTP server +with an OAuth2 authentication layer. + +For further documentation, please refer to the extension README: +https://github.com/eclipse-edc/Connector/tree/main/extensions/data-plane/data-plane-http-oauth2-core diff --git a/docs/data-transfer/diagrams/transfer_sequence_1.png b/docs/samples/diagrams/transfer_sequence_1.png similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_1.png rename to docs/samples/diagrams/transfer_sequence_1.png diff --git a/docs/data-transfer/diagrams/transfer_sequence_1.puml b/docs/samples/diagrams/transfer_sequence_1.puml similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_1.puml rename to docs/samples/diagrams/transfer_sequence_1.puml diff --git a/docs/data-transfer/diagrams/transfer_sequence_2.png b/docs/samples/diagrams/transfer_sequence_2.png similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_2.png rename to docs/samples/diagrams/transfer_sequence_2.png diff --git a/docs/data-transfer/diagrams/transfer_sequence_2.puml b/docs/samples/diagrams/transfer_sequence_2.puml similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_2.puml rename to docs/samples/diagrams/transfer_sequence_2.puml diff --git a/docs/data-transfer/diagrams/transfer_sequence_3.png b/docs/samples/diagrams/transfer_sequence_3.png similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_3.png rename to docs/samples/diagrams/transfer_sequence_3.png diff --git a/docs/data-transfer/diagrams/transfer_sequence_3.puml b/docs/samples/diagrams/transfer_sequence_3.puml similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_3.puml rename to docs/samples/diagrams/transfer_sequence_3.puml diff --git a/docs/data-transfer/diagrams/transfer_sequence_4.png b/docs/samples/diagrams/transfer_sequence_4.png similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_4.png rename to docs/samples/diagrams/transfer_sequence_4.png diff --git a/docs/data-transfer/diagrams/transfer_sequence_4.puml b/docs/samples/diagrams/transfer_sequence_4.puml similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_4.puml rename to docs/samples/diagrams/transfer_sequence_4.puml diff --git a/docs/data-transfer/diagrams/transfer_sequence_5.png b/docs/samples/diagrams/transfer_sequence_5.png similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_5.png rename to docs/samples/diagrams/transfer_sequence_5.png diff --git a/docs/data-transfer/diagrams/transfer_sequence_5.puml b/docs/samples/diagrams/transfer_sequence_5.puml similarity index 100% rename from docs/data-transfer/diagrams/transfer_sequence_5.puml rename to docs/samples/diagrams/transfer_sequence_5.puml diff --git a/edc-controlplane/README.md b/edc-controlplane/README.md index 033852b1c..01017989c 100644 --- a/edc-controlplane/README.md +++ b/edc-controlplane/README.md @@ -32,7 +32,7 @@ As it is possible to configure EDC settings via environment variables, one way t Please have a look at the open issues in the open source repository. The list below might not be maintained well and only contains the most important issues. -EDC Github Repository https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues +EDC Github Repository https://github.com/eclipse-edc/Connector/issues --- @@ -42,30 +42,8 @@ EDC commit the Product-EDC uses. --- **Persistence** -- ContractDefinition-AssetSelector of InMemory Connector selects 50 Asset max.([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1779)) - -**Negotiation** - -- Connector blocks negotiation when `rightExpression` of a `Constraint` contains multiple elements/an array ([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/2026)) - -- Provider must pass its own `ContractPolicy` for the negotiation to succeed ([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1975)) - -**Transfer** -- Transfer Process remains 'InProgress' on provider side ([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1287)) - -**Data Management API** - -- Pagination is not correctly applied during catalog request ([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/2008)) - -**Configuration** -- Contract negotiation not working when `web.http.ids.path` is configured/changed ([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1249)) - - **Workaround:** Don't configure `web.http.ids.path`, so that the default path is used. - -- HttpProxy Transfer: Provider Control Plane spams Consumer Control Plane + HttpProxy Backend Application with requests([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1840)) - - **Possible Workaround:** Reconfigure data plane URL from `http://dataplane:8185/api/public` to `http://dataplane:8185/api/public/` - -- Non-telling logs when `edc.transfer.proxy.token.verifier.publickey.alias` setting is missing([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1889)) +- ContractDefinition-AssetSelector of InMemory Connector selects 50 Asset max.([issue](https://github.com/eclipse-edc/Connector/issues/1779)) **Other** -- Non-IDS-Transformable-ContractDefinition causes connector to be unable to send out self-descriptions/catalogs([issue](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1265)) +- Non-IDS-Transformable-ContractDefinition causes connector to be unable to send out self-descriptions/catalogs([issue](https://github.com/eclipse-edc/Connector/issues/1265)) - **Workaround:** Delete non-transformable ContractDefinition or Policy. diff --git a/edc-controlplane/edc-controlplane-base/pom.xml b/edc-controlplane/edc-controlplane-base/pom.xml index 73ad7647d..d668c9b60 100644 --- a/edc-controlplane/edc-controlplane-base/pom.xml +++ b/edc-controlplane/edc-controlplane-base/pom.xml @@ -24,7 +24,7 @@ edc-controlplane org.eclipse.tractusx.edc - 0.2.0 + 0.3.0 4.0.0 @@ -75,146 +75,129 @@ org.eclipse.tractusx.edc.extensions - custom-jsonld + control-plane-adapter + + + org.eclipse.tractusx.edc.extensions + provision-additional-headers - org.eclipse.dataspaceconnector + org.eclipse.edc control-plane-core - org.eclipse.dataspaceconnector - filesystem-configuration + org.eclipse.edc + configuration-filesystem - org.eclipse.dataspaceconnector + org.eclipse.edc auth-tokenbased - org.eclipse.dataspaceconnector + org.eclipse.edc oauth2-core - org.eclipse.dataspaceconnector - iam-daps + org.eclipse.edc + oauth2-daps - org.eclipse.dataspaceconnector - data-management-api + org.eclipse.edc + management-api - org.eclipse.dataspaceconnector - observability-api + org.eclipse.edc + api-observability - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-configuration - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-multipart-dispatcher-v1 - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-multipart-endpoint-v1 - org.eclipse.dataspaceconnector - ids-api-transform-v1 + org.eclipse.edc + ids-transform-v1 - org.eclipse.dataspaceconnector + org.eclipse.edc ids-core - org.eclipse.dataspaceconnector + org.eclipse.edc ids-spi - org.eclipse.dataspaceconnector + org.eclipse.edc jwt-spi - org.eclipse.dataspaceconnector - data-plane-transfer-sync + org.eclipse.edc + transfer-data-plane - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-core - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-client - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-spi - - org.eclipse.dataspaceconnector - data-plane-transfer-client - - org.eclipse.dataspaceconnector - core-micrometer + org.eclipse.edc + micrometer-core - org.eclipse.dataspaceconnector + org.eclipse.edc jersey-micrometer - org.eclipse.dataspaceconnector + org.eclipse.edc jetty-micrometer - org.eclipse.dataspaceconnector - jdk-logger-monitor + org.eclipse.edc + monitor-jdk-logger - org.eclipse.dataspaceconnector + org.eclipse.edc http - org.eclipse.dataspaceconnector - http-receiver + org.eclipse.edc + transfer-pull-http-dynamic-receiver - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - diff --git a/edc-controlplane/edc-controlplane-memory-hashicorp-vault/pom.xml b/edc-controlplane/edc-controlplane-memory-hashicorp-vault/pom.xml index ff1f4912b..2f73fd043 100644 --- a/edc-controlplane/edc-controlplane-memory-hashicorp-vault/pom.xml +++ b/edc-controlplane/edc-controlplane-memory-hashicorp-vault/pom.xml @@ -23,7 +23,7 @@ edc-controlplane org.eclipse.tractusx.edc - 0.2.0 + 0.3.0 4.0.0 @@ -62,7 +62,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false @@ -94,7 +94,7 @@ edc-controlplane-base - org.eclipse.dataspaceconnector + org.eclipse.edc control-plane-core @@ -105,8 +105,8 @@ - org.eclipse.dataspaceconnector - data-plane-transfer-client + org.eclipse.edc + transfer-data-plane diff --git a/edc-controlplane/edc-controlplane-memory-hashicorp-vault/src/main/docker/Dockerfile b/edc-controlplane/edc-controlplane-memory-hashicorp-vault/src/main/docker/Dockerfile index 06ee33b61..7d9185aba 100644 --- a/edc-controlplane/edc-controlplane-memory-hashicorp-vault/src/main/docker/Dockerfile +++ b/edc-controlplane/edc-controlplane-memory-hashicorp-vault/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.1 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.1 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-controlplane.jar"] diff --git a/edc-controlplane/edc-controlplane-memory/README.md b/edc-controlplane/edc-controlplane-memory/README.md index b3115a5c3..29a68abdd 100644 --- a/edc-controlplane/edc-controlplane-memory/README.md +++ b/edc-controlplane/edc-controlplane-memory/README.md @@ -9,7 +9,7 @@ ### Configuration (configuration.properties) Listed below are configuration keys needed to get the `edc-controlplane-memory` up and running. -Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs). +Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tree/main/docs). | Key | Required | Example | Description | |--- |--- |--- |--- | @@ -106,7 +106,7 @@ EOF export LOGGING_PROPERTIES_FILE=$(mktemp /tmp/logging.properties.XXXXXX) cat << 'EOF' > ${LOGGING_PROPERTIES_FILE} .level=INFO -org.eclipse.dataspaceconnector.level=ALL +org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL diff --git a/edc-controlplane/edc-controlplane-memory/pom.xml b/edc-controlplane/edc-controlplane-memory/pom.xml index 903c741ab..92231dd57 100644 --- a/edc-controlplane/edc-controlplane-memory/pom.xml +++ b/edc-controlplane/edc-controlplane-memory/pom.xml @@ -22,7 +22,7 @@ org.eclipse.tractusx.edc edc-controlplane - 0.2.0 + 0.3.0 4.0.0 @@ -62,7 +62,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false @@ -94,14 +94,14 @@ edc-controlplane-base - org.eclipse.dataspaceconnector + org.eclipse.edc control-plane-core - org.eclipse.dataspaceconnector - azure-vault + org.eclipse.edc + vault-azure com.azure diff --git a/edc-controlplane/edc-controlplane-memory/src/main/docker/Dockerfile b/edc-controlplane/edc-controlplane-memory/src/main/docker/Dockerfile index 06ee33b61..b3ac0576e 100644 --- a/edc-controlplane/edc-controlplane-memory/src/main/docker/Dockerfile +++ b/edc-controlplane/edc-controlplane-memory/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.2 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.2 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-controlplane.jar"] diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md index 08a1ecf3c..f00a9eddb 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/README.md @@ -9,7 +9,7 @@ ### Configuration Listed below are configuration keys needed to get the `edc-controlplane-postgresql-hashicorp-vault` up and running. -Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs). +Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tree/main/docs). | Key | Required | Example | Description | |--- |--- |--- |--- | @@ -146,7 +146,7 @@ EOF export LOGGING_PROPERTIES_FILE=$(mktemp /tmp/logging.properties.XXXXXX) cat << 'EOF' > ${LOGGING_PROPERTIES_FILE} .level=INFO -org.eclipse.dataspaceconnector.level=ALL +org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/pom.xml b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/pom.xml index 2fe6ebae8..f1b991aee 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/pom.xml +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc edc-controlplane - 0.2.0 + 0.3.0 4.0.0 @@ -62,7 +62,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false @@ -91,13 +91,55 @@ org.eclipse.tractusx.edc - edc-controlplane-postgresql - - - org.eclipse.dataspaceconnector - azure-vault - - + edc-controlplane-base + + + + + org.eclipse.tractusx.edc.extensions + postgresql-migration + + + org.eclipse.tractusx.edc.extensions + data-encryption + + + + + org.eclipse.edc + asset-index-sql + + + org.eclipse.edc + contract-definition-store-sql + + + org.eclipse.edc + contract-negotiation-store-sql + + + org.eclipse.edc + transfer-process-store-sql + + + org.eclipse.edc + policy-definition-store-sql + + + + + org.eclipse.edc + sql-pool-apache-commons + + + org.eclipse.edc + transaction-local + + + + + org.postgresql + postgresql diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/src/main/docker/Dockerfile b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/src/main/docker/Dockerfile index 06ee33b61..b3ac0576e 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/src/main/docker/Dockerfile +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.2 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.2 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-controlplane.jar"] diff --git a/edc-controlplane/edc-controlplane-postgresql/README.md b/edc-controlplane/edc-controlplane-postgresql/README.md index b6f18f171..bee4d38d5 100644 --- a/edc-controlplane/edc-controlplane-postgresql/README.md +++ b/edc-controlplane/edc-controlplane-postgresql/README.md @@ -9,7 +9,7 @@ ### Configuration Listed below are configuration keys needed to get the `edc-controlplane-postgresql` up and running. -Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs). +Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tree/main/docs). | Key | Required | Example | Description | |--- |--- |--- |--- | @@ -149,7 +149,7 @@ EOF export LOGGING_PROPERTIES_FILE=$(mktemp /tmp/logging.properties.XXXXXX) cat << 'EOF' > ${LOGGING_PROPERTIES_FILE} .level=INFO -org.eclipse.dataspaceconnector.level=ALL +org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL diff --git a/edc-controlplane/edc-controlplane-postgresql/pom.xml b/edc-controlplane/edc-controlplane-postgresql/pom.xml index 657e83f2d..465606b83 100644 --- a/edc-controlplane/edc-controlplane-postgresql/pom.xml +++ b/edc-controlplane/edc-controlplane-postgresql/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc edc-controlplane - 0.2.0 + 0.3.0 4.0.0 @@ -63,7 +63,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false @@ -103,8 +103,8 @@ - org.eclipse.dataspaceconnector - azure-vault + org.eclipse.edc + vault-azure com.azure @@ -119,33 +119,33 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc asset-index-sql - org.eclipse.dataspaceconnector - contractdefinition-store-sql + org.eclipse.edc + contract-definition-store-sql - org.eclipse.dataspaceconnector - contractnegotiation-store-sql + org.eclipse.edc + contract-negotiation-store-sql - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-process-store-sql - org.eclipse.dataspaceconnector - policy-store-sql + org.eclipse.edc + policy-definition-store-sql - org.eclipse.dataspaceconnector - apache-commons-pool-sql + org.eclipse.edc + sql-pool-apache-commons - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-local diff --git a/edc-controlplane/edc-controlplane-postgresql/src/main/docker/Dockerfile b/edc-controlplane/edc-controlplane-postgresql/src/main/docker/Dockerfile index 06ee33b61..b3ac0576e 100644 --- a/edc-controlplane/edc-controlplane-postgresql/src/main/docker/Dockerfile +++ b/edc-controlplane/edc-controlplane-postgresql/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.2 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.2 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-controlplane.jar"] diff --git a/edc-controlplane/pom.xml b/edc-controlplane/pom.xml index ef0c27fe1..a869dd38f 100644 --- a/edc-controlplane/pom.xml +++ b/edc-controlplane/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc product-edc-parent - 0.2.0 + 0.3.0 4.0.0 diff --git a/edc-dataplane/README.md b/edc-dataplane/README.md index 6efe7366f..2deeec0d6 100644 --- a/edc-dataplane/README.md +++ b/edc-dataplane/README.md @@ -12,4 +12,4 @@ Please be aware that there are several confidential settings, that should not be As it is possible to configure EDC settings via environment variables, one way to do it would be via Kubernetes Secrets. For other deployment scenarios than Kubernetes equivalent measures should be taken. # Known Data Plane Issues -Please have a look at the open issues in the open source repository: [EDC Github Repository](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues) +Please have a look at the open issues in the open source repository: [EDC Github Repository](https://github.com/eclipse-edc/Connector/issues) diff --git a/edc-dataplane/edc-dataplane-azure-vault/README.md b/edc-dataplane/edc-dataplane-azure-vault/README.md index 490bd0002..41fc3f7f5 100644 --- a/edc-dataplane/edc-dataplane-azure-vault/README.md +++ b/edc-dataplane/edc-dataplane-azure-vault/README.md @@ -9,7 +9,7 @@ ### Configuration Listed below are configuration keys needed to get the `edc-dataplane-azure-vault` up and running. -Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs). +Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tree/main/docs). | Key | Required | Example | Description | |--- |--- |--- |--- | @@ -64,7 +64,7 @@ EOF export LOGGING_PROPERTIES_FILE=$(mktemp /tmp/logging.properties.XXXXXX) cat << 'EOF' > ${LOGGING_PROPERTIES_FILE} .level=INFO -org.eclipse.dataspaceconnector.level=ALL +org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL diff --git a/edc-dataplane/edc-dataplane-azure-vault/pom.xml b/edc-dataplane/edc-dataplane-azure-vault/pom.xml index 9b87fd695..222680b98 100644 --- a/edc-dataplane/edc-dataplane-azure-vault/pom.xml +++ b/edc-dataplane/edc-dataplane-azure-vault/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc edc-dataplane - 0.2.0 + 0.3.0 4.0.0 @@ -62,7 +62,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false @@ -95,8 +95,8 @@ - org.eclipse.dataspaceconnector - azure-vault + org.eclipse.edc + vault-azure com.azure diff --git a/edc-dataplane/edc-dataplane-azure-vault/src/main/docker/Dockerfile b/edc-dataplane/edc-dataplane-azure-vault/src/main/docker/Dockerfile index 5d14913c9..cb9617d93 100644 --- a/edc-dataplane/edc-dataplane-azure-vault/src/main/docker/Dockerfile +++ b/edc-dataplane/edc-dataplane-azure-vault/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.1 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.1 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-dataplane.jar"] diff --git a/edc-dataplane/edc-dataplane-base/pom.xml b/edc-dataplane/edc-dataplane-base/pom.xml index 9ca6eaa43..799e50d68 100644 --- a/edc-dataplane/edc-dataplane-base/pom.xml +++ b/edc-dataplane/edc-dataplane-base/pom.xml @@ -24,7 +24,7 @@ edc-dataplane org.eclipse.tractusx.edc - 0.2.0 + 0.3.0 4.0.0 @@ -58,91 +58,78 @@ - org.eclipse.dataspaceconnector - filesystem-configuration + org.eclipse.edc + configuration-filesystem - org.eclipse.dataspaceconnector - data-plane-s3 + org.eclipse.edc + data-plane-aws-s3 - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-http + + org.eclipse.edc + data-plane-http-oauth2 + - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-framework - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-api - org.eclipse.dataspaceconnector - observability-api + org.eclipse.edc + api-observability - org.eclipse.dataspaceconnector - core-base - - - org.eclipse.dataspaceconnector - core-boot + org.eclipse.edc + connector-core - org.eclipse.dataspaceconnector - s3-core + org.eclipse.edc + boot + + + + - org.eclipse.dataspaceconnector - core-micrometer + org.eclipse.edc + micrometer-core - org.eclipse.dataspaceconnector + org.eclipse.edc jersey-micrometer - org.eclipse.dataspaceconnector + org.eclipse.edc jetty-micrometer - org.eclipse.dataspaceconnector - jdk-logger-monitor + org.eclipse.edc + monitor-jdk-logger - org.eclipse.dataspaceconnector + org.eclipse.edc http - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - diff --git a/edc-dataplane/edc-dataplane-hashicorp-vault/README.md b/edc-dataplane/edc-dataplane-hashicorp-vault/README.md index 45b196572..7a7e76c5e 100644 --- a/edc-dataplane/edc-dataplane-hashicorp-vault/README.md +++ b/edc-dataplane/edc-dataplane-hashicorp-vault/README.md @@ -9,7 +9,7 @@ ### Configuration Listed below are configuration keys needed to get the `edc-dataplane-hashicorp-vault` up and running. -Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs). +Details regarding each configuration property can be found at the [documentary section of the EDC](https://github.com/eclipse-edc/Connector/tree/main/docs). | Key | Required | Example | Description | |--- |--- |--- |--- | @@ -62,7 +62,7 @@ EOF export LOGGING_PROPERTIES_FILE=$(mktemp /tmp/logging.properties.XXXXXX) cat << 'EOF' > ${LOGGING_PROPERTIES_FILE} .level=INFO -org.eclipse.dataspaceconnector.level=ALL +org.eclipse.edc.level=ALL handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL diff --git a/edc-dataplane/edc-dataplane-hashicorp-vault/pom.xml b/edc-dataplane/edc-dataplane-hashicorp-vault/pom.xml index ca700672a..88625afd6 100644 --- a/edc-dataplane/edc-dataplane-hashicorp-vault/pom.xml +++ b/edc-dataplane/edc-dataplane-hashicorp-vault/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc edc-dataplane - 0.2.0 + 0.3.0 4.0.0 @@ -62,7 +62,7 @@ true lib/ - org.eclipse.dataspaceconnector.boot.system.runtime.BaseRuntime + org.eclipse.edc.boot.system.runtime.BaseRuntime false diff --git a/edc-dataplane/edc-dataplane-hashicorp-vault/src/main/docker/Dockerfile b/edc-dataplane/edc-dataplane-hashicorp-vault/src/main/docker/Dockerfile index 5d14913c9..e19cde1e0 100644 --- a/edc-dataplane/edc-dataplane-hashicorp-vault/src/main/docker/Dockerfile +++ b/edc-dataplane/edc-dataplane-hashicorp-vault/src/main/docker/Dockerfile @@ -1,4 +1,5 @@ # +# Copyright (c) 2023 ZF Friedrichshafen AG # Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH # Copyright (c) 2021,2022 Contributors to the Eclipse Foundation # @@ -17,7 +18,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -FROM alpine:3.17.0 as otel +FROM alpine:3.17.2 as otel ENV OTEL_AGENT_LOCATION "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.12.1/opentelemetry-javaagent.jar" @@ -25,7 +26,7 @@ HEALTHCHECK NONE RUN wget ${OTEL_AGENT_LOCATION} -O /tmp/opentelemetry-javaagent.jar -FROM alpine:3.17.0 +FROM alpine:3.17.2 ARG JAR ARG LIB @@ -34,7 +35,7 @@ ARG APP_USER=docker ARG APP_UID=10100 RUN apk update && \ - apk add openjdk11-jre-headless=11.0.17_p8-r3 --no-cache && \ + apk add openjdk11-jre-headless=11.0.18_p10-r0 --no-cache && \ rm -rf /var/cache/apk/* RUN addgroup --system "$APP_USER" @@ -64,6 +65,6 @@ CMD ["java", \ "-Dotel.javaagent.configuration-file=/app/opentelemetry.properties", \ "-Dotel.metrics.exporter=prometheus", \ "-Dotel.exporter.prometheus.port=9090", \ - "-Djava.security.edg=file:/dev/.urandom", \ + "-Djava.security.egd=file:/dev/urandom", \ "-jar", \ "edc-dataplane.jar"] diff --git a/edc-dataplane/pom.xml b/edc-dataplane/pom.xml index 9579cd690..5b249e676 100644 --- a/edc-dataplane/pom.xml +++ b/edc-dataplane/pom.xml @@ -24,7 +24,7 @@ org.eclipse.tractusx.edc product-edc-parent - 0.2.0 + 0.3.0 edc-dataplane diff --git a/edc-extensions/business-partner-validation/README.md b/edc-extensions/business-partner-validation/README.md index bcf7f7ed0..d37041560 100644 --- a/edc-extensions/business-partner-validation/README.md +++ b/edc-extensions/business-partner-validation/README.md @@ -4,7 +4,7 @@ Using the Business Partner Validation Extension it's possible to add configurabl Catena-X `Participants` in the `ContractDefinition.AccessPolicy`. Using a BPN in `ContractDefinition.ContractPolicy` is possible, too, but once the contract is complete there is no policy enforcement in place from the EDC. It is recommended to have a basic understanding of the EDC contract/policy domain before using this extension. The -corresponding documentation can be found in the [EDC GitHub Repository](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector). +corresponding documentation can be found in the [EDC GitHub Repository](https://github.com/eclipse-edc/Connector). The business partner number of another connector is part of its DAPS token. Once a BPN constraint is used in an access policy the connector checks the token before sending out contract offers. diff --git a/edc-extensions/business-partner-validation/pom.xml b/edc-extensions/business-partner-validation/pom.xml index 50a065bbd..81812de72 100644 --- a/edc-extensions/business-partner-validation/pom.xml +++ b/edc-extensions/business-partner-validation/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc.extensions edc-extensions - 0.2.0 + 0.3.0 4.0.0 @@ -56,15 +56,15 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector + org.eclipse.edc policy-spi - org.eclipse.dataspaceconnector + org.eclipse.edc policy-engine-spi diff --git a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtension.java b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtension.java index dfc2fda26..f0edd6be2 100644 --- a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtension.java +++ b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtension.java @@ -20,17 +20,17 @@ package org.eclipse.tractusx.edc.validation.businesspartner; -import static org.eclipse.dataspaceconnector.spi.policy.engine.PolicyEngine.ALL_SCOPES; +import static org.eclipse.edc.policy.engine.spi.PolicyEngine.ALL_SCOPES; -import org.eclipse.dataspaceconnector.policy.model.Duty; -import org.eclipse.dataspaceconnector.policy.model.Permission; -import org.eclipse.dataspaceconnector.policy.model.Prohibition; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Inject; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyEngine; -import org.eclipse.dataspaceconnector.spi.policy.engine.RuleBindingRegistry; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; +import org.eclipse.edc.policy.engine.spi.PolicyEngine; +import org.eclipse.edc.policy.engine.spi.RuleBindingRegistry; +import org.eclipse.edc.policy.model.Duty; +import org.eclipse.edc.policy.model.Permission; +import org.eclipse.edc.policy.model.Prohibition; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.tractusx.edc.validation.businesspartner.functions.BusinessPartnerDutyFunction; import org.eclipse.tractusx.edc.validation.businesspartner.functions.BusinessPartnerPermissionFunction; import org.eclipse.tractusx.edc.validation.businesspartner.functions.BusinessPartnerProhibitionFunction; diff --git a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidation.java b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidation.java index 16997c672..55cb0d52b 100644 --- a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidation.java +++ b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidation.java @@ -22,10 +22,10 @@ import java.util.Map; import java.util.Objects; -import org.eclipse.dataspaceconnector.policy.model.Operator; -import org.eclipse.dataspaceconnector.spi.agent.ParticipantAgent; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyContext; +import org.eclipse.edc.policy.engine.spi.PolicyContext; +import org.eclipse.edc.policy.model.Operator; +import org.eclipse.edc.spi.agent.ParticipantAgent; +import org.eclipse.edc.spi.monitor.Monitor; /** * Abstract class for BusinessPartnerNumber validation. This class may be inherited from the EDC diff --git a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerDutyFunction.java b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerDutyFunction.java index 0282a4465..f53ba3cbc 100644 --- a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerDutyFunction.java +++ b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerDutyFunction.java @@ -20,11 +20,11 @@ package org.eclipse.tractusx.edc.validation.businesspartner.functions; -import org.eclipse.dataspaceconnector.policy.model.Duty; -import org.eclipse.dataspaceconnector.policy.model.Operator; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.AtomicConstraintFunction; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyContext; +import org.eclipse.edc.policy.engine.spi.AtomicConstraintFunction; +import org.eclipse.edc.policy.engine.spi.PolicyContext; +import org.eclipse.edc.policy.model.Duty; +import org.eclipse.edc.policy.model.Operator; +import org.eclipse.edc.spi.monitor.Monitor; /** AtomicConstraintFunction to validate business partner numbers for edc duties. */ public class BusinessPartnerDutyFunction extends AbstractBusinessPartnerValidation diff --git a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerPermissionFunction.java b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerPermissionFunction.java index c5c17d8ec..07bda765e 100644 --- a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerPermissionFunction.java +++ b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerPermissionFunction.java @@ -20,11 +20,11 @@ package org.eclipse.tractusx.edc.validation.businesspartner.functions; -import org.eclipse.dataspaceconnector.policy.model.Operator; -import org.eclipse.dataspaceconnector.policy.model.Permission; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.AtomicConstraintFunction; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyContext; +import org.eclipse.edc.policy.engine.spi.AtomicConstraintFunction; +import org.eclipse.edc.policy.engine.spi.PolicyContext; +import org.eclipse.edc.policy.model.Operator; +import org.eclipse.edc.policy.model.Permission; +import org.eclipse.edc.spi.monitor.Monitor; /** AtomicConstraintFunction to validate business partner numbers for edc permissions. */ public class BusinessPartnerPermissionFunction extends AbstractBusinessPartnerValidation diff --git a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerProhibitionFunction.java b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerProhibitionFunction.java index ad71419f7..f3cddf9fe 100644 --- a/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerProhibitionFunction.java +++ b/edc-extensions/business-partner-validation/src/main/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/BusinessPartnerProhibitionFunction.java @@ -20,11 +20,11 @@ package org.eclipse.tractusx.edc.validation.businesspartner.functions; -import org.eclipse.dataspaceconnector.policy.model.Operator; -import org.eclipse.dataspaceconnector.policy.model.Prohibition; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.AtomicConstraintFunction; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyContext; +import org.eclipse.edc.policy.engine.spi.AtomicConstraintFunction; +import org.eclipse.edc.policy.engine.spi.PolicyContext; +import org.eclipse.edc.policy.model.Operator; +import org.eclipse.edc.policy.model.Prohibition; +import org.eclipse.edc.spi.monitor.Monitor; /** AtomicConstraintFunction to validate business partner numbers for edc prohibitions. */ public class BusinessPartnerProhibitionFunction extends AbstractBusinessPartnerValidation diff --git a/edc-extensions/business-partner-validation/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/business-partner-validation/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/business-partner-validation/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/business-partner-validation/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtensionTest.java b/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtensionTest.java index 1351564b1..732379fc2 100644 --- a/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtensionTest.java +++ b/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/BusinessPartnerValidationExtensionTest.java @@ -20,13 +20,13 @@ package org.eclipse.tractusx.edc.validation.businesspartner; -import org.eclipse.dataspaceconnector.policy.model.Duty; -import org.eclipse.dataspaceconnector.policy.model.Permission; -import org.eclipse.dataspaceconnector.policy.model.Prohibition; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyEngine; -import org.eclipse.dataspaceconnector.spi.policy.engine.RuleBindingRegistry; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; +import org.eclipse.edc.policy.engine.spi.PolicyEngine; +import org.eclipse.edc.policy.engine.spi.RuleBindingRegistry; +import org.eclipse.edc.policy.model.Duty; +import org.eclipse.edc.policy.model.Permission; +import org.eclipse.edc.policy.model.Prohibition; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; diff --git a/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidationTest.java b/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidationTest.java index 175613f6c..e8909c04e 100644 --- a/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidationTest.java +++ b/edc-extensions/business-partner-validation/src/test/java/org/eclipse/tractusx/edc/validation/businesspartner/functions/AbstractBusinessPartnerValidationTest.java @@ -22,10 +22,10 @@ import java.util.Collections; import java.util.List; -import org.eclipse.dataspaceconnector.policy.model.Operator; -import org.eclipse.dataspaceconnector.spi.agent.ParticipantAgent; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.policy.engine.PolicyContext; +import org.eclipse.edc.policy.engine.spi.PolicyContext; +import org.eclipse.edc.policy.model.Operator; +import org.eclipse.edc.spi.agent.ParticipantAgent; +import org.eclipse.edc.spi.monitor.Monitor; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/control-plane-adapter/README.md b/edc-extensions/control-plane-adapter/README.md index ddfd2b40e..7b6dfa31b 100644 --- a/edc-extensions/control-plane-adapter/README.md +++ b/edc-extensions/control-plane-adapter/README.md @@ -4,22 +4,36 @@ The goal of this extension is to simplify the process of retrieving data out of Additional requirements, that affects the architecture of the extension: - can return data both in SYNC and ASYNC mode (currently only SYNC endpoint available) -- can be persistent, so that process can be restored from the point where it was before application was stopped (not implemented yet) -- prepared to scale horizontally (not yet implemented) +- can be persistent, so that process can be restored from the point where it was before application was stopped +- scaling horizontally (when persistence is added to configuration) - can retry failed part of the process (no need to start the process from the beginning) -Configuration: +## Configuration: -| Key | Description | Mandatory | Default | -|:-------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|----| -| edc.cp.adapter.default.message.retry.number | Number of retries of a message, in case of an error, within the internal process of retrieving DataReference | no | 3 | -| edc.cp.adapter.default.sync.request.timeout | Timeout for synchronous request (in seconds), after witch 'timeout' error will be returned to the requesting client | no | 20 | -| edc.cp.adapter.messagebus.inmemory.thread.number | Number of threads running within the in-memory implementation of MessageBus _ _ | no | 10 | -| edc.cp.adapter.cache.contract.agreement | Turn on/off contract agreement cache for the specific asset. Once the contract is agreed, the second request for the same asset will reuse the agreement. Value 1 = on, 0 = off. | no | 1 | -| edc.cp.adapter.cache.catalog.expire.after | Number of seconds, after witch prevoiusly requested catalog will not be reused, and will be removed from catalog cache | no | 3600 | +| Key | Description | Mandatory | Default | +|:-------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|---------| +| edc.cp.adapter.default.message.retry.number | Number of retries of a message, in case of an error, within the internal process of retrieving DataReference | no | 3 | +| edc.cp.adapter.default.sync.request.timeout | Timeout for synchronous request (in seconds), after witch 'timeout' error will be returned to the requesting client | no | 20 | +| edc.cp.adapter.messagebus.inmemory.thread.number | Number of threads running within the in-memory implementation of MessageBus _ _ | no | 10 | +| edc.cp.adapter.reuse.contract.agreement | Turn on/off reusing of existing contract agreements for the specific asset. Once the contract is agreed, the second request for the same asset will reuse the agreement (if exists) pulled from the EDC. | no | true | +| edc.cp.adapter.cache.catalog.expire.after | Number of seconds, after witch prevoiusly requested catalog will not be reused, and will be removed from catalog cache | no | 300 | +| edc.cp.adapter.catalog.request.limit | Maximum number of items taken from Catalog within single request. Requests are repeated until all offers of the query are retrieved | no | 100 | +By default, the extension works in "IN MEMORY" mode. This setup has some limitations: ++ It can work only within single EDC instance. If CP-adapter requests are handled by more than one EDC, data flow may be broken. ++ If the EDC instance is restarted, all running processes are lost. -How to use it: +To run CP-Adapter in "PERSISTENT" mode, You need to create a proper tables with [this](docs/schema.sql) script, and add the following configuration values to Your control-plane EDC properties file: + +| Key | Description | +|-----------------------------------|-------------| +| edc.datasource.cpadapter.name | data source name | +| edc.datasource.cpadapter.url | data source url | +| edc.datasource.cpadapter.user | data source user | +| edc.datasource.cpadapter.password | data source password | + + +## How to use it: 1. Client sends a GET request with two parameters: assetId and the url of the provider control-plane: ``` @@ -31,8 +45,16 @@ Additional requirements, that affects the architecture of the extension: ``` http://localhost:9193/api/v1/data/adapter/asset/sync/123?providerUrl=http://localhost:8182/api/v1/ids/data ``` + + Optional request parameters, that overwrite the settings for a single request: - The controller is registered under the context alias of DataManagment API. The authentication depends on the DataManagement configuration. + | Name | Description | + |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--- | + | contractAgreementId | Defines the ID of existing contract agreement, that should be reused for retrieving the asset. If parameter is specified, but contract is not found, 404 error will be returned. | + | contractAgreementReuse | Similar to edc.cp.adapter.reuse.contract.agreement option allows to turn off reusing of existing contracts, but on a request level. Set the parameter value to 'false' and new contract agrement will be negotiated. | + | timeout | Similar to edc.cp.adapter.default.sync.request.timeout, defines the maximum time of the request. If data is not ready, time out error will be returned. | + + The controller is registered under the context alias of DataManagement API. The authentication depends on the DataManagement configuration. To find out more please visit: [api-configuration](../../edc/extensions/control-plane/api/data-management/api-configuration/README.md) @@ -62,7 +84,7 @@ Additional requirements, that affects the architecture of the extension: header: Authorization:eyJhbGciOiJSUzI1NiJ9.eyJkYWQiOi... {authKey:authCode} ``` -Internal design of the extension: +### Internal design of the extension: ![diagram](src/main/resources/control-plane-adapter.jpg) diff --git a/edc-extensions/control-plane-adapter/docs/schema.sql b/edc-extensions/control-plane-adapter/docs/schema.sql new file mode 100644 index 000000000..3e64d3c45 --- /dev/null +++ b/edc-extensions/control-plane-adapter/docs/schema.sql @@ -0,0 +1,54 @@ +-- +-- Copyright (c) 2022 ZF Friedrichshafen 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: +-- ZF Friedrichshafen AG - Initial SQL Query +-- + +-- Statements are designed for and tested with Postgres only! + + +CREATE TABLE IF NOT EXISTS edc_lease +( + leased_by VARCHAR NOT NULL, + leased_at BIGINT, + lease_duration INTEGER NOT NULL, + lease_id VARCHAR NOT NULL + CONSTRAINT lease_pk + PRIMARY KEY +); + +CREATE TABLE IF NOT EXISTS edc_cpadapter_queue +( + id VARCHAR NOT NULL, + created_at BIGINT NOT NULL, + channel VARCHAR, + message JSON, + invoke_after BIGINT NOT NULL, + lease_id VARCHAR + CONSTRAINT cpadapter_queue_lease_lease_id_fk + REFERENCES edc_lease + ON DELETE SET NULL, + PRIMARY KEY (id) +); + +CREATE UNIQUE INDEX IF NOT EXISTS edc_cpadapter_queue_id_uindex + ON edc_cpadapter_queue (id); + +CREATE TABLE IF NOT EXISTS edc_cpadapter_object_store +( + id VARCHAR NOT NULL, + created_at BIGINT NOT NULL, + type VARCHAR, + object JSON, + PRIMARY KEY (id) +); + + + diff --git a/edc-extensions/control-plane-adapter/pom.xml b/edc-extensions/control-plane-adapter/pom.xml index 9e7c5db5f..fcb35ab23 100644 --- a/edc-extensions/control-plane-adapter/pom.xml +++ b/edc-extensions/control-plane-adapter/pom.xml @@ -17,7 +17,7 @@ org.eclipse.tractusx.edc.extensions edc-extensions - 0.2.0 + 0.3.0 4.0.0 @@ -87,25 +87,55 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector + org.eclipse.edc policy-spi - org.eclipse.dataspaceconnector - data-management-api + org.eclipse.edc + management-api - org.eclipse.dataspaceconnector + org.eclipse.edc catalog-spi - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-spi + + org.eclipse.edc + ids-core + + + org.eclipse.edc + aggregate-service-spi + + + + org.eclipse.edc + sql-core + + + org.eclipse.edc + sql-lease + ${org.eclipse.edc.version} + + + org.eclipse.edc + sql-pool-apache-commons + + + org.eclipse.edc + transaction-datasource-spi + + + org.postgresql + postgresql + diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterConfig.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterConfig.java deleted file mode 100644 index 4ddf179ed..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter; - -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; - -public class ApiAdapterConfig { - private static final String DEFAULT_MESSAGE_RETRY_NUMBER = - "edc.cp.adapter.default.message.retry.number"; - private static final String DEFAULT_SYNC_REQUEST_TIMEOUT = - "edc.cp.adapter.default.sync.request.timeout"; - private static final String IN_MEMORY_MESSAGE_BUS_THREAD_NUMBER = - "edc.cp.adapter.messagebus.inmemory.thread.number"; - private static final String CATALOG_EXPIRE_AFTER_TIME = - "edc.cp.adapter.cache.catalog.expire.after"; - private static final String CONTRACT_AGREEMENT_CACHE = "edc.cp.adapter.cache.contract.agreement"; - - private final ServiceExtensionContext context; - - public ApiAdapterConfig(ServiceExtensionContext context) { - this.context = context; - } - - public int getDefaultMessageRetryNumber() { - return context.getSetting(DEFAULT_MESSAGE_RETRY_NUMBER, 3); - } - - public int getDefaultSyncRequestTimeout() { - return context.getSetting(DEFAULT_SYNC_REQUEST_TIMEOUT, 20); - } - - public int getInMemoryMessageBusThreadNumber() { - return context.getSetting(IN_MEMORY_MESSAGE_BUS_THREAD_NUMBER, 10); - } - - public boolean isContractAgreementCacheOn() { - return context.getSetting(CONTRACT_AGREEMENT_CACHE, 1) != 0; - } - - public int getCatalogExpireAfterTime() { - return context.getSetting(CATALOG_EXPIRE_AFTER_TIME, 3600); - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterExtension.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterExtension.java deleted file mode 100644 index 008c61abb..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/ApiAdapterExtension.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter; - -import static java.util.Objects.nonNull; - -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.InMemoryMessageBus; -import net.catenax.edc.cp.adapter.messaging.ListenerService; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractDataStore; -import net.catenax.edc.cp.adapter.process.contractdatastore.InMemoryContractDataStore; -import net.catenax.edc.cp.adapter.process.contractnegotiation.ContractNegotiationHandler; -import net.catenax.edc.cp.adapter.process.contractnotification.*; -import net.catenax.edc.cp.adapter.process.datareference.DataRefInMemorySyncService; -import net.catenax.edc.cp.adapter.process.datareference.DataRefNotificationSyncService; -import net.catenax.edc.cp.adapter.process.datareference.DataReferenceHandler; -import net.catenax.edc.cp.adapter.process.datareference.EndpointDataReferenceReceiverImpl; -import net.catenax.edc.cp.adapter.service.ErrorResultService; -import net.catenax.edc.cp.adapter.service.ResultService; -import net.catenax.edc.cp.adapter.util.ExpiringMap; -import net.catenax.edc.cp.adapter.util.LockMap; -import org.eclipse.dataspaceconnector.api.datamanagement.catalog.service.CatalogServiceImpl; -import org.eclipse.dataspaceconnector.api.datamanagement.configuration.DataManagementApiConfiguration; -import org.eclipse.dataspaceconnector.api.datamanagement.contractnegotiation.service.ContractNegotiationService; -import org.eclipse.dataspaceconnector.api.datamanagement.transferprocess.service.TransferProcessService; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Inject; -import org.eclipse.dataspaceconnector.spi.WebService; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.observe.ContractNegotiationListener; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.observe.ContractNegotiationObservable; -import org.eclipse.dataspaceconnector.spi.message.RemoteMessageDispatcherRegistry; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiver; -import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiverRegistry; - -public class ApiAdapterExtension implements ServiceExtension { - @Inject private Monitor monitor; - @Inject private ContractNegotiationObservable negotiationObservable; - @Inject private WebService webService; - @Inject private ContractNegotiationService contractNegotiationService; - @Inject private RemoteMessageDispatcherRegistry dispatcher; - @Inject private EndpointDataReferenceReceiverRegistry receiverRegistry; - @Inject private DataManagementApiConfiguration apiConfig; - @Inject private TransferProcessService transferProcessService; - - @Override - public String name() { - return "Control Plane Adapter Extension"; - } - - @Override - public void initialize(ServiceExtensionContext context) { - ApiAdapterConfig config = new ApiAdapterConfig(context); - ListenerService listenerService = new ListenerService(); - InMemoryMessageBus messageBus = - new InMemoryMessageBus( - monitor, listenerService, config.getInMemoryMessageBusThreadNumber()); - - ResultService resultService = new ResultService(config.getDefaultSyncRequestTimeout()); - ErrorResultService errorResultService = new ErrorResultService(monitor, messageBus); - ContractNotificationSyncService contractSyncService = - new ContractInMemorySyncService(new LockMap()); - ContractDataStore contractDataStore = new InMemoryContractDataStore(); - DataTransferInitializer dataTransferInitializer = - new DataTransferInitializer(monitor, transferProcessService); - ContractNotificationHandler contractNotificationHandler = - new ContractNotificationHandler( - monitor, - messageBus, - contractSyncService, - contractNegotiationService, - dataTransferInitializer); - ContractNegotiationHandler contractNegotiationHandler = - getContractNegotiationHandler( - monitor, contractNegotiationService, messageBus, contractDataStore); - DataRefNotificationSyncService dataRefSyncService = - new DataRefInMemorySyncService(new LockMap()); - DataReferenceHandler dataReferenceHandler = - new DataReferenceHandler(monitor, messageBus, dataRefSyncService); - - listenerService.addListener(Channel.INITIAL, contractNegotiationHandler); - listenerService.addListener(Channel.CONTRACT_CONFIRMATION, contractNotificationHandler); - listenerService.addListener(Channel.DATA_REFERENCE, dataReferenceHandler); - listenerService.addListener(Channel.RESULT, resultService); - listenerService.addListener(Channel.DLQ, errorResultService); - - initHttpController(monitor, messageBus, resultService, config); - initContractNegotiationListener( - monitor, - negotiationObservable, - messageBus, - contractSyncService, - contractDataStore, - dataTransferInitializer); - initDataReferenceReciever(monitor, messageBus, dataRefSyncService); - } - - private void initHttpController( - Monitor monitor, - InMemoryMessageBus messageBus, - ResultService resultService, - ApiAdapterConfig config) { - webService.registerResource( - apiConfig.getContextAlias(), - new HttpController(monitor, resultService, messageBus, config)); - } - - private ContractNegotiationHandler getContractNegotiationHandler( - Monitor monitor, - ContractNegotiationService contractNegotiationService, - InMemoryMessageBus messageBus, - ContractDataStore contractDataStore) { - return new ContractNegotiationHandler( - monitor, - messageBus, - contractNegotiationService, - new CatalogServiceImpl(dispatcher), - contractDataStore, - new ExpiringMap<>()); - } - - private void initDataReferenceReciever( - Monitor monitor, - InMemoryMessageBus messageBus, - DataRefNotificationSyncService dataRefSyncService) { - EndpointDataReferenceReceiver dataReferenceReceiver = - new EndpointDataReferenceReceiverImpl(monitor, messageBus, dataRefSyncService); - receiverRegistry.registerReceiver(dataReferenceReceiver); - } - - private void initContractNegotiationListener( - Monitor monitor, - ContractNegotiationObservable negotiationObservable, - InMemoryMessageBus messageBus, - ContractNotificationSyncService contractSyncService, - ContractDataStore contractDataStore, - DataTransferInitializer dataTransferInitializer) { - ContractNegotiationListener contractNegotiationListener = - new ContractNegotiationListenerImpl( - monitor, messageBus, contractSyncService, contractDataStore, dataTransferInitializer); - if (nonNull(negotiationObservable)) { - negotiationObservable.registerListener(contractNegotiationListener); - } - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractAgreementData.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractAgreementData.java deleted file mode 100644 index 5ba7bcb0e..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractAgreementData.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter.process.contractdatastore; - -import lombok.Getter; -import lombok.Setter; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.agreement.ContractAgreement; - -@Getter -@Setter -public class ContractAgreementData { - private String id; - private String providerAgentId; - private String consumerAgentId; - private long contractSigningDate; - private long contractStartDate; - private long contractEndDate; - private String assetId; - private String policyId; - - public static ContractAgreementData from(ContractAgreement agreement) { - ContractAgreementData data = new ContractAgreementData(); - data.setId(agreement.getId()); - data.setAssetId(agreement.getAssetId()); - data.setContractStartDate(agreement.getContractStartDate()); - data.setContractEndDate(agreement.getContractEndDate()); - data.setContractSigningDate(agreement.getContractSigningDate()); - return data; - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/InMemoryContractDataStore.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/InMemoryContractDataStore.java deleted file mode 100644 index be6c692db..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/InMemoryContractDataStore.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter.process.contractdatastore; - -import java.util.HashMap; -import java.util.Map; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.agreement.ContractAgreement; - -public class InMemoryContractDataStore implements ContractDataStore { - private static final Map contractMap = new HashMap<>(); - - @Override - public void add(String assetId, String provider, ContractAgreement agreement) { - contractMap.put(getKey(assetId, provider), ContractAgreementData.from(agreement)); - } - - @Override - public ContractAgreementData get(String assetId, String provider) { - return contractMap.get(getKey(assetId, provider)); - } - - private String getKey(String assetId, String provider) { - return assetId + "::" + provider; - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java deleted file mode 100644 index 4daf8b08a..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter.process.contractnegotiation; - -import java.time.Instant; -import java.util.Collections; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.exception.ExternalRequestException; -import net.catenax.edc.cp.adapter.exception.ResourceNotFoundException; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Listener; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractAgreementData; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractDataStore; -import net.catenax.edc.cp.adapter.util.ExpiringMap; -import org.eclipse.dataspaceconnector.api.datamanagement.catalog.service.CatalogService; -import org.eclipse.dataspaceconnector.api.datamanagement.contractnegotiation.service.ContractNegotiationService; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.query.QuerySpec; -import org.eclipse.dataspaceconnector.spi.types.domain.catalog.Catalog; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractOfferRequest; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.offer.ContractOffer; -import org.jetbrains.annotations.Nullable; - -@RequiredArgsConstructor -public class ContractNegotiationHandler implements Listener { - private final Monitor monitor; - private final MessageBus messageBus; - private final ContractNegotiationService contractNegotiationService; - private final CatalogService catalogService; - private final ContractDataStore contractDataStore; - private final ExpiringMap catalogCache; - - @Override - public void process(DataReferenceRetrievalDto dto) { - monitor.info( - String.format( - "[%s] RequestHandler: input request: [%s]", dto.getTraceId(), dto.getPayload())); - ProcessData processData = dto.getPayload(); - - ContractAgreementData contractData = getCachedContractData(dto); - if (Objects.nonNull(contractData) && isContractValid(contractData)) { - monitor.info(String.format("[%s] ContractAgreement taken from cache.", dto.getTraceId())); - dto.getPayload().setContractAgreementId(contractData.getId()); - dto.getPayload().setContractConfirmed(true); - messageBus.send(Channel.CONTRACT_CONFIRMATION, dto); - return; - } - - ContractOffer contractOffer = - findContractOffer( - processData.getAssetId(), - processData.getProvider(), - processData.getCatalogExpiryTime()); - - String contractNegotiationId = - initializeContractNegotiation( - contractOffer, dto.getPayload().getProvider(), dto.getTraceId()); - dto.getPayload().setContractNegotiationId(contractNegotiationId); - - messageBus.send(Channel.CONTRACT_CONFIRMATION, dto); - } - - @Nullable - private ContractAgreementData getCachedContractData(DataReferenceRetrievalDto dto) { - return dto.getPayload().isContractAgreementCacheOn() - ? contractDataStore.get(dto.getPayload().getAssetId(), dto.getPayload().getProvider()) - : null; - } - - private boolean isContractValid(ContractAgreementData contractAgreement) { - long now = Instant.now().getEpochSecond(); - return Objects.nonNull(contractAgreement) - && contractAgreement.getContractStartDate() < now - && contractAgreement.getContractEndDate() > now; - } - - private ContractOffer findContractOffer( - String assetId, String providerUrl, int catalogExpiryTime) { - Catalog catalog = getCatalog(providerUrl, catalogExpiryTime); - return Optional.ofNullable(catalog.getContractOffers()).orElse(Collections.emptyList()).stream() - .filter(it -> it.getAsset().getId().equals(assetId)) - .findFirst() - .orElseThrow( - () -> - new ResourceNotFoundException("Could not find Contract Offer for given Asset Id")); - } - - private Catalog getCatalog(String providerUrl, int catalogExpiryTime) { - Catalog catalog = catalogCache.get(providerUrl, catalogExpiryTime); - if (Objects.nonNull(catalog)) { - return catalog; - } - - try { - catalog = catalogService.getByProviderUrl(providerUrl, QuerySpec.max()).get(); - catalogCache.put(providerUrl, catalog); - return catalog; - } catch (InterruptedException | ExecutionException e) { - throw new ExternalRequestException("Could not retrieve contract offer.", e); - } - } - - private String initializeContractNegotiation( - ContractOffer contractOffer, String providerUrl, String traceId) { - monitor.info(String.format("[%s] RequestHandler: initiateNegotiation - start", traceId)); - ContractOfferRequest contractOfferRequest = - ContractOfferRequest.Builder.newInstance() - .connectorAddress(providerUrl) - .contractOffer(contractOffer) - .type(ContractOfferRequest.Type.INITIAL) - .connectorId("provider") - .protocol("ids-multipart") - .correlationId(traceId) - .build(); - - ContractNegotiation contractNegotiation = - contractNegotiationService.initiateNegotiation(contractOfferRequest); - monitor.info(String.format("[%s] RequestHandler: initiateNegotiation - end", traceId)); - return Optional.ofNullable(contractNegotiation.getId()) - .orElseThrow(() -> new ResourceNotFoundException("Could not find Contract NegotiationId")); - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInMemorySyncService.java b/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInMemorySyncService.java deleted file mode 100644 index 3b40911f1..000000000 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInMemorySyncService.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter.process.contractnotification; - -import static java.util.Objects.isNull; - -import java.util.HashMap; -import java.util.Map; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.util.LockMap; - -public class ContractInMemorySyncService implements ContractNotificationSyncService { - private final Map dtoMap = new HashMap<>(); - private final Map contractInfoMap = new HashMap<>(); - private final LockMap locks; - - public ContractInMemorySyncService(LockMap locks) { - this.locks = locks; - } - - @Override - public DataReferenceRetrievalDto exchangeConfirmedContract( - String negotiationId, String agreementId) { - locks.lock(negotiationId); - DataReferenceRetrievalDto dto = dtoMap.get(negotiationId); - if (isNull(dto)) { - contractInfoMap.put( - negotiationId, new ContractInfo(agreementId, ContractInfo.ContractState.CONFIRMED)); - } - locks.unlock(negotiationId); - return dto; - } - - @Override - public DataReferenceRetrievalDto exchangeDeclinedContract(String negotiationId) { - locks.lock(negotiationId); - DataReferenceRetrievalDto dto = dtoMap.get(negotiationId); - if (isNull(dto)) { - contractInfoMap.put(negotiationId, new ContractInfo(ContractInfo.ContractState.DECLINED)); - } - locks.unlock(negotiationId); - return dto; - } - - @Override - public DataReferenceRetrievalDto exchangeErrorContract(String negotiationId) { - locks.lock(negotiationId); - DataReferenceRetrievalDto dto = dtoMap.get(negotiationId); - if (isNull(dto)) { - contractInfoMap.put(negotiationId, new ContractInfo(ContractInfo.ContractState.ERROR)); - } - - locks.unlock(negotiationId); - return dto; - } - - @Override - public ContractInfo exchangeDto(DataReferenceRetrievalDto dto) { - String negotiationId = dto.getPayload().getContractNegotiationId(); - - locks.lock(negotiationId); - ContractInfo contractInfo = contractInfoMap.get(negotiationId); - if (isNull(contractInfo)) { - dtoMap.put(negotiationId, dto); - } - - locks.unlock(negotiationId); - return contractInfo; - } - - @Override - public void removeContractInfo(String negotiationId) { - contractInfoMap.remove(negotiationId); - locks.removeLock(negotiationId); - } - - @Override - public void removeDto(String negotiationId) { - dtoMap.remove(negotiationId); - locks.removeLock(negotiationId); - } -} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterConfig.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterConfig.java new file mode 100644 index 000000000..cd243f9ba --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterConfig.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter; + +import org.eclipse.edc.spi.system.ServiceExtensionContext; + +public class ApiAdapterConfig { + private static final String DEFAULT_MESSAGE_RETRY_NUMBER = + "edc.cp.adapter.default.message.retry.number"; + private static final String DEFAULT_SYNC_REQUEST_TIMEOUT = + "edc.cp.adapter.default.sync.request.timeout"; + private static final String CATALOG_EXPIRE_AFTER_TIME = + "edc.cp.adapter.cache.catalog.expire.after"; + private static final String REUSE_CONTRACT_AGREEMENT = "edc.cp.adapter.reuse.contract.agreement"; + private static final String CATALOG_REQUEST_LIMIT = "edc.cp.adapter.catalog.request.limit"; + + private static final String DATASOURCE_NAME = "edc.datasource.cpadapter.name"; + private static final String DATASOURCE_URL = "edc.datasource.cpadapter.url"; + private static final String DATASOURCE_USER = "edc.datasource.cpadapter.user"; + private static final String DATASOURCE_PASS = "edc.datasource.cpadapter.password"; + + private static final String IN_MEMORY_MESSAGE_BUS_THREAD_NUMBER = + "edc.cp.adapter.messagebus.inmemory.thread.number"; + private static final String SQL_MESSAGE_BUS_THREAD_NUMBER = + "edc.cp.adapter.messagebus.sql.thread.number"; + private static final String SQL_MESSAGE_BUS_MAX_DELIVERY = + "edc.cp.adapter.messagebus.sql.max.delivery"; + private static final String SQL_MESSAGE_BUS_DELIVERY_INTERVAL = + "edc.cp.adapter.messagebus.sql.max.delivery"; + + private final ServiceExtensionContext context; + + public ApiAdapterConfig(ServiceExtensionContext context) { + this.context = context; + } + + public int getDefaultMessageRetryNumber() { + return context.getSetting(DEFAULT_MESSAGE_RETRY_NUMBER, 3); + } + + public int getDefaultSyncRequestTimeout() { + return context.getSetting(DEFAULT_SYNC_REQUEST_TIMEOUT, 20); + } + + public int getInMemoryMessageBusThreadNumber() { + return context.getSetting(IN_MEMORY_MESSAGE_BUS_THREAD_NUMBER, 10); + } + + public boolean isContractAgreementReuseOn() { + return context.getSetting(REUSE_CONTRACT_AGREEMENT, true); + } + + public int getCatalogExpireAfterTime() { + return context.getSetting(CATALOG_EXPIRE_AFTER_TIME, 180); + } + + public int getCatalogRequestLimit() { + return context.getSetting(CATALOG_REQUEST_LIMIT, 100); + } + + public String getDataSourceName() { + return context.getSetting(DATASOURCE_NAME, "cpadapter"); + } + + public String getDataSourceUrl() { + return context.getSetting(DATASOURCE_URL, null); + } + + public String getDataSourceUser() { + return context.getSetting(DATASOURCE_USER, null); + } + + public String getDataSourcePass() { + return context.getSetting(DATASOURCE_PASS, null); + } + + public int getSqlMessageBusThreadNumber() { + return context.getSetting(SQL_MESSAGE_BUS_THREAD_NUMBER, 10); + } + + public int getSqlMessageBusMaxDelivery() { + return context.getSetting(SQL_MESSAGE_BUS_MAX_DELIVERY, 10); + } + + public int getSqlMessageBusDeliveryInterval() { + return context.getSetting(SQL_MESSAGE_BUS_DELIVERY_INTERVAL, 1); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterExtension.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterExtension.java new file mode 100644 index 000000000..16eb0a32a --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/ApiAdapterExtension.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter; + +import static java.util.Objects.nonNull; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.Clock; +import java.util.Objects; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.eclipse.edc.connector.api.management.configuration.ManagementApiConfiguration; +import org.eclipse.edc.connector.contract.spi.negotiation.observe.ContractNegotiationListener; +import org.eclipse.edc.connector.contract.spi.negotiation.observe.ContractNegotiationObservable; +import org.eclipse.edc.connector.spi.catalog.CatalogService; +import org.eclipse.edc.connector.spi.contractagreement.ContractAgreementService; +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.connector.spi.transferprocess.TransferProcessService; +import org.eclipse.edc.connector.transfer.spi.edr.EndpointDataReferenceReceiver; +import org.eclipse.edc.connector.transfer.spi.edr.EndpointDataReferenceReceiverRegistry; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; +import org.eclipse.edc.transaction.spi.TransactionContext; +import org.eclipse.edc.web.spi.WebService; +import org.eclipse.tractusx.edc.cp.adapter.messaging.*; +import org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation.CatalogCachedRetriever; +import org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation.CatalogRetriever; +import org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation.ContractAgreementRetriever; +import org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation.ContractNegotiationHandler; +import org.eclipse.tractusx.edc.cp.adapter.process.contractnotification.*; +import org.eclipse.tractusx.edc.cp.adapter.process.datareference.*; +import org.eclipse.tractusx.edc.cp.adapter.service.ErrorResultService; +import org.eclipse.tractusx.edc.cp.adapter.service.ResultService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreServiceInMemory; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreServiceSql; +import org.eclipse.tractusx.edc.cp.adapter.store.SqlObjectStore; +import org.eclipse.tractusx.edc.cp.adapter.store.SqlQueueStore; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.postgres.PostgresDialectObjectStoreStatements; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.postgres.PostgresDialectQueueStatements; +import org.eclipse.tractusx.edc.cp.adapter.util.ExpiringMap; +import org.eclipse.tractusx.edc.cp.adapter.util.LockMap; + +public class ApiAdapterExtension implements ServiceExtension { + @Inject private Monitor monitor; + @Inject private ContractNegotiationObservable negotiationObservable; + @Inject private WebService webService; + @Inject private ContractNegotiationService contractNegotiationService; + @Inject private EndpointDataReferenceReceiverRegistry receiverRegistry; + @Inject private ManagementApiConfiguration apiConfig; + @Inject private TransferProcessService transferProcessService; + @Inject private TransactionContext transactionContext; + @Inject private CatalogService catalogService; + @Inject private ContractAgreementService agreementService; + @Inject private DataSourceRegistry dataSourceRegistry; + @Inject private Clock clock; + + @Override + public String name() { + return "Control Plane Adapter Extension"; + } + + @Override + public void initialize(ServiceExtensionContext context) { + ApiAdapterConfig config = new ApiAdapterConfig(context); + ListenerService listenerService = new ListenerService(); + + MessageBus messageBus = createMessageBus(listenerService, context, config); + ObjectStoreService storeService = getStoreService(context, config); + + ResultService resultService = new ResultService(config.getDefaultSyncRequestTimeout(), monitor); + ErrorResultService errorResultService = new ErrorResultService(monitor, messageBus); + + ContractNotificationSyncService contractSyncService = + new ContractSyncService(storeService, new LockMap()); + + DataTransferInitializer dataTransferInitializer = + new DataTransferInitializer(monitor, transferProcessService); + + ContractNotificationHandler contractNotificationHandler = + new ContractNotificationHandler( + monitor, + messageBus, + contractSyncService, + contractNegotiationService, + dataTransferInitializer); + + ContractNegotiationHandler contractNegotiationHandler = + getContractNegotiationHandler(monitor, contractNegotiationService, messageBus, config); + + DataRefNotificationSyncService dataRefSyncService = + new DataRefSyncService(storeService, new LockMap()); + DataReferenceHandler dataReferenceHandler = + new DataReferenceHandler(monitor, messageBus, dataRefSyncService); + + listenerService.addListener(Channel.INITIAL, contractNegotiationHandler); + listenerService.addListener(Channel.CONTRACT_CONFIRMATION, contractNotificationHandler); + listenerService.addListener(Channel.DATA_REFERENCE, dataReferenceHandler); + listenerService.addListener(Channel.RESULT, resultService); + listenerService.addListener(Channel.DLQ, errorResultService); + + initHttpController(messageBus, resultService, config); + initContractNegotiationListener( + negotiationObservable, messageBus, contractSyncService, dataTransferInitializer); + initDataReferenceReceiver(messageBus, dataRefSyncService); + initDataRefErrorHandler(messageBus, storeService, transferProcessService); + } + + private MessageBus createMessageBus( + ListenerService listenerService, ServiceExtensionContext context, ApiAdapterConfig config) { + if (!isPersistenceConfigured(config)) { + monitor.info( + "Persistent layer configuration is missing. Starting MessageBus in 'IN MEMORY' mode."); + return new InMemoryMessageBus( + monitor, listenerService, config.getInMemoryMessageBusThreadNumber()); + } + + SqlQueueStore sqlQueueStore = + new SqlQueueStore( + dataSourceRegistry, + config.getDataSourceName(), + transactionContext, + context.getTypeManager().getMapper(), + new PostgresDialectQueueStatements(), + context.getConnectorId(), + clock); + SqlMessageBus messageBus = + new SqlMessageBus( + monitor, + listenerService, + sqlQueueStore, + config.getSqlMessageBusThreadNumber(), + config.getSqlMessageBusMaxDelivery()); + initMessageBus(messageBus, config); + return messageBus; + } + + private ObjectStoreService getStoreService( + ServiceExtensionContext context, ApiAdapterConfig config) { + if (!isPersistenceConfigured(config)) { + monitor.info( + "Persistent layer configuration is missing. Starting Control Plane Adapter Extension in 'IN MEMORY' mode."); + return new ObjectStoreServiceInMemory(context.getTypeManager().getMapper()); + } + + ObjectMapper mapper = context.getTypeManager().getMapper(); + SqlObjectStore objectStore = + new SqlObjectStore( + dataSourceRegistry, + config.getDataSourceName(), + transactionContext, + mapper, + new PostgresDialectObjectStoreStatements()); + return new ObjectStoreServiceSql(mapper, objectStore); + } + + private void initMessageBus(SqlMessageBus messageBus, ApiAdapterConfig config) { + final int poolSize = 1; + final int initialDelay = 5; + ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(poolSize); + scheduler.scheduleAtFixedRate( + () -> messageBus.deliverMessages(config.getSqlMessageBusMaxDelivery()), + initialDelay, + config.getSqlMessageBusDeliveryInterval(), + TimeUnit.SECONDS); + } + + private void initHttpController( + MessageBus messageBus, ResultService resultService, ApiAdapterConfig config) { + webService.registerResource( + apiConfig.getContextAlias(), + new HttpController(monitor, resultService, messageBus, config)); + } + + private ContractNegotiationHandler getContractNegotiationHandler( + Monitor monitor, + ContractNegotiationService contractNegotiationService, + MessageBus messageBus, + ApiAdapterConfig config) { + return new ContractNegotiationHandler( + monitor, + messageBus, + contractNegotiationService, + new CatalogCachedRetriever( + new CatalogRetriever(config.getCatalogRequestLimit(), catalogService), + new ExpiringMap<>()), + new ContractAgreementRetriever(monitor, agreementService)); + } + + private void initDataReferenceReceiver( + MessageBus messageBus, DataRefNotificationSyncService dataRefSyncService) { + EndpointDataReferenceReceiver dataReferenceReceiver = + new EndpointDataReferenceReceiverImpl(monitor, messageBus, dataRefSyncService); + receiverRegistry.registerReceiver(dataReferenceReceiver); + } + + private void initContractNegotiationListener( + ContractNegotiationObservable negotiationObservable, + MessageBus messageBus, + ContractNotificationSyncService contractSyncService, + DataTransferInitializer dataTransferInitializer) { + ContractNegotiationListener contractNegotiationListener = + new ContractNegotiationListenerImpl( + monitor, messageBus, contractSyncService, dataTransferInitializer); + if (nonNull(negotiationObservable)) { + negotiationObservable.registerListener(contractNegotiationListener); + } + } + + private void initDataRefErrorHandler( + MessageBus messageBus, + ObjectStoreService objectStore, + TransferProcessService transferProcessService) { + + final int poolSize = 1; + final int initialDelay = 5; + final int interval = 5; + ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(poolSize); + + DataReferenceErrorHandler errorHandler = + new DataReferenceErrorHandler(monitor, messageBus, objectStore, transferProcessService); + + scheduler.scheduleAtFixedRate( + errorHandler::validateActiveProcesses, initialDelay, interval, TimeUnit.SECONDS); + } + + private boolean isPersistenceConfigured(ApiAdapterConfig config) { + return Objects.nonNull(config.getDataSourceName()) + && Objects.nonNull(config.getDataSourceUrl()); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/HttpController.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/HttpController.java similarity index 58% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/HttpController.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/HttpController.java index 4837d9694..1d6bbc3fa 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/HttpController.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/HttpController.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter; +package org.eclipse.tractusx.edc.cp.adapter; import static java.util.Objects.isNull; @@ -20,14 +20,16 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.util.Objects; +import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.service.ResultService; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.util.string.StringUtils; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; +import org.eclipse.tractusx.edc.cp.adapter.service.ResultService; @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) @@ -42,16 +44,24 @@ public class HttpController { @GET @Path("sync/{assetId}") public Response getAssetSynchronous( - @PathParam("assetId") String assetId, @QueryParam("providerUrl") String providerUrl) { + @PathParam("assetId") String assetId, + @QueryParam("providerUrl") String providerUrl, + @QueryParam("contractAgreementId") String contractAgreementId, + @QueryParam("contractAgreementReuse") @DefaultValue("true") boolean contractAgreementReuse, + @QueryParam("timeout") String timeout) { if (invalidParams(assetId, providerUrl)) { return badRequestResponse(); } - String traceId = initiateProcess(assetId, providerUrl); + String traceId = + initiateProcess(assetId, providerUrl, contractAgreementId, contractAgreementReuse); try { - ProcessData processData = resultService.pull(traceId); + ProcessData processData = + StringUtils.isNullOrEmpty(timeout) || !isNumeric(timeout) + ? resultService.pull(traceId) + : resultService.pull(traceId, Long.parseLong(timeout), TimeUnit.SECONDS); if (Objects.isNull(processData)) { return notFoundResponse(); @@ -79,14 +89,30 @@ private boolean invalidParams(String assetId, String providerUrl) { return isNull(assetId) || assetId.isBlank() || isNull(providerUrl) || providerUrl.isBlank(); } - private String initiateProcess(String assetId, String providerUrl) { - ProcessData processData = getProcessData(assetId, providerUrl); + private String initiateProcess( + String assetId, + String providerUrl, + String contractAgreementId, + boolean contractAgreementReuse) { + ProcessData processData = + ProcessData.builder() + .assetId(assetId) + .provider(providerUrl) + .contractAgreementId(contractAgreementId) + .contractAgreementReuseOn(isContractAgreementReuseOn(contractAgreementReuse)) + .catalogExpiryTime(config.getCatalogExpireAfterTime()) + .build(); + Message message = new DataReferenceRetrievalDto(processData, config.getDefaultMessageRetryNumber()); messageBus.send(Channel.INITIAL, message); return message.getTraceId(); } + private boolean isContractAgreementReuseOn(boolean contractAgreementReuse) { + return contractAgreementReuse && config.isContractAgreementReuseOn(); + } + private Response notFoundResponse() { return Response.status(Response.Status.NOT_FOUND) .entity(Response.Status.NOT_FOUND.getReasonPhrase()) @@ -111,12 +137,7 @@ private Response timeoutResponse() { .build(); } - private ProcessData getProcessData(String assetId, String providerUrl) { - return ProcessData.builder() - .assetId(assetId) - .provider(providerUrl) - .contractAgreementCacheOn(config.isContractAgreementCacheOn()) - .catalogExpiryTime(config.getCatalogExpireAfterTime()) - .build(); + private boolean isNumeric(String str) { + return str != null && str.matches("[0-9]+"); } } diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/DataReferenceRetrievalDto.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/DataReferenceRetrievalDto.java similarity index 77% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/DataReferenceRetrievalDto.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/DataReferenceRetrievalDto.java index de9931616..675a991e4 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/DataReferenceRetrievalDto.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/DataReferenceRetrievalDto.java @@ -12,10 +12,12 @@ * */ -package net.catenax.edc.cp.adapter.dto; +package org.eclipse.tractusx.edc.cp.adapter.dto; -import net.catenax.edc.cp.adapter.messaging.Message; +import lombok.NoArgsConstructor; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +@NoArgsConstructor public class DataReferenceRetrievalDto extends Message { public DataReferenceRetrievalDto(ProcessData payload, int retryLimit) { super(payload, retryLimit); diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/ProcessData.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/ProcessData.java similarity index 70% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/ProcessData.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/ProcessData.java index 182898eaf..98792df2a 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/dto/ProcessData.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/dto/ProcessData.java @@ -12,34 +12,34 @@ * */ -package net.catenax.edc.cp.adapter.dto; +package org.eclipse.tractusx.edc.cp.adapter.dto; import static java.lang.System.currentTimeMillis; import jakarta.ws.rs.core.Response; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import lombok.*; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; @Getter @ToString @Builder +@NoArgsConstructor +@AllArgsConstructor public class ProcessData { private final long timestamp = currentTimeMillis(); // request data - private final String assetId; - private final String provider; + private String assetId; + private String provider; private String contractOfferId; private int catalogExpiryTime; - private boolean contractAgreementCacheOn; + private boolean contractAgreementReuseOn; // contract data @Setter private String contractNegotiationId; @Setter private String contractAgreementId; - @Setter private boolean isContractConfirmed = false; + @Builder.Default @Setter private boolean isContractConfirmed = false; + @Setter private String transferProcessId; // result/response data @Setter private EndpointDataReference endpointDataReference; diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ConfigurationException.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ConfigurationException.java similarity index 90% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ConfigurationException.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ConfigurationException.java index 260000136..bd8e2ad2a 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ConfigurationException.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ConfigurationException.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.exception; +package org.eclipse.tractusx.edc.cp.adapter.exception; public class ConfigurationException extends RuntimeException { public ConfigurationException(String message) { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ExternalRequestException.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ExternalRequestException.java similarity index 91% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ExternalRequestException.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ExternalRequestException.java index a082a16dd..f8bcb8939 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ExternalRequestException.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ExternalRequestException.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.exception; +package org.eclipse.tractusx.edc.cp.adapter.exception; public class ExternalRequestException extends RuntimeException { public ExternalRequestException(String message) { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ResourceNotFoundException.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ResourceNotFoundException.java similarity index 91% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ResourceNotFoundException.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ResourceNotFoundException.java index 825e032cd..bde662d42 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/exception/ResourceNotFoundException.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/exception/ResourceNotFoundException.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.exception; +package org.eclipse.tractusx.edc.cp.adapter.exception; public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException(String message) { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Channel.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Channel.java similarity index 89% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Channel.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Channel.java index 4ec21b96b..170c6fc3d 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Channel.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Channel.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; public enum Channel { INITIAL, diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBus.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBus.java similarity index 95% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBus.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBus.java index a0993be5e..6b4043e1f 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBus.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBus.java @@ -12,14 +12,14 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; import static java.util.Objects.isNull; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.edc.spi.monitor.Monitor; public class InMemoryMessageBus implements MessageBus { private final Monitor monitor; diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Listener.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Listener.java similarity index 89% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Listener.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Listener.java index 21bba1b42..911ba8902 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Listener.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Listener.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; public interface Listener

> { void process(P message); diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/ListenerService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/ListenerService.java similarity index 89% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/ListenerService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/ListenerService.java index 4418bd661..3e79e3e6f 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/ListenerService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/ListenerService.java @@ -12,14 +12,14 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; import static java.util.Objects.isNull; import java.util.HashMap; import java.util.Map; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.exception.ConfigurationException; +import org.eclipse.tractusx.edc.cp.adapter.exception.ConfigurationException; @RequiredArgsConstructor public class ListenerService { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Message.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Message.java similarity index 65% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Message.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Message.java index ce8bd228b..9bb67c414 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/Message.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/Message.java @@ -12,18 +12,23 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@NoArgsConstructor +@Getter +@Setter public abstract class Message { - @Getter private final String traceId; - @Getter private final T payload; - private final AtomicInteger errorNumber = new AtomicInteger(); - private final int retryLimit; - @Getter private Exception finalException; + private String traceId; + private T payload; + private int errorNumber; + private int retryLimit; + private Exception exception; + private Exception finalException; public Message(String traceId, T payload, int retryLimit) { this.traceId = traceId; @@ -38,16 +43,16 @@ public Message(T payload, int retryLimit) { } protected long unsucceeded() { - errorNumber.incrementAndGet(); + errorNumber++; return getDelayTime(); } protected void clearErrors() { - errorNumber.set(0); + errorNumber = 0; } protected boolean canRetry() { - return errorNumber.get() < retryLimit; + return errorNumber < retryLimit; } protected void setFinalException(Exception e) { @@ -55,8 +60,6 @@ protected void setFinalException(Exception e) { } private int getDelayTime() { - return errorNumber.get() < 5 - ? errorNumber.get() * 750 - : (int) Math.pow(errorNumber.get(), 2) * 150; + return errorNumber < 5 ? errorNumber * 750 : (int) Math.pow(errorNumber, 2) * 150; } } diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/MessageBus.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/MessageBus.java similarity index 89% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/MessageBus.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/MessageBus.java index a8c17dc42..b1021dd6d 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/messaging/MessageBus.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/MessageBus.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; public interface MessageBus { void send(Channel name, Message message); diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBus.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBus.java new file mode 100644 index 000000000..d76079c53 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBus.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.messaging; + +import static java.util.Objects.isNull; + +import java.time.Instant; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.store.SqlQueueStore; +import org.eclipse.tractusx.edc.cp.adapter.store.model.QueueMessage; + +public class SqlMessageBus implements MessageBus { + private final int maxDelivery; + private final Monitor monitor; + private final ListenerService listenerService; + private final ScheduledExecutorService executorService; + private final SqlQueueStore store; + + public SqlMessageBus( + Monitor monitor, + ListenerService listenerService, + SqlQueueStore sqlQueueStore, + int threadPoolSize, + int maxDelivery) { + this.monitor = monitor; + this.listenerService = listenerService; + this.store = sqlQueueStore; + this.maxDelivery = maxDelivery; + this.executorService = Executors.newScheduledThreadPool(threadPoolSize); + } + + @Override + public void send(Channel channel, Message message) { + if (isNull(message)) { + monitor.warning(String.format("Message is empty, channel: %s", channel)); + return; + } + monitor.info(String.format("[%s] Message sent to channel: %s", message.getTraceId(), channel)); + long now = Instant.now().toEpochMilli(); + store.saveMessage( + QueueMessage.builder().channel(channel.name()).message(message).invokeAfter(now).build()); + + deliverMessages(maxDelivery); + } + + public void deliverMessages(int maxElements) { + List queueMessages = store.findMessagesToSend(maxElements); + monitor.debug(String.format("Found [%d] messages to send.", queueMessages.size())); + queueMessages.forEach( + queueMessage -> executorService.submit(() -> deliverMessage(queueMessage))); + } + + private void deliverMessage(QueueMessage queueMessage) { + Channel channel = Channel.valueOf(queueMessage.getChannel()); + Message message = queueMessage.getMessage(); + + int currentErrorNumber = message.getErrorNumber(); + message.clearErrors(); + + try { + listenerService.getListener(channel).process(message); + store.deleteMessage(queueMessage.getId()); + monitor.debug(String.format("[%s] Message sent and removed.", queueMessage.getId())); + } catch (Exception e) { + monitor.warning(String.format("[%s] Message processing error.", message.getTraceId()), e); + message.setErrorNumber(currentErrorNumber); + if (!message.canRetry()) { + monitor.warning(String.format("[%s] Message reached retry limit!", message.getTraceId())); + sendMessageToDlq(message, e); + store.deleteMessage(queueMessage.getId()); + return; + } + long delayTime = message.unsucceeded(); + long now = Instant.now().toEpochMilli(); + queueMessage.setInvokeAfter(now + delayTime); + message.setException(e); + store.updateMessage(queueMessage); + } + } + + private void sendMessageToDlq(Message message, Exception finalException) { + message.clearErrors(); + message.setFinalException(finalException); + send(Channel.DLQ, message); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogCachedRetriever.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogCachedRetriever.java new file mode 100644 index 000000000..b57d6c9bc --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogCachedRetriever.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.catalog.spi.Catalog; +import org.eclipse.edc.util.collection.CollectionUtil; +import org.eclipse.tractusx.edc.cp.adapter.util.ExpiringMap; + +@RequiredArgsConstructor +public class CatalogCachedRetriever { + private final CatalogRetriever catalogRetriever; + private final ExpiringMap catalogCache; + + public Catalog getEntireCatalog(String providerUrl, int catalogExpiryTime) { + return getEntireCatalog(providerUrl, null, catalogExpiryTime); + } + + public Catalog getEntireCatalog(String providerUrl, String assetId, int catalogExpiryTime) { + Catalog catalog = catalogCache.get(getKey(providerUrl, assetId), catalogExpiryTime); + if (Objects.nonNull(catalog)) { + return catalog; + } + + catalog = catalogRetriever.getEntireCatalog(providerUrl, assetId); + + if (Objects.nonNull(catalog) && CollectionUtil.isNotEmpty(catalog.getContractOffers())) { + catalogCache.put(getKey(providerUrl, assetId), catalog); + } + + return catalog; + } + + private String getKey(String providerUrl, String assetId) { + return providerUrl + "::" + assetId; + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetriever.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetriever.java new file mode 100644 index 000000000..51ccef238 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetriever.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutionException; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.catalog.spi.Catalog; +import org.eclipse.edc.connector.spi.catalog.CatalogService; +import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.tractusx.edc.cp.adapter.exception.ExternalRequestException; + +@RequiredArgsConstructor +public class CatalogRetriever { + private final int limit; + private final CatalogService catalogService; + + public Catalog getEntireCatalog(String providerUrl) { + return getEntireCatalog(providerUrl, null); + } + + public Catalog getEntireCatalog(String providerUrl, String assetId) { + int offset = 0; + + Catalog catalogResult = getCatalog(providerUrl, getQuerySpec(limit, offset, assetId)); + boolean reachedLastPage = catalogResult.getContractOffers().size() < limit; + + while (!reachedLastPage) { + offset += limit; + Catalog catalog = getCatalog(providerUrl, getQuerySpec(limit, offset, assetId)); + catalogResult.getContractOffers().addAll(catalog.getContractOffers()); + reachedLastPage = catalog.getContractOffers().size() < limit; + } + + return catalogResult; + } + + public Catalog getCatalog(String providerUrl, QuerySpec querySpec) { + try { + return catalogService.getByProviderUrl(providerUrl, querySpec).get(); + } catch (InterruptedException | ExecutionException e) { + throw new ExternalRequestException("Could not retrieve contract offer.", e); + } + } + + private QuerySpec getQuerySpec(int limit, int offset, String assetId) { + List filters = + Objects.isNull(assetId) + ? Collections.emptyList() + : List.of(new Criterion("asset:prop:id", "=", assetId)); + return QuerySpec.Builder.newInstance().offset(offset).filter(filters).limit(limit).build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetriever.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetriever.java new file mode 100644 index 000000000..7d87948b0 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetriever.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import java.time.Instant; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.spi.contractagreement.ContractAgreementService; +import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.query.QuerySpec; + +@RequiredArgsConstructor +public class ContractAgreementRetriever { + private final Monitor monitor; + private final ContractAgreementService agreementService; + + public ContractAgreement getExistingContractById(String contractAgreementId) { + return agreementService.findById(contractAgreementId); + } + + public ContractAgreement getExistingContractByAssetId(String assetId) { + Collection agreements = getContractAgreementsByAssetId(assetId); + + validateResults(agreements); + + long now = Instant.now().getEpochSecond(); + return agreements.stream() + .filter(agreement -> agreement.getContractStartDate() < now) + .filter(agreement -> agreement.getContractEndDate() > now) + .findFirst() + .orElse(null); + } + + private Collection getContractAgreementsByAssetId(String assetId) { + QuerySpec querySpec = + QuerySpec.Builder.newInstance() + .filter(List.of(new Criterion("policy.target", "=", assetId))) + .limit(500) + .build(); + ServiceResult> result = agreementService.query(querySpec); + return result.succeeded() + ? result.getContent().collect(Collectors.toList()) + : Collections.emptyList(); + } + + private void validateResults(Collection agreements) { + if (agreements.size() > 1) { + monitor.warning( + "More than one agreement found for a given assetId! First of the list will be used!"); + } + int numberOfProviders = + agreements.stream() + .collect(Collectors.groupingBy(ContractAgreement::getProviderAgentId)) + .size(); + if (numberOfProviders > 1) { + monitor.warning("Contract agreement: given assetId found for more than one provider!"); + } + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java new file mode 100644 index 000000000..b0d7bf237 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandler.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import jakarta.ws.rs.core.Response; +import java.time.Instant; +import java.util.*; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.catalog.spi.Catalog; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractOfferRequest; +import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.exception.ResourceNotFoundException; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Listener; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; + +@RequiredArgsConstructor +public class ContractNegotiationHandler implements Listener { + private final Monitor monitor; + private final MessageBus messageBus; + private final ContractNegotiationService contractNegotiationService; + private final CatalogCachedRetriever catalogRetriever; + private final ContractAgreementRetriever agreementRetriever; + + @Override + public void process(DataReferenceRetrievalDto dto) { + monitor.info( + String.format( + "[%s] RequestHandler: input request: [%s]", dto.getTraceId(), dto.getPayload())); + ProcessData processData = dto.getPayload(); + + ContractAgreement contractAgreement = getContractAgreementById(dto); + if (Objects.nonNull(dto.getPayload().getContractAgreementId()) && contractAgreement == null) { + sendNotFoundErrorResult(dto, getAgreementNotFoundMessage(dto)); + return; + } + + if (Objects.isNull(contractAgreement)) { + contractAgreement = + agreementRetriever.getExistingContractByAssetId(dto.getPayload().getAssetId()); + } + + if (Objects.nonNull(contractAgreement) && isContractValid(contractAgreement)) { + monitor.info( + String.format("[%s] existing ContractAgreement taken from EDC.", dto.getTraceId())); + dto.getPayload().setContractAgreementId(contractAgreement.getId()); + dto.getPayload().setContractConfirmed(true); + messageBus.send(Channel.CONTRACT_CONFIRMATION, dto); + return; + } + + ContractOffer contractOffer = + findContractOffer( + processData.getAssetId(), + processData.getProvider(), + processData.getCatalogExpiryTime()); + + if (Objects.isNull(contractOffer)) { + sendNotFoundErrorResult(dto, getContractNotFoundMessage(dto)); + return; + } + + String contractNegotiationId = + initializeContractNegotiation( + contractOffer, dto.getPayload().getProvider(), dto.getTraceId()); + dto.getPayload().setContractNegotiationId(contractNegotiationId); + + messageBus.send(Channel.CONTRACT_CONFIRMATION, dto); + } + + private ContractAgreement getContractAgreementById(DataReferenceRetrievalDto dto) { + return Optional.ofNullable(dto.getPayload().getContractAgreementId()) + .map(agreementRetriever::getExistingContractById) + .orElse(null); + } + + private boolean isContractValid(ContractAgreement contractAgreement) { + long now = Instant.now().getEpochSecond(); + return Objects.nonNull(contractAgreement) + && contractAgreement.getContractStartDate() < now + && contractAgreement.getContractEndDate() > now; + } + + private ContractOffer findContractOffer( + String assetId, String providerUrl, int catalogExpiryTime) { + Catalog catalog = catalogRetriever.getEntireCatalog(providerUrl, assetId, catalogExpiryTime); + return Optional.ofNullable(catalog.getContractOffers()).orElse(Collections.emptyList()).stream() + .filter(it -> it.getAsset().getId().equals(assetId)) + .findFirst() + .orElse(null); + } + + private String initializeContractNegotiation( + ContractOffer contractOffer, String providerUrl, String traceId) { + monitor.info(String.format("[%s] RequestHandler: initiateNegotiation - start", traceId)); + ContractOfferRequest contractOfferRequest = + ContractOfferRequest.Builder.newInstance() + .connectorAddress(providerUrl) + .contractOffer(contractOffer) + .type(ContractOfferRequest.Type.INITIAL) + .connectorId("provider") + .protocol("ids-multipart") + .correlationId(traceId) + .build(); + + ContractNegotiation contractNegotiation = + contractNegotiationService.initiateNegotiation(contractOfferRequest); + monitor.info(String.format("[%s] RequestHandler: initiateNegotiation - end", traceId)); + return Optional.ofNullable(contractNegotiation.getId()) + .orElseThrow(() -> new ResourceNotFoundException("Could not find Contract NegotiationId")); + } + + private void sendNotFoundErrorResult(DataReferenceRetrievalDto dto, String message) { + dto.getPayload().setErrorMessage(message); + dto.getPayload().setErrorStatus(Response.Status.NOT_FOUND); + messageBus.send(Channel.RESULT, dto); + } + + private String getAgreementNotFoundMessage(DataReferenceRetrievalDto dto) { + return "Not found the contract agreement with ID: " + dto.getPayload().getContractAgreementId(); + } + + private String getContractNotFoundMessage(DataReferenceRetrievalDto dto) { + return "Could not find Contract Offer for given Asset Id"; + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInfo.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractInfo.java similarity index 83% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInfo.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractInfo.java index 46bd038d3..e4437cbbb 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractInfo.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractInfo.java @@ -12,10 +12,14 @@ * */ -package net.catenax.edc.cp.adapter.process.contractnotification; +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Getter; +import lombok.NoArgsConstructor; +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) public class ContractInfo { @Getter private String contractAgreementId; private ContractState contractState; diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java similarity index 71% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java index fc3bd55f0..a441eddf6 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerImpl.java @@ -1,16 +1,29 @@ -package net.catenax.edc.cp.adapter.process.contractnotification; +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; import static java.util.Objects.isNull; import jakarta.ws.rs.core.Response; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractDataStore; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.observe.ContractNegotiationListener; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.negotiation.observe.ContractNegotiationListener; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; @RequiredArgsConstructor public class ContractNegotiationListenerImpl implements ContractNegotiationListener { @@ -19,7 +32,6 @@ public class ContractNegotiationListenerImpl implements ContractNegotiationListe private final Monitor monitor; private final MessageBus messageBus; private final ContractNotificationSyncService syncService; - private final ContractDataStore contractDataStore; private final DataTransferInitializer dataTransfer; @Override @@ -34,10 +46,6 @@ public void confirmed(ContractNegotiation negotiation) { } dto.getPayload().setContractAgreementId(agreementId); initiateDataTransfer(dto); - contractDataStore.add( - dto.getPayload().getAssetId(), - dto.getPayload().getProvider(), - negotiation.getContractAgreement()); syncService.removeDto(negotiationId); } @@ -66,7 +74,8 @@ public void failed(ContractNegotiation negotiation) { } public void initiateDataTransfer(DataReferenceRetrievalDto dto) { - dataTransfer.initiate(dto); + String transferProcessId = dataTransfer.initiate(dto); + dto.getPayload().setTransferProcessId(transferProcessId); dto.getPayload().setContractConfirmed(true); messageBus.send(Channel.DATA_REFERENCE, dto); } diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java similarity index 79% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java index 42d6c89cb..5bd254194 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandler.java @@ -12,21 +12,21 @@ * */ -package net.catenax.edc.cp.adapter.process.contractnotification; +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; import static jakarta.ws.rs.core.Response.Status; import static java.util.Objects.isNull; import java.util.Objects; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Listener; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.api.datamanagement.contractnegotiation.service.ContractNegotiationService; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiationStates; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiationStates; +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Listener; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; @RequiredArgsConstructor public class ContractNotificationHandler implements Listener { @@ -73,7 +73,8 @@ public void process(DataReferenceRetrievalDto dto) { } public void initiateDataTransfer(DataReferenceRetrievalDto dto) { - dataTransfer.initiate(dto); + String transferProcessId = dataTransfer.initiate(dto); + dto.getPayload().setTransferProcessId(transferProcessId); dto.getPayload().setContractConfirmed(true); messageBus.send(Channel.DATA_REFERENCE, dto); } diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java similarity index 85% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java index b3582b9dd..e687822c2 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationSyncService.java @@ -12,9 +12,9 @@ * */ -package net.catenax.edc.cp.adapter.process.contractnotification; +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; public interface ContractNotificationSyncService { DataReferenceRetrievalDto exchangeConfirmedContract( diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncService.java new file mode 100644 index 000000000..44f3cbce6 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncService.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; + +import static java.util.Objects.isNull; + +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectType; +import org.eclipse.tractusx.edc.cp.adapter.util.LockMap; + +public class ContractSyncService implements ContractNotificationSyncService { + private final ObjectStoreService storeService; + private final LockMap locks; + + public ContractSyncService(ObjectStoreService storeService, LockMap locks) { + this.storeService = storeService; + this.locks = locks; + } + + @Override + public DataReferenceRetrievalDto exchangeConfirmedContract( + String negotiationId, String agreementId) { + locks.lock(negotiationId); + + DataReferenceRetrievalDto dto = + storeService.get(negotiationId, ObjectType.DTO, DataReferenceRetrievalDto.class); + + if (isNull(dto)) { + ContractInfo contractInfo = + new ContractInfo(agreementId, ContractInfo.ContractState.CONFIRMED); + storeService.put(negotiationId, ObjectType.CONTRACT_INFO, contractInfo); + } + locks.unlock(negotiationId); + return dto; + } + + @Override + public DataReferenceRetrievalDto exchangeDeclinedContract(String negotiationId) { + locks.lock(negotiationId); + + DataReferenceRetrievalDto dto = + storeService.get(negotiationId, ObjectType.DTO, DataReferenceRetrievalDto.class); + + if (isNull(dto)) { + ContractInfo contractInfo = new ContractInfo(ContractInfo.ContractState.DECLINED); + storeService.put(negotiationId, ObjectType.CONTRACT_INFO, contractInfo); + } + locks.unlock(negotiationId); + return dto; + } + + @Override + public DataReferenceRetrievalDto exchangeErrorContract(String negotiationId) { + locks.lock(negotiationId); + + DataReferenceRetrievalDto dto = + storeService.get(negotiationId, ObjectType.DTO, DataReferenceRetrievalDto.class); + + if (isNull(dto)) { + ContractInfo contractInfo = new ContractInfo(ContractInfo.ContractState.ERROR); + storeService.put(negotiationId, ObjectType.CONTRACT_INFO, contractInfo); + } + + locks.unlock(negotiationId); + return dto; + } + + @Override + public ContractInfo exchangeDto(DataReferenceRetrievalDto dto) { + String negotiationId = dto.getPayload().getContractNegotiationId(); + locks.lock(negotiationId); + + ContractInfo contractInfo = + storeService.get(negotiationId, ObjectType.CONTRACT_INFO, ContractInfo.class); + + if (isNull(contractInfo)) { + storeService.put(negotiationId, ObjectType.DTO, dto); + } + + locks.unlock(negotiationId); + return contractInfo; + } + + @Override + public void removeContractInfo(String negotiationId) { + storeService.remove(negotiationId, ObjectType.CONTRACT_INFO); + locks.removeLock(negotiationId); + } + + @Override + public void removeDto(String negotiationId) { + storeService.remove(negotiationId, ObjectType.DTO); + locks.removeLock(negotiationId); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java similarity index 61% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java index 29ba2b3bd..34812567f 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/DataTransferInitializer.java @@ -1,21 +1,35 @@ -package net.catenax.edc.cp.adapter.process.contractnotification; +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.exception.ExternalRequestException; -import org.eclipse.dataspaceconnector.api.datamanagement.transferprocess.service.TransferProcessService; -import org.eclipse.dataspaceconnector.api.result.ServiceResult; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.DataAddress; -import org.eclipse.dataspaceconnector.spi.types.domain.transfer.DataRequest; -import org.eclipse.dataspaceconnector.spi.types.domain.transfer.TransferType; +import org.eclipse.edc.connector.spi.transferprocess.TransferProcessService; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.connector.transfer.spi.types.TransferType; +import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.exception.ExternalRequestException; @RequiredArgsConstructor public class DataTransferInitializer { private final Monitor monitor; private final TransferProcessService transferProcessService; - public void initiate(DataReferenceRetrievalDto dto) { + public String initiate(DataReferenceRetrievalDto dto) { monitor.info( String.format( "[%s] ContractConfirmationHandler: transfer init - start.", dto.getTraceId())); @@ -46,6 +60,8 @@ public void initiate(DataReferenceRetrievalDto dto) { if (result.failed()) { throwDataRefRequestException(dto); } + + return result.getContent(); } private void throwDataRefRequestException(DataReferenceRetrievalDto dto) { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java similarity index 77% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java index f74bb9b58..2bb24af30 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefNotificationSyncService.java @@ -12,10 +12,10 @@ * */ -package net.catenax.edc.cp.adapter.process.datareference; +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; public interface DataRefNotificationSyncService { EndpointDataReference exchangeDto(DataReferenceRetrievalDto dto, String contractAgreementId); diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefInMemorySyncService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncService.java similarity index 52% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefInMemorySyncService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncService.java index 277e96b34..812ba70da 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataRefInMemorySyncService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncService.java @@ -12,28 +12,30 @@ * */ -package net.catenax.edc.cp.adapter.process.datareference; +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; import static java.util.Objects.isNull; -import java.util.HashMap; -import java.util.Map; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.util.LockMap; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectType; +import org.eclipse.tractusx.edc.cp.adapter.util.LockMap; @RequiredArgsConstructor -public class DataRefInMemorySyncService implements DataRefNotificationSyncService { - private final Map dtoMap = new HashMap<>(); - private final Map dataReferenceMap = new HashMap<>(); +public class DataRefSyncService implements DataRefNotificationSyncService { + private final ObjectStoreService storeService; private final LockMap locks; public EndpointDataReference exchangeDto(DataReferenceRetrievalDto dto, String agreementId) { locks.lock(agreementId); - EndpointDataReference dataReference = dataReferenceMap.get(agreementId); + + EndpointDataReference dataReference = + storeService.get(agreementId, ObjectType.DATA_REFERENCE, EndpointDataReference.class); + if (isNull(dataReference)) { - dtoMap.put(agreementId, dto); + storeService.put(agreementId, ObjectType.DTO, dto); } locks.unlock(agreementId); return dataReference; @@ -43,9 +45,12 @@ public EndpointDataReference exchangeDto(DataReferenceRetrievalDto dto, String a public DataReferenceRetrievalDto exchangeDataReference( EndpointDataReference dataReference, String agreementId) { locks.lock(agreementId); - DataReferenceRetrievalDto dto = dtoMap.get(agreementId); + + DataReferenceRetrievalDto dto = + storeService.get(agreementId, ObjectType.DTO, DataReferenceRetrievalDto.class); + if (isNull(dto)) { - dataReferenceMap.put(agreementId, dataReference); + storeService.put(agreementId, ObjectType.DATA_REFERENCE, dataReference); } locks.unlock(agreementId); return dto; @@ -53,13 +58,13 @@ public DataReferenceRetrievalDto exchangeDataReference( @Override public void removeDataReference(String agreementId) { - dataReferenceMap.remove(agreementId); + storeService.remove(agreementId, ObjectType.DATA_REFERENCE); locks.removeLock(agreementId); } @Override public void removeDto(String agreementId) { - dtoMap.remove(agreementId); + storeService.remove(agreementId, ObjectType.DTO); locks.removeLock(agreementId); } } diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandler.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandler.java new file mode 100644 index 000000000..39885837c --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandler.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; + +import jakarta.ws.rs.core.Response; +import java.util.List; +import lombok.AllArgsConstructor; +import org.eclipse.edc.connector.spi.transferprocess.TransferProcessService; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.util.string.StringUtils; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectType; + +@AllArgsConstructor +public class DataReferenceErrorHandler { + private static final String ERROR_MESSAGE = "Data reference process stage failed with status: "; + private final Monitor monitor; + private final MessageBus messageBus; + private final ObjectStoreService objectStore; + private final TransferProcessService transferProcessService; + + private final List errorStates = List.of("CANCELLED", "ERROR"); + + public void validateActiveProcesses() { + monitor.debug("Data reference error handling - START"); + objectStore.get(ObjectType.DTO, DataReferenceRetrievalDto.class).stream() + .filter(dto -> !StringUtils.isNullOrEmpty(dto.getPayload().getTransferProcessId())) + .forEach(this::validateProcess); + } + + private void validateProcess(DataReferenceRetrievalDto dto) { + String state = transferProcessService.getState(dto.getPayload().getTransferProcessId()); + if (errorStates.contains(state)) { + monitor.warning(String.format("[%s] ", dto.getTraceId()) + ERROR_MESSAGE + state); + String contractAgreementId = dto.getPayload().getContractAgreementId(); + objectStore.remove(contractAgreementId, ObjectType.DTO); + + dto.getPayload().setErrorStatus(Response.Status.BAD_GATEWAY); + dto.getPayload().setErrorMessage(ERROR_MESSAGE + state); + messageBus.send(Channel.RESULT, dto); + } + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandler.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandler.java similarity index 75% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandler.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandler.java index 590e77881..2e5f901d3 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandler.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandler.java @@ -12,17 +12,17 @@ * */ -package net.catenax.edc.cp.adapter.process.datareference; +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; import static java.util.Objects.isNull; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Listener; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Listener; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; @RequiredArgsConstructor public class DataReferenceHandler implements Listener { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java similarity index 58% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java index adb96c13b..0f1173cf4 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverImpl.java @@ -1,16 +1,30 @@ -package net.catenax.edc.cp.adapter.process.datareference; +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; import static java.util.Objects.isNull; import java.util.concurrent.CompletableFuture; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiver; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.connector.transfer.spi.edr.EndpointDataReferenceReceiver; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.result.Result; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.jetbrains.annotations.NotNull; @RequiredArgsConstructor diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ErrorResultService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ErrorResultService.java similarity index 78% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ErrorResultService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ErrorResultService.java index 1a1527a97..5428317e3 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ErrorResultService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ErrorResultService.java @@ -12,20 +12,20 @@ * */ -package net.catenax.edc.cp.adapter.service; +package org.eclipse.tractusx.edc.cp.adapter.service; import jakarta.ws.rs.core.Response; import java.util.HashMap; import java.util.Map; import java.util.Objects; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.exception.ExternalRequestException; -import net.catenax.edc.cp.adapter.exception.ResourceNotFoundException; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Listener; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.exception.ExternalRequestException; +import org.eclipse.tractusx.edc.cp.adapter.exception.ResourceNotFoundException; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Listener; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; @RequiredArgsConstructor public class ErrorResultService implements Listener { diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ResultService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultService.java similarity index 57% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ResultService.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultService.java index 63a12a65f..494237abe 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/service/ResultService.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultService.java @@ -12,25 +12,28 @@ * */ -package net.catenax.edc.cp.adapter.service; +package org.eclipse.tractusx.edc.cp.adapter.service; import static java.util.Objects.isNull; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Listener; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Listener; @RequiredArgsConstructor public class ResultService implements Listener { private final int CAPACITY = 1; private final int DEFAULT_TIMEOUT; private final Map> results = new ConcurrentHashMap<>(); + private final Monitor monitor; public ProcessData pull(String id) throws InterruptedException { return pull(id, DEFAULT_TIMEOUT, SECONDS); @@ -50,17 +53,41 @@ public void process(DataReferenceRetrievalDto dto) { if (isNull(dto) || isNull(dto.getPayload())) { throw new IllegalArgumentException(); } + logReceivedResult(dto); add(dto.getTraceId(), dto.getPayload()); } - private void add(String id, ProcessData ProcessData) { + private void add(String id, ProcessData processData) { if (!results.containsKey(id)) { initiate(id); } - results.get(id).add(ProcessData); + try { + results.get(id).add(processData); + } catch (IllegalStateException e) { + logIgnoredResult(id, processData); + } } private void initiate(String id) { results.put(id, new ArrayBlockingQueue<>(CAPACITY)); } + + private void logReceivedResult(DataReferenceRetrievalDto dto) { + monitor.info( + String.format( + "[%s] Result received: %s", dto.getTraceId(), getResultInfo(dto.getPayload()))); + } + + private void logIgnoredResult(String id, ProcessData processData) { + monitor.warning( + String.format( + "[%s] Other Result was already returned! Result '%s' will be ignored!", + id, getResultInfo(processData))); + } + + private String getResultInfo(ProcessData processData) { + return Objects.nonNull(processData.getErrorMessage()) + ? processData.getErrorMessage() + : processData.getEndpointDataReference().getId(); + } } diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreService.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreService.java new file mode 100644 index 000000000..6c3818379 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.service.objectstore; + +import java.util.List; + +public interface ObjectStoreService { + void put(String key, ObjectType objectType, Object object); + + T get(String key, ObjectType objectType, Class type); + + void remove(String key, ObjectType objectType); + + List get(ObjectType objectType, Class type); +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceInMemory.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceInMemory.java new file mode 100644 index 000000000..3e1a8190a --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceInMemory.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.service.objectstore; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class ObjectStoreServiceInMemory implements ObjectStoreService { + private final ObjectMapper mapper; + private final Map map = new HashMap<>(); + + @Override + public void put(String key, ObjectType objectType, Object object) { + try { + map.put(getKey(key, objectType), mapper.writeValueAsString(object)); + } catch (JsonProcessingException e) { + e.printStackTrace(); + throw new IllegalArgumentException(); + } + } + + @Override + public T get(String key, ObjectType objectType, Class type) { + String json = map.get(getKey(key, objectType)); + return Objects.isNull(json) ? null : map(type, json); + } + + @Override + public List get(ObjectType objectType, Class type) { + return map.entrySet().stream() + .filter(entry -> entry.getKey().startsWith(objectType.name())) + .map(Map.Entry::getValue) + .map(s -> map(type, s)) + .collect(Collectors.toList()); + } + + @Override + public void remove(String key, ObjectType objectType) { + map.remove(getKey(key, objectType)); + } + + private String getKey(String key, ObjectType objectType) { + return objectType.name() + key; + } + + private T map(Class type, String json) { + T object = null; + try { + object = mapper.readValue(json, type); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return object; + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceSql.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceSql.java new file mode 100644 index 000000000..b16daea50 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectStoreServiceSql.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.service.objectstore; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import org.eclipse.edc.util.collection.CollectionUtil; +import org.eclipse.tractusx.edc.cp.adapter.store.SqlObjectStore; +import org.eclipse.tractusx.edc.cp.adapter.store.model.ObjectEntity; + +@AllArgsConstructor +public class ObjectStoreServiceSql implements ObjectStoreService { + private final ObjectMapper mapper; + private final SqlObjectStore objectStore; + + @Override + public void put(String key, ObjectType objectType, Object object) { + ObjectEntity entity = + ObjectEntity.builder() + .id(key) + .type(objectType.name()) + .object(objectToJson(object, objectType.name())) + .build(); + objectStore.saveMessage(entity); + } + + @Override + public T get(String key, ObjectType objectType, Class type) { + ObjectEntity entity = objectStore.find(key, objectType.name()); + if (Objects.isNull(entity)) { + return null; + } + return jsonToObject(entity, type); + } + + @Override + public List get(ObjectType objectType, Class type) { + List entities = objectStore.find(objectType.name()); + if (CollectionUtil.isEmpty(entities)) { + return List.of(); + } + return entities.stream().map(entity -> jsonToObject(entity, type)).collect(Collectors.toList()); + } + + @Override + public void remove(String key, ObjectType objectType) { + objectStore.deleteMessage(key, objectType.name()); + } + + private String objectToJson(Object object, String type) { + if (Objects.isNull(object)) { + return null; + } + try { + return mapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + throw new IllegalArgumentException(String.format("Can not parse object of type %s", type)); + } + } + + private T jsonToObject(ObjectEntity entity, Class type) { + try { + return mapper.readValue(entity.getObject(), type); + } catch (JsonProcessingException e) { + e.printStackTrace(); + throw new IllegalArgumentException(String.format("Can not parse object of type %s", type)); + } + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractDataStore.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectType.java similarity index 52% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractDataStore.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectType.java index 71e3876b3..5cbee2d0f 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/process/contractdatastore/ContractDataStore.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/service/objectstore/ObjectType.java @@ -12,12 +12,11 @@ * */ -package net.catenax.edc.cp.adapter.process.contractdatastore; +package org.eclipse.tractusx.edc.cp.adapter.service.objectstore; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.agreement.ContractAgreement; - -public interface ContractDataStore { - void add(String assetId, String provider, ContractAgreement contractAgreement); - - ContractAgreementData get(String assetId, String provider); +public enum ObjectType { + DTO, + CONTRACT_INFO, + DATA_REFERENCE, + RESULT } diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlObjectStore.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlObjectStore.java new file mode 100644 index 000000000..4a5ec94a9 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlObjectStore.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store; + +import static org.eclipse.edc.sql.SqlQueryExecutor.executeQuery; +import static org.eclipse.edc.sql.SqlQueryExecutor.executeQuerySingle; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.Instant; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.eclipse.edc.spi.persistence.EdcPersistenceException; +import org.eclipse.edc.sql.store.AbstractSqlStore; +import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; +import org.eclipse.edc.transaction.spi.TransactionContext; +import org.eclipse.tractusx.edc.cp.adapter.store.model.ObjectEntity; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.ObjectStoreStatements; + +public class SqlObjectStore extends AbstractSqlStore { + private final ObjectStoreStatements statements; + + public SqlObjectStore( + DataSourceRegistry dataSourceRegistry, + String dataSourceName, + TransactionContext transactionContext, + ObjectMapper objectMapper, + ObjectStoreStatements statements) { + super(dataSourceRegistry, dataSourceName, transactionContext, objectMapper); + this.statements = statements; + } + + public void saveMessage(ObjectEntity objectEntity) { + long now = Instant.now().toEpochMilli(); + transactionContext.execute( + () -> { + try (var conn = getConnection()) { + var template = statements.getSaveObjectTemplate(); + executeQuery( + conn, + template, + objectEntity.getId(), + now, + objectEntity.getType(), + objectEntity.getObject()); + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + public ObjectEntity find(String id, String type) { + return transactionContext.execute( + () -> { + try (var connection = getConnection()) { + var sql = statements.getFindByIdAndTypeTemplate(); + return executeQuerySingle(connection, false, this::mapObjectEntity, sql, id, type); + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + public List find(String type) { + return transactionContext.execute( + () -> { + try (var connection = getConnection()) { + var sql = statements.getFindByTypeTemplate(); + Stream stream = + executeQuery(connection, false, this::mapObjectEntity, sql, type); + List result = stream.collect(Collectors.toList()); + stream.close(); + return result; + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + public void deleteMessage(String id, String type) { + transactionContext.execute( + () -> { + try (var connection = getConnection()) { + var stmt = statements.getDeleteTemplate(); + executeQuery(connection, stmt, id, type); + } catch (SQLException | IllegalStateException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + private ObjectEntity mapObjectEntity(ResultSet resultSet) throws SQLException { + return ObjectEntity.builder() + .id(resultSet.getString(statements.getIdColumn())) + .createdAt(resultSet.getLong(statements.getCreatedAtColumn())) + .type(resultSet.getString(statements.getTypeColumn())) + .object(resultSet.getString(statements.getObjectColumn())) + .build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlQueueStore.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlQueueStore.java new file mode 100644 index 000000000..0d808fae1 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/SqlQueueStore.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store; + +import static org.eclipse.edc.sql.SqlQueryExecutor.executeQuery; +import static org.eclipse.edc.sql.SqlQueryExecutor.executeQuerySingle; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.Clock; +import java.time.Instant; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.eclipse.edc.spi.persistence.EdcPersistenceException; +import org.eclipse.edc.sql.lease.SqlLeaseContextBuilder; +import org.eclipse.edc.sql.store.AbstractSqlStore; +import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; +import org.eclipse.edc.transaction.spi.TransactionContext; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.store.model.QueueMessage; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.QueueStatements; + +public class SqlQueueStore extends AbstractSqlStore { + private final QueueStatements statements; + private final SqlLeaseContextBuilder leaseContext; + + public SqlQueueStore( + DataSourceRegistry dataSourceRegistry, + String dataSourceName, + TransactionContext transactionContext, + ObjectMapper objectMapper, + QueueStatements statements, + String connectorId, + Clock clock) { + super(dataSourceRegistry, dataSourceName, transactionContext, objectMapper); + this.statements = statements; + leaseContext = SqlLeaseContextBuilder.with(transactionContext, connectorId, statements, clock); + } + + public void saveMessage(QueueMessage queueMessage) { + long now = Instant.now().toEpochMilli(); + transactionContext.execute( + () -> { + try (var conn = getConnection()) { + var template = statements.getSaveMessageTemplate(); + executeQuery( + conn, + template, + now, + UUID.randomUUID().toString(), + queueMessage.getChannel(), + toJson(queueMessage.getMessage()), + queueMessage.getInvokeAfter()); + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + public QueueMessage findById(String id) { + return transactionContext.execute( + () -> { + try (var connection = getConnection()) { + var sql = statements.getFindByIdTemplate(); + return executeQuerySingle(connection, false, this::mapQueueMessage, sql, id); + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + public void deleteMessage(String id) { + transactionContext.execute( + () -> { + var existing = findById(id); + + if (existing != null) { + try (var connection = getConnection()) { + breakLease(connection, id); + var stmt = statements.getDeleteTemplate(); + executeQuery(connection, stmt, id); + } catch (SQLException | IllegalStateException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + } + }); + } + + public void updateMessage(QueueMessage queueMessage) { + transactionContext.execute( + () -> { + var existing = findById(queueMessage.getId()); + + if (existing != null) { + try (var connection = getConnection()) { + var stmt = statements.getUpdateTemplate(); + breakLease(connection, queueMessage.getId()); + executeQuery( + connection, + stmt, + queueMessage.getChannel(), + toJson(queueMessage.getMessage()), + queueMessage.getInvokeAfter(), + queueMessage.getId()); + } catch (SQLException | IllegalStateException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + } + }); + } + + public List findMessagesToSend(int max) { + long now = Instant.now().toEpochMilli(); + return transactionContext.execute( + () -> { + try (var connection = getConnection()) { + var sql = statements.getMessagesToSendTemplate(); + Stream stream = + executeQuery(connection, false, this::mapQueueMessage, sql, now, max); + List result = + stream + .map(queueMessage -> getLeasedQueueMessage(connection, queueMessage)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + stream.close(); + return result; + } catch (SQLException e) { + e.printStackTrace(); + throw new EdcPersistenceException(e); + } + }); + } + + private QueueMessage getLeasedQueueMessage(Connection connection, QueueMessage queueMessage) { + try { + acquireLease(connection, queueMessage.getId()); + return queueMessage; + } catch (IllegalStateException e) { + return null; + } + } + + private void acquireLease(Connection connection, String id) { + leaseContext.withConnection(connection).acquireLease(id); + } + + private void breakLease(Connection connection, String id) { + leaseContext.withConnection(connection).breakLease(id); + } + + private QueueMessage mapQueueMessage(ResultSet resultSet) throws SQLException { + return QueueMessage.builder() + .id(resultSet.getString(statements.getIdColumn())) + .message( + fromJson( + resultSet.getString(statements.getMessageColumn()), + DataReferenceRetrievalDto.class)) + .invokeAfter(resultSet.getLong(statements.getInvokeAfterColumn())) + .createdAt(resultSet.getLong(statements.getCreatedAtColumn())) + .channel(resultSet.getString(statements.getChannelColumn())) + .build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/ObjectEntity.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/ObjectEntity.java new file mode 100644 index 000000000..ffefe3927 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/ObjectEntity.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class ObjectEntity { + private String id; + private long createdAt; + private String type; + private String object; +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/QueueMessage.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/QueueMessage.java new file mode 100644 index 000000000..e3d1ec8bb --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/model/QueueMessage.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; + +@Getter +@Setter +@Builder +public class QueueMessage { + private String id; + private long createdAt; + private String channel; + private Message message; + private long invokeAfter; +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectObjectStoreStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectObjectStoreStatements.java new file mode 100644 index 000000000..caa7fb39a --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectObjectStoreStatements.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema; + +import static java.lang.String.format; + +import org.eclipse.edc.sql.dialect.BaseSqlDialect; + +public class BaseSqlDialectObjectStoreStatements implements ObjectStoreStatements { + @Override + public String getSaveObjectTemplate() { + return format( + "INSERT INTO %s (%s, %s, %s, %s) VALUES(?, ?, ?, ?%s)", + getObjectStoreTable(), + getIdColumn(), + getCreatedAtColumn(), + getTypeColumn(), + getObjectColumn(), + getFormatJsonOperator()); + } + + @Override + public String getFindByIdAndTypeTemplate() { + return format( + "SELECT * FROM %s WHERE %s = ? AND %s = ?", + getObjectStoreTable(), getIdColumn(), getTypeColumn()); + } + + @Override + public String getFindByTypeTemplate() { + return format("SELECT * FROM %s WHERE %s = ?", getObjectStoreTable(), getTypeColumn()); + } + + @Override + public String getDeleteTemplate() { + return format( + "DELETE FROM %s WHERE %s = ? AND %s = ?;", + getObjectStoreTable(), getIdColumn(), getTypeColumn()); + } + + protected String getFormatJsonOperator() { + return BaseSqlDialect.getJsonCastOperator(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectQueueStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectQueueStatements.java new file mode 100644 index 000000000..7bf19422c --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/BaseSqlDialectQueueStatements.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema; + +import static java.lang.String.format; + +import org.eclipse.edc.sql.dialect.BaseSqlDialect; + +public class BaseSqlDialectQueueStatements implements QueueStatements { + + @Override + public String getSaveMessageTemplate() { + return format( + "INSERT INTO %s (%s, %s, %s, %s, %s) VALUES(?, ?, ?, ?%s, ?)", + getQueueTable(), + getCreatedAtColumn(), + getIdColumn(), + getChannelColumn(), + getMessageColumn(), + getInvokeAfterColumn(), + getFormatJsonOperator()); + } + + @Override + public String getAllMessagesTemplate() { + return format("SELECT * FROM %s ", getQueueTable()); + } + + @Override + public String getMessagesToSendTemplate() { + return format( + "SELECT * FROM %s WHERE %s <= ? AND %s IS NULL LIMIT ?", + getQueueTable(), getInvokeAfterColumn(), getLeaseIdColumn()); + } + ; + + @Override + public String getDeleteTemplate() { + return format("DELETE FROM %s WHERE %s = ?", getQueueTable(), getIdColumn()); + } + + @Override + public String getFindByIdTemplate() { + return format("SELECT * FROM %s WHERE %s = ?", getQueueTable(), getIdColumn()); + } + + @Override + public String getUpdateTemplate() { + return format( + "UPDATE %s SET %s=?, %s=?%s, %s=? WHERE %s=?", + getQueueTable(), + getChannelColumn(), + getMessageColumn(), + getFormatJsonOperator(), + getInvokeAfterColumn(), + getIdColumn()); + } + + @Override + public String getDeleteLeaseTemplate() { + return format("DELETE FROM %s WHERE %s = ?;", getLeaseTableName(), getLeaseIdColumn()); + } + + @Override + public String getInsertLeaseTemplate() { + return format( + "INSERT INTO %s (%s, %s, %s, %s)" + "VALUES (?,?,?,?);", + getLeaseTableName(), + getLeaseIdColumn(), + getLeasedByColumn(), + getLeasedAtColumn(), + getLeaseDurationColumn()); + } + + @Override + public String getUpdateLeaseTemplate() { + return format( + "UPDATE %s SET %s=? WHERE %s = ?;", getQueueTable(), getLeaseIdColumn(), getIdColumn()); + } + + @Override + public String getFindLeaseByEntityTemplate() { + return format( + "SELECT * FROM %s WHERE %s = (SELECT lease_id FROM %s WHERE %s=? )", + getLeaseTableName(), getLeaseIdColumn(), getQueueTable(), getIdColumn()); + } + + protected String getFormatJsonOperator() { + return BaseSqlDialect.getJsonCastOperator(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/ObjectStoreStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/ObjectStoreStatements.java new file mode 100644 index 000000000..57f60988a --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/ObjectStoreStatements.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema; + +public interface ObjectStoreStatements { + default String getObjectStoreTable() { + return "edc_cpadapter_object_store"; + } + + default String getIdColumn() { + return "id"; + } + + default String getCreatedAtColumn() { + return "created_at"; + } + + default String getTypeColumn() { + return "type"; + } + + default String getObjectColumn() { + return "object"; + } + + String getSaveObjectTemplate(); + + String getFindByIdAndTypeTemplate(); + + String getFindByTypeTemplate(); + + String getDeleteTemplate(); +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/QueueStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/QueueStatements.java new file mode 100644 index 000000000..918734c2a --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/QueueStatements.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema; + +import org.eclipse.edc.sql.lease.LeaseStatements; + +/** Defines all statements that are needed for the ContractDefinition store */ +public interface QueueStatements extends LeaseStatements { + default String getQueueTable() { + return "edc_cpadapter_queue"; + } + + default String getIdColumn() { + return "id"; + } + + default String getCreatedAtColumn() { + return "created_at"; + } + + default String getChannelColumn() { + return "channel"; + } + + default String getMessageColumn() { + return "message"; + } + + default String getInvokeAfterColumn() { + return "invoke_after"; + } + + String getAllMessagesTemplate(); + + String getMessagesToSendTemplate(); + + String getSaveMessageTemplate(); + + String getDeleteTemplate(); + + String getFindByIdTemplate(); + + String getUpdateTemplate(); +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectObjectStoreStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectObjectStoreStatements.java new file mode 100644 index 000000000..85a078981 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectObjectStoreStatements.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema.postgres; + +import org.eclipse.edc.sql.dialect.PostgresDialect; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.BaseSqlDialectObjectStoreStatements; + +public class PostgresDialectObjectStoreStatements extends BaseSqlDialectObjectStoreStatements { + /** + * Overridable operator to convert strings to JSON. For postgres, this is the "::json" operator + */ + @Override + protected String getFormatJsonOperator() { + return PostgresDialect.getJsonCastOperator(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectQueueStatements.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectQueueStatements.java new file mode 100644 index 000000000..cdafaf4f3 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/store/schema/postgres/PostgresDialectQueueStatements.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.store.schema.postgres; + +import org.eclipse.edc.sql.dialect.PostgresDialect; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.BaseSqlDialectQueueStatements; + +public class PostgresDialectQueueStatements extends BaseSqlDialectQueueStatements { + + /** + * Overridable operator to convert strings to JSON. For postgres, this is the "::json" operator + */ + @Override + protected String getFormatJsonOperator() { + return PostgresDialect.getJsonCastOperator(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/ExpiringMap.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMap.java similarity index 93% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/ExpiringMap.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMap.java index 40a1a4695..657ca8f92 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/ExpiringMap.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMap.java @@ -12,7 +12,7 @@ * */ -package net.catenax.edc.cp.adapter.util; +package org.eclipse.tractusx.edc.cp.adapter.util; import java.time.Instant; import java.util.HashMap; @@ -22,7 +22,7 @@ public class ExpiringMap { private final Map map = new HashMap<>(); private final Map entryTimeMap = new HashMap<>(); - private long expireAfter = 60 * 60; + private long expireAfter = 2 * 60; public ExpiringMap() {} @@ -53,7 +53,6 @@ public V get(K key, long expireAfter) { } if (entryTime + expireAfter < now()) { - remove(key); return null; } diff --git a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/LockMap.java b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/LockMap.java similarity index 67% rename from edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/LockMap.java rename to edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/LockMap.java index f3c020c6e..c8014ee9b 100644 --- a/edc-extensions/control-plane-adapter/src/main/java/net/catenax/edc/cp/adapter/util/LockMap.java +++ b/edc-extensions/control-plane-adapter/src/main/java/org/eclipse/tractusx/edc/cp/adapter/util/LockMap.java @@ -12,12 +12,18 @@ * */ -package net.catenax.edc.cp.adapter.util; +package org.eclipse.tractusx.edc.cp.adapter.util; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; +/** + * When CP-Adapter works in InMemory mode, LockMap is used to prevent race condition of two events. + * This implementation will not work if both events will be handled by two separate EDC instances + * (persistent mode), but edc.cp.adapter.service.objectstore.ObjectStoreServiceSql#put(...) method + * will not allow to save both events in the table as PRIMARY_KE collision would appear. + */ public class LockMap { private final Map lock = new HashMap<>(); diff --git a/edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 86% rename from edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 6d37b24d2..30008be0f 100644 --- a/edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension +++ b/edc-extensions/control-plane-adapter/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -11,4 +11,4 @@ # ZF Friedrichshafen AG - Initial API and Implementation # -net.catenax.edc.cp.adapter.ApiAdapterExtension +org.eclipse.tractusx.edc.cp.adapter.ApiAdapterExtension diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/HttpControllerTest.java b/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/HttpControllerTest.java deleted file mode 100644 index 8d19ee06e..000000000 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/HttpControllerTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2022 ZF Friedrichshafen 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: - * ZF Friedrichshafen AG - Initial API and Implementation - * - */ - -package net.catenax.edc.cp.adapter; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - -import jakarta.ws.rs.core.Response; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.service.ResultService; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.Mockito; - -public class HttpControllerTest { - @Mock ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); - Integer RETRY_NUMBER = 3; - - @Test - public void getAssetSynchronous_shouldReturnBadRequestIfNoAssetIdParam() { - // given - Monitor monitor = Mockito.mock(Monitor.class); - ResultService resultService = Mockito.mock(ResultService.class); - MessageBus messageBus = Mockito.mock(MessageBus.class); - when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); - HttpController httpController = new HttpController(monitor, resultService, messageBus, config); - - // when - Response response = httpController.getAssetSynchronous(null, "providerUrl"); - - // then - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); - } - - @Test - public void getAssetSynchronous_shouldReturnBadRequestIfNoProviderUrlParam() { - // given - Monitor monitor = Mockito.mock(Monitor.class); - ResultService resultService = Mockito.mock(ResultService.class); - MessageBus messageBus = Mockito.mock(MessageBus.class); - ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); - when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); - HttpController httpController = new HttpController(monitor, resultService, messageBus, config); - - // when - Response response = httpController.getAssetSynchronous("assetId", null); - - // then - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); - } -} diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/HttpControllerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/HttpControllerTest.java new file mode 100644 index 000000000..0d0f6add3 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/HttpControllerTest.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +import jakarta.ws.rs.core.Response; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; +import org.eclipse.tractusx.edc.cp.adapter.service.ResultService; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +public class HttpControllerTest { + @Mock ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); + Integer RETRY_NUMBER = 3; + + @Test + public void getAssetSynchronous_shouldReturnBadRequestIfNoAssetIdParam() { + // given + Monitor monitor = Mockito.mock(Monitor.class); + ResultService resultService = Mockito.mock(ResultService.class); + MessageBus messageBus = Mockito.mock(MessageBus.class); + when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); + HttpController httpController = new HttpController(monitor, resultService, messageBus, config); + + // when + Response response = httpController.getAssetSynchronous(null, "providerUrl", null, false, null); + + // then + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + } + + @Test + public void getAssetSynchronous_shouldReturnBadRequestIfNoProviderUrlParam() { + // given + Monitor monitor = Mockito.mock(Monitor.class); + ResultService resultService = Mockito.mock(ResultService.class); + MessageBus messageBus = Mockito.mock(MessageBus.class); + ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); + when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); + HttpController httpController = new HttpController(monitor, resultService, messageBus, config); + + // when + Response response = httpController.getAssetSynchronous("assetId", null, null, false, null); + + // then + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + } + + @Test + public void getAssetSynchronous_shouldReturnErrorStatusIfOccurred() throws InterruptedException { + // given + Monitor monitor = Mockito.mock(Monitor.class); + ResultService resultService = Mockito.mock(ResultService.class); + MessageBus messageBus = Mockito.mock(MessageBus.class); + ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); + when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); + HttpController httpController = new HttpController(monitor, resultService, messageBus, config); + + when(resultService.pull(anyString())) + .thenReturn( + ProcessData.builder() + .errorStatus(Response.Status.BAD_GATEWAY) + .endpointDataReference(getEndpointDataReference()) + .build()); + + // when + Response response = + httpController.getAssetSynchronous("assetId", "providerUrl", null, false, null); + + // then + assertEquals(Response.Status.BAD_GATEWAY.getStatusCode(), response.getStatus()); + } + + @Test + public void getAssetSynchronous_shouldReturnOkResponse() throws InterruptedException { + // given + Monitor monitor = Mockito.mock(Monitor.class); + ResultService resultService = Mockito.mock(ResultService.class); + MessageBus messageBus = Mockito.mock(MessageBus.class); + ApiAdapterConfig config = Mockito.mock(ApiAdapterConfig.class); + when(config.getDefaultMessageRetryNumber()).thenReturn(RETRY_NUMBER); + HttpController httpController = new HttpController(monitor, resultService, messageBus, config); + when(resultService.pull(anyString())) + .thenReturn( + ProcessData.builder().endpointDataReference(getEndpointDataReference()).build()); + + // when + Response response = + httpController.getAssetSynchronous("assetId", "providerUrl", null, false, null); + + // then + assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + } + + private EndpointDataReference getEndpointDataReference() { + return EndpointDataReference.Builder.newInstance() + .endpoint("endpoint") + .authCode("authCode") + .authKey("authKey") + .build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBusTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBusTest.java similarity index 89% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBusTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBusTest.java index 21e464ab0..abf500a96 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/messaging/InMemoryMessageBusTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/InMemoryMessageBusTest.java @@ -12,14 +12,14 @@ * */ -package net.catenax.edc.cp.adapter.messaging; +package org.eclipse.tractusx.edc.cp.adapter.messaging; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBusTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBusTest.java new file mode 100644 index 000000000..a7a953c3c --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/messaging/SqlMessageBusTest.java @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.messaging; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; +import java.util.*; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; +import org.eclipse.edc.transaction.spi.TransactionContext; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.store.SqlQueueStore; +import org.eclipse.tractusx.edc.cp.adapter.store.model.QueueMessage; +import org.eclipse.tractusx.edc.cp.adapter.store.schema.QueueStatements; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class SqlMessageBusTest { + @Mock Monitor monitor; + @Mock Listener listener; + @Mock ListenerService listenerService; + @Mock SqlQueueStore store; + @Mock DataSourceRegistry dataSourceRegistry; + + @BeforeEach + void init() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void send_shouldCallListenerOnce() throws InterruptedException { + // given + Message message = new DataReferenceRetrievalDto(null, 3); + when(listenerService.getListener(any())).thenReturn(listener); + SqlMessageBus messageBus = + new SqlMessageBus(monitor, listenerService, inMemoryFakeStore(), 2, 10); + + // when + messageBus.send(Channel.INITIAL, message); + Thread.sleep(60); + messageBus.deliverMessages(10); + + // then + Thread.sleep(60); + verify(listener, times(1)).process(any(DataReferenceRetrievalDto.class)); + } + + @Test + public void send_shouldCallListenerWithRetryOnException() throws InterruptedException { + // given + Message message = new DataReferenceRetrievalDto(null, 3); + when(listenerService.getListener(any())).thenReturn(listener); + doThrow(new IllegalStateException()).doNothing().when(listener).process(any()); + SqlMessageBus messageBus = + new SqlMessageBus(monitor, listenerService, inMemoryFakeStore(), 2, 10); + + // when + messageBus.send(Channel.INITIAL, message); + messageBus.deliverMessages(10); + Thread.sleep(60); + + // then + verify(listener, times(2)).process(any(DataReferenceRetrievalDto.class)); + } + + @Test + public void send_shouldSendToDlqIfErrorLimitReached() throws InterruptedException { + // given + Message message = new DataReferenceRetrievalDto(null, 3); + message.setErrorNumber(10); + when(listenerService.getListener(any())).thenReturn(listener); + doThrow(new IllegalStateException()).doNothing().when(listener).process(any()); + SqlMessageBus messageBus = + new SqlMessageBus(monitor, listenerService, inMemoryFakeStore(), 2, 10); + + // when + messageBus.send(Channel.INITIAL, message); + Thread.sleep(60); + + // then + verify(listenerService).getListener(eq(Channel.DLQ)); + } + + private SqlQueueStore inMemoryFakeStore() { + return new SqlQueueStore( + dataSourceRegistry, + "dsname", + getFakeTransactionContext(), + new ObjectMapper(), + getFakeStatements(), + "cid", + getFakeClock()) { + + private final Map map = new HashMap<>(); + + @Override + public void saveMessage(QueueMessage queueMessage) { + String id = UUID.randomUUID().toString(); + queueMessage.setId(id); + map.put(id, queueMessage); + } + + @Override + public QueueMessage findById(String id) { + return map.get(id); + } + + @Override + public void deleteMessage(String id) { + map.remove(id); + } + + @Override + public void updateMessage(QueueMessage queueMessage) { + map.remove(queueMessage.getId()); + map.put(queueMessage.getId(), queueMessage); + } + + @Override + public List findMessagesToSend(int max) { + return new ArrayList<>(map.values()); + } + }; + } + + private Clock getFakeClock() { + return new Clock() { + @Override + public ZoneId getZone() { + return null; + } + + @Override + public Clock withZone(ZoneId zone) { + return null; + } + + @Override + public Instant instant() { + return null; + } + }; + } + + @NotNull + private QueueStatements getFakeStatements() { + return new QueueStatements() { + @Override + public String getAllMessagesTemplate() { + return null; + } + + @Override + public String getMessagesToSendTemplate() { + return null; + } + + @Override + public String getSaveMessageTemplate() { + return null; + } + + @Override + public String getDeleteTemplate() { + return null; + } + + @Override + public String getFindByIdTemplate() { + return null; + } + + @Override + public String getUpdateTemplate() { + return null; + } + + @Override + public String getDeleteLeaseTemplate() { + return null; + } + + @Override + public String getInsertLeaseTemplate() { + return null; + } + + @Override + public String getUpdateLeaseTemplate() { + return null; + } + + @Override + public String getFindLeaseByEntityTemplate() { + return null; + } + }; + } + + private TransactionContext getFakeTransactionContext() { + return new TransactionContext() { + @Override + public void execute(TransactionBlock transactionBlock) {} + + @Override + public T execute(ResultTransactionBlock resultTransactionBlock) { + return null; + } + + @Override + public void registerSynchronization(TransactionSynchronization transactionSynchronization) {} + }; + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetrieverTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetrieverTest.java new file mode 100644 index 000000000..22f1946ed --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/CatalogRetrieverTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.time.ZonedDateTime; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.eclipse.edc.catalog.spi.Catalog; +import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; +import org.eclipse.edc.connector.spi.catalog.CatalogService; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.asset.Asset; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class CatalogRetrieverTest { + @Mock CatalogService catalogService; + + @BeforeEach + void init() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void getEntireCatalog_shouldReturnEntireCatalogIfMoreThanOnePage() { + // given + CatalogRetriever catalogRetriever = new CatalogRetriever(50, catalogService); + when(catalogService.getByProviderUrl(anyString(), any())) + .thenReturn(getCatalogResult(50), getCatalogResult(50), getCatalogResult(10)); + + // when + Catalog catalog = catalogRetriever.getEntireCatalog("providerUrl", "assetId"); + + // then + assertEquals(110, catalog.getContractOffers().size()); + } + + @Test + public void getEntireCatalog_shouldEmptyCatalogIfNoResults() { + // given + CatalogRetriever catalogRetriever = new CatalogRetriever(50, catalogService); + when(catalogService.getByProviderUrl(anyString(), any())).thenReturn(getCatalogResult(0)); + + // when + Catalog catalog = catalogRetriever.getEntireCatalog("providerUrl", "assetId"); + + // then + assertEquals(0, catalog.getContractOffers().size()); + } + + private CompletableFuture getCatalogResult(int offersNumber) { + List contractOffers = + IntStream.range(0, offersNumber) + .mapToObj(operand -> getContractOffer()) + .collect(Collectors.toList()); + + return CompletableFuture.completedFuture( + Catalog.Builder.newInstance().id("id").contractOffers(contractOffers).build()); + } + + private ContractOffer getContractOffer() { + Asset asset = Asset.Builder.newInstance().id("assetId").build(); + return ContractOffer.Builder.newInstance() + .id("id") + .asset(asset) + .policy(Policy.Builder.newInstance().build()) + .contractStart(ZonedDateTime.now()) + .contractEnd(ZonedDateTime.now().plusDays(1)) + .build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetrieverTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetrieverTest.java new file mode 100644 index 000000000..ad4cda3c0 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractAgreementRetrieverTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.time.Instant; +import java.util.stream.Stream; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.spi.contractagreement.ContractAgreementService; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.monitor.Monitor; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class ContractAgreementRetrieverTest { + @Mock Monitor monitor; + @Mock ContractAgreementService agreementService; + + @BeforeEach + void init() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void getExistingContractByAssetId_shouldReturnValidContract() { + // given + long now = Instant.now().getEpochSecond(); + when(agreementService.query(any())).thenReturn(getResult(now + 1000)); + ContractAgreementRetriever retriever = + new ContractAgreementRetriever(monitor, agreementService); + + // when + ContractAgreement contractAgreement = retriever.getExistingContractByAssetId("id"); + + // then + Assertions.assertNotNull(contractAgreement); + } + + @Test + public void getExistingContractByAssetId_shouldNotReturnExpiredContract() { + // given + long now = Instant.now().getEpochSecond(); + when(agreementService.query(any())).thenReturn(getResult(now - 1000)); + ContractAgreementRetriever retriever = + new ContractAgreementRetriever(monitor, agreementService); + + // when + ContractAgreement contractAgreement = retriever.getExistingContractByAssetId("id"); + + // then + Assertions.assertNull(contractAgreement); + } + + private ServiceResult> getResult(long endDate) { + long now = Instant.now().getEpochSecond(); + return ServiceResult.success( + Stream.of( + ContractAgreement.Builder.newInstance() + .id("id") + .assetId("assetId") + .contractStartDate(now - 2000) + .contractEndDate(endDate) + .providerAgentId("providerId") + .consumerAgentId("consumerId") + .policy(Policy.Builder.newInstance().build()) + .build())); + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java similarity index 52% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java index c9aa12dbd..7d82766a9 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnegotiation/ContractNegotiationHandlerTest.java @@ -12,30 +12,27 @@ * */ -package net.catenax.edc.cp.adapter.process.contractnegotiation; +package org.eclipse.tractusx.edc.cp.adapter.process.contractnegotiation; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; import java.time.Instant; +import java.time.ZonedDateTime; import java.util.List; -import java.util.concurrent.CompletableFuture; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractAgreementData; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractDataStore; -import net.catenax.edc.cp.adapter.util.ExpiringMap; -import org.eclipse.dataspaceconnector.api.datamanagement.catalog.service.CatalogService; -import org.eclipse.dataspaceconnector.api.datamanagement.contractnegotiation.service.ContractNegotiationService; -import org.eclipse.dataspaceconnector.policy.model.Policy; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.eclipse.dataspaceconnector.spi.types.domain.catalog.Catalog; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.offer.ContractOffer; +import org.eclipse.edc.catalog.spi.Catalog; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.asset.Asset; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -45,8 +42,8 @@ public class ContractNegotiationHandlerTest { @Mock Monitor monitor; @Mock MessageBus messageBus; @Mock ContractNegotiationService contractNegotiationService; - @Mock CatalogService catalogService; - @Mock ContractDataStore contractDataStore; + @Mock CatalogCachedRetriever catalogRetriever; + @Mock ContractAgreementRetriever agreementRetriever; @BeforeEach void init() { @@ -54,19 +51,14 @@ void init() { } @Test - public void process_shouldNotInitializeContractNegotiationWhenCachedContractAlreadyAvailable() { + public void process_shouldNotInitializeContractNegotiationWhenContractAlreadyAvailable() { // given ContractNegotiationHandler contractNegotiationHandler = new ContractNegotiationHandler( - monitor, - messageBus, - contractNegotiationService, - catalogService, - contractDataStore, - new ExpiringMap<>()); + monitor, messageBus, contractNegotiationService, catalogRetriever, agreementRetriever); - when(contractDataStore.get(anyString(), anyString())) - .thenReturn(getValidContractAgreementData()); + when(agreementRetriever.getExistingContractByAssetId(anyString())) + .thenReturn(getValidContractAgreement()); // when contractNegotiationHandler.process(new DataReferenceRetrievalDto(getProcessData(), 3)); @@ -77,21 +69,16 @@ public void process_shouldNotInitializeContractNegotiationWhenCachedContractAlre } @Test - public void process_shouldInitializeContractNegotiationWhenCachedContractExpired() { + public void process_shouldInitializeContractNegotiationWhenExistingContractExpired() { // given ContractNegotiationHandler contractNegotiationHandler = new ContractNegotiationHandler( - monitor, - messageBus, - contractNegotiationService, - catalogService, - contractDataStore, - new ExpiringMap<>()); - - when(contractDataStore.get(anyString(), anyString())) - .thenReturn(getExpiredContractAgreementData()); - when(catalogService.getByProviderUrl(anyString(), any())) - .thenReturn(CompletableFuture.completedFuture(getCatalog())); + monitor, messageBus, contractNegotiationService, catalogRetriever, agreementRetriever); + + when(agreementRetriever.getExistingContractByAssetId(anyString())) + .thenReturn(getExpiredContractAgreement()); + when(catalogRetriever.getEntireCatalog(anyString(), anyString(), anyInt())) + .thenReturn(getCatalog()); when(contractNegotiationService.initiateNegotiation(any())) .thenReturn(getContractNegotiation()); @@ -104,20 +91,15 @@ public void process_shouldInitializeContractNegotiationWhenCachedContractExpired } @Test - public void process_shouldInitiateContractNegotiationAndSendDtoFurtherIfCacheEmpty() { + public void process_shouldInitiateContractNegotiationAndSendDtoFurtherIfAgreementNotExist() { // given ContractNegotiationHandler contractNegotiationHandler = new ContractNegotiationHandler( - monitor, - messageBus, - contractNegotiationService, - catalogService, - contractDataStore, - new ExpiringMap<>()); - - when(contractDataStore.get(anyString(), anyString())).thenReturn(null); - when(catalogService.getByProviderUrl(anyString(), any())) - .thenReturn(CompletableFuture.completedFuture(getCatalog())); + monitor, messageBus, contractNegotiationService, catalogRetriever, agreementRetriever); + + when(agreementRetriever.getExistingContractByAssetId(anyString())).thenReturn(null); + when(catalogRetriever.getEntireCatalog(anyString(), anyString(), anyInt())) + .thenReturn(getCatalog()); when(contractNegotiationService.initiateNegotiation(any())) .thenReturn(getContractNegotiation()); @@ -134,7 +116,7 @@ private ProcessData getProcessData() { .assetId("assetId") .provider("provider") .catalogExpiryTime(30) - .contractAgreementCacheOn(true) + .contractAgreementReuseOn(true) .build(); } @@ -159,24 +141,35 @@ private ContractOffer getContractOffer() { return ContractOffer.Builder.newInstance() .id("id") .asset(asset) + .contractStart(ZonedDateTime.now()) + .contractEnd(ZonedDateTime.now().plusDays(1)) .policy(Policy.Builder.newInstance().build()) .build(); } - private ContractAgreementData getValidContractAgreementData() { + private ContractAgreement getValidContractAgreement() { long now = Instant.now().getEpochSecond(); - ContractAgreementData contractAgreementData = new ContractAgreementData(); - contractAgreementData.setId("id"); - contractAgreementData.setAssetId("assetId"); - contractAgreementData.setContractStartDate(now - 5000); - contractAgreementData.setContractEndDate(now + 5000); - return contractAgreementData; + return ContractAgreement.Builder.newInstance() + .id("id") + .assetId("assetId") + .contractStartDate(now - 5000) + .contractEndDate(now + 5000) + .consumerAgentId("consumer") + .providerAgentId("provider") + .policy(Policy.Builder.newInstance().build()) + .build(); } - private ContractAgreementData getExpiredContractAgreementData() { + private ContractAgreement getExpiredContractAgreement() { long now = Instant.now().getEpochSecond(); - ContractAgreementData contractAgreementData = getValidContractAgreementData(); - contractAgreementData.setContractEndDate(now - 1000); - return contractAgreementData; + return ContractAgreement.Builder.newInstance() + .id("id") + .assetId("assetId") + .contractStartDate(now - 5000) + .contractEndDate(now - 1000) + .consumerAgentId("consumer") + .providerAgentId("provider") + .policy(Policy.Builder.newInstance().build()) + .build(); } } diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java similarity index 72% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java index bb1298f60..5d0e83553 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNegotiationListenerTest.java @@ -1,4 +1,18 @@ -package net.catenax.edc.cp.adapter.process.contractnotification; +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -6,18 +20,17 @@ import static org.mockito.Mockito.times; import jakarta.ws.rs.core.Response; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import net.catenax.edc.cp.adapter.process.contractdatastore.ContractDataStore; -import org.eclipse.dataspaceconnector.policy.model.Policy; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.observe.ContractNegotiationListener; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.agreement.ContractAgreement; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiationStates; +import org.eclipse.edc.connector.contract.spi.negotiation.observe.ContractNegotiationListener; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiationStates; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,7 +42,6 @@ public class ContractNegotiationListenerTest { @Mock Monitor monitor; @Mock MessageBus messageBus; @Mock ContractNotificationSyncService syncService; - @Mock ContractDataStore contractDataStore; @Mock DataTransferInitializer dataTransfer; @BeforeEach @@ -41,8 +53,7 @@ void init() { public void confirmed_shouldNotInitiateTransferIfMessageNotAvailable() { // given ContractNegotiationListener listener = - new ContractNegotiationListenerImpl( - monitor, messageBus, syncService, contractDataStore, dataTransfer); + new ContractNegotiationListenerImpl(monitor, messageBus, syncService, dataTransfer); ContractNegotiation contractNegotiation = getConfirmedContractNegotiation(); // when @@ -62,8 +73,7 @@ public void confirmed_shouldInitiateTransferIfMessageIsAvailable() { verify(dataTransfer, times(0)).initiate(any()); ContractNegotiationListener listener = - new ContractNegotiationListenerImpl( - monitor, messageBus, syncService, contractDataStore, dataTransfer); + new ContractNegotiationListenerImpl(monitor, messageBus, syncService, dataTransfer); ContractNegotiation contractNegotiation = getConfirmedContractNegotiation(); // when @@ -80,8 +90,7 @@ public void preDeclined_shouldSendErrorResultIfMessageIsAvailable() { when(syncService.exchangeDeclinedContract(any())) .thenReturn(new DataReferenceRetrievalDto(getProcessData(), 3)); ContractNegotiationListener listener = - new ContractNegotiationListenerImpl( - monitor, messageBus, syncService, contractDataStore, dataTransfer); + new ContractNegotiationListenerImpl(monitor, messageBus, syncService, dataTransfer); ContractNegotiation contractNegotiation = getConfirmedContractNegotiation(); // when @@ -101,8 +110,7 @@ public void preError_shouldSendErrorResultIfMessageIsAvailable() { when(syncService.exchangeErrorContract(any())) .thenReturn(new DataReferenceRetrievalDto(getProcessData(), 3)); ContractNegotiationListener listener = - new ContractNegotiationListenerImpl( - monitor, messageBus, syncService, contractDataStore, dataTransfer); + new ContractNegotiationListenerImpl(monitor, messageBus, syncService, dataTransfer); ContractNegotiation contractNegotiation = getConfirmedContractNegotiation(); // when diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java similarity index 84% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java index 01809a35a..c2e0480b3 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractNotificationHandlerTest.java @@ -12,22 +12,22 @@ * */ -package net.catenax.edc.cp.adapter.process.contractnotification; +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.api.datamanagement.contractnegotiation.service.ContractNegotiationService; -import org.eclipse.dataspaceconnector.policy.model.Policy; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.agreement.ContractAgreement; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiation; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractNegotiationStates; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiationStates; +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncServiceTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncServiceTest.java new file mode 100644 index 000000000..720cc0b37 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/contractnotification/ContractSyncServiceTest.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.contractnotification; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreServiceInMemory; +import org.eclipse.tractusx.edc.cp.adapter.util.LockMap; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ContractSyncServiceTest { + + @Test + public void exchangeConfirmedContract_shouldReturnDtoIfAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeDto(getDataReferenceRetrievalDto()); + + // when + DataReferenceRetrievalDto dto = + syncService.exchangeConfirmedContract("negotiationId", "agreementId"); + + // then + Assertions.assertNotNull(dto); + } + + @Test + public void exchangeConfirmedContract_shouldReturnNullIfDtoNotAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + DataReferenceRetrievalDto dto = + syncService.exchangeConfirmedContract("negotiationId", "agreementId"); + + // then + Assertions.assertNull(dto); + } + + @Test + public void exchangeDeclinedContract_shouldReturnDtoIfAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeDto(getDataReferenceRetrievalDto()); + + // when + DataReferenceRetrievalDto dto = syncService.exchangeDeclinedContract("negotiationId"); + + // then + Assertions.assertNotNull(dto); + } + + @Test + public void exchangeDeclinedContract_shouldReturnNullIfDtoNotAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + DataReferenceRetrievalDto dto = syncService.exchangeDeclinedContract("negotiationId"); + + // then + Assertions.assertNull(dto); + } + + @Test + public void exchangeErrorContract_shouldReturnDtoIfAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeDto(getDataReferenceRetrievalDto()); + + // when + DataReferenceRetrievalDto dto = syncService.exchangeErrorContract("negotiationId"); + + // then + Assertions.assertNotNull(dto); + } + + @Test + public void exchangeErrorContract_shouldReturnNullIfDtoNotAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + DataReferenceRetrievalDto dto = syncService.exchangeErrorContract("negotiationId"); + + // then + Assertions.assertNull(dto); + } + + @Test + public void exchangeDto_shouldReturnContractInfoIfAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeConfirmedContract("negotiationId", "agreementId"); + + // when + ContractInfo contractInfo = syncService.exchangeDto(getDataReferenceRetrievalDto()); + + // then + Assertions.assertNotNull(contractInfo); + } + + @Test + public void exchangeDto_shouldReturnNullIfContractInfoNotAvailable() { + // given + ContractSyncService syncService = + new ContractSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + ContractInfo contractInfo = syncService.exchangeDto(getDataReferenceRetrievalDto()); + + // then + Assertions.assertNull(contractInfo); + } + + private DataReferenceRetrievalDto getDataReferenceRetrievalDto() { + ProcessData processData = ProcessData.builder().assetId("assetId").provider("provider").build(); + DataReferenceRetrievalDto dto = new DataReferenceRetrievalDto(processData, 3); + dto.getPayload().setContractNegotiationId("negotiationId"); + return dto; + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncServiceTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncServiceTest.java new file mode 100644 index 000000000..0b0e537f7 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataRefSyncServiceTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreServiceInMemory; +import org.eclipse.tractusx.edc.cp.adapter.util.LockMap; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class DataRefSyncServiceTest { + + @Test + public void exchangeDto_shouldReturnDataReferenceIfAvailable() { + // given + DataRefSyncService syncService = + new DataRefSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeDataReference(getEndpointDataReference(), "agreementId"); + + // when + EndpointDataReference dataReference = + syncService.exchangeDto(getDataReferenceRetrievalDto(), "agreementId"); + + // then + Assertions.assertNotNull(dataReference); + } + + @Test + public void exchangeDto_shouldReturnNullIfDataReferenceNotAvailable() { + // given + DataRefSyncService syncService = + new DataRefSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + EndpointDataReference dataReference = + syncService.exchangeDto(getDataReferenceRetrievalDto(), "agreementId"); + + // then + Assertions.assertNull(dataReference); + } + + @Test + public void exchangeDataReference_shouldReturnDtoIfAvailable() { + // given + DataRefSyncService syncService = + new DataRefSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + syncService.exchangeDto(getDataReferenceRetrievalDto(), "agreementId"); + + // when + DataReferenceRetrievalDto dto = + syncService.exchangeDataReference(getEndpointDataReference(), "agreementId"); + + // then + Assertions.assertNotNull(dto); + } + + @Test + public void exchangeDataReference_shouldReturnNullIfDtoNotAvailable() { + // given + DataRefSyncService syncService = + new DataRefSyncService(new ObjectStoreServiceInMemory(new ObjectMapper()), new LockMap()); + + // when + DataReferenceRetrievalDto dto = + syncService.exchangeDataReference(getEndpointDataReference(), "agreementId"); + + // then + Assertions.assertNull(dto); + } + + private EndpointDataReference getEndpointDataReference() { + return EndpointDataReference.Builder.newInstance() + .endpoint("endpoint") + .authCode("authCode") + .authKey("authKey") + .build(); + } + + private DataReferenceRetrievalDto getDataReferenceRetrievalDto() { + ProcessData processData = ProcessData.builder().assetId("assetId").provider("provider").build(); + return new DataReferenceRetrievalDto(processData, 3); + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandlerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandlerTest.java new file mode 100644 index 000000000..167a47479 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceErrorHandlerTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.eclipse.edc.connector.spi.transferprocess.TransferProcessService; +import org.eclipse.edc.connector.transfer.spi.types.TransferProcessStates; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreService; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectStoreServiceInMemory; +import org.eclipse.tractusx.edc.cp.adapter.service.objectstore.ObjectType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class DataReferenceErrorHandlerTest { + @Mock Monitor monitor; + @Mock MessageBus messageBus; + @Mock TransferProcessService transferProcessService; + ObjectStoreService storeService = new ObjectStoreServiceInMemory(new ObjectMapper()); + + @BeforeEach + void init() { + MockitoAnnotations.openMocks(this); + storeService.put("key1", ObjectType.DTO, getDto()); + storeService.put("key2", ObjectType.DTO, getDto()); + } + + @Test + public void validateActiveProcesses_shouldSkipIfNoError() { + // given + when(transferProcessService.getState("transferId")) + .thenReturn(TransferProcessStates.COMPLETED.name()); + DataReferenceErrorHandler errorHandler = + new DataReferenceErrorHandler(monitor, messageBus, storeService, transferProcessService); + + // when + errorHandler.validateActiveProcesses(); + + // then + verify(messageBus, times(0)).send(eq(Channel.RESULT), any(Message.class)); + } + + @Test + public void validateActiveProcesses_shouldHandleErrorReference() { + // given + when(transferProcessService.getState("transferId")) + .thenReturn(TransferProcessStates.COMPLETED.name()) + .thenReturn(TransferProcessStates.ERROR.name()); + DataReferenceErrorHandler errorHandler = + new DataReferenceErrorHandler(monitor, messageBus, storeService, transferProcessService); + + // when + errorHandler.validateActiveProcesses(); + + // then + verify(messageBus, times(1)).send(eq(Channel.RESULT), any(Message.class)); + } + + @Test + public void validateActiveProcesses_shouldHandleCancelledReference() { + // given + when(transferProcessService.getState("transferId")) + .thenReturn(TransferProcessStates.COMPLETED.name()) + .thenReturn(TransferProcessStates.CANCELLED.name()); + DataReferenceErrorHandler errorHandler = + new DataReferenceErrorHandler(monitor, messageBus, storeService, transferProcessService); + + // when + errorHandler.validateActiveProcesses(); + + // then + verify(messageBus, times(1)).send(eq(Channel.RESULT), any(Message.class)); + } + + private DataReferenceRetrievalDto getDto() { + return new DataReferenceRetrievalDto(getProcessData(), 3); + } + + private ProcessData getProcessData() { + return ProcessData.builder() + .assetId("assetId") + .provider("provider") + .contractAgreementId("agreementId") + .transferProcessId("transferId") + .build(); + } +} diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java similarity index 82% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java index 1f5eca794..138dbe974 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/DataReferenceHandlerTest.java @@ -12,19 +12,19 @@ * */ -package net.catenax.edc.cp.adapter.process.datareference; +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java similarity index 66% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java index b957d4257..9d0d983c4 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/process/datareference/EndpointDataReferenceReceiverTest.java @@ -1,17 +1,31 @@ -package net.catenax.edc.cp.adapter.process.datareference; +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.process.datareference; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import net.catenax.edc.cp.adapter.messaging.Channel; -import net.catenax.edc.cp.adapter.messaging.Message; -import net.catenax.edc.cp.adapter.messaging.MessageBus; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiver; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.connector.transfer.spi.edr.EndpointDataReferenceReceiver; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Channel; +import org.eclipse.tractusx.edc.cp.adapter.messaging.Message; +import org.eclipse.tractusx.edc.cp.adapter.messaging.MessageBus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; diff --git a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/service/ResultServiceTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultServiceTest.java similarity index 80% rename from edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/service/ResultServiceTest.java rename to edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultServiceTest.java index 282c88a30..2b7bff25f 100644 --- a/edc-extensions/control-plane-adapter/src/test/java/net/catenax/edc/cp/adapter/service/ResultServiceTest.java +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/service/ResultServiceTest.java @@ -12,23 +12,33 @@ * */ -package net.catenax.edc.cp.adapter.service; +package org.eclipse.tractusx.edc.cp.adapter.service; import static org.junit.jupiter.api.Assertions.fail; import java.util.concurrent.TimeUnit; -import net.catenax.edc.cp.adapter.dto.DataReferenceRetrievalDto; -import net.catenax.edc.cp.adapter.dto.ProcessData; -import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.cp.adapter.dto.DataReferenceRetrievalDto; +import org.eclipse.tractusx.edc.cp.adapter.dto.ProcessData; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; public class ResultServiceTest { + @Mock Monitor monitor; + + @BeforeEach + void init() { + MockitoAnnotations.openMocks(this); + } @Test public void pull_shouldReturnDataReferenceWhenMessageOccursFirst() throws InterruptedException { // given - ResultService resultService = new ResultService(20); + ResultService resultService = new ResultService(20, monitor); String endpointDataRefId = "456"; DataReferenceRetrievalDto dto = getDto(endpointDataRefId); ProcessData processData; @@ -44,7 +54,7 @@ public void pull_shouldReturnDataReferenceWhenMessageOccursFirst() throws Interr @Test public void pull_shouldReturnDataReferenceWhenMessageOccursSecond() throws InterruptedException { // given - ResultService resultService = new ResultService(20); + ResultService resultService = new ResultService(20, monitor); String endpointDataRefId = "456"; DataReferenceRetrievalDto dto = getDto(endpointDataRefId); ProcessData processData; @@ -60,7 +70,7 @@ public void pull_shouldReturnDataReferenceWhenMessageOccursSecond() throws Inter @Test public void pull_shouldReturnNullOnTimeout() throws InterruptedException { // given - ResultService resultService = new ResultService(20); + ResultService resultService = new ResultService(20, monitor); // when ProcessData processData = resultService.pull("123", 500, TimeUnit.MILLISECONDS); @@ -72,7 +82,7 @@ public void pull_shouldReturnNullOnTimeout() throws InterruptedException { @Test public void process_shouldThrowIllegalArgumentExceptionIfNoDataPayload() { // given - ResultService resultService = new ResultService(20); + ResultService resultService = new ResultService(20, monitor); DataReferenceRetrievalDto dto = new DataReferenceRetrievalDto(null, 3); // when then diff --git a/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMapTest.java b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMapTest.java new file mode 100644 index 000000000..a9ed2a9b5 --- /dev/null +++ b/edc-extensions/control-plane-adapter/src/test/java/org/eclipse/tractusx/edc/cp/adapter/util/ExpiringMapTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 ZF Friedrichshafen 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: + * ZF Friedrichshafen AG - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.cp.adapter.util; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ExpiringMapTest { + + private static final String KEY = "key"; + private static final String VAL = "value"; + + @Test + public void get_shouldGetWhenNotExpired() { + // given + ExpiringMap expiringMap = new ExpiringMap<>(60); + expiringMap.put(KEY, VAL); + + // when + String value = expiringMap.get(KEY); + + // then + Assertions.assertEquals(VAL, value); + } + + @Test + public void get_shouldGetNullWhenExpired() throws InterruptedException { + // given + ExpiringMap expiringMap = new ExpiringMap<>(0); + expiringMap.put(KEY, VAL); + + // when + Thread.sleep(1000); + String value = expiringMap.get(KEY, 0); + + // then + Assertions.assertNull(value); + } + + @Test + public void get_shouldGetNullWhenRemoved() throws InterruptedException { + // given + ExpiringMap expiringMap = new ExpiringMap<>(0); + expiringMap.put(KEY, VAL); + + // when + expiringMap.remove(KEY); + String value = expiringMap.get(KEY, 1000); + + // then + Assertions.assertNull(value); + } +} diff --git a/edc-extensions/custom-jsonld/README.md b/edc-extensions/custom-jsonld/README.md deleted file mode 100644 index d9d8add9e..000000000 --- a/edc-extensions/custom-jsonld/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Custom Json LD - -This module was introduced to patch the bug about `LogicalConstraint` serializer: -https://github.com/eclipse-edc/Connector/issues/2334 - -The module can be removed once the bug will be fixed, merged and integrated in the EDC version used by product-EDC diff --git a/edc-extensions/custom-jsonld/src/main/java/org/eclipse/tractusx/edc/jsonld/CustomJsonLdExtension.java b/edc-extensions/custom-jsonld/src/main/java/org/eclipse/tractusx/edc/jsonld/CustomJsonLdExtension.java deleted file mode 100644 index 986fa6d58..000000000 --- a/edc-extensions/custom-jsonld/src/main/java/org/eclipse/tractusx/edc/jsonld/CustomJsonLdExtension.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * 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.jsonld; - -import de.fraunhofer.iais.eis.*; -import de.fraunhofer.iais.eis.util.TypedLiteral; -import org.eclipse.dataspaceconnector.ids.core.serialization.IdsConstraintImpl; -import org.eclipse.dataspaceconnector.ids.jsonld.JsonLd; -import org.eclipse.dataspaceconnector.ids.jsonld.JsonLdSerializer; -import org.eclipse.dataspaceconnector.ids.spi.domain.IdsConstants; -import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Inject; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.types.TypeManager; - -/** - * This extension is a temporary fix for a serialization bug: - * https://github.com/eclipse-edc/Connector/issues/2334 - */ -public class CustomJsonLdExtension implements ServiceExtension { - - public static final String IDS = "ids"; - // this is only needed to ensure that this extension is initialized after the - // IdsCoreServiceExtension - @Inject private ConnectorService connectorService; - - @Override - public String name() { - return "Custom JsonLD"; - } - - @Override - public void initialize(ServiceExtensionContext context) { - var typeManager = context.getTypeManager(); - typeManager.registerContext(IDS, JsonLd.getObjectMapper()); - - registerIdsClasses(typeManager); - registerCustomConstraintImpl(typeManager); - } - - private void registerIdsClasses(TypeManager typeManager) { - registerSerializer(typeManager, ArtifactRequestMessage.class); - registerSerializer(typeManager, RequestInProcessMessage.class); - registerSerializer(typeManager, MessageProcessedNotificationMessage.class); - registerSerializer(typeManager, DescriptionRequestMessage.class); - registerSerializer(typeManager, NotificationMessage.class); - registerSerializer(typeManager, ParticipantUpdateMessage.class); - registerSerializer(typeManager, RejectionMessage.class); - registerSerializer(typeManager, ContractAgreementMessage.class); - registerSerializer(typeManager, ContractRejectionMessage.class); - registerSerializer(typeManager, ContractOfferMessage.class); - registerSerializer(typeManager, ContractRequestMessage.class); - registerSerializer(typeManager, DynamicAttributeToken.class); - registerSerializer(typeManager, TokenFormat.class); - registerSerializer(typeManager, ContractAgreement.class); - registerSerializer(typeManager, ContractOffer.class); - registerSerializer(typeManager, Contract.class); - registerSerializer(typeManager, Permission.class); - registerSerializer(typeManager, Prohibition.class); - registerSerializer(typeManager, Duty.class); - registerSerializer(typeManager, Action.class); - registerSerializer(typeManager, LogicalConstraint.class); - registerSerializer(typeManager, Constraint.class); - registerSerializer(typeManager, Artifact.class); - registerSerializer(typeManager, BaseConnector.class); - registerSerializer(typeManager, Representation.class); - registerSerializer(typeManager, Resource.class); - registerSerializer(typeManager, TypedLiteral.class); - registerSerializer(typeManager, ResourceCatalog.class); - registerSerializer(typeManager, CustomMediaType.class); - } - - private void registerCustomConstraintImpl(TypeManager typeManager) { - registerSerializer(typeManager, IdsConstraintImpl.class); - typeManager.registerTypes(IDS, IdsConstraintImpl.class); - } - - private void registerSerializer(TypeManager typeManager, Class clazz) { - typeManager.registerSerializer(IDS, clazz, new JsonLdSerializer<>(clazz, IdsConstants.CONTEXT)); - } -} diff --git a/edc-extensions/cx-oauth2/pom.xml b/edc-extensions/cx-oauth2/pom.xml index 03c885d9b..b47cfad6e 100644 --- a/edc-extensions/cx-oauth2/pom.xml +++ b/edc-extensions/cx-oauth2/pom.xml @@ -24,7 +24,7 @@ edc-extensions org.eclipse.tractusx.edc.extensions - 0.2.0 + 0.3.0 4.0.0 @@ -97,15 +97,15 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector + org.eclipse.edc oauth2-spi - org.eclipse.dataspaceconnector + org.eclipse.edc jwt-spi @@ -127,24 +127,6 @@ okhttp - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - org.junit.jupiter 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 index 4acb18f5a..4b5bffc74 100644 --- 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 @@ -20,9 +20,9 @@ package org.eclipse.tractusx.edc.oauth2; import java.util.Map; -import org.eclipse.dataspaceconnector.iam.oauth2.spi.CredentialsRequestAdditionalParametersProvider; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Provider; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; +import org.eclipse.edc.iam.oauth2.spi.CredentialsRequestAdditionalParametersProvider; +import org.eclipse.edc.runtime.metamodel.annotation.Provider; +import org.eclipse.edc.spi.system.ServiceExtension; public class CXOAuth2Extension implements ServiceExtension { diff --git a/edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/cx-oauth2/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/data-encryption/pom.xml b/edc-extensions/data-encryption/pom.xml index 67180369a..570134ee4 100644 --- a/edc-extensions/data-encryption/pom.xml +++ b/edc-extensions/data-encryption/pom.xml @@ -24,7 +24,7 @@ edc-extensions org.eclipse.tractusx.edc.extensions - 0.2.0 + 0.3.0 4.0.0 @@ -98,12 +98,12 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector - data-plane-transfer-spi + org.eclipse.edc + transfer-data-plane-spi diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtension.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtension.java index 350fd373d..8024bc276 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtension.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtension.java @@ -22,14 +22,14 @@ import java.time.Duration; import java.util.List; import java.util.stream.Collectors; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Provides; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Requires; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.connector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.runtime.metamodel.annotation.Provides; +import org.eclipse.edc.runtime.metamodel.annotation.Requires; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.tractusx.edc.data.encryption.encrypter.AesDataEncrypterConfiguration; import org.eclipse.tractusx.edc.data.encryption.encrypter.DataEncrypterFactory; import org.eclipse.tractusx.edc.data.encryption.key.AesKey; diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesAlgorithm.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesAlgorithm.java index 0e420a91c..69c54a173 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesAlgorithm.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesAlgorithm.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2023 ZF Friedrichshafen AG * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH * Copyright (c) 2021,2022 Contributors to the Eclipse Foundation * @@ -22,6 +23,7 @@ import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; @@ -29,6 +31,7 @@ import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import lombok.NonNull; +import lombok.SneakyThrows; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.eclipse.tractusx.edc.data.encryption.algorithms.CryptoAlgorithm; import org.eclipse.tractusx.edc.data.encryption.data.CryptoDataFactory; @@ -36,6 +39,7 @@ import org.eclipse.tractusx.edc.data.encryption.data.EncryptedData; import org.eclipse.tractusx.edc.data.encryption.key.AesKey; import org.eclipse.tractusx.edc.data.encryption.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; public class AesAlgorithm implements CryptoAlgorithm { @@ -43,12 +47,21 @@ public class AesAlgorithm implements CryptoAlgorithm { private static final String AES = "AES"; private static final Object MONITOR = new Object(); + private final SecureRandom secureRandom; + @NonNull private final CryptoDataFactory cryptoDataFactory; private AesInitializationVectorIterator initializationVectorIterator; - public AesAlgorithm(CryptoDataFactory cryptoDataFactory) { + @SneakyThrows + public AesAlgorithm(@NotNull CryptoDataFactory cryptoDataFactory) { this.cryptoDataFactory = cryptoDataFactory; - this.initializationVectorIterator = new AesInitializationVectorIterator(); + + // We use new SecureRandom() and not SecureRandom.getInstanceStrong(), as the second one + // would use a blocking algorithm, which leads to an increased encryption time of up to 3 + // minutes. Since we have already used /dev/urandom, which only provides pseudo-randomness and + // is also non-blocking, switching to a non-blocking algorithm should not matter here either. + this.secureRandom = new SecureRandom(); + this.initializationVectorIterator = new AesInitializationVectorIterator(this.secureRandom); } @Override @@ -59,7 +72,7 @@ public synchronized EncryptedData encrypt(DecryptedData data, AesKey key) final byte[] initializationVector; synchronized (MONITOR) { if (!initializationVectorIterator.hasNext()) { - initializationVectorIterator = new AesInitializationVectorIterator(); + initializationVectorIterator = new AesInitializationVectorIterator(this.secureRandom); } initializationVector = initializationVectorIterator.next(); @@ -92,4 +105,8 @@ public DecryptedData decrypt(EncryptedData data, AesKey key) byte[] decryptedData = cipher.doFinal(encrypted); return cryptoDataFactory.decryptedFromBytes(decryptedData); } + + public String getAlgorithm() { + return this.secureRandom.getAlgorithm(); + } } diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIterator.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIterator.java index 11ca0011a..cd0a6b1ec 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIterator.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIterator.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2023 ZF Friedrichshafen AG * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH * Copyright (c) 2021,2022 Contributors to the Eclipse Foundation * @@ -29,12 +30,14 @@ public class AesInitializationVectorIterator implements Iterator { public static final int RANDOM_SIZE = 12; public static final int COUNTER_SIZE = 4; - public static final int VECTOR_SIZE = RANDOM_SIZE + COUNTER_SIZE; private final ByteCounter counter; - public AesInitializationVectorIterator() { - counter = new ByteCounter(COUNTER_SIZE); + private SecureRandom secureRandom; + + public AesInitializationVectorIterator(SecureRandom secureRandom) { + this.counter = new ByteCounter(COUNTER_SIZE); + this.secureRandom = secureRandom; } public AesInitializationVectorIterator(ByteCounter byteCounter) { @@ -60,9 +63,8 @@ public byte[] next() { @SneakyThrows public byte[] getNextRandom() { - SecureRandom random = SecureRandom.getInstanceStrong(); byte[] newVector = new byte[RANDOM_SIZE]; - random.nextBytes(newVector); + secureRandom.nextBytes(newVector); return newVector; } } diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/AesDataEncrypterImpl.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/AesDataEncrypterImpl.java index 746fb4073..160f57df0 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/AesDataEncrypterImpl.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/AesDataEncrypterImpl.java @@ -29,9 +29,9 @@ import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import lombok.RequiredArgsConstructor; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.connector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.tractusx.edc.data.encryption.DataEncryptionExtension; import org.eclipse.tractusx.edc.data.encryption.algorithms.CryptoAlgorithm; import org.eclipse.tractusx.edc.data.encryption.data.CryptoDataFactory; diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactory.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactory.java index d60d052f5..916ab245f 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactory.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactory.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2023 ZF Friedrichshafen AG * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH * Copyright (c) 2021,2022 Contributors to the Eclipse Foundation * @@ -20,11 +21,12 @@ package org.eclipse.tractusx.edc.data.encryption.encrypter; +import static java.lang.String.format; + import lombok.RequiredArgsConstructor; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.transfer.dataplane.spi.security.DataEncrypter; -import org.eclipse.tractusx.edc.data.encryption.algorithms.CryptoAlgorithm; +import org.eclipse.edc.connector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.Vault; import org.eclipse.tractusx.edc.data.encryption.algorithms.aes.AesAlgorithm; import org.eclipse.tractusx.edc.data.encryption.data.CryptoDataFactory; import org.eclipse.tractusx.edc.data.encryption.data.CryptoDataFactoryImpl; @@ -67,8 +69,12 @@ public DataEncrypter createAesEncrypter(AesDataEncrypterConfiguration configurat } final CryptoDataFactory cryptoDataFactory = new CryptoDataFactoryImpl(); - final CryptoAlgorithm algorithm = new AesAlgorithm(cryptoDataFactory); + final AesAlgorithm algorithm = new AesAlgorithm(cryptoDataFactory); + monitor.debug( + format( + "AES algorithm was initialised with SecureRandom algorithm '%s'", + algorithm.getAlgorithm())); return new AesDataEncrypterImpl(algorithm, monitor, keyProvider, algorithm, cryptoDataFactory); } } diff --git a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProvider.java b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProvider.java index b009b51de..82b8eccdd 100644 --- a/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProvider.java +++ b/edc-extensions/data-encryption/src/main/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProvider.java @@ -24,7 +24,7 @@ import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.bouncycastle.util.encoders.Base64; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.security.Vault; import org.eclipse.tractusx.edc.data.encryption.DataEncryptionExtension; import org.eclipse.tractusx.edc.data.encryption.key.AesKey; import org.eclipse.tractusx.edc.data.encryption.key.CryptoKeyFactory; diff --git a/edc-extensions/data-encryption/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/data-encryption/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/data-encryption/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/data-encryption/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtensionTest.java b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtensionTest.java index e91d69ee8..c1e0bbb1a 100644 --- a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtensionTest.java +++ b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/DataEncryptionExtensionTest.java @@ -20,10 +20,10 @@ package org.eclipse.tractusx.edc.data.encryption; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.tractusx.edc.data.encryption.encrypter.DataEncrypterFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIteratorTest.java b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIteratorTest.java index ff466a2e2..ceebf50d6 100644 --- a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIteratorTest.java +++ b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/algorithms/aes/AesInitializationVectorIteratorTest.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2023 ZF Friedrichshafen AG * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH * Copyright (c) 2021,2022 Contributors to the Eclipse Foundation * @@ -19,6 +20,7 @@ */ package org.eclipse.tractusx.edc.data.encryption.algorithms.aes; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; @@ -34,7 +36,8 @@ class AesInitializationVectorIteratorTest { @SneakyThrows void testDistinctVectors() { final int vectorCount = 100; - AesInitializationVectorIterator iterator = new AesInitializationVectorIterator(); + final SecureRandom secureRandom = new SecureRandom(); + AesInitializationVectorIterator iterator = new AesInitializationVectorIterator(secureRandom); List vectors = new ArrayList<>(); for (var i = 0; i < vectorCount; i++) { diff --git a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterAesComponentTest.java b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterAesComponentTest.java index 08d9245a9..aa9140629 100644 --- a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterAesComponentTest.java +++ b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterAesComponentTest.java @@ -20,9 +20,9 @@ package org.eclipse.tractusx.edc.data.encryption.encrypter; import lombok.SneakyThrows; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.connector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.Vault; import org.eclipse.tractusx.edc.data.encryption.algorithms.CryptoAlgorithm; import org.eclipse.tractusx.edc.data.encryption.algorithms.aes.AesAlgorithm; import org.eclipse.tractusx.edc.data.encryption.data.CryptoDataFactory; diff --git a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactoryTest.java b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactoryTest.java index e61ac96e9..650fcfec5 100644 --- a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactoryTest.java +++ b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/encrypter/DataEncrypterFactoryTest.java @@ -20,9 +20,9 @@ package org.eclipse.tractusx.edc.data.encryption.encrypter; import java.time.Duration; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.connector.transfer.dataplane.spi.security.DataEncrypter; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.Vault; import org.eclipse.tractusx.edc.data.encryption.key.CryptoKeyFactoryImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProviderTest.java b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProviderTest.java index 25867acbc..04625fdb0 100644 --- a/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProviderTest.java +++ b/edc-extensions/data-encryption/src/test/java/org/eclipse/tractusx/edc/data/encryption/provider/AesKeyProviderTest.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.security.Vault; import org.eclipse.tractusx.edc.data.encryption.key.AesKey; import org.eclipse.tractusx.edc.data.encryption.key.CryptoKeyFactoryImpl; import org.junit.jupiter.api.Assertions; diff --git a/edc-extensions/dataplane-selector-configuration/pom.xml b/edc-extensions/dataplane-selector-configuration/pom.xml index 831359227..d0d152ae1 100644 --- a/edc-extensions/dataplane-selector-configuration/pom.xml +++ b/edc-extensions/dataplane-selector-configuration/pom.xml @@ -24,7 +24,7 @@ edc-extensions org.eclipse.tractusx.edc.extensions - 0.2.0 + 0.3.0 4.0.0 @@ -56,40 +56,22 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-spi - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.eclipse.dataspaceconnector + org.eclipse.edc junit test - org.eclipse.dataspaceconnector + org.eclipse.edc junit test-fixtures test diff --git a/edc-extensions/dataplane-selector-configuration/src/main/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtension.java b/edc-extensions/dataplane-selector-configuration/src/main/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtension.java index df0bc3843..4f4216a0f 100644 --- a/edc-extensions/dataplane-selector-configuration/src/main/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtension.java +++ b/edc-extensions/dataplane-selector-configuration/src/main/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtension.java @@ -28,14 +28,14 @@ import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; -import org.eclipse.dataspaceconnector.dataplane.selector.DataPlaneSelectorService; -import org.eclipse.dataspaceconnector.dataplane.selector.instance.DataPlaneInstanceImpl; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Requires; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.configuration.Config; +import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; +import org.eclipse.edc.connector.dataplane.selector.spi.instance.DataPlaneInstance; +import org.eclipse.edc.runtime.metamodel.annotation.Requires; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.configuration.Config; /** * This Extension provides functionality to read materialized DataPlane instances from the @@ -180,8 +180,8 @@ private void configureDataPlaneInstance(final Config config) { return; } - final DataPlaneInstanceImpl.Builder builder = - DataPlaneInstanceImpl.Builder.newInstance().id(id).url(url); + final DataPlaneInstance.Builder builder = + DataPlaneInstance.Builder.newInstance().id(id).url(url); sourceTypes.forEach(builder::allowedSourceType); destinationTypes.forEach(builder::allowedDestType); diff --git a/edc-extensions/dataplane-selector-configuration/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/dataplane-selector-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/dataplane-selector-configuration/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/dataplane-selector-configuration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionEdcExtensionTest.java b/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionEdcExtensionTest.java index 565da1c1e..fef84076a 100644 --- a/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionEdcExtensionTest.java +++ b/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionEdcExtensionTest.java @@ -22,12 +22,12 @@ import java.util.HashMap; import java.util.Map; -import org.eclipse.dataspaceconnector.dataplane.selector.DataPlaneSelectorService; -import org.eclipse.dataspaceconnector.junit.extensions.EdcExtension; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Provides; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.types.domain.DataAddress; +import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; +import org.eclipse.edc.junit.extensions.EdcExtension; +import org.eclipse.edc.runtime.metamodel.annotation.Provides; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.types.domain.DataAddress; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionTest.java b/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionTest.java index c8bd23144..5a9298e83 100644 --- a/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionTest.java +++ b/edc-extensions/dataplane-selector-configuration/src/test/java/org/eclipse/tractusx/edc/dataplane/selector/configuration/DataPlaneSelectorConfigurationServiceExtensionTest.java @@ -23,13 +23,13 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.eclipse.dataspaceconnector.dataplane.selector.DataPlaneSelectorService; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.configuration.Config; -import org.eclipse.dataspaceconnector.spi.system.configuration.ConfigFactory; -import org.eclipse.dataspaceconnector.spi.types.domain.DataAddress; +import org.eclipse.edc.connector.dataplane.selector.spi.DataPlaneSelectorService; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.configuration.Config; +import org.eclipse.edc.spi.system.configuration.ConfigFactory; +import org.eclipse.edc.spi.types.domain.DataAddress; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/pom.xml b/edc-extensions/hashicorp-vault/pom.xml index c51b65ae8..28f73e732 100644 --- a/edc-extensions/hashicorp-vault/pom.xml +++ b/edc-extensions/hashicorp-vault/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc.extensions edc-extensions - 0.2.0 + 0.3.0 4.0.0 @@ -115,16 +115,16 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector + org.eclipse.edc junit test - org.eclipse.dataspaceconnector + org.eclipse.edc junit test-fixtures test @@ -144,24 +144,6 @@ okhttp - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - org.junit.jupiter diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpVaultExtension.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpVaultExtension.java index a30b593a0..dae92725f 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpVaultExtension.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpVaultExtension.java @@ -22,7 +22,7 @@ import java.time.Duration; import okhttp3.OkHttpClient; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.ServiceExtensionContext; /** * Temporary solution as long as the Vault components needs to be loaded as dedicated vault diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolver.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolver.java index 81375a538..ed807cbb8 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolver.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolver.java @@ -27,10 +27,10 @@ import java.security.cert.X509Certificate; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.security.CertificateResolver; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.EdcException; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.security.CertificateResolver; +import org.eclipse.edc.spi.security.Vault; /** Resolves an X.509 certificate in Hashicorp vault. */ @RequiredArgsConstructor diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVault.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVault.java index e49563974..e8a59937a 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVault.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVault.java @@ -22,9 +22,9 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.result.Result; +import org.eclipse.edc.spi.security.Vault; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClient.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClient.java index 068a24387..850c33243 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClient.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClient.java @@ -37,7 +37,7 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -import org.eclipse.dataspaceconnector.spi.result.Result; +import org.eclipse.edc.spi.result.Result; import org.jetbrains.annotations.NotNull; @RequiredArgsConstructor diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultException.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultException.java index 57743d1f1..bd3c60549 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultException.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultException.java @@ -20,7 +20,7 @@ package org.eclipse.tractusx.edc.hashicorpvault; -import org.eclipse.dataspaceconnector.spi.EdcException; +import org.eclipse.edc.spi.EdcException; public class HashicorpVaultException extends EdcException { diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheck.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheck.java index 464408d12..9834b0d03 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheck.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheck.java @@ -16,11 +16,11 @@ import java.io.IOException; import lombok.RequiredArgsConstructor; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckResult; -import org.eclipse.dataspaceconnector.spi.system.health.LivenessProvider; -import org.eclipse.dataspaceconnector.spi.system.health.ReadinessProvider; -import org.eclipse.dataspaceconnector.spi.system.health.StartupStatusProvider; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.health.HealthCheckResult; +import org.eclipse.edc.spi.system.health.LivenessProvider; +import org.eclipse.edc.spi.system.health.ReadinessProvider; +import org.eclipse.edc.spi.system.health.StartupStatusProvider; @RequiredArgsConstructor public class HashicorpVaultHealthCheck diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthExtension.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthExtension.java index 4c81cca20..5b7cca1a3 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthExtension.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthExtension.java @@ -21,10 +21,10 @@ package org.eclipse.tractusx.edc.hashicorpvault; import okhttp3.OkHttpClient; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Requires; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckService; +import org.eclipse.edc.runtime.metamodel.annotation.Requires; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.health.HealthCheckService; @Requires(HealthCheckService.class) public class HashicorpVaultHealthExtension extends AbstractHashicorpVaultExtension diff --git a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultVaultExtension.java b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultVaultExtension.java index 223c70406..d8b41b2c1 100644 --- a/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultVaultExtension.java +++ b/edc-extensions/hashicorp-vault/src/main/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultVaultExtension.java @@ -21,13 +21,13 @@ package org.eclipse.tractusx.edc.hashicorpvault; import okhttp3.OkHttpClient; -import org.eclipse.dataspaceconnector.runtime.metamodel.annotation.Provides; -import org.eclipse.dataspaceconnector.spi.security.CertificateResolver; -import org.eclipse.dataspaceconnector.spi.security.PrivateKeyResolver; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.spi.security.VaultPrivateKeyResolver; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; +import org.eclipse.edc.runtime.metamodel.annotation.Provides; +import org.eclipse.edc.spi.security.CertificateResolver; +import org.eclipse.edc.spi.security.PrivateKeyResolver; +import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.spi.security.VaultPrivateKeyResolver; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; @Provides({Vault.class, CertificateResolver.class, PrivateKeyResolver.class}) public class HashicorpVaultVaultExtension extends AbstractHashicorpVaultExtension diff --git a/edc-extensions/hashicorp-vault/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/hashicorp-vault/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/hashicorp-vault/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/hashicorp-vault/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpIT.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpIT.java index 925e05de5..e196cd27d 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpIT.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/AbstractHashicorpIT.java @@ -31,17 +31,17 @@ import java.util.UUID; import java.util.stream.Collectors; import lombok.Getter; -import org.eclipse.dataspaceconnector.junit.extensions.EdcExtension; -import org.eclipse.dataspaceconnector.spi.security.CertificateResolver; -import org.eclipse.dataspaceconnector.spi.security.Vault; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckResult; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckService; -import org.eclipse.dataspaceconnector.spi.system.health.HealthStatus; -import org.eclipse.dataspaceconnector.spi.system.health.LivenessProvider; -import org.eclipse.dataspaceconnector.spi.system.health.ReadinessProvider; -import org.eclipse.dataspaceconnector.spi.system.health.StartupStatusProvider; +import org.eclipse.edc.junit.extensions.EdcExtension; +import org.eclipse.edc.spi.security.CertificateResolver; +import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.health.HealthCheckResult; +import org.eclipse.edc.spi.system.health.HealthCheckService; +import org.eclipse.edc.spi.system.health.HealthStatus; +import org.eclipse.edc.spi.system.health.LivenessProvider; +import org.eclipse.edc.spi.system.health.ReadinessProvider; +import org.eclipse.edc.spi.system.health.StartupStatusProvider; import org.junit.ClassRule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverIT.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverIT.java index ed52719e8..48fc06eca 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverIT.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverIT.java @@ -23,8 +23,8 @@ import java.security.cert.X509Certificate; import java.util.UUID; import lombok.SneakyThrows; -import org.eclipse.dataspaceconnector.spi.security.CertificateResolver; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.security.CertificateResolver; +import org.eclipse.edc.spi.security.Vault; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverTest.java index e5d87171e..754bdda28 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpCertificateResolverTest.java @@ -22,7 +22,7 @@ import java.security.cert.X509Certificate; import lombok.SneakyThrows; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.edc.spi.monitor.Monitor; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClientTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClientTest.java index d0dbabbf2..2bddac46e 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClientTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultClientTest.java @@ -29,7 +29,7 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; -import org.eclipse.dataspaceconnector.spi.result.Result; +import org.eclipse.edc.spi.result.Result; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultExtensionTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultExtensionTest.java index 110020dd7..dfba9fe1c 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultExtensionTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultExtensionTest.java @@ -20,10 +20,10 @@ package org.eclipse.tractusx.edc.hashicorpvault; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckService; -import org.eclipse.dataspaceconnector.spi.types.TypeManager; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.health.HealthCheckService; +import org.eclipse.edc.spi.types.TypeManager; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckExtensionTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckExtensionTest.java index 28ee78640..5991f8c1e 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckExtensionTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckExtensionTest.java @@ -20,10 +20,10 @@ package org.eclipse.tractusx.edc.hashicorpvault; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckService; -import org.eclipse.dataspaceconnector.spi.types.TypeManager; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.health.HealthCheckService; +import org.eclipse.edc.spi.types.TypeManager; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckTest.java index 20b59c1db..3abf95289 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultHealthCheckTest.java @@ -21,8 +21,8 @@ package org.eclipse.tractusx.edc.hashicorpvault; import java.io.IOException; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.system.health.HealthCheckResult; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.health.HealthCheckResult; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultIT.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultIT.java index 1608a3666..f6cb202b8 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultIT.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultIT.java @@ -21,7 +21,7 @@ package org.eclipse.tractusx.edc.hashicorpvault; import java.util.UUID; -import org.eclipse.dataspaceconnector.spi.security.Vault; +import org.eclipse.edc.spi.security.Vault; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultTest.java b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultTest.java index e0809120d..03512f2a6 100644 --- a/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultTest.java +++ b/edc-extensions/hashicorp-vault/src/test/java/org/eclipse/tractusx/edc/hashicorpvault/HashicorpVaultTest.java @@ -22,8 +22,8 @@ import java.util.UUID; import lombok.SneakyThrows; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.result.Result; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/edc-extensions/pom.xml b/edc-extensions/pom.xml index b83258a11..1b022014a 100644 --- a/edc-extensions/pom.xml +++ b/edc-extensions/pom.xml @@ -23,7 +23,7 @@ org.eclipse.tractusx.edc product-edc-parent - 0.2.0 + 0.3.0 4.0.0 @@ -42,8 +42,11 @@ dataplane-selector-configuration data-encryption control-plane-adapter - custom-jsonld cx-oauth2 + provision-additional-headers + transferprocess-sftp-common + transferprocess-sftp-client + transferprocess-sftp-provisioner diff --git a/edc-extensions/postgresql-migration/pom.xml b/edc-extensions/postgresql-migration/pom.xml index 70cd148f4..689878012 100644 --- a/edc-extensions/postgresql-migration/pom.xml +++ b/edc-extensions/postgresql-migration/pom.xml @@ -23,7 +23,7 @@ edc-extensions org.eclipse.tractusx.edc.extensions - 0.2.0 + 0.3.0 4.0.0 @@ -55,25 +55,25 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-datasource-spi - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-spi - org.eclipse.dataspaceconnector + org.eclipse.edc asset-index-sql compile - org.eclipse.dataspaceconnector - common-sql + org.eclipse.edc + sql-core diff --git a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AbstractPostgresqlMigrationExtension.java b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AbstractPostgresqlMigrationExtension.java index 73bc1abae..ab0efc62d 100644 --- a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AbstractPostgresqlMigrationExtension.java +++ b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AbstractPostgresqlMigrationExtension.java @@ -22,11 +22,11 @@ import java.util.Objects; import java.util.Properties; -import org.eclipse.dataspaceconnector.spi.persistence.EdcPersistenceException; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtension; -import org.eclipse.dataspaceconnector.spi.system.ServiceExtensionContext; -import org.eclipse.dataspaceconnector.spi.system.configuration.Config; -import org.eclipse.dataspaceconnector.sql.datasource.ConnectionFactoryDataSource; +import org.eclipse.edc.spi.persistence.EdcPersistenceException; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.configuration.Config; +import org.eclipse.edc.sql.datasource.ConnectionFactoryDataSource; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.MigrationVersion; import org.flywaydb.core.api.output.MigrateResult; diff --git a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AssetPostgresqlMigrationExtension.java b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AssetPostgresqlMigrationExtension.java index d07d01841..d44663e2b 100644 --- a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AssetPostgresqlMigrationExtension.java +++ b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/AssetPostgresqlMigrationExtension.java @@ -20,7 +20,7 @@ package org.eclipse.tractusx.edc.postgresql.migration; -import org.eclipse.dataspaceconnector.sql.assetindex.ConfigurationKeys; +import org.eclipse.edc.connector.store.sql.assetindex.ConfigurationKeys; public class AssetPostgresqlMigrationExtension extends AbstractPostgresqlMigrationExtension { private static final String NAME_SUBSYSTEM = "asset"; diff --git a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/CpAdapterPostgresqlMigrationExtension.java b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/CpAdapterPostgresqlMigrationExtension.java new file mode 100644 index 000000000..63e43c1e7 --- /dev/null +++ b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/CpAdapterPostgresqlMigrationExtension.java @@ -0,0 +1,16 @@ +package org.eclipse.tractusx.edc.postgresql.migration; + +public class CpAdapterPostgresqlMigrationExtension extends AbstractPostgresqlMigrationExtension { + private static final String NAME_SUBSYSTEM = "cpadapter"; + private static final String DATASOURCE_SETTING_NAME = "edc.datasource.cpadapter.name"; + + @Override + protected String getDataSourceNameConfigurationKey() { + return DATASOURCE_SETTING_NAME; + } + + @Override + protected String getSubsystemName() { + return NAME_SUBSYSTEM; + } +} diff --git a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/DriverManagerConnectionFactory.java b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/DriverManagerConnectionFactory.java index 594cab2b6..621bc8774 100644 --- a/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/DriverManagerConnectionFactory.java +++ b/edc-extensions/postgresql-migration/src/main/java/org/eclipse/tractusx/edc/postgresql/migration/DriverManagerConnectionFactory.java @@ -24,8 +24,8 @@ import java.sql.DriverManager; import java.util.Objects; import java.util.Properties; -import org.eclipse.dataspaceconnector.spi.persistence.EdcPersistenceException; -import org.eclipse.dataspaceconnector.sql.ConnectionFactory; +import org.eclipse.edc.spi.persistence.EdcPersistenceException; +import org.eclipse.edc.sql.ConnectionFactory; class DriverManagerConnectionFactory implements ConnectionFactory { private final String jdbcUrl; diff --git a/edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 93% rename from edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 4c12f6272..b34529d7e 100644 --- a/edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension +++ b/edc-extensions/postgresql-migration/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -22,3 +22,4 @@ org.eclipse.tractusx.edc.postgresql.migration.ContractDefinitionPostgresqlMigrat org.eclipse.tractusx.edc.postgresql.migration.ContractNegotiationPostgresqlMigrationExtension org.eclipse.tractusx.edc.postgresql.migration.PolicyPostgresqlMigrationExtension org.eclipse.tractusx.edc.postgresql.migration.TransferProcessPostgresqlMigrationExtension +org.eclipse.tractusx.edc.postgresql.migration.CpAdapterPostgresqlMigrationExtension diff --git a/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/contractdefinition/V0_0_4__Snapshot_20221201_Update.sql b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/contractdefinition/V0_0_4__Snapshot_20221201_Update.sql new file mode 100644 index 000000000..d6f0c1bd8 --- /dev/null +++ b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/contractdefinition/V0_0_4__Snapshot_20221201_Update.sql @@ -0,0 +1,18 @@ +-- +-- Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH +-- +-- 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: +-- Mercedes-Benz Tech Innovation GmbH - EDC Snapshot 20221201 Update +-- + +-- add columns +ALTER TABLE edc_contract_definitions ADD COLUMN validity BIGINT; +-- set to 60×60×24×365, to let existing contracts expire after one year +UPDATE edc_contract_definitions SET validity=31536000; +ALTER TABLE edc_contract_definitions ALTER COLUMN validity SET NOT NULL; diff --git a/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/cpadapter/V0_0_7__Init_CpAdapter_Database_Schema.sql b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/cpadapter/V0_0_7__Init_CpAdapter_Database_Schema.sql new file mode 100644 index 000000000..3e64d3c45 --- /dev/null +++ b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/cpadapter/V0_0_7__Init_CpAdapter_Database_Schema.sql @@ -0,0 +1,54 @@ +-- +-- Copyright (c) 2022 ZF Friedrichshafen 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: +-- ZF Friedrichshafen AG - Initial SQL Query +-- + +-- Statements are designed for and tested with Postgres only! + + +CREATE TABLE IF NOT EXISTS edc_lease +( + leased_by VARCHAR NOT NULL, + leased_at BIGINT, + lease_duration INTEGER NOT NULL, + lease_id VARCHAR NOT NULL + CONSTRAINT lease_pk + PRIMARY KEY +); + +CREATE TABLE IF NOT EXISTS edc_cpadapter_queue +( + id VARCHAR NOT NULL, + created_at BIGINT NOT NULL, + channel VARCHAR, + message JSON, + invoke_after BIGINT NOT NULL, + lease_id VARCHAR + CONSTRAINT cpadapter_queue_lease_lease_id_fk + REFERENCES edc_lease + ON DELETE SET NULL, + PRIMARY KEY (id) +); + +CREATE UNIQUE INDEX IF NOT EXISTS edc_cpadapter_queue_id_uindex + ON edc_cpadapter_queue (id); + +CREATE TABLE IF NOT EXISTS edc_cpadapter_object_store +( + id VARCHAR NOT NULL, + created_at BIGINT NOT NULL, + type VARCHAR, + object JSON, + PRIMARY KEY (id) +); + + + diff --git a/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/transferprocess/V0_0_6__Snapshot_20230109_Update.sql b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/transferprocess/V0_0_6__Snapshot_20230109_Update.sql new file mode 100644 index 000000000..7e6ec836a --- /dev/null +++ b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/transferprocess/V0_0_6__Snapshot_20230109_Update.sql @@ -0,0 +1,15 @@ +-- +-- Copyright (c) 2022 ZF Friedrichshafen 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: +-- ZF Friedrichshafen AG - Add column for the dynamically HTTP Receiver callback endpoints +-- + +-- add column +ALTER TABLE edc_transfer_process ADD COLUMN transferprocess_properties TEXT; diff --git a/edc-extensions/provision-additional-headers/README.md b/edc-extensions/provision-additional-headers/README.md new file mode 100644 index 000000000..3d68602fa --- /dev/null +++ b/edc-extensions/provision-additional-headers/README.md @@ -0,0 +1,9 @@ +# Provision: additional headers + +The goal of this extension is to provide additional headers to the request to the backend service done by the provider +in order to retrieve the data that will be given to the consumer. + +This gives for example the provider backend service the possibility to audit the data requests. + +The following headers are added to the `HttpDataAddress`: +- `Edc-Contract-Agreement-Id`: the id of the contract agreement diff --git a/edc-extensions/custom-jsonld/pom.xml b/edc-extensions/provision-additional-headers/pom.xml similarity index 80% rename from edc-extensions/custom-jsonld/pom.xml rename to edc-extensions/provision-additional-headers/pom.xml index 4acd9ca61..05d51bd57 100644 --- a/edc-extensions/custom-jsonld/pom.xml +++ b/edc-extensions/provision-additional-headers/pom.xml @@ -1,7 +1,7 @@ - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - org.eclipse.dataspaceconnector - ids-jsonld-serdes - - - org.eclipse.dataspaceconnector - ids-spi - - - org.eclipse.dataspaceconnector - ids-core + org.eclipse.edc + transfer-spi @@ -123,25 +115,17 @@ slf4j-api - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - + - com.fasterxml.jackson.core - jackson-databind + org.eclipse.edc + control-plane-core + test - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + org.eclipse.edc + junit + test - - org.junit.jupiter junit-jupiter @@ -152,5 +136,15 @@ mockito-core test + + org.mockito + mockito-inline + test + + + org.awaitility + awaitility + test + diff --git a/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResource.java b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResource.java new file mode 100644 index 000000000..b0d3534ea --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResource.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedContentResource; + +@JsonDeserialize(builder = AdditionalHeadersProvisionedResource.Builder.class) +class AdditionalHeadersProvisionedResource extends ProvisionedContentResource { + + @JsonPOJOBuilder(withPrefix = "") + public static class Builder + extends ProvisionedContentResource.Builder { + + private Builder() { + super(new AdditionalHeadersProvisionedResource()); + } + + @JsonCreator + public static Builder newInstance() { + return new Builder(); + } + } +} diff --git a/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisioner.java b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisioner.java new file mode 100644 index 000000000..b5b4085e5 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisioner.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import org.eclipse.edc.connector.transfer.spi.provision.Provisioner; +import org.eclipse.edc.connector.transfer.spi.types.DeprovisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionResponse; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.response.StatusResult; +import org.eclipse.edc.spi.types.domain.HttpDataAddress; + +public class AdditionalHeadersProvisioner + implements Provisioner< + AdditionalHeadersResourceDefinition, AdditionalHeadersProvisionedResource> { + + @Override + public boolean canProvision(ResourceDefinition resourceDefinition) { + return resourceDefinition instanceof AdditionalHeadersResourceDefinition; + } + + @Override + public boolean canDeprovision(ProvisionedResource provisionedResource) { + return false; // nothing to deprovision + } + + @Override + public CompletableFuture> provision( + AdditionalHeadersResourceDefinition resourceDefinition, Policy policy) { + + var address = + HttpDataAddress.Builder.newInstance() + .copyFrom(resourceDefinition.getDataAddress()) + .addAdditionalHeader("Edc-Contract-Agreement-Id", resourceDefinition.getContractId()) + .build(); + + var provisioned = + AdditionalHeadersProvisionedResource.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .resourceDefinitionId(resourceDefinition.getId()) + .transferProcessId(resourceDefinition.getTransferProcessId()) + .dataAddress(address) + .resourceName(UUID.randomUUID().toString()) + .hasToken(false) + .build(); + + var response = ProvisionResponse.Builder.newInstance().resource(provisioned).build(); + var result = StatusResult.success(response); + return CompletableFuture.completedFuture(result); + } + + @Override + public CompletableFuture> deprovision( + AdditionalHeadersProvisionedResource additionalHeadersProvisionedResource, Policy policy) { + return null; // nothing to deprovision + } +} diff --git a/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinition.java b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinition.java new file mode 100644 index 000000000..e609922be --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinition.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.spi.types.domain.DataAddress; + +@JsonDeserialize(builder = AdditionalHeadersResourceDefinition.Builder.class) +@JsonTypeName("dataspaceconnector:additionalheadersresourcedefinition") +class AdditionalHeadersResourceDefinition extends ResourceDefinition { + + private String contractId; + private DataAddress dataAddress; + + @Override + public Builder toBuilder() { + return initializeBuilder(new Builder()); + } + + public DataAddress getDataAddress() { + return dataAddress; + } + + public String getContractId() { + return contractId; + } + + @JsonPOJOBuilder(withPrefix = "") + public static class Builder + extends ResourceDefinition.Builder { + + protected Builder() { + super(new AdditionalHeadersResourceDefinition()); + } + + @JsonCreator + public static Builder newInstance() { + return new Builder(); + } + + public Builder contractId(String contractId) { + this.resourceDefinition.contractId = contractId; + return this; + } + + public Builder dataAddress(DataAddress dataAddress) { + this.resourceDefinition.dataAddress = dataAddress; + return this; + } + } +} diff --git a/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGenerator.java b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGenerator.java new file mode 100644 index 000000000..1d85bdd94 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGenerator.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import java.util.UUID; +import org.eclipse.edc.connector.transfer.spi.provision.ProviderResourceDefinitionGenerator; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.jetbrains.annotations.Nullable; + +class AdditionalHeadersResourceDefinitionGenerator implements ProviderResourceDefinitionGenerator { + + @Override + public boolean canGenerate(DataRequest dataRequest, DataAddress dataAddress, Policy policy) { + return "HttpData".equals(dataAddress.getType()); + } + + @Override + public @Nullable ResourceDefinition generate( + DataRequest dataRequest, DataAddress dataAddress, Policy policy) { + return AdditionalHeadersResourceDefinition.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .dataAddress(dataAddress) + .contractId(dataRequest.getContractId()) + .build(); + } +} diff --git a/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtension.java b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtension.java new file mode 100644 index 000000000..ef58cd4a2 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/main/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtension.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import org.eclipse.edc.connector.transfer.spi.provision.ProvisionManager; +import org.eclipse.edc.connector.transfer.spi.provision.ResourceManifestGenerator; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.types.TypeManager; + +public class ProvisionAdditionalHeadersExtension implements ServiceExtension { + + @Inject private ResourceManifestGenerator resourceManifestGenerator; + + @Inject private ProvisionManager provisionManager; + + @Inject private TypeManager typeManager; + + @Override + public void initialize(ServiceExtensionContext context) { + typeManager.registerTypes( + AdditionalHeadersResourceDefinition.class, AdditionalHeadersProvisionedResource.class); + resourceManifestGenerator.registerGenerator(new AdditionalHeadersResourceDefinitionGenerator()); + provisionManager.register(new AdditionalHeadersProvisioner()); + } +} diff --git a/edc-extensions/custom-jsonld/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/provision-additional-headers/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 76% rename from edc-extensions/custom-jsonld/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension rename to edc-extensions/provision-additional-headers/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 52b428d41..df3714fd4 100644 --- a/edc-extensions/custom-jsonld/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension +++ b/edc-extensions/provision-additional-headers/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -1,6 +1,6 @@ # -# Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -# Copyright (c) 2021,2022 Contributors to the Eclipse Foundation +# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# Copyright (c) 2021-2023 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -17,5 +17,4 @@ # # SPDX-License-Identifier: Apache-2.0 # - -org.eclipse.tractusx.edc.jsonld.CustomJsonLdExtension +org.eclipse.tractusx.edc.provision.additionalheaders.ProvisionAdditionalHeadersExtension diff --git a/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResourceTest.java b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResourceTest.java new file mode 100644 index 000000000..dc133d060 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionedResourceTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.UUID; +import org.eclipse.edc.spi.types.TypeManager; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.junit.jupiter.api.Test; + +class AdditionalHeadersProvisionedResourceTest { + + @Test + void serdes() { + var typeManager = new TypeManager(); + var resource = + AdditionalHeadersProvisionedResource.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .resourceDefinitionId(UUID.randomUUID().toString()) + .transferProcessId(UUID.randomUUID().toString()) + .hasToken(false) + .resourceName("name") + .dataAddress(DataAddress.Builder.newInstance().type("type").build()) + .build(); + + var json = typeManager.writeValueAsString(resource); + var deserialized = typeManager.readValue(json, AdditionalHeadersProvisionedResource.class); + + assertThat(deserialized).usingRecursiveComparison().isEqualTo(resource); + } +} diff --git a/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionerTest.java b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionerTest.java new file mode 100644 index 000000000..45769a935 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersProvisionerTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.map; +import static org.assertj.core.api.InstanceOfAssertFactories.type; +import static org.mockito.Mockito.mock; + +import java.util.UUID; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionResponse; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedDataAddressResource; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.response.StatusResult; +import org.eclipse.edc.spi.types.domain.HttpDataAddress; +import org.junit.jupiter.api.Test; + +class AdditionalHeadersProvisionerTest { + + private final AdditionalHeadersProvisioner provisioner = new AdditionalHeadersProvisioner(); + + @Test + void canProvisionAdditionalHeadersResourceDefinition() { + assertThat(provisioner.canProvision(mock(AdditionalHeadersResourceDefinition.class))).isTrue(); + assertThat(provisioner.canProvision(mock(ResourceDefinition.class))).isFalse(); + } + + @Test + void cannotDeprovisionAdditionalHeadersResourceDefinition() { + assertThat(provisioner.canDeprovision(mock(AdditionalHeadersProvisionedResource.class))) + .isFalse(); + assertThat(provisioner.canDeprovision(mock(ProvisionedResource.class))).isFalse(); + } + + @Test + void shouldAddContractIdAdditionalHeader() { + var address = HttpDataAddress.Builder.newInstance().baseUrl("http://any").build(); + var resourceDefinition = + AdditionalHeadersResourceDefinition.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .transferProcessId(UUID.randomUUID().toString()) + .contractId("contractId") + .dataAddress(address) + .build(); + + var result = provisioner.provision(resourceDefinition, Policy.Builder.newInstance().build()); + + assertThat(result) + .succeedsWithin(5, SECONDS) + .matches(StatusResult::succeeded) + .extracting(StatusResult::getContent) + .extracting(ProvisionResponse::getResource) + .asInstanceOf(type(AdditionalHeadersProvisionedResource.class)) + .extracting(ProvisionedDataAddressResource::getDataAddress) + .extracting(a -> HttpDataAddress.Builder.newInstance().copyFrom(a).build()) + .extracting(HttpDataAddress::getAdditionalHeaders) + .asInstanceOf(map(String.class, String.class)) + .containsEntry("Edc-Contract-Agreement-Id", "contractId"); + } +} diff --git a/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGeneratorTest.java b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGeneratorTest.java new file mode 100644 index 000000000..12b9a61e6 --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionGeneratorTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.type; + +import java.util.UUID; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.spi.types.domain.HttpDataAddress; +import org.junit.jupiter.api.Test; + +class AdditionalHeadersResourceDefinitionGeneratorTest { + + private final AdditionalHeadersResourceDefinitionGenerator generator = + new AdditionalHeadersResourceDefinitionGenerator(); + + @Test + void canGenerate_shouldReturnFalseForNotHttpDataAddresses() { + var dataAddress = DataAddress.Builder.newInstance().type("any").build(); + var dataRequest = + DataRequest.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .dataDestination(dataAddress) + .build(); + var build = Policy.Builder.newInstance().build(); + + var result = generator.canGenerate(dataRequest, dataAddress, build); + + assertThat(result).isFalse(); + } + + @Test + void canGenerate_shouldReturnTrueForHttpDataAddresses() { + var dataAddress = DataAddress.Builder.newInstance().type("HttpData").build(); + var dataRequest = + DataRequest.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .dataDestination(dataAddress) + .build(); + var build = Policy.Builder.newInstance().build(); + + var result = generator.canGenerate(dataRequest, dataAddress, build); + + assertThat(result).isTrue(); + } + + @Test + void shouldCreateResourceDefinitionWithDataAddress() { + var dataAddress = HttpDataAddress.Builder.newInstance().baseUrl("http://any").build(); + var dataRequest = + DataRequest.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .dataDestination(dataAddress) + .build(); + var build = Policy.Builder.newInstance().build(); + + var result = generator.generate(dataRequest, dataAddress, build); + + assertThat(result) + .asInstanceOf(type(AdditionalHeadersResourceDefinition.class)) + .extracting(AdditionalHeadersResourceDefinition::getDataAddress) + .extracting(address -> HttpDataAddress.Builder.newInstance().copyFrom(address).build()) + .extracting(HttpDataAddress::getBaseUrl) + .isEqualTo("http://any"); + } +} diff --git a/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionTest.java b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionTest.java new file mode 100644 index 000000000..4c69e297d --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/AdditionalHeadersResourceDefinitionTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.UUID; +import org.eclipse.edc.spi.types.TypeManager; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.junit.jupiter.api.Test; + +class AdditionalHeadersResourceDefinitionTest { + + @Test + void serdes() { + var typeManager = new TypeManager(); + var definition = + AdditionalHeadersResourceDefinition.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .transferProcessId(UUID.randomUUID().toString()) + .dataAddress(DataAddress.Builder.newInstance().type("type").build()) + .contractId(UUID.randomUUID().toString()) + .build(); + + var json = typeManager.writeValueAsString(definition); + var deserialized = typeManager.readValue(json, AdditionalHeadersResourceDefinition.class); + + assertThat(deserialized).usingRecursiveComparison().isEqualTo(definition); + } +} diff --git a/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtensionTest.java b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtensionTest.java new file mode 100644 index 000000000..205b3c75c --- /dev/null +++ b/edc-extensions/provision-additional-headers/src/test/java/org/eclipse/tractusx/edc/provision/additionalheaders/ProvisionAdditionalHeadersExtensionTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-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 + */ + +package org.eclipse.tractusx.edc.provision.additionalheaders; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.awaitility.Awaitility.await; +import static org.mockito.Mockito.*; + +import org.eclipse.edc.connector.transfer.spi.TransferProcessManager; +import org.eclipse.edc.connector.transfer.spi.flow.DataFlowController; +import org.eclipse.edc.connector.transfer.spi.flow.DataFlowManager; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.junit.extensions.EdcExtension; +import org.eclipse.edc.spi.asset.AssetIndex; +import org.eclipse.edc.spi.response.StatusResult; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.spi.types.domain.asset.Asset; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +@ExtendWith(EdcExtension.class) +class ProvisionAdditionalHeadersExtensionTest { + + private final DataFlowController dataFlowController = mock(DataFlowController.class); + + @BeforeEach + void setUp() { + when(dataFlowController.canHandle(any(), any())).thenReturn(true); + when(dataFlowController.initiateFlow(any(), any(), any())).thenReturn(StatusResult.success()); + } + + @Test + void shouldPutContractIdAsHeaderInDataAddress( + TransferProcessManager transferProcessManager, + AssetIndex assetIndex, + DataFlowManager dataFlowManager) { + dataFlowManager.register(dataFlowController); + var asset = Asset.Builder.newInstance().id("assetId").build(); + var dataAddress = DataAddress.Builder.newInstance().type("HttpData").build(); + assetIndex.accept(asset, dataAddress); + + var dataRequest = + DataRequest.Builder.newInstance() + .contractId("aContractId") + .assetId("assetId") + .destinationType("HttpProxy") + .build(); + + var result = transferProcessManager.initiateProviderRequest(dataRequest); + + assertThat(result).matches(StatusResult::succeeded); + + await() + .untilAsserted( + () -> { + verify(dataFlowController) + .initiateFlow( + any(), + argThat( + it -> + "aContractId" + .equals(it.getProperty("header:Edc-Contract-Agreement-Id"))), + any()); + }); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/pom.xml b/edc-extensions/transferprocess-sftp-client/pom.xml new file mode 100644 index 000000000..260a92009 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/pom.xml @@ -0,0 +1,237 @@ + + + + + org.eclipse.tractusx.edc.extensions + edc-extensions + 0.3.0 + + 4.0.0 + + transferprocess-sftp-client + jar + + + ${project.basedir}/src/main/java + ${originalSourceDirectory} + ${project.build.directory}/delombok + ${project.groupId}_${project.artifactId} + + + + ${sourceDirectory} + + + + src/main/resources + + **/* + + + + ../.. + META-INF + + NOTICE.md + LICENSE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + org.projectlombok + lombok + ${org.projectlombok.lombok.version} + + + + + + + org.projectlombok + lombok-maven-plugin + ${org.projectlombok.lombok.maven.plugin.version} + + + generate-sources + + delombok + + + + + ${originalSourceDirectory} + ${delombokSourceDirectory} + false + UTF-8 + + skip + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + + + + + org.eclipse.edc + core-spi + + + org.eclipse.edc + policy-engine + + + org.eclipse.edc + transfer-spi + + + org.eclipse.edc + data-plane-spi + + + org.eclipse.edc + data-plane-core + + + org.eclipse.edc + data-plane-util + + + org.eclipse.edc + policy-spi + + + org.eclipse.edc + junit + test + + + org.eclipse.edc + junit + test-fixtures + test + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-common + 0.3.0 + + + + + org.projectlombok + lombok + + + org.apache.sshd + sshd-core + + + org.apache.sshd + sshd-sftp + + + + + org.junit.jupiter + junit-jupiter + test + + + org.mockito + mockito-core + test + + + org.mockito + mockito-inline + test + + + org.testcontainers + junit-jupiter + test + + + ch.qos.logback + logback-core + test + + + org.testcontainers + testcontainers + + + org.slf4j + slf4j-api + + + org.slf4j + jul-to-slf4j + + + org.apache.logging.log4j + log4j-api + 2.19.0 + test + + + org.hamcrest + hamcrest + test + + + org.awaitility + awaitility + test + + + + + + + + delombok + + ${delombokSourceDirectory} + + + + \ No newline at end of file diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientConfig.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientConfig.java new file mode 100644 index 000000000..bf5da3a2f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; + +@Builder +@Getter +public class SftpClientConfig { + private SftpUser sftpUser; + private SftpLocation sftpLocation; + @Builder.Default private int bufferSize = 4096; + @Builder.Default private boolean hostVerification = true; + + @Builder.Default + private Path knownHostFile = Paths.get(System.getenv("HOME"), ".ssh/known_hosts"); + + @Builder.Default private int connectionTimeoutSeconds = 10; + + @Builder.Default + private Collection writeOpenModes = + List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Write); + + @Builder.Default + private Collection readOpenModes = List.of(SftpClient.OpenMode.Read); +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientExtension.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientExtension.java new file mode 100644 index 000000000..9143b3583 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientExtension.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import org.eclipse.edc.connector.dataplane.spi.pipeline.PipelineService; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.runtime.metamodel.annotation.Provides; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; + +@Provides(SftpClientWrapper.class) +public class SftpClientExtension implements ServiceExtension { + + @Inject PipelineService pipelineService; + + @Override + public void initialize(ServiceExtensionContext context) { + SftpDataSinkFactory sftpDataSinkFactory = new SftpDataSinkFactory(); + SftpDataSourceFactory sftpDataSourceFactory = new SftpDataSourceFactory(); + SftpClientWrapperFactory sftpClientWrapperFactory = new SftpClientWrapperFactoryImpl(); + + pipelineService.registerFactory(sftpDataSinkFactory); + pipelineService.registerFactory(sftpDataSourceFactory); + context.registerService(SftpClientWrapperFactory.class, sftpClientWrapperFactory); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapper.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapper.java new file mode 100644 index 000000000..c082106f2 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapper.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.io.IOException; +import java.io.InputStream; + +public interface SftpClientWrapper { + void uploadFile(InputStream inputStream) throws IOException; + + InputStream downloadFile() throws IOException; +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactory.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactory.java new file mode 100644 index 000000000..ba60d9c04 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactory.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +public interface SftpClientWrapperFactory { + SftpClientWrapper getSftpClientWrapper(SftpClientConfig config); +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactoryImpl.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactoryImpl.java new file mode 100644 index 000000000..a300ea4d0 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperFactoryImpl.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +public class SftpClientWrapperFactoryImpl implements SftpClientWrapperFactory { + + @Override + public SftpClientWrapper getSftpClientWrapper(SftpClientConfig config) { + return new SftpClientWrapperImpl(config); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperImpl.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperImpl.java new file mode 100644 index 000000000..cad0ea6e5 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperImpl.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.time.Duration; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.apache.sshd.client.ClientBuilder; +import org.apache.sshd.client.SshClient; +import org.apache.sshd.client.auth.password.PasswordIdentityProvider; +import org.apache.sshd.client.keyverifier.KnownHostsServerKeyVerifier; +import org.apache.sshd.client.keyverifier.RejectAllServerKeyVerifier; +import org.apache.sshd.client.keyverifier.ServerKeyVerifier; +import org.apache.sshd.client.session.ClientSession; +import org.apache.sshd.common.keyprovider.KeyIdentityProvider; +import org.apache.sshd.sftp.client.SftpClient; +import org.apache.sshd.sftp.client.SftpClientFactory; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.EdcSftpException; +import org.jetbrains.annotations.NotNull; + +public class SftpClientWrapperImpl implements SftpClientWrapper { + @Getter private final SftpClientConfig config; + private final SftpClient sftpClient; + + public SftpClientWrapperImpl(SftpClientConfig config) { + this.config = config; + try { + this.sftpClient = getSftpClient(config); + } catch (IOException e) { + throw new EdcSftpException("Unable to create SftpClient.", e); + } + } + + public SftpClientWrapperImpl(SftpClientConfig config, SftpClient sftpClient) { + this.config = config; + this.sftpClient = sftpClient; + } + + @Override + public void uploadFile(@NonNull final InputStream inputStream) throws IOException { + try (final OutputStream outputStream = + sftpClient.write( + config.getSftpLocation().getPath(), + config.getBufferSize(), + config.getWriteOpenModes())) { + inputStream.transferTo(outputStream); + } + } + + @Override + public InputStream downloadFile() throws IOException { + final InputStream delegateInputStream; + try { + delegateInputStream = + sftpClient.read( + config.getSftpLocation().getPath(), + config.getBufferSize(), + config.getReadOpenModes()); + } catch (final IOException e) { + sftpClient.close(); + throw new EdcSftpException( + String.format("Unable to download file at %s", config.getSftpLocation().toString()), e); + } + + return new SftpInputStreamWrapper(sftpClient, delegateInputStream); + } + + static SftpClient getSftpClient(SftpClientConfig config) throws IOException { + final ClientSession session = getSshClientSession(config); + final SftpClientFactory factory = SftpClientFactory.instance(); + final SftpClient sftpClient = factory.createSftpClient(session); + return sftpClient.singleSessionInstance(); + } + + private static ClientSession getSshClientSession(SftpClientConfig config) throws IOException { + final SshClient sshClient = getSshClient(config); + sshClient.start(); + final ClientSession session = + sshClient + .connect( + config.getSftpUser().getName(), + config.getSftpLocation().getHost(), + config.getSftpLocation().getPort()) + .verify() + .getSession(); + session.auth().await(Duration.ofSeconds(config.getConnectionTimeoutSeconds())); + + return session; + } + + private static SshClient getSshClient(SftpClientConfig config) { + final SshClient sshClient = ClientBuilder.builder().build(); + + if (config.getSftpUser().getKeyPair() != null) { + sshClient.setKeyIdentityProvider( + KeyIdentityProvider.wrapKeyPairs(config.getSftpUser().getKeyPair())); + } else if (config.getSftpUser().getPassword() != null) { + sshClient.setPasswordIdentityProvider( + PasswordIdentityProvider.wrapPasswords(config.getSftpUser().getPassword())); + } else { + sshClient.setPasswordIdentityProvider(PasswordIdentityProvider.EMPTY_PASSWORDS_PROVIDER); + } + + if (config.isHostVerification()) { + final ServerKeyVerifier keyVerifier = + new KnownHostsServerKeyVerifier( + RejectAllServerKeyVerifier.INSTANCE, config.getKnownHostFile()); + sshClient.setServerKeyVerifier(keyVerifier); + } + + return sshClient; + } + + @RequiredArgsConstructor + private static class SftpInputStreamWrapper extends InputStream { + @NonNull private final SftpClient sftpClient; + @NonNull private final InputStream delegateInputStream; + + @Override + public int read() throws IOException { + return delegateInputStream.read(); + } + + @Override + public int read(byte @NotNull [] b, int off, int len) throws IOException { + return delegateInputStream.read(b, off, len); + } + + @Override + public void close() { + try { + delegateInputStream.close(); + } catch (IOException ignored) { + // Ignored. The exception should only be thrown of the stream is already closed. + } + + try { + sftpClient.close(); + } catch (IOException ignored) { + // Ignored. The exception should only be thrown of the client is already closed. + } + } + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSink.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSink.java new file mode 100644 index 000000000..e819229f0 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSink.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial Test + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.io.IOException; +import java.util.List; +import lombok.Builder; +import lombok.NonNull; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; +import org.eclipse.edc.connector.dataplane.util.sink.ParallelSink; +import org.eclipse.edc.spi.response.ResponseStatus; +import org.eclipse.edc.spi.response.StatusResult; + +@Builder +public class SftpDataSink extends ParallelSink { + @NonNull private final SftpClientWrapper sftpClientWrapper; + + @Override + protected StatusResult transferParts(List parts) { + for (DataSource.Part part : parts) { + try { + sftpClientWrapper.uploadFile(part.openStream()); + } catch (IOException e) { + return StatusResult.failure(ResponseStatus.FATAL_ERROR, e.getMessage()); + } + } + return StatusResult.success(); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactory.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactory.java new file mode 100644 index 000000000..4edcb9dec --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactory.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial Test + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSink; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSinkFactory; +import org.eclipse.edc.spi.result.Result; +import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.EdcSftpException; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.jetbrains.annotations.NotNull; + +@RequiredArgsConstructor +public class SftpDataSinkFactory implements DataSinkFactory { + @Override + public boolean canHandle(DataFlowRequest request) { + try { + SftpDataAddress.fromDataAddress(request.getDestinationDataAddress()); + return true; + } catch (EdcSftpException e) { + return false; + } + } + + @Override + public @NotNull Result validate(DataFlowRequest request) { + if (!canHandle(request)) { + return Result.failure(String.format("Invalid DataFlowRequest: %s", request.getId())); + } + + return VALID; + } + + @Override + public DataSink createSink(DataFlowRequest request) { + if (!canHandle(request)) { + return null; + } + + SftpDataAddress destination = + SftpDataAddress.fromDataAddress(request.getDestinationDataAddress()); + + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder() + .writeOpenModes(List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Append)) + .sftpUser(destination.getSftpUser()) + .sftpLocation(destination.getSftpLocation()) + .build(); + + SftpClientWrapper sftpClientWrapper = new SftpClientWrapperImpl(sftpClientConfig); + + return new SftpDataSink(sftpClientWrapper); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSource.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSource.java new file mode 100644 index 000000000..334538fea --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSource.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial Test + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.util.stream.Stream; +import lombok.Builder; +import lombok.NonNull; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; + +@Builder +public class SftpDataSource implements DataSource { + @NonNull private final SftpClientWrapper sftpClientWrapper; + + @Override + public Stream openPartStream() { + Part sftpPart = new SftpPart(sftpClientWrapper); + return Stream.of(sftpPart); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactory.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactory.java new file mode 100644 index 000000000..076afc72d --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactory.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial Test + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSourceFactory; +import org.eclipse.edc.spi.result.Result; +import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.EdcSftpException; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.jetbrains.annotations.NotNull; + +@RequiredArgsConstructor +public class SftpDataSourceFactory implements DataSourceFactory { + @Override + public boolean canHandle(DataFlowRequest request) { + try { + SftpDataAddress.fromDataAddress(request.getSourceDataAddress()); + return true; + } catch (EdcSftpException e) { + return false; + } + } + + @Override + public @NotNull Result validate(DataFlowRequest request) { + if (!canHandle(request)) { + return Result.failure(String.format("Invalid DataFlowRequest: %s", request.getId())); + } + + return VALID; + } + + @Override + public DataSource createSource(DataFlowRequest request) { + if (!canHandle(request)) { + return null; + } + + SftpDataAddress source = SftpDataAddress.fromDataAddress(request.getSourceDataAddress()); + + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder() + .sftpUser(source.getSftpUser()) + .sftpLocation(source.getSftpLocation()) + .build(); + + SftpClientWrapper sftpClientWrapper = new SftpClientWrapperImpl(sftpClientConfig); + return new SftpDataSource(sftpClientWrapper); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpPart.java b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpPart.java new file mode 100644 index 000000000..2b4e9e7e3 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpPart.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.io.InputStream; +import lombok.Builder; +import lombok.NonNull; +import lombok.SneakyThrows; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; + +@Builder +public class SftpPart implements DataSource.Part { + @NonNull private final SftpClientWrapper sftpClientWrapper; + + @Override + public String name() { + return ((SftpClientWrapperImpl) sftpClientWrapper).getConfig().getSftpLocation().getPath(); + } + + @Override + @SneakyThrows + public InputStream openStream() { + return sftpClientWrapper.downloadFile(); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/transferprocess-sftp-client/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension new file mode 100644 index 000000000..bfdbb7ac1 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension @@ -0,0 +1,13 @@ +# +# Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH +# +# 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: +# Mercedes-Benz Tech Innovation GmbH - Initial ServiceExtension file +# +org.eclipse.tractusx.edc.transferprocess.sftp.client.SftpClientExtension diff --git a/edc-extensions/transferprocess-sftp-client/src/main/resources/logback.xml b/edc-extensions/transferprocess-sftp-client/src/main/resources/logback.xml new file mode 100644 index 000000000..3347fcbae --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/main/resources/logback.xml @@ -0,0 +1,23 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] sdfsfs %-5level %logger{36} - %msg%n + + + + + + diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/AbstractSftpClientWrapperIT.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/AbstractSftpClientWrapperIT.java new file mode 100644 index 000000000..757319606 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/AbstractSftpClientWrapperIT.java @@ -0,0 +1,230 @@ +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.testcontainers.shaded.org.awaitility.Awaitility.await; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFilePermission; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.interfaces.RSAPublicKey; +import java.util.Base64; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import org.bouncycastle.crypto.params.RSAKeyParameters; +import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.ClassRule; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.shaded.org.apache.commons.io.IOUtils; +import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils; +import org.testcontainers.utility.DockerImageName; + +abstract class AbstractSftpClientWrapperIT { + static final String DOCKER_IMAGE_NAME = "atmoz/sftp:alpine-3.6"; + static final String sftpPathPrefix = "transfer"; + static final Map DOCKER_ENV = + Map.of("SFTP_USERS", String.format("user:password:::%s", sftpPathPrefix)); + static final Path dockerVolumeDirectory; + static final Path remotePasswordUploadDirectory; + static final Path remotePasswordDownloadDirectory; + static final Path remoteKeypairUploadDirectory; + static final Path remoteKeypairDownloadDirectory; + static final Path localUploadAndGeneratorDirectory; + static final Path keyDirectory; + static final Path publicKeyPath; + static final KeyPair keyPair; + @Container @ClassRule private static final GenericContainer sftpContainer; + + static { + keyPair = generateKeyPair(); + + try { + Set fullPermission = new HashSet(); + fullPermission.add(PosixFilePermission.OWNER_EXECUTE); + fullPermission.add(PosixFilePermission.OWNER_READ); + fullPermission.add(PosixFilePermission.OWNER_WRITE); + fullPermission.add(PosixFilePermission.GROUP_EXECUTE); + fullPermission.add(PosixFilePermission.GROUP_READ); + fullPermission.add(PosixFilePermission.GROUP_WRITE); + fullPermission.add(PosixFilePermission.OTHERS_EXECUTE); + fullPermission.add(PosixFilePermission.OTHERS_READ); + fullPermission.add(PosixFilePermission.OTHERS_WRITE); + + dockerVolumeDirectory = Files.createTempDirectory(SftpClientWrapperIT.class.getName()); + localUploadAndGeneratorDirectory = + Files.createTempDirectory(SftpClientWrapperIT.class.getName()); + remotePasswordUploadDirectory = + Files.createDirectory(dockerVolumeDirectory.resolve("passwordUpload")); + remotePasswordDownloadDirectory = + Files.createDirectory(dockerVolumeDirectory.resolve("passwordDownload")); + remoteKeypairUploadDirectory = + Files.createDirectory(dockerVolumeDirectory.resolve("keypairUpload")); + remoteKeypairDownloadDirectory = + Files.createDirectory(dockerVolumeDirectory.resolve("keypairDownload")); + keyDirectory = Files.createTempDirectory(SftpClientWrapperIT.class.getName()); + publicKeyPath = keyDirectory.resolve("public"); + + try (final OutputStreamWriter fileWriter = + new OutputStreamWriter(new FileOutputStream(publicKeyPath.toString()))) { + final RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + final RSAKeyParameters publicKeyParameters = + new RSAKeyParameters(false, publicKey.getModulus(), publicKey.getPublicExponent()); + byte[] encodedKey = OpenSSHPublicKeyUtil.encodePublicKey(publicKeyParameters); + String keyString = Base64.getEncoder().encodeToString(encodedKey); + String authKeysEntry = String.format("ssh-rsa %s", keyString); + fileWriter.write(authKeysEntry); + } + + Files.setPosixFilePermissions(dockerVolumeDirectory, fullPermission); + Files.setPosixFilePermissions(remotePasswordUploadDirectory, fullPermission); + Files.setPosixFilePermissions(remotePasswordDownloadDirectory, fullPermission); + Files.setPosixFilePermissions(remoteKeypairUploadDirectory, fullPermission); + Files.setPosixFilePermissions(remoteKeypairDownloadDirectory, fullPermission); + Files.setPosixFilePermissions(keyDirectory, fullPermission); + } catch (IOException e) { + throw new RuntimeException(); + } + + sftpContainer = + new GenericContainer<>(DockerImageName.parse(DOCKER_IMAGE_NAME)) + .withEnv(DOCKER_ENV) + .withExposedPorts(22) + .waitingFor(Wait.forListeningPort()) + .withFileSystemBind( + dockerVolumeDirectory.toAbsolutePath().toString(), + String.format("/home/user/%s", sftpPathPrefix)) + .withFileSystemBind(keyDirectory.toAbsolutePath().toString(), "/home/user/keys"); + sftpContainer.start(); + + await().atMost(10, SECONDS).until(sftpContainer::isRunning); + + try { + sftpContainer.execInContainer("mkdir", "-p", "/home/user/.ssh"); + sftpContainer.execInContainer("chmod", "700", "/home/user/.ssh"); + sftpContainer.execInContainer("chown", "user", "/home/user/.ssh/"); + sftpContainer.execInContainer( + "cp", "-f", "/home/user/keys/public", "/home/user/.ssh/authorized_keys"); + sftpContainer.execInContainer("chown", "user", "/home/user/.ssh/authorized_keys"); + sftpContainer.execInContainer("chmod", "600", "/home/user/.ssh/authorized_keys"); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(); + } + } + + @AfterAll + @SneakyThrows + static void tearDown() { + if (Files.exists(dockerVolumeDirectory)) { + Files.walk(dockerVolumeDirectory) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + if (Files.exists(localUploadAndGeneratorDirectory)) { + Files.walk(localUploadAndGeneratorDirectory) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + if (Files.exists(keyDirectory)) { + Files.walk(keyDirectory) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } + + protected SftpUser getPasswordUser() { + return SftpUser.builder().name("user").password("password").build(); + } + + protected SftpUser getKeyPairUser() { + return SftpUser.builder().name("user").keyPair(keyPair).build(); + } + + protected SftpLocation getSftpLocation(String path) { + return SftpLocation.builder() + .host("127.0.0.1") + .port(sftpContainer.getFirstMappedPort()) + .path(path) + .build(); + } + + protected SftpClientWrapper getSftpClient(SftpLocation location, SftpUser sftpUser) { + SftpClientConfig config = + SftpClientConfig.builder() + .sftpLocation(location) + .sftpUser(sftpUser) + .hostVerification(false) + .build(); + return new SftpClientWrapperImpl(config); + } + + @NoArgsConstructor + protected static class FilesProvider implements ArgumentsProvider { + @Override + public Stream provideArguments(ExtensionContext context) { + return Stream.of( + Arguments.of(get1KBFile()), Arguments.of(get1MBFile()), Arguments.of(get2MBFile())); + } + + private static final int BUFFER_SIZE = 4 * 1024 * 1024; + + public File get1KBFile() { + return generateFile(1 * 1024); + } + + public File get1MBFile() { + return generateFile(1 * 1024 * 1024); + } + + public File get2MBFile() { + return generateFile(2 * 1024 * 1024); + } + + @SneakyThrows + private File generateFile(final int byteSize) { + Path path = localUploadAndGeneratorDirectory.resolve(String.format("%s.bin", byteSize)); + if (!Files.exists(path)) { + Files.createFile(path); + try (final OutputStream outputStream = Files.newOutputStream(path)) { + int bufferSize; + int remaining = byteSize; + do { + bufferSize = Math.min(remaining, BUFFER_SIZE); + byte[] chunk = RandomUtils.nextBytes(bufferSize); + IOUtils.write(chunk, outputStream); + remaining = remaining - bufferSize; + } while (remaining > 0); + } + } + return path.toFile(); + } + } + + @SneakyThrows + private static KeyPair generateKeyPair() { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); + return keyPairGenerator.generateKeyPair(); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperIT.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperIT.java new file mode 100644 index 000000000..5aebc4573 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperIT.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial Test + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.client; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import lombok.Cleanup; +import lombok.SneakyThrows; +import org.eclipse.edc.junit.extensions.EdcExtension; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ArgumentsSource; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.shaded.org.apache.commons.io.IOUtils; + +@Testcontainers +@ExtendWith(EdcExtension.class) +class SftpClientWrapperIT extends AbstractSftpClientWrapperIT { + + @ParameterizedTest + @SneakyThrows + @ArgumentsSource(FilesProvider.class) + void uploadFileWithPassword(File file) { + final SftpUser sftpUser = getPasswordUser(); + final SftpLocation sftpLocation = + getSftpLocation( + String.format( + "%s/%s/%s", + sftpPathPrefix, + remotePasswordUploadDirectory.getFileName().toString(), + file.getName())); + + @Cleanup final InputStream fileStream = Files.newInputStream(file.toPath()); + + getSftpClient(sftpLocation, sftpUser).uploadFile(fileStream); + + final Path uploadedFilePath = remotePasswordUploadDirectory.resolve(file.getName()); + Assertions.assertTrue(Files.exists(uploadedFilePath)); + + @Cleanup final InputStream source = Files.newInputStream(file.toPath()); + @Cleanup final InputStream target = Files.newInputStream(uploadedFilePath); + + Assertions.assertTrue( + IOUtils.contentEquals(source, target), + String.format( + "File %s should have same content as file %s", file.toPath(), uploadedFilePath)); + } + + @ParameterizedTest + @SneakyThrows + @ArgumentsSource(FilesProvider.class) + void uploadFileWithKeyPair(File file) { + final SftpUser sftpUser = getKeyPairUser(); + final SftpLocation sftpLocation = + getSftpLocation( + String.format( + "%s/%s/%s", + sftpPathPrefix, + remoteKeypairUploadDirectory.getFileName().toString(), + file.getName())); + + @Cleanup final InputStream fileStream = Files.newInputStream(file.toPath()); + + getSftpClient(sftpLocation, sftpUser).uploadFile(fileStream); + + final Path uploadedFilePath = remoteKeypairUploadDirectory.resolve(file.getName()); + Assertions.assertTrue(Files.exists(uploadedFilePath)); + + @Cleanup final InputStream source = Files.newInputStream(file.toPath()); + @Cleanup final InputStream target = Files.newInputStream(uploadedFilePath); + + Assertions.assertTrue( + IOUtils.contentEquals(source, target), + String.format( + "File %s should have same content as file %s", file.toPath(), uploadedFilePath)); + } + + @ParameterizedTest + @SneakyThrows + @ArgumentsSource(FilesProvider.class) + void downloadFileWithPassword(File file) { + final SftpUser sftpUser = getPasswordUser(); + final SftpLocation sftpLocation = + getSftpLocation( + String.format( + "%s/%s/%s", + sftpPathPrefix, + remotePasswordDownloadDirectory.getFileName().toString(), + file.getName())); + + @Cleanup final InputStream fileToUpload = Files.newInputStream(file.toPath()); + Files.copy( + fileToUpload, + remotePasswordDownloadDirectory.resolve(file.getName()), + StandardCopyOption.REPLACE_EXISTING); + + @Cleanup final InputStream source = Files.newInputStream(file.toPath()); + @Cleanup final InputStream target = getSftpClient(sftpLocation, sftpUser).downloadFile(); + + Assertions.assertTrue( + IOUtils.contentEquals(source, target), + String.format( + "File %s should have same content as file %s", file.toPath(), sftpLocation.getPath())); + } + + @ParameterizedTest + @SneakyThrows + @ArgumentsSource(FilesProvider.class) + void downloadFileWithKeyPair(File file) { + final SftpUser sftpUser = getKeyPairUser(); + final SftpLocation sftpLocation = + getSftpLocation( + String.format( + "%s/%s/%s", + sftpPathPrefix, + remoteKeypairDownloadDirectory.getFileName().toString(), + file.getName())); + + @Cleanup final InputStream fileToUpload = Files.newInputStream(file.toPath()); + Files.copy( + fileToUpload, + remoteKeypairDownloadDirectory.resolve(file.getName()), + StandardCopyOption.REPLACE_EXISTING); + + @Cleanup final InputStream source = Files.newInputStream(file.toPath()); + @Cleanup final InputStream target = getSftpClient(sftpLocation, sftpUser).downloadFile(); + + Assertions.assertTrue( + IOUtils.contentEquals(source, target), + String.format( + "File %s should have same content as file %s", file.toPath(), sftpLocation.getPath())); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperTest.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperTest.java new file mode 100644 index 000000000..7fcb0196c --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpClientWrapperTest.java @@ -0,0 +1,85 @@ +/* + * 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.transferprocess.sftp.client; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.List; +import lombok.SneakyThrows; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class SftpClientWrapperTest { + @Test + @SneakyThrows + void uploadFile() { + SftpUser userMock = Mockito.mock(SftpUser.class); + SftpLocation locationMock = Mockito.mock(SftpLocation.class); + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder().sftpUser(userMock).sftpLocation(locationMock).build(); + SftpClient sftpClientMock = Mockito.mock(SftpClient.class); + SftpClientWrapperImpl sftpClientWrapper = + Mockito.spy(new SftpClientWrapperImpl(sftpClientConfig, sftpClientMock)); + byte[] content = new byte[] {0, 1, 2}; + InputStream inputStream = new ByteArrayInputStream(content); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + Mockito.when(locationMock.getPath()).thenReturn("path"); + Mockito.when( + sftpClientMock.write(Mockito.anyString(), Mockito.anyInt(), Mockito.anyCollection())) + .thenReturn(outputStream); + sftpClientWrapper.uploadFile(inputStream); + + Assertions.assertArrayEquals(content, outputStream.toByteArray()); + Mockito.verify(sftpClientMock, Mockito.times(1)) + .write("path", 4096, List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Write)); + } + + @Test + @SneakyThrows + void downloadFile() { + SftpUser userMock = Mockito.mock(SftpUser.class); + SftpLocation locationMock = Mockito.mock(SftpLocation.class); + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder().sftpUser(userMock).sftpLocation(locationMock).build(); + SftpClient sftpClientMock = Mockito.mock(SftpClient.class); + SftpClientWrapperImpl sftpClientWrapper = + Mockito.spy(new SftpClientWrapperImpl(sftpClientConfig, sftpClientMock)); + byte[] content = new byte[] {0, 1, 2}; + InputStream inputStream = new ByteArrayInputStream(content); + + Mockito.when(locationMock.getPath()).thenReturn("path"); + Mockito.when( + sftpClientMock.read(Mockito.anyString(), Mockito.anyInt(), Mockito.anyCollection())) + .thenReturn(inputStream); + + try (InputStream resultStream = sftpClientWrapper.downloadFile()) { + Assertions.assertArrayEquals(content, resultStream.readAllBytes()); + Mockito.verify(sftpClientMock, Mockito.times(1)) + .read("path", 4096, List.of(SftpClient.OpenMode.Read)); + } + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactoryTest.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactoryTest.java new file mode 100644 index 000000000..835c764cc --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkFactoryTest.java @@ -0,0 +1,124 @@ +/* + * 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.transferprocess.sftp.client; + +import java.util.List; +import java.util.Map; +import lombok.SneakyThrows; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +class SftpDataSinkFactoryTest { + + @Test + void validate__valid() { + SftpDataSinkFactory dataSinkFactory = new SftpDataSinkFactory(); + SftpUser sftpUser = SftpUser.builder().name("name").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + + SftpDataAddress sftpDataAddress = + SftpDataAddress.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getDestinationDataAddress()).thenReturn(sftpDataAddress); + + Assertions.assertTrue(dataSinkFactory.validate(request).succeeded()); + } + + @Test + void validate__invalidDataAddressType() { + SftpDataSinkFactory dataSinkFactory = new SftpDataSinkFactory(); + DataAddress dataAddress = DataAddress.Builder.newInstance().type("wrong").build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getDestinationDataAddress()).thenReturn(dataAddress); + + Assertions.assertTrue(dataSinkFactory.validate(request).failed()); + } + + @Test + void validate__invalidDataAddressParameters() { + SftpDataSinkFactory dataSinkFactory = new SftpDataSinkFactory(); + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "notANumber", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getDestinationDataAddress()).thenReturn(dataAddress); + + Assertions.assertTrue(dataSinkFactory.validate(request).failed()); + } + + @Test + @SneakyThrows + void createSink__successful() { + SftpDataSinkFactory dataSinkFactory = new SftpDataSinkFactory(); + SftpUser sftpUser = SftpUser.builder().name("name").build(); + SftpLocation sftpLocation = + SftpLocation.builder().host("127.0.0.1").port(22).path("path").build(); + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder() + .writeOpenModes(List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Append)) + .sftpUser(sftpUser) + .sftpLocation(sftpLocation) + .build(); + + SftpDataAddress sftpDataAddress = + SftpDataAddress.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getDestinationDataAddress()).thenReturn(sftpDataAddress); + + try (MockedStatic staticWrapper = + Mockito.mockStatic(SftpClientWrapperImpl.class)) { + staticWrapper + .when(() -> SftpClientWrapperImpl.getSftpClient(sftpClientConfig)) + .thenReturn(Mockito.mock(SftpClient.class)); + Assertions.assertNotNull(dataSinkFactory.createSink(request)); + + staticWrapper.verify( + () -> SftpClientWrapperImpl.getSftpClient(Mockito.any()), Mockito.times(1)); + } + } + + @Test + @SneakyThrows + void createSink__invalidDataAddressType() { + SftpDataSinkFactory dataSinkFactory = new SftpDataSinkFactory(); + DataAddress dataAddress = DataAddress.Builder.newInstance().type("wrong").build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getDestinationDataAddress()).thenReturn(dataAddress); + + Assertions.assertNull(dataSinkFactory.createSink(request)); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkTest.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkTest.java new file mode 100644 index 000000000..7af9eea1f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSinkTest.java @@ -0,0 +1,86 @@ +/* + * 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.transferprocess.sftp.client; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class SftpDataSinkTest { + @Test + @SneakyThrows + void transferParts() { + final SftpUser userMock = Mockito.mock(SftpUser.class); + final SftpLocation locationMock = Mockito.mock(SftpLocation.class); + final SftpClientConfig sftpClientConfig = + SftpClientConfig.builder() + .sftpUser(userMock) + .sftpLocation(locationMock) + .writeOpenModes(List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Append)) + .build(); + final SftpClient sftpClientMock = Mockito.mock(SftpClient.class); + final SftpClientWrapperImpl sftpClientWrapper = + Mockito.spy(new SftpClientWrapperImpl(sftpClientConfig, sftpClientMock)); + final SftpDataSink sftpDataSink = Mockito.spy(new SftpDataSink(sftpClientWrapper)); + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + Mockito.when(sftpClientMock.write(Mockito.any(), Mockito.anyInt(), Mockito.anyCollection())) + .thenReturn(outputStream); + Mockito.when(locationMock.getPath()).thenReturn("path"); + + List parts = + Arrays.asList(new SftpTestPart(new byte[] {0, 1}), new SftpTestPart(new byte[] {2, 3})); + byte[] expected = {0, 1, 2, 3}; + + sftpDataSink.transferParts(parts); + + Assertions.assertArrayEquals(expected, outputStream.toByteArray()); + Mockito.verify(sftpClientMock, Mockito.times(2)) + .write("path", 4096, List.of(SftpClient.OpenMode.Create, SftpClient.OpenMode.Append)); + } + + @AllArgsConstructor + private static class SftpTestPart implements DataSource.Part { + + final byte[] content; + + @Override + public String name() { + return null; + } + + @Override + public InputStream openStream() { + return new ByteArrayInputStream(content); + } + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactoryTest.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactoryTest.java new file mode 100644 index 000000000..5c8a63f4f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceFactoryTest.java @@ -0,0 +1,118 @@ +/* + * 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.transferprocess.sftp.client; + +import java.util.Map; +import lombok.SneakyThrows; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +class SftpDataSourceFactoryTest { + + @Test + void validate__valid() { + SftpDataSourceFactory dataSourceFactory = new SftpDataSourceFactory(); + SftpUser sftpUser = SftpUser.builder().name("name").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + + SftpDataAddress sftpDataAddress = + SftpDataAddress.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getSourceDataAddress()).thenReturn(sftpDataAddress); + + Assertions.assertTrue(dataSourceFactory.validate(request).succeeded()); + } + + @Test + void validate__invalidDataAddressType() { + SftpDataSourceFactory dataSourceFactory = new SftpDataSourceFactory(); + DataAddress dataAddress = DataAddress.Builder.newInstance().type("wrong").build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getSourceDataAddress()).thenReturn(dataAddress); + + Assertions.assertTrue(dataSourceFactory.validate(request).failed()); + } + + @Test + void validate__invalidDataAddressParameters() { + SftpDataSourceFactory dataSourceFactory = new SftpDataSourceFactory(); + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "notANumber", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + DataAddress dataAddress = DataAddress.Builder.newInstance().properties(properties).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getSourceDataAddress()).thenReturn(dataAddress); + + Assertions.assertTrue(dataSourceFactory.validate(request).failed()); + } + + @Test + @SneakyThrows + void createSink__successful() { + SftpDataSourceFactory dataSourceFactory = new SftpDataSourceFactory(); + SftpUser sftpUser = SftpUser.builder().name("name").build(); + SftpLocation sftpLocation = + SftpLocation.builder().host("127.0.0.1").port(22).path("path").build(); + SftpClientConfig sftpClientConfig = + SftpClientConfig.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + + SftpDataAddress sftpDataAddress = + SftpDataAddress.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getSourceDataAddress()).thenReturn(sftpDataAddress); + + try (MockedStatic staticWrapper = + Mockito.mockStatic(SftpClientWrapperImpl.class)) { + staticWrapper + .when(() -> SftpClientWrapperImpl.getSftpClient(sftpClientConfig)) + .thenReturn(Mockito.mock(SftpClient.class)); + Assertions.assertNotNull(dataSourceFactory.createSource(request)); + + staticWrapper.verify( + () -> SftpClientWrapperImpl.getSftpClient(Mockito.any()), Mockito.times(1)); + } + } + + @Test + @SneakyThrows + void createSink__invalidDataAddressType() { + SftpDataSourceFactory dataSourceFactory = new SftpDataSourceFactory(); + DataAddress dataAddress = DataAddress.Builder.newInstance().type("wrong").build(); + DataFlowRequest request = Mockito.mock(DataFlowRequest.class); + Mockito.when(request.getSourceDataAddress()).thenReturn(dataAddress); + + Assertions.assertNull(dataSourceFactory.createSource(request)); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceTest.java b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceTest.java new file mode 100644 index 000000000..7288c6442 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/client/SftpDataSourceTest.java @@ -0,0 +1,63 @@ +/* + * 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.transferprocess.sftp.client; + +import java.io.ByteArrayInputStream; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.SneakyThrows; +import org.apache.sshd.sftp.client.SftpClient; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class SftpDataSourceTest { + @Test + @SneakyThrows + void openPartStream() { + final SftpUser userMock = Mockito.mock(SftpUser.class); + final SftpLocation locationMock = Mockito.mock(SftpLocation.class); + final SftpClientConfig sftpClientConfig = + SftpClientConfig.builder().sftpUser(userMock).sftpLocation(locationMock).build(); + final SftpClient sftpClientMock = Mockito.mock(SftpClient.class); + final SftpClientWrapperImpl sftpClientWrapper = + Mockito.spy(new SftpClientWrapperImpl(sftpClientConfig, sftpClientMock)); + SftpDataSource sftpDataSource = Mockito.spy(new SftpDataSource(sftpClientWrapper)); + byte[] expected = new byte[] {0, 1, 2, 3}; + ByteArrayInputStream outputStream = new ByteArrayInputStream(expected); + + Mockito.when(locationMock.getPath()).thenReturn("path"); + Mockito.when( + sftpClientMock.read(Mockito.anyString(), Mockito.anyInt(), Mockito.anyCollection())) + .thenReturn(outputStream); + + Stream partStream = sftpDataSource.openPartStream(); + DataSource.Part part = partStream.collect(Collectors.toList()).get(0); + + Assertions.assertArrayEquals(expected, part.openStream().readAllBytes()); + Mockito.verify(sftpClientMock, Mockito.times(1)) + .read("path", 4096, List.of(SftpClient.OpenMode.Read)); + } +} diff --git a/edc-extensions/transferprocess-sftp-client/src/test/resources/logback.xml b/edc-extensions/transferprocess-sftp-client/src/test/resources/logback.xml new file mode 100644 index 000000000..3347fcbae --- /dev/null +++ b/edc-extensions/transferprocess-sftp-client/src/test/resources/logback.xml @@ -0,0 +1,23 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] sdfsfs %-5level %logger{36} - %msg%n + + + + + + diff --git a/edc-extensions/transferprocess-sftp-common/pom.xml b/edc-extensions/transferprocess-sftp-common/pom.xml new file mode 100644 index 000000000..d365e1bca --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/pom.xml @@ -0,0 +1,173 @@ + + + + + org.eclipse.tractusx.edc.extensions + edc-extensions + 0.3.0 + + 4.0.0 + + transferprocess-sftp-common + jar + + + ${project.basedir}/src/main/java + ${originalSourceDirectory} + ${project.build.directory}/delombok + ${project.groupId}_${project.artifactId} + + + + ${sourceDirectory} + + + + src/main/resources + + **/* + + + + ../.. + META-INF + + NOTICE.md + LICENSE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + org.projectlombok + lombok + ${org.projectlombok.lombok.version} + + + + + + + org.projectlombok + lombok-maven-plugin + ${org.projectlombok.lombok.maven.plugin.version} + + + generate-sources + + delombok + + + + + ${originalSourceDirectory} + ${delombokSourceDirectory} + false + UTF-8 + + skip + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + + + + org.eclipse.edc + core-spi + + + + + org.projectlombok + lombok + + + + + org.junit.jupiter + junit-jupiter + test + + + org.mockito + mockito-core + test + + + org.mockito + mockito-inline + test + + + org.testcontainers + junit-jupiter + test + + + ch.qos.logback + logback-core + test + + + org.slf4j + slf4j-api + test + + + org.slf4j + jul-to-slf4j + test + + + org.hamcrest + hamcrest + test + + + + + + delombok + + ${delombokSourceDirectory} + + + + \ No newline at end of file diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/EdcSftpException.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/EdcSftpException.java new file mode 100644 index 000000000..aa6151eec --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/EdcSftpException.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import org.eclipse.edc.spi.EdcException; + +public class EdcSftpException extends EdcException { + public EdcSftpException(String message) { + super(message); + } + + public EdcSftpException(String message, Throwable cause) { + super(message, cause); + } + + public EdcSftpException(Throwable cause) { + super(cause); + } + + public EdcSftpException( + String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddress.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddress.java new file mode 100644 index 000000000..0a9b8ef03 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddress.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; +import org.eclipse.edc.spi.types.domain.DataAddress; + +@AllArgsConstructor +@Builder +@Getter +public class SftpDataAddress extends DataAddress { + private static final String LOCATION_HOST = "locationHost"; + private static final String LOCATION_PORT = "locationPort"; + private static final String LOCATION_PATH = "locationPath"; + private static final String USER_NAME = "userName"; + private static final String USER_PASSWORD = "userPassword"; + private static final String USER_PRIVATE_KEY = "userPrivateKey"; + + @Getter private static final String CONNECTION_TYPE = "sftp"; + @NonNull private final SftpUser sftpUser; + @NonNull private final SftpLocation sftpLocation; + + public static SftpDataAddress fromDataAddress(DataAddress dataAddress) throws EdcSftpException { + if (dataAddress instanceof SftpDataAddress) { + return (SftpDataAddress) dataAddress; + } + + if (!dataAddress.getType().equalsIgnoreCase("sftp")) { + throw new EdcSftpException( + String.format( + "Invalid DataAddress type: %s. Expected %s.", + dataAddress.getType(), CONNECTION_TYPE)); + } + + try { + SftpUser sftpUser = + SftpUser.builder() + .name(dataAddress.getProperty(USER_NAME)) + .password(dataAddress.getProperty(USER_PASSWORD)) + .keyPair( + SftpUserKeyPairGenerator.getKeyPairFromPrivateKey( + dataAddress.getProperty(USER_PRIVATE_KEY), + dataAddress.getProperty(USER_NAME))) + .build(); + + SftpLocation sftpLocation = + SftpLocation.builder() + .host(dataAddress.getProperty(LOCATION_HOST)) + .port(Integer.valueOf(dataAddress.getProperty(LOCATION_PORT, "22"))) + .path(dataAddress.getProperty(LOCATION_PATH)) + .build(); + + return SftpDataAddress.builder().sftpUser(sftpUser).sftpLocation(sftpLocation).build(); + } catch (NullPointerException e) { + throw new EdcSftpException(e.getMessage(), e); + } catch (NumberFormatException e) { + throw new EdcSftpException( + String.format( + "Port for SftpLocation %s/%s not a number", + dataAddress.getProperty(LOCATION_HOST), dataAddress.getProperty(LOCATION_PATH)), + e); + } + } +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocation.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocation.java new file mode 100644 index 000000000..b9af1aecb --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocation.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; + +@Builder +@Getter +@EqualsAndHashCode +public class SftpLocation { + @NonNull private final String host; + @NonNull private final Integer port; + @NonNull private final String path; + + @Override + public String toString() { + return String.format("%s:%d/%s", host, port, path); + } +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocationFactory.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocationFactory.java new file mode 100644 index 000000000..8c229d39f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpLocationFactory.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +public interface SftpLocationFactory { + SftpLocation createSftpLocation(String sftpHost, Integer sftpPort, String sftpPath); +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpProvider.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpProvider.java new file mode 100644 index 000000000..4ddd29396 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpProvider.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +public interface SftpProvider { + void createUser(SftpUser user); + + void deleteUser(SftpUser user); + + void createLocation(SftpLocation location); + + void deleteLocation(SftpLocation location); +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUser.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUser.java new file mode 100644 index 000000000..b66dfc3e0 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUser.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import java.security.KeyPair; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; +import lombok.ToString; + +@Builder +@Getter +@ToString(of = "name") +@EqualsAndHashCode +public class SftpUser { + @NonNull private final String name; + private final String password; + private final KeyPair keyPair; +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserFactory.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserFactory.java new file mode 100644 index 000000000..ea04a125e --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserFactory.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +public interface SftpUserFactory { + SftpUser createSftpUser(String sftpUserName, String sftpUserPassword, byte[] sftpUserKeypair); +} diff --git a/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserKeyPairGenerator.java b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserKeyPairGenerator.java new file mode 100644 index 000000000..55d2984ce --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpUserKeyPairGenerator.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.interfaces.RSAPrivateCrtKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.RSAPublicKeySpec; +import java.util.Base64; +import lombok.AllArgsConstructor; +import lombok.NonNull; + +@AllArgsConstructor +public class SftpUserKeyPairGenerator { + public static KeyPair getKeyPairFromPrivateKey( + byte[] privateKeyBytes, @NonNull String sftpUserName) { + if (privateKeyBytes == null) { + return null; + } + + try { + final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + final PrivateKey privateKey = + keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); + + final RSAPrivateCrtKey privateKeySpec = (RSAPrivateCrtKey) privateKey; + + final PublicKey publicKey = + keyFactory.generatePublic( + new RSAPublicKeySpec( + privateKeySpec.getModulus(), privateKeySpec.getPublicExponent())); + return new KeyPair(publicKey, privateKey); + + } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { + throw new EdcSftpException( + String.format("Unable to parse provided keypair for Sftp user %s", sftpUserName), e); + } + } + + public static KeyPair getKeyPairFromPrivateKey(String privateKey, @NonNull String sftpUserName) { + if (privateKey == null) { + return null; + } + + byte[] publicBytes; + try { + publicBytes = Base64.getDecoder().decode(privateKey); + } catch (IllegalArgumentException e) { + throw new EdcSftpException( + String.format("Cannot decode base64 private key for user %s", sftpUserName), e); + } + + return getKeyPairFromPrivateKey(publicBytes, sftpUserName); + } +} diff --git a/edc-extensions/transferprocess-sftp-common/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddressTest.java b/edc-extensions/transferprocess-sftp-common/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddressTest.java new file mode 100644 index 000000000..d29cdcd0e --- /dev/null +++ b/edc-extensions/transferprocess-sftp-common/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/common/SftpDataAddressTest.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.common; + +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.util.Base64; +import java.util.Map; +import lombok.SneakyThrows; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SftpDataAddressTest { + + @Test + void fromDataAddress__password() { + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + final SftpDataAddress sftpDataAddress = SftpDataAddress.fromDataAddress(dataAddress); + + Assertions.assertEquals("localhost", sftpDataAddress.getSftpLocation().getHost()); + Assertions.assertEquals(22, sftpDataAddress.getSftpLocation().getPort()); + Assertions.assertEquals("path", sftpDataAddress.getSftpLocation().getPath()); + Assertions.assertEquals("name", sftpDataAddress.getSftpUser().getName()); + Assertions.assertEquals("password", sftpDataAddress.getSftpUser().getPassword()); + Assertions.assertNull(sftpDataAddress.getSftpUser().getKeyPair()); + } + + @Test + @SneakyThrows + void fromDataAddress__keyPair() { + final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); + final KeyPair keyPair = keyPairGenerator.generateKeyPair(); + final byte[] privateKeyBytes = keyPair.getPrivate().getEncoded(); + + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPrivateKey", Base64.getEncoder().encodeToString(privateKeyBytes)); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + final SftpDataAddress sftpDataAddress = SftpDataAddress.fromDataAddress(dataAddress); + + Assertions.assertEquals("localhost", sftpDataAddress.getSftpLocation().getHost()); + Assertions.assertEquals(22, sftpDataAddress.getSftpLocation().getPort()); + Assertions.assertEquals("path", sftpDataAddress.getSftpLocation().getPath()); + Assertions.assertEquals("name", sftpDataAddress.getSftpUser().getName()); + Assertions.assertArrayEquals( + privateKeyBytes, sftpDataAddress.getSftpUser().getKeyPair().getPrivate().getEncoded()); + Assertions.assertNull(sftpDataAddress.getSftpUser().getPassword()); + } + + @Test + @SneakyThrows + void fromDataAddress__noAuth() { + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + final SftpDataAddress sftpDataAddress = SftpDataAddress.fromDataAddress(dataAddress); + + Assertions.assertEquals("localhost", sftpDataAddress.getSftpLocation().getHost()); + Assertions.assertEquals(22, sftpDataAddress.getSftpLocation().getPort()); + Assertions.assertEquals("path", sftpDataAddress.getSftpLocation().getPath()); + Assertions.assertEquals("name", sftpDataAddress.getSftpUser().getName()); + Assertions.assertNull(sftpDataAddress.getSftpUser().getPassword()); + } + + @Test + @SneakyThrows + void fromDataAddress__invalidKeyPairBrokenBase64() { + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPrivateKey", "clearlyNotAPrivateKey"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + EdcSftpException edcSftpException = + Assertions.assertThrows( + EdcSftpException.class, () -> SftpDataAddress.fromDataAddress(dataAddress)); + Assertions.assertEquals( + "Cannot decode base64 private key for user name", edcSftpException.getMessage()); + } + + @Test + @SneakyThrows + void fromDataAddress__invalidKeyPairButCorrectBase64() { + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPrivateKey", "TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + EdcSftpException edcSftpException = + Assertions.assertThrows( + EdcSftpException.class, () -> SftpDataAddress.fromDataAddress(dataAddress)); + Assertions.assertEquals( + "Unable to parse provided keypair for Sftp user name", edcSftpException.getMessage()); + } + + @Test + void fromDataAddress__portNaN() { + final Map properties = + Map.of( + "type", "sftp", + "locationHost", "localhost", + "locationPort", "notANumber", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + EdcSftpException edcSftpException = + Assertions.assertThrows( + EdcSftpException.class, () -> SftpDataAddress.fromDataAddress(dataAddress)); + Assertions.assertEquals( + "Port for SftpLocation localhost/path not a number", edcSftpException.getMessage()); + } + + @Test + void fromDataAddress__missingParameter() { + final Map properties = + Map.of( + "type", "sftp", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + EdcSftpException edcSftpException = + Assertions.assertThrows( + EdcSftpException.class, () -> SftpDataAddress.fromDataAddress(dataAddress)); + Assertions.assertEquals("host is marked non-null but is null", edcSftpException.getMessage()); + } + + @Test + void fromDataAddress__notSftp() { + final Map properties = + Map.of( + "type", "somethingOtherThanSftp", + "locationHost", "localhost", + "locationPort", "22", + "locationPath", "path", + "userName", "name", + "userPassword", "password"); + + final DataAddress dataAddress = + DataAddress.Builder.newInstance().properties(properties).build(); + + EdcSftpException edcSftpException = + Assertions.assertThrows( + EdcSftpException.class, () -> SftpDataAddress.fromDataAddress(dataAddress)); + Assertions.assertEquals( + "Invalid DataAddress type: somethingOtherThanSftp. Expected sftp.", + edcSftpException.getMessage()); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/pom.xml b/edc-extensions/transferprocess-sftp-provisioner/pom.xml new file mode 100644 index 000000000..10640f7d3 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/pom.xml @@ -0,0 +1,204 @@ + + + + + org.eclipse.tractusx.edc.extensions + edc-extensions + 0.3.0 + + 4.0.0 + + transferprocess-sftp-provisioner + jar + + + ${project.basedir}/src/main/java + ${originalSourceDirectory} + ${project.build.directory}/delombok + ${project.groupId}_${project.artifactId} + + + + ${sourceDirectory} + + + + src/main/resources + + **/* + + + + ../.. + META-INF + + NOTICE.md + LICENSE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + org.projectlombok + lombok + ${org.projectlombok.lombok.version} + + + + + + + org.projectlombok + lombok-maven-plugin + ${org.projectlombok.lombok.maven.plugin.version} + + + generate-sources + + delombok + + + + + ${originalSourceDirectory} + ${delombokSourceDirectory} + false + UTF-8 + + skip + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + + + + + org.eclipse.edc + core-spi + + + org.eclipse.edc + policy-engine + + + org.eclipse.edc + transfer-spi + + + org.eclipse.edc + junit + test + + + org.eclipse.edc + junit + test-fixtures + test + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-common + 0.3.0 + + + + + org.projectlombok + lombok + + + org.bouncycastle + bcpkix-jdk15on + + + + + + org.junit.jupiter + junit-jupiter + test + + + org.mockito + mockito-core + test + + + org.mockito + mockito-inline + test + + + org.testcontainers + junit-jupiter + test + + + ch.qos.logback + logback-core + test + + + org.slf4j + slf4j-api + test + + + org.slf4j + jul-to-slf4j + test + + + org.hamcrest + hamcrest + test + + + + + + + delombok + + ${delombokSourceDirectory} + + + + \ No newline at end of file diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvider.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvider.java new file mode 100644 index 000000000..d12015d7d --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpProvider; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; + +public class NoOpSftpProvider implements SftpProvider { + + /** + * This provisioner does not create cloud resources. The assumption is that users and locations + * already exist cloud-side. Thus, this method has no functionality. + * + * @param user The user whose credentials should be deployed. + */ + @Override + public void createUser(SftpUser user) { + // do nothing + } + + /** + * This provisioner does not create cloud resources. The assumption is that users and locations + * already exist cloud-side. Thus, this method has no functionality. + * + * @param user The user whose credentials should be deleted. + */ + @Override + public void deleteUser(SftpUser user) { + // do nothing + } + + /** + * This provisioner does not create cloud resources. The assumption is that users and locations + * already exist cloud-side. Thus, this method has no functionality. + * + * @param location The location of the cloud resource that should be made available. + */ + @Override + public void createLocation(SftpLocation location) { + // do nothing + } + + /** + * This provisioner does not create cloud resources. The assumption is that users and locations + * already exist cloud-side. Thus, this method has no functionality. + * + * @param location The location of the cloud resource that should be made unavailable. + */ + @Override + public void deleteLocation(SftpLocation location) { + // do nothing + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisioner.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisioner.java new file mode 100644 index 000000000..978f4bc94 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisioner.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import java.util.concurrent.CompletableFuture; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.transfer.spi.provision.Provisioner; +import org.eclipse.edc.connector.transfer.spi.types.DeprovisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionResponse; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.engine.spi.PolicyEngine; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.response.ResponseStatus; +import org.eclipse.edc.spi.response.StatusResult; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.EdcSftpException; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; + +@RequiredArgsConstructor +public class NoOpSftpProvisioner + implements Provisioner { + static final String DATA_ADDRESS_TYPE = "sftp"; + static final String PROVIDER_TYPE = "NoOp"; + + @NonNull private final String policyScope; + @NonNull private final PolicyEngine policyEngine; + @NonNull private final NoOpSftpProvider sftpProvider; + + @Override + public boolean canProvision(@NonNull ResourceDefinition resourceDefinition) { + if (!(resourceDefinition instanceof SftpProviderResourceDefinition)) { + return false; + } + if (!(((SftpProviderResourceDefinition) resourceDefinition) + .getProviderType() + .equals(PROVIDER_TYPE))) { + return false; + } + try { + SftpDataAddress.fromDataAddress( + ((SftpProviderResourceDefinition) resourceDefinition).getSftpDataAddress()); + } catch (EdcSftpException e) { + return false; + } + return true; + } + + @Override + public boolean canDeprovision(@NonNull ProvisionedResource provisionedResource) { + if (!(provisionedResource instanceof SftpProvisionedContentResource)) { + return false; + } + + if (!(((SftpProvisionedContentResource) provisionedResource) + .getProviderType() + .equals(PROVIDER_TYPE))) { + return false; + } + + try { + SftpDataAddress.fromDataAddress( + ((SftpProvisionedContentResource) provisionedResource).getSftpDataAddress()); + } catch (EdcSftpException e) { + return false; + } + return true; + } + + @Override + public CompletableFuture> provision( + SftpProviderResourceDefinition sftpProviderResourceDefinition, Policy policy) { + + return CompletableFuture.supplyAsync( + () -> { + if (!this.canProvision(sftpProviderResourceDefinition)) { + return StatusResult.failure(ResponseStatus.FATAL_ERROR); + } + // As of the time of writing, policies don't actually do anything in this context. + // They are included here in case EDC wants to use them eventually. + Policy scopedPolicy; + scopedPolicy = policyEngine.filter(policy, policyScope); + sftpProvider.createLocation( + sftpProviderResourceDefinition.getSftpDataAddress().getSftpLocation()); + sftpProvider.createUser( + sftpProviderResourceDefinition.getSftpDataAddress().getSftpUser()); + + SftpProvisionedContentResource sftpProvisionedContentResource = + SftpProvisionedContentResource.builder() + .sftpDataAddress(sftpProviderResourceDefinition.getSftpDataAddress()) + .providerType(PROVIDER_TYPE) + .scopedPolicy(scopedPolicy) + .provisionedResourceId( + generateResourceId( + sftpProviderResourceDefinition.getSftpDataAddress().getSftpUser(), + sftpProviderResourceDefinition.getSftpDataAddress().getSftpLocation())) + .build(); + + return StatusResult.success( + ProvisionResponse.Builder.newInstance() + .resource(sftpProvisionedContentResource) + .build()); + }); + } + + @Override + public CompletableFuture> deprovision( + SftpProvisionedContentResource sftpProvisionedContentResource, Policy policy) { + return CompletableFuture.supplyAsync( + () -> { + if (!this.canDeprovision(sftpProvisionedContentResource)) { + return StatusResult.failure(ResponseStatus.FATAL_ERROR); + } + // As of the time of writing, policies don't actually do anything in this context. + // They are included here in case EDC wants to use them eventually. + sftpProvider.deleteLocation( + sftpProvisionedContentResource.getSftpDataAddress().getSftpLocation()); + sftpProvider.deleteUser( + sftpProvisionedContentResource.getSftpDataAddress().getSftpUser()); + + DeprovisionedResource deprovisionedResource = + DeprovisionedResource.Builder.newInstance() + .provisionedResourceId(sftpProvisionedContentResource.getProvisionedResourceId()) + .inProcess(true) + .build(); + + return StatusResult.success(deprovisionedResource); + }); + } + + private String generateResourceId(SftpUser sftpUser, SftpLocation sftpLocation) { + return String.format( + "%s@%s:%d/%s", + sftpUser.getName(), sftpLocation.getHost(), sftpLocation.getPort(), sftpLocation.getPath()); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImpl.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImpl.java new file mode 100644 index 000000000..413c98335 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImpl.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import lombok.RequiredArgsConstructor; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocationFactory; + +@RequiredArgsConstructor +public class SftpLocationFactoryImpl implements SftpLocationFactory { + @Override + public SftpLocation createSftpLocation(String sftpHost, Integer sftpPort, String sftpPath) { + return SftpLocation.builder().host(sftpHost).port(sftpPort).path(sftpPath).build(); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinition.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinition.java new file mode 100644 index 000000000..a15c97cca --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinition.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; + +@Getter +@RequiredArgsConstructor +public class SftpProviderResourceDefinition extends ResourceDefinition { + @NonNull private String providerType; + @NonNull private SftpDataAddress sftpDataAddress; + + @Override + public > B toBuilder() { + return null; + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGenerator.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGenerator.java new file mode 100644 index 000000000..ed9c137e5 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGenerator.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import static org.eclipse.tractusx.edc.transferprocess.sftp.provisioner.NoOpSftpProvisioner.PROVIDER_TYPE; + +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.transfer.spi.provision.ProviderResourceDefinitionGenerator; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.EdcSftpException; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.jetbrains.annotations.Nullable; + +@RequiredArgsConstructor +public class SftpProviderResourceDefinitionGenerator + implements ProviderResourceDefinitionGenerator { + + @Override + public @Nullable ResourceDefinition generate( + DataRequest dataRequest, DataAddress assetAddress, Policy policy) { + SftpDataAddress sftpDataAddress; + try { + sftpDataAddress = SftpDataAddress.fromDataAddress(assetAddress); + } catch (EdcSftpException e) { + return null; + } + return new SftpProviderResourceDefinition(PROVIDER_TYPE, sftpDataAddress); + } + + @Override + public boolean canGenerate(DataRequest dataRequest, DataAddress dataAddress, Policy policy) { + try { + SftpDataAddress.fromDataAddress(dataAddress); + } catch (EdcSftpException e) { + return false; + } + return true; + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionedContentResource.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionedContentResource.java new file mode 100644 index 000000000..5f7f364ab --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionedContentResource.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedContentResource; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; + +@Getter +@RequiredArgsConstructor +@Builder +public class SftpProvisionedContentResource extends ProvisionedContentResource { + @NonNull private String providerType; + @NonNull private Policy scopedPolicy; + @NonNull private SftpDataAddress sftpDataAddress; + @NonNull private String provisionedResourceId; +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerConfiguration.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerConfiguration.java new file mode 100644 index 000000000..acf67ac29 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 Microsoft Corporation + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Microsoft Corporation - initial API and implementation + * Mercedes Benz Tech Innovation - adapt to SFTP + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import java.net.URL; +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; + +/** Configuration to create a resource definition and provisioner pair for sftp data transfer. */ +@Getter +@Builder +public class SftpProvisionerConfiguration { + + @NonNull private final String name; + + @NonNull @Builder.Default + private final ProvisionerType provisionerType = ProvisionerType.PROVIDER; + + @NonNull private final String dataAddressType; + @NonNull private final String policyScope; + @NonNull private final URL endpoint; + + public enum ProvisionerType { + CONSUMER, + PROVIDER + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerExtension.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerExtension.java new file mode 100644 index 000000000..eb3e3f80f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProvisionerExtension.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import org.eclipse.edc.connector.transfer.spi.provision.ProviderResourceDefinitionGenerator; +import org.eclipse.edc.connector.transfer.spi.provision.ProvisionManager; +import org.eclipse.edc.policy.engine.spi.PolicyEngine; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.runtime.metamodel.annotation.Provides; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; + +@Provides(NoOpSftpProvisioner.class) +public class SftpProvisionerExtension implements ServiceExtension { + + @Inject ProvisionManager provisionManager; + @Inject Monitor monitor; + @Inject PolicyEngine policyEngine; + + private static final String POLICY_SCOPE_CONFIG_PATH = "provisioner.sftp.policy.scope"; + private static final String DEFAULT_POLICY_SCOPE = "sftp.provisioner"; + + @Override + public String name() { + return "Sftp Provisioner"; + } + + @Override + public void initialize(ServiceExtensionContext context) { + final String policyScope = + context.getConfig().getString(POLICY_SCOPE_CONFIG_PATH, DEFAULT_POLICY_SCOPE); + + final NoOpSftpProvider sftpProvider = new NoOpSftpProvider(); + final NoOpSftpProvisioner noOpSftpProvisioner = + new NoOpSftpProvisioner(policyScope, policyEngine, sftpProvider); + final SftpProviderResourceDefinitionGenerator generator = + new SftpProviderResourceDefinitionGenerator(); + provisionManager.register(noOpSftpProvisioner); + context.registerService(ProviderResourceDefinitionGenerator.class, generator); + + monitor.info("SftpProvisionerExtension: authentication/initialization complete."); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImpl.java b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImpl.java new file mode 100644 index 000000000..2bb921fdf --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImpl.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH + * + * 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: + * Mercedes-Benz Tech Innovation GmbH - Initial API and Implementation + * + */ + +package org.eclipse.tractusx.edc.transferprocess.sftp.provisioner; + +import java.security.KeyPair; +import lombok.Builder; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUserFactory; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUserKeyPairGenerator; + +@Builder +public class SftpUserFactoryImpl implements SftpUserFactory { + + @Override + public SftpUser createSftpUser( + String sftpUserName, String sftpUserPassword, byte[] sftpUserPrivateKey) { + KeyPair sftpUserKeyPair = + SftpUserKeyPairGenerator.getKeyPairFromPrivateKey(sftpUserPrivateKey, sftpUserName); + + return SftpUser.builder() + .name(sftpUserName) + .password(sftpUserPassword) + .keyPair(sftpUserKeyPair) + .build(); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension b/edc-extensions/transferprocess-sftp-provisioner/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension new file mode 100644 index 000000000..8656b38dd --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/main/resources/META-INF/services/org.eclipse.dataspaceconnector.spi.system.ServiceExtension @@ -0,0 +1,13 @@ +# +# Copyright (c) 2022 Mercedes-Benz Tech Innovation GmbH +# +# 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: +# Mercedes-Benz Tech Innovation GmbH - Initial ServiceExtension file +# + org.eclipse.tractusx.edc.transferprocess.sftp.provisioner.SftpProvisionerExtension diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisionerTest.java b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisionerTest.java new file mode 100644 index 000000000..c5657191f --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/NoOpSftpProvisionerTest.java @@ -0,0 +1,206 @@ +/* + * 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.transferprocess.sftp.provisioner; + +import java.util.concurrent.CompletableFuture; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import org.eclipse.edc.connector.transfer.spi.types.DeprovisionedResource; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionResponse; +import org.eclipse.edc.connector.transfer.spi.types.ProvisionedContentResource; +import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; +import org.eclipse.edc.policy.engine.spi.PolicyEngine; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.response.StatusResult; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class NoOpSftpProvisionerTest { + private final String policyScope = "scope"; + private final PolicyEngine policyEngine = Mockito.mock(PolicyEngine.class); + private final NoOpSftpProvider sftpProvider = new NoOpSftpProvider(); + + private final NoOpSftpProvisioner provisioner = + new NoOpSftpProvisioner(policyScope, policyEngine, sftpProvider); + + @Test + void canProvision__true() { + String provisionType = "NoOp"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + SftpProviderResourceDefinition resourceDefinition = + new SftpProviderResourceDefinition(provisionType, dataAddress); + + Assertions.assertTrue(provisioner.canProvision(resourceDefinition)); + } + + @Test + void canProvision__falseProvisionType() { + String provisionType = "AmazonS3"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + SftpProviderResourceDefinition resourceDefinition = + new SftpProviderResourceDefinition(provisionType, dataAddress); + + Assertions.assertFalse(provisioner.canProvision(resourceDefinition)); + } + + @Test + void canProvision__falseDefinitionType() { + ResourceDefinition resourceDefinition = new WrongResourceDefinition(); + + Assertions.assertFalse(provisioner.canProvision(resourceDefinition)); + } + + @Test + void canDeprovision__true() { + String provisionType = "NoOp"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + Policy scopedPolicy = Mockito.mock(Policy.class); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + String provisionedResourceID = "resource"; + SftpProvisionedContentResource provisionedContentResource = + new SftpProvisionedContentResource( + provisionType, scopedPolicy, dataAddress, provisionedResourceID); + + Assertions.assertTrue(provisioner.canDeprovision(provisionedContentResource)); + } + + @Test + void canDeprovision__falseProvisionType() { + String provisionType = "AmazonS3"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + Policy scopedPolicy = Mockito.mock(Policy.class); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + String provisionedResourceID = "resource"; + SftpProvisionedContentResource provisionedContentResource = + new SftpProvisionedContentResource( + provisionType, scopedPolicy, dataAddress, provisionedResourceID); + + Assertions.assertFalse(provisioner.canDeprovision(provisionedContentResource)); + } + + @Test + void canDeprovision__falseDefinitionType() { + ProvisionedContentResource provisionedContentResource = new WrongProvisionedContentResource(); + + Assertions.assertFalse(provisioner.canDeprovision(provisionedContentResource)); + } + + @Test + @SneakyThrows + void provision__successful() { + String provisionType = "NoOp"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + SftpProviderResourceDefinition resourceDefinition = + new SftpProviderResourceDefinition(provisionType, dataAddress); + Policy policy = Mockito.mock(Policy.class); + + Mockito.when(policyEngine.filter(policy, policyScope)).thenReturn(policy); + + CompletableFuture> future = + provisioner.provision(resourceDefinition, policy); + StatusResult result = future.get(); + + Assertions.assertTrue(result.succeeded()); + } + + @Test + @SneakyThrows + void provision__failedWrongProvisionType() { + String provisionType = "AmazonS3"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + SftpProviderResourceDefinition resourceDefinition = + new SftpProviderResourceDefinition(provisionType, dataAddress); + Policy policy = Mockito.mock(Policy.class); + + Mockito.when(policyEngine.filter(policy, policyScope)).thenReturn(policy); + + CompletableFuture> future = + provisioner.provision(resourceDefinition, policy); + StatusResult result = future.get(); + + Assertions.assertTrue(result.failed()); + } + + @Test + @SneakyThrows + void deprovision__successful() { + String provisionType = "NoOp"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + Policy policy = Mockito.mock(Policy.class); + String provisionedResourceID = "resource"; + SftpProvisionedContentResource provisionedContentResource = + new SftpProvisionedContentResource( + provisionType, policy, dataAddress, provisionedResourceID); + + CompletableFuture> future = + provisioner.deprovision(provisionedContentResource, policy); + StatusResult result = future.get(); + + Assertions.assertTrue(result.succeeded()); + } + + @Test + @SneakyThrows + void deprovision__failedWrongProvisionType() { + String provisionType = "AmazonS3"; + SftpUser sftpUser = SftpUser.builder().name("name").password("password").build(); + SftpLocation sftpLocation = SftpLocation.builder().host("host").port(22).path("path").build(); + SftpDataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + Policy policy = Mockito.mock(Policy.class); + String provisionedResourceID = "resource"; + SftpProvisionedContentResource provisionedContentResource = + new SftpProvisionedContentResource( + provisionType, policy, dataAddress, provisionedResourceID); + + CompletableFuture> future = + provisioner.deprovision(provisionedContentResource, policy); + StatusResult result = future.get(); + + Assertions.assertTrue(result.failed()); + } + + @NoArgsConstructor + private static class WrongResourceDefinition extends ResourceDefinition { + @Override + public > B toBuilder() { + return null; + } + } + + @NoArgsConstructor + private static class WrongProvisionedContentResource extends ProvisionedContentResource {} +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImplTest.java b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImplTest.java new file mode 100644 index 000000000..afca5d5ac --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpLocationFactoryImplTest.java @@ -0,0 +1,42 @@ +/* + * 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.transferprocess.sftp.provisioner; + +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SftpLocationFactoryImplTest { + private final SftpLocationFactoryImpl sftpLocationFactoryImpl = new SftpLocationFactoryImpl(); + + @Test + void generateSftpLocation() { + final String host = "host"; + final Integer port = 22; + final String path = "path"; + + final SftpLocation location = sftpLocationFactoryImpl.createSftpLocation(host, port, path); + + Assertions.assertEquals(host, location.getHost()); + Assertions.assertEquals(port, location.getPort()); + Assertions.assertEquals(path, location.getPath()); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGeneratorTest.java b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGeneratorTest.java new file mode 100644 index 000000000..d81252705 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpProviderResourceDefinitionGeneratorTest.java @@ -0,0 +1,94 @@ +/* + * 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.transferprocess.sftp.provisioner; + +import static org.eclipse.tractusx.edc.transferprocess.sftp.provisioner.NoOpSftpProvisioner.DATA_ADDRESS_TYPE; +import static org.eclipse.tractusx.edc.transferprocess.sftp.provisioner.NoOpSftpProvisioner.PROVIDER_TYPE; + +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import lombok.SneakyThrows; +import org.eclipse.edc.connector.transfer.spi.types.DataRequest; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpDataAddress; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpLocation; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SftpProviderResourceDefinitionGeneratorTest { + private final SftpProviderResourceDefinitionGenerator generator = + new SftpProviderResourceDefinitionGenerator(); + + @Test + void generate__successful() { + final String name = "name"; + final String password = "password"; + final KeyPair keyPair = generateKeyPair(); + final String host = "host"; + final Integer port = 22; + final String path = "path"; + + final DataRequest dataRequest = + DataRequest.Builder.newInstance().destinationType(DATA_ADDRESS_TYPE).build(); + final SftpUser sftpUser = + SftpUser.builder().name(name).password(password).keyPair(keyPair).build(); + final SftpLocation sftpLocation = + SftpLocation.builder().host(host).port(port).path(path).build(); + final DataAddress dataAddress = new SftpDataAddress(sftpUser, sftpLocation); + final Policy policy = Policy.Builder.newInstance().build(); + + final SftpProviderResourceDefinition resourceDefinition = + (SftpProviderResourceDefinition) generator.generate(dataRequest, dataAddress, policy); + + Assertions.assertNotNull(resourceDefinition); + final SftpDataAddress sftpDataAddress = resourceDefinition.getSftpDataAddress(); + + Assertions.assertEquals(PROVIDER_TYPE, resourceDefinition.getProviderType()); + Assertions.assertEquals(host, sftpDataAddress.getSftpLocation().getHost()); + Assertions.assertEquals(port, sftpDataAddress.getSftpLocation().getPort()); + Assertions.assertEquals(path, sftpDataAddress.getSftpLocation().getPath()); + Assertions.assertEquals(name, sftpDataAddress.getSftpUser().getName()); + Assertions.assertEquals(password, sftpDataAddress.getSftpUser().getPassword()); + Assertions.assertEquals(keyPair, sftpDataAddress.getSftpUser().getKeyPair()); + } + + @Test + void generate__wrongDataAddressType() { + final DataRequest dataRequest = + DataRequest.Builder.newInstance().destinationType(DATA_ADDRESS_TYPE).build(); + final DataAddress dataAddress = DataAddress.Builder.newInstance().type("wrong").build(); + final Policy policy = Policy.Builder.newInstance().build(); + + final SftpProviderResourceDefinition resourceDefinition = + (SftpProviderResourceDefinition) generator.generate(dataRequest, dataAddress, policy); + + Assertions.assertNull(resourceDefinition); + } + + @SneakyThrows + static KeyPair generateKeyPair() { + final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); + return keyPairGenerator.generateKeyPair(); + } +} diff --git a/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImplTest.java b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImplTest.java new file mode 100644 index 000000000..29a456176 --- /dev/null +++ b/edc-extensions/transferprocess-sftp-provisioner/src/test/java/org/eclipse/tractusx/edc/transferprocess/sftp/provisioner/SftpUserFactoryImplTest.java @@ -0,0 +1,51 @@ +/* + * 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.transferprocess.sftp.provisioner; + +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import lombok.SneakyThrows; +import org.eclipse.tractusx.edc.transferprocess.sftp.common.SftpUser; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SftpUserFactoryImplTest { + private final SftpUserFactoryImpl sftpUserFactoryImpl = new SftpUserFactoryImpl(); + + @Test + @SneakyThrows + void generateSftpLocation() { + final String name = "name"; + final String password = "password"; + + final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); + final KeyPair keyPair = keyPairGenerator.generateKeyPair(); + final byte[] privateKeyBytes = keyPair.getPrivate().getEncoded(); + + final SftpUser sftpUser = sftpUserFactoryImpl.createSftpUser(name, password, privateKeyBytes); + + Assertions.assertEquals(name, sftpUser.getName()); + Assertions.assertEquals(password, sftpUser.getPassword()); + + Assertions.assertArrayEquals(privateKeyBytes, sftpUser.getKeyPair().getPrivate().getEncoded()); + } +} diff --git a/edc-tests/pom.xml b/edc-tests/pom.xml index ce44483db..0d2239cff 100644 --- a/edc-tests/pom.xml +++ b/edc-tests/pom.xml @@ -25,7 +25,7 @@ org.eclipse.tractusx.edc product-edc-parent - 0.2.0 + 0.3.0 org.eclipse.tractusx.edc.tests @@ -35,10 +35,10 @@ ${project.groupId}_${project.artifactId} 2.10 - 4.5.13 + 4.5.14 1.4.5 2.0.3 - 2.18.26 + 2.20.0 @@ -189,7 +189,15 @@ org.eclipse.tractusx.edc.extensions - custom-jsonld + transferprocess-sftp-client + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-common + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-provisioner diff --git a/edc-tests/src/main/resources/deployment/helm/omejdn/templates/configmap.yaml b/edc-tests/src/main/resources/deployment/helm/omejdn/templates/configmap.yaml index 597850bd9..3d3e17c1f 100644 --- a/edc-tests/src/main/resources/deployment/helm/omejdn/templates/configmap.yaml +++ b/edc-tests/src/main/resources/deployment/helm/omejdn/templates/configmap.yaml @@ -40,6 +40,13 @@ data: clients.yml: |- --- + - client_id: data-plane-oauth2 + client_secret: supersecret + name: provision oauth2 + grant_types: + - client_credentials + token_endpoint_auth_method: client_secret_post + scope: openid {{- range $i, $val := .Values.connectors }} - client_id: {{ quote $val.id }} name: {{ quote $val.name }} @@ -60,6 +67,7 @@ data: redirect_uri: http://localhost:4200 {{ end -}} + {{- range $i, $val := .Values.connectors }} {{ $val.name }}: {{ quote $val.certificate | toString }} {{ end -}} diff --git a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/Chart.yaml b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/Chart.yaml index c701cb199..d3248326b 100644 --- a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/Chart.yaml +++ b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/Chart.yaml @@ -42,13 +42,13 @@ dependencies: # PostgreSQL - name: postgresql alias: plato-postgresql - version: 11.2.4 + version: 12.1.6 repository: https://charts.bitnami.com/bitnami condition: install.postgresql - name: postgresql alias: sokrates-postgresql - version: 11.2.4 + version: 12.1.6 repository: https://charts.bitnami.com/bitnami condition: install.postgresql diff --git a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md index e639dd387..3aae7191a 100644 --- a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md +++ b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/README.md @@ -1,11 +1,63 @@ -# All-In-One Deployment +# Supporting Infrastructure Deployment -The Product EDC Demo Deployment creates a complete, independent and already configured EDC test environment. +The Supporting Infrastructure Deployment creates a complete, independent and already configured EDC test environment. +During the automated business tests, these infrastructure components are deployed together with two connectors (Plato & Sokrates). -This deployment may function as +This deployment could also be used as - reference setup for teams, that want to create their own connector -- standalone test environment to try different things out +- standalone infrastructure to try things out + +This deployment should **never** be used + +- in **any** production or near production environments +- in **any** long living internet facing connector setups + +## Components + +Overview of the installed components. + +![Deployed Components](diagrams/deployed_components.png) + +### Omejdn DAPS + +The Dynamic Attribute Provisioning Service (DAPS) is a component of the IDS Ecosystem. +The Fraunhofer Institute has created a DAPS reference implementation, the Omejdn +DAPS ([link](https://github.com/Fraunhofer-AISEC/omejdn-server)). This deplyoment configures and deployes a instance of +this reference implementation. + +Definition of DAPS from the IDS Reference architecture v3.0 +> The Identity Provider acts as an agent for the International +> Data Spaces Association. It is responsible for issuing technical identities to parties that have been approved to become +> Participants in the International Data Spaces. The Identity +> Provider is instructed to issue identities based on approved +> roles (e.g., App Store or App Provider). Only if equipped with +> such an identity, an entity is allowed to participate in the International Data Spaces + +Also, please note, that the Omejdn DAPS is meant as research sandbox and should not be used in anq +productive environment. + +> **IMPORTANT:** Omejdn is meant to be a research sandbox in which we can (re)implement standard protocols and +> potentially extend and modify functionality under the hood to support research projects. Use at your own +> risk! ([source](https://github.com/Fraunhofer-AISEC/omejdn-server)) + +### HashiCorp Vault + +The Control- and Data Plane persist confidential in the vault and persist and communicate using only the secret +names. Hence, it is not possible to run a connector without an instance of a vault. + +### Backend Application + +After a Data Transfer is successfully prepared the control plane will contact the a configurable endpoint with the +information it needs to initiate the data transfer. This transfer flow, where something like a Backend Application is +required, is unique to the HTTP Proxy data transfer flow. + +The Backend Application has an API endpoint, that is configured in the control plane. After it gets called with the data +transfer information, it will do the actual data transfer and store the data on disk. + +### PostgreSQL + +This database is used to persist the state of the Control Plane. ## Setup @@ -31,64 +83,13 @@ helm dependency update **Install Demo Chart** ```bash -helm install edc-all-in-one --namespace edc-all-in-one --create-namespace . +helm install tx-infrastructure --namespace tx --create-namespace . ``` -This will deploy the following components: - -![Deployed Components](diagrams/deployed_components.png) - ## Stop Demo Environment **Uninstall Demo Chart** ```bash -helm uninstall edc-all-in-one --namespace edc-all-in-one +helm uninstall tx-infrastructure --namespace tx ``` - -## Components - -Overview of the installed components. - -### EDC Control Plane - -The EDC Control Plane does - -- data/contract offering -- contract negotiation -- data transfer coordination - -Two control planes always talk to each other using IDS messages. Therefore, when telling one connector to talk to -another connector, the target endpoint must point to the IDS API (e.g `http://[myTargetConnector].com/api/v1/ids`). - -The connector owner should only talk to the control plane via the Data Management API. The API is not only used for -simple data management, but for initiating inter-connector communication as well. - -### EDC Data Plane - -The EDC Data Plane is used for the actual data transfer. - -At the time of writing the Data Plane may only function as HTTP proxy and does not support any other type of -transfer. Additional transfer capabilities could be added by including new EDC extensions in the Data Plane application. - -### PostgreSQL - -This database is used to persist the state of the Control Plane. - -### HashiCorp Vault - -The Control- and Data Plane will persist confidential in the vault and persist and communicate using only the secret -names. - -### Backend Application - -After a Data Transfer is successfully prepared the control plane will contact the a configurable endpoint with the -information it needs to initiate the data transfer. This transfer flow, where something like a Backend Application is -required, is unique to the HTTP Proxy data transfer flow. - -The Backend Application has an API endpoint, that is configured in the control plane. After it gets called with the data -transfer information, it will do the actual data transfer and store the data on disk. - -### Omejdn DAPS - -Instead of the Catena-X DAPS this demo configures and deploys it's own DAPS instance. diff --git a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.png b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.png index b91338ef6..443b739f8 100644 Binary files a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.png and b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.png differ diff --git a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.puml b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.puml index 34c7da665..9f3dfdd94 100644 --- a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.puml +++ b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/diagrams/deployed_components.puml @@ -1,47 +1,20 @@ @startuml -!define aliceColor 66CCFF -!define bobColor CCFF99 -!define dapsColor FFFF99 - -node PlatoSetup as "Plato Connector Setup" { - database PlatoPsql as "PostgreSQL" #bobColor - database PlatoKeyVault as "HashiCorp Vault" #bobColor - component PlatoConnector as "Eclipse Dataspace Connector" { - artifact BobControlPlane as "Control Plane" #bobColor - artifact BobDataPlane as "Data Plane" #bobColor +node Infrastructure as "Tractus-X Connector\nSupporting Infrastructure" { + node SokratesSetup as "Persistence / PostgreSQL" { + database SokratesPsql as "Sokrates PSQL" + database PlatoPsql as "Plato PSQL" } - component PlatoBackendService as "Backend Application" #bobColor -} - -BobControlPlane -- PlatoPsql -BobControlPlane -- PlatoKeyVault -BobDataPlane -- PlatoKeyVault -BobDataPlane -left- BobControlPlane -BobControlPlane -left- PlatoBackendService - -node SokratesSetup as "Sokrates Connector Setup" { - database SokratesPsql as "PostgreSQL" #aliceColor - database SokratesKeyVault as "HashiCorp Vault" #aliceColor - component SokratesConnector as "Eclipse Dataspace Connector" { - artifact AliceControlPlane as "Control Plane" #aliceColor - artifact AliceDataPlane as "Data Plane" #aliceColor + node SharedComponents as "Additional Components" { + component Vault as "HashiCorp Vault" + component BackendService as "Backend Application" + } + node IdentityProvider as "Identity Provider" { + component OmejdnDaps as "Omejdn DAPS" } - component AliceBackendService as "Backend Application" #aliceColor -} - -AliceControlPlane -- SokratesPsql -AliceControlPlane -- SokratesKeyVault -AliceDataPlane -- SokratesKeyVault -AliceDataPlane -left- AliceControlPlane -AliceControlPlane -left- AliceBackendService - - -node IdentityProvider as "Identity Provider" { - component OmejdnDaps as "Omejdn DAPS" #dapsColor } -PlatoPsql -[hidden]down- OmejdnDaps -AliceControlPlane -[hidden]up- OmejdnDaps +IdentityProvider -[hidden]down- SharedComponents +IdentityProvider -[hidden]right- SokratesSetup @enduml diff --git a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/values.yaml b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/values.yaml index 095c6b3d3..57779134b 100644 --- a/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/values.yaml +++ b/edc-tests/src/main/resources/deployment/helm/supporting-infrastructure/values.yaml @@ -1,7 +1,7 @@ --- ########### -# INSTALL # +# Install # ########### install: daps: true @@ -16,8 +16,11 @@ install: backend: fullnameOverride: "backend" service: + type: NodePort frontend: - port: 80 + port: 8080 + backend: + port: 8081 ######## @@ -29,7 +32,7 @@ idsdaps: - id: E7:07:2D:74:56:66:31:F0:7B:10:EA:B6:03:06:4C:23:7F:ED:A6:65:keyid:E7:07:2D:74:56:66:31:F0:7B:10:EA:B6:03:06:4C:23:7F:ED:A6:65 name: sokrates attributes: - referringConnector: http://sokrates-edc-controlplane/BPNSOKRATES + referringConnector: http://sokrates-controlplane/BPNSOKRATES # Must be the same certificate that is stores in section 'sokrates-vault' certificate: |- -----BEGIN CERTIFICATE----- @@ -59,7 +62,7 @@ idsdaps: - id: 99:83:A7:17:86:FF:98:93:CE:A0:DD:A1:F1:36:FA:F6:0F:75:0A:23:keyid:99:83:A7:17:86:FF:98:93:CE:A0:DD:A1:F1:36:FA:F6:0F:75:0A:23 name: plato attributes: - referringConnector: http://plato-edc-controlplane/BPNPLATO + referringConnector: http://plato-controlplane/BPNPLATO # Must be the same certificate that is stores in section 'plato-vault' certificate: |- -----BEGIN CERTIFICATE----- diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/AssetStepDefs.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/AssetStepDefs.java index 9bcb6d4eb..0405bf646 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/AssetStepDefs.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/AssetStepDefs.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.UUID; import org.eclipse.tractusx.edc.tests.data.Asset; +import org.eclipse.tractusx.edc.tests.data.NullDataAddress; public class AssetStepDefs { @@ -43,7 +44,9 @@ public void hasAssets(Connector connector, int assetCount) throws Exception { final DataManagementAPI api = connector.getDataManagementAPI(); for (var i = 0; i < assetCount; i++) - api.createAsset(new Asset(UUID.randomUUID().toString(), i + 1 + " / " + assetCount)); + api.createAsset( + new Asset( + UUID.randomUUID().toString(), i + 1 + " / " + assetCount, NullDataAddress.INSTANCE)); } private List parseDataTable(DataTable table) { @@ -52,7 +55,7 @@ private List parseDataTable(DataTable table) { for (Map map : table.asMaps()) { String id = map.get("id"); String description = map.get("description"); - assets.add(new Asset(id, description)); + assets.add(new Asset(id, description, NullDataAddress.INSTANCE)); } return assets; diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/BackendServiceBackendAPI.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/BackendServiceBackendAPI.java index 4295d9f10..6b2a5ee2e 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/BackendServiceBackendAPI.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/BackendServiceBackendAPI.java @@ -36,6 +36,7 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -54,6 +55,7 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; +@Slf4j public class BackendServiceBackendAPI { private static final String HTTP_HEADER_ACCEPT = "Accept"; private static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type"; @@ -76,6 +78,8 @@ public List list(/* @Nullable */ final String path) { final HttpGet get = new HttpGet(uri); get.setHeader(HTTP_HEADER_ACCEPT, ContentType.APPLICATION_JSON.getMimeType()); + log.debug(String.format("Send %-6s %s", get.getMethod(), get.getURI())); + return httpClient.execute(get, ListResponseHandler.INSTANCE); } @@ -85,6 +89,8 @@ public boolean exists(@NonNull final String path) { final URI uri = new URIBuilder(backendServiceBackendApiUrl).setPath(path).build(); final HttpHead head = new HttpHead(uri); + log.debug(String.format("Send %-6s %s", head.getMethod(), head.getURI())); + return httpClient.execute(head, ExistsResponseHandler.INSTANCE); } @@ -95,6 +101,8 @@ public byte[] get(@NonNull final String path) { final HttpGet get = new HttpGet(uri); get.setHeader(HTTP_HEADER_ACCEPT, ContentType.APPLICATION_OCTET_STREAM.getMimeType()); + log.debug(String.format("Send %-6s %s", get.getMethod(), get.getURI())); + return httpClient.execute(get, GetResponseHandler.INSTANCE); } @@ -114,6 +122,8 @@ public void post( post.setEntity(entity); + log.debug(String.format("Send %-6s %s", post.getMethod(), post.getURI())); + httpClient.execute(post, PostResponseHandler.INSTANCE); } @@ -240,7 +250,7 @@ private static class ListResponseHandler extends GsonResponseHandler>() {}); // JVM type erasure: Keep generic args! + super(new TypeToken<>() {}); // JVM type erasure: Keep generic args! } } diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/ContractDefinitionStepDefs.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/ContractDefinitionStepDefs.java index d31653144..634a845ff 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/ContractDefinitionStepDefs.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/ContractDefinitionStepDefs.java @@ -48,8 +48,11 @@ private List parseDataTable(DataTable table) { String assetId = map.get("asset"); List assetIds = assetId == null ? new ArrayList<>() : List.of(assetId); + String mapValidity = map.get("validity"); + Long validity = mapValidity == null ? null : Long.parseLong(mapValidity); + contractDefinitions.add( - new ContractDefinition(id, contractPolicyId, accessPolicyId, assetIds)); + new ContractDefinition(id, contractPolicyId, accessPolicyId, assetIds, validity)); } return contractDefinitions; diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/DataManagementAPI.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/DataManagementAPI.java index eb8d169e4..78562b2f8 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/DataManagementAPI.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/DataManagementAPI.java @@ -21,11 +21,13 @@ package org.eclipse.tractusx.edc.tests; import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -75,7 +77,7 @@ public List requestCatalogFrom(String receivingConnectorUrl) thro return catalog.contractOffers.stream().map(this::mapOffer).collect(Collectors.toList()); } - public String initiateNegotiation( + public Negotiation initiateNegotiation( String receivingConnectorUrl, String definitionId, String assetId, Policy policy) throws IOException { final ManagementApiOffer offer = new ManagementApiOffer(); @@ -99,12 +101,13 @@ public String initiateNegotiation( throw new RuntimeException( "Initiated negotiation. Connector did not answer with negotiation ID."); - log.debug("Initiated negotiation ( id= " + response.getId() + " )"); + log.info(String.format("Initiated negotiation (id=%s)", response.getId())); - return response.getId(); + final String negotiationId = response.getId(); + return new Negotiation(negotiationId); } - public String initiateTransferProcess( + public Transfer initiateTransferProcess( String receivingConnectorUrl, String contractAgreementId, String assetId, @@ -120,6 +123,31 @@ public String initiateTransferProcess( transfer.dataDestination = mapDataAddress(dataAddress); transfer.protocol = "ids-multipart"; + return initiateTransferProcess(transfer); + } + + public Transfer initiateTransferProcess( + String receivingConnectorUrl, + String contractAgreementId, + String assetId, + DataAddress dataAddress, + String receiverEndpoint) + throws IOException { + final ManagementApiTransfer transfer = new ManagementApiTransfer(); + + transfer.connectorAddress = receivingConnectorUrl; + transfer.contractId = contractAgreementId; + transfer.assetId = assetId; + transfer.transferType = new ManagementApiTransferType(); + transfer.managedResources = false; + transfer.dataDestination = mapDataAddress(dataAddress); + transfer.protocol = "ids-multipart"; + transfer.properties = new ManagementApiProperties(receiverEndpoint); + + return initiateTransferProcess(transfer); + } + + private Transfer initiateTransferProcess(ManagementApiTransfer transfer) throws IOException { final ManagementApiTransferResponse response = post(TRANSFER_PATH, transfer, new TypeToken() {}); @@ -127,9 +155,10 @@ public String initiateTransferProcess( throw new RuntimeException( "Initiated transfer process. Connector did not answer with transfer process ID."); - log.info("Initiated transfer process ( id= " + response.getId() + " )"); + log.info(String.format("Initiated transfer process (id=%s)", response.getId())); - return response.getId(); + final String transferId = response.getId(); + return new Transfer(transferId); } public TransferProcess getTransferProcess(String id) throws IOException { @@ -144,26 +173,17 @@ public ContractNegotiation getNegotiation(String id) throws IOException { return mapNegotiation(negotiation); } + public List getNegotiations() throws IOException { + final List negotiations = + get(NEGOTIATIONS_PATH + "/", new TypeToken>() {}); + return negotiations.stream().map(this::mapNegotiation).collect(Collectors.toList()); + } + public void createAsset(Asset asset) throws IOException { - final ManagementApiDataAddress dataAddress = new ManagementApiDataAddress(); final ManagementApiAssetCreate assetCreate = new ManagementApiAssetCreate(); - dataAddress.properties = - Map.of( - ManagementApiDataAddress.TYPE, - "HttpData", - "baseUrl", - "https://jsonplaceholder.typicode.com/todos/1"); assetCreate.asset = mapAsset(asset); - assetCreate.dataAddress = dataAddress; - - post(ASSET_PATH, assetCreate); - } - - public void createAsset(AssetWithDataAddress assetWithDataAddress) throws IOException { - final ManagementApiAssetCreate assetCreate = new ManagementApiAssetCreate(); - assetCreate.asset = mapAsset(assetWithDataAddress.getAsset()); - assetCreate.dataAddress = mapDataAddress(assetWithDataAddress.getDataAddress()); + assetCreate.dataAddress = mapDataAddress(asset.getDataAddress()); post(ASSET_PATH, assetCreate); } @@ -266,6 +286,9 @@ private TransferProcess mapTransferProcess(ManagementApiTransferProcess transfer case "COMPLETED": state = TransferProcessState.COMPLETED; break; + case "ERROR": + state = TransferProcessState.ERROR; + break; default: state = TransferProcessState.UNKNOWN; } @@ -275,7 +298,43 @@ private TransferProcess mapTransferProcess(ManagementApiTransferProcess transfer private ManagementApiDataAddress mapDataAddress(@NonNull DataAddress dataAddress) { final ManagementApiDataAddress apiObject = new ManagementApiDataAddress(); - apiObject.setProperties(dataAddress.getProperties()); + + if (dataAddress instanceof HttpProxySourceDataAddress) { + final var address = (HttpProxySourceDataAddress) dataAddress; + var properties = new HashMap(); + properties.put("type", "HttpData"); + properties.put("baseUrl", address.getBaseUrl()); + var oauth2Provision = address.getOauth2Provision(); + if (oauth2Provision != null) { + properties.put("oauth2:tokenUrl", oauth2Provision.getTokenUrl()); + properties.put("oauth2:clientId", oauth2Provision.getClientId()); + properties.put("oauth2:clientSecret", oauth2Provision.getClientSecret()); + properties.put("oauth2:scope", oauth2Provision.getScope()); + } + apiObject.setProperties(properties); + } else if (dataAddress instanceof HttpProxySinkDataAddress) { + apiObject.setProperties(Map.of("type", "HttpProxy")); + } else if (dataAddress instanceof S3DataAddress) { + final S3DataAddress a = (S3DataAddress) dataAddress; + apiObject.setProperties( + Map.of( + "type", + "AmazonS3", + "bucketName", + a.getBucketName(), + "region", + a.getRegion(), + "keyName", + a.getKeyName())); + } else if (dataAddress instanceof NullDataAddress) { + // set something that passes validation + apiObject.setProperties(Map.of("type", "HttpData", "baseUrl", "http://localhost")); + } else { + throw new UnsupportedOperationException( + String.format( + "Cannot map data address of type %s to EDC domain", dataAddress.getClass())); + } + return apiObject; } @@ -464,6 +523,7 @@ private static class ManagementApiTransfer { private ManagementApiDataAddress dataDestination; private boolean managedResources; private ManagementApiTransferType transferType; + private ManagementApiProperties properties; } @Data @@ -497,6 +557,12 @@ private static class ManagementApiDataAddress { private Map properties; } + @Data + private static class ManagementApiProperties { + @SerializedName(value = "receiver.http.endpoint") + private final String receiverHttpEndpoint; + } + @Data private static class ManagementApiPolicyDefinition { private String id; diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/HttpProxyTransferSteps.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/HttpProxyTransferSteps.java new file mode 100644 index 000000000..663cdd70c --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/HttpProxyTransferSteps.java @@ -0,0 +1,90 @@ +package org.eclipse.tractusx.edc.tests; + +import io.cucumber.datatable.DataTable; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.edc.tests.data.*; +import org.junit.jupiter.api.Assertions; + +@Slf4j +public class HttpProxyTransferSteps { + + private static final String ID = "id"; + private static final String DESCRIPTION = "description"; + private static final String BASE_URL = "baseUrl"; + private static final String ASSET_ID = "asset id"; + private static final String RECEIVER_HTTP_ENDPOINT = "receiverHttpEndpoint"; + + @Given("'{connector}' has a http proxy assets") + public void hasAssets(Connector connector, DataTable table) throws Exception { + final DataManagementAPI api = connector.getDataManagementAPI(); + + for (var map : table.asMaps()) { + final String id = map.get(ID); + final String description = map.get(DESCRIPTION); + final String baseUrl = map.get(BASE_URL); + + var oauth2Provision = + Arrays.stream(Oauth2DataAddressFields.values()) + .map(it -> it.text) + .anyMatch(map::containsKey) + ? new HttpProxySourceDataAddress.Oauth2Provision( + map.get(Oauth2DataAddressFields.TOKEN_URL.text), + map.get(Oauth2DataAddressFields.CLIENT_ID.text), + map.get(Oauth2DataAddressFields.CLIENT_SECRET.text), + map.get(Oauth2DataAddressFields.SCOPE.text)) + : null; + + final DataAddress address = new HttpProxySourceDataAddress(baseUrl, oauth2Provision); + final Asset asset = new Asset(id, description, address); + + api.createAsset(asset); + } + } + + @When("'{connector}' initiates HttpProxy transfer from '{connector}'") + public void sokratesInitiateHttpProxyTransferProcessFromPlato( + Connector consumer, Connector provider, DataTable dataTable) throws IOException { + final DataManagementAPI api = consumer.getDataManagementAPI(); + final String receiverUrl = provider.getEnvironment().getIdsUrl() + "/data"; + + final List negotiation = api.getNegotiations(); + final String agreementId = negotiation.get(0).getAgreementId(); + final DataAddress dataAddress = new HttpProxySinkDataAddress(); + + for (var map : dataTable.asMaps()) { + final String assetId = map.get(ASSET_ID); + final String receiverHttpEndpoint = map.get(RECEIVER_HTTP_ENDPOINT); + final Transfer transfer = + api.initiateTransferProcess( + receiverUrl, agreementId, assetId, dataAddress, receiverHttpEndpoint); + + transfer.waitUntilComplete(api); + } + } + + @Then("the backend application of '{connector}' has received data") + public void theBackendApplicationOfSocratesHasReceivedData(Connector consumer) { + final BackendServiceBackendAPI api = consumer.getBackendServiceBackendAPI(); + final List transferredData = api.list("/"); + Assertions.assertNotEquals(0, transferredData.size()); + } + + private enum Oauth2DataAddressFields { + TOKEN_URL("oauth2 token url"), + CLIENT_ID("oauth2 client id"), + CLIENT_SECRET("oauth2 client secret"), + SCOPE("oauth2 scope"); + + private final String text; + + Oauth2DataAddressFields(String text) { + this.text = text; + } + } +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/NegotiationSteps.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/NegotiationSteps.java index 26e143347..5872d2dfe 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/NegotiationSteps.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/NegotiationSteps.java @@ -20,70 +20,75 @@ package org.eclipse.tractusx.edc.tests; -import static org.awaitility.Awaitility.await; - import io.cucumber.datatable.DataTable; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; import java.io.IOException; -import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.edc.tests.data.ContractNegotiation; import org.eclipse.tractusx.edc.tests.data.ContractNegotiationState; +import org.eclipse.tractusx.edc.tests.data.Negotiation; import org.eclipse.tractusx.edc.tests.data.Permission; import org.eclipse.tractusx.edc.tests.data.Policy; -import org.eclipse.tractusx.edc.tests.util.Timeouts; import org.junit.jupiter.api.Assertions; @Slf4j public class NegotiationSteps { + private static final String DEFINITION_ID = "definition id"; + private static final String ASSET_ID = "asset id"; + private ContractNegotiation lastInitiatedNegotiation; - @When("'{connector}' sends '{connector}' a counter offer without constraints") - public void sendOfferWithoutConstraints(Connector sender, Connector receiver, DataTable table) + @When("'{connector}' sends '{connector}' an offer without constraints") + public void sendAnOfferWithoutConstraints(Connector sender, Connector receiver, DataTable table) throws IOException { final DataManagementAPI dataManagementAPI = sender.getDataManagementAPI(); final String receiverIdsUrl = receiver.getEnvironment().getIdsUrl() + "/data"; for (Map map : table.asMaps()) { - final String definitionId = map.get("definition id"); - final String assetId = map.get("asset id"); + final String definitionId = map.get(DEFINITION_ID); + final String assetId = map.get(ASSET_ID); final Permission permission = new Permission("USE", null, new ArrayList<>()); final Policy policy = new Policy("foo", List.of(permission)); - final String negotiationId = + final Negotiation negotiation = dataManagementAPI.initiateNegotiation(receiverIdsUrl, definitionId, assetId, policy); // wait for negotiation to complete - await() - .pollDelay(Duration.ofMillis(500)) - .atMost(Timeouts.CONTRACT_NEGOTIATION) - .until(() -> isNegotiationComplete(dataManagementAPI, negotiationId)); + negotiation.waitUntilComplete(dataManagementAPI); - lastInitiatedNegotiation = dataManagementAPI.getNegotiation(negotiationId); + lastInitiatedNegotiation = dataManagementAPI.getNegotiation(negotiation.getId()); } } + @When("'{connector}' successfully negotiation a contract agreement with '{connector}'") + public void sokratesSuccessfullyNegotiationAContractAgreementPlatoFor( + Connector consumer, Connector provider, DataTable table) throws IOException { + final DataManagementAPI api = consumer.getDataManagementAPI(); + + final Map map = table.asMap(); + final String definitionId = map.get(DEFINITION_ID); + final String assetId = map.get(ASSET_ID); + + // as default always the "allow all" policy is used. So we can assume this here, too. + final Permission permission = new Permission("USE", null, new ArrayList<>()); + final Policy policy = new Policy("policy-id", List.of(permission)); + + final String receiverUrl = provider.getEnvironment().getIdsUrl(); + final Negotiation negotiation = + api.initiateNegotiation(receiverUrl, assetId, definitionId, policy); + + negotiation.waitUntilComplete(api); + } + @Then("the negotiation is declined") public void assertLastNegotiationDeclined() { Assertions.assertEquals(ContractNegotiationState.DECLINED, lastInitiatedNegotiation.getState()); } - - static boolean isNegotiationComplete(DataManagementAPI dataManagementAPI, String negotiationId) - throws IOException { - var negotiation = dataManagementAPI.getNegotiation(negotiationId); - return negotiation != null - && Stream.of( - ContractNegotiationState.ERROR, - ContractNegotiationState.CONFIRMED, - ContractNegotiationState.DECLINED) - .anyMatch((l) -> l.equals(negotiation.getState())); - } } diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/S3FileTransferStepsDefs.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/S3FileTransferStepsDefs.java index 92e0c063b..c4bc85a27 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/S3FileTransferStepsDefs.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/S3FileTransferStepsDefs.java @@ -20,7 +20,6 @@ package org.eclipse.tractusx.edc.tests; import static org.awaitility.Awaitility.await; -import static org.eclipse.tractusx.edc.tests.NegotiationSteps.isNegotiationComplete; import static org.junit.jupiter.api.Assertions.fail; import io.cucumber.datatable.DataTable; @@ -32,16 +31,16 @@ import java.nio.file.Files; import java.time.Duration; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.tractusx.edc.tests.data.Asset; -import org.eclipse.tractusx.edc.tests.data.AssetWithDataAddress; import org.eclipse.tractusx.edc.tests.data.DataAddress; +import org.eclipse.tractusx.edc.tests.data.Negotiation; import org.eclipse.tractusx.edc.tests.data.Permission; import org.eclipse.tractusx.edc.tests.data.Policy; -import org.eclipse.tractusx.edc.tests.data.TransferProcessState; +import org.eclipse.tractusx.edc.tests.data.S3DataAddress; +import org.eclipse.tractusx.edc.tests.data.Transfer; import org.eclipse.tractusx.edc.tests.util.S3Client; import org.eclipse.tractusx.edc.tests.util.Timeouts; import org.junit.jupiter.api.Assertions; @@ -90,7 +89,7 @@ public void hasAssets(Connector connector, DataTable table) { } private String assetId; - private String contractNegotiationId; + private String agreementId; @Then("'{connector}' negotiates the contract successfully with '{connector}'") public void negotiateContract(Connector sender, Connector receiver, DataTable dataTable) @@ -106,18 +105,14 @@ public void negotiateContract(Connector sender, Connector receiver, DataTable da final DataManagementAPI dataManagementAPI = sender.getDataManagementAPI(); final String receiverIdsUrl = receiver.getEnvironment().getIdsUrl() + "/data"; - final String negotiationId = + final Negotiation negotiation = dataManagementAPI.initiateNegotiation(receiverIdsUrl, definitionId, assetId, policy); + negotiation.waitUntilComplete(dataManagementAPI); - await() - .pollDelay(Duration.ofMillis(500)) - .atMost(Timeouts.CONTRACT_NEGOTIATION) - .until(() -> isNegotiationComplete(dataManagementAPI, negotiationId)); - - contractNegotiationId = dataManagementAPI.getNegotiation(negotiationId).getAgreementId(); + agreementId = dataManagementAPI.getNegotiation(negotiation.getId()).getAgreementId(); } - @Then("'{connector}' initiate transfer process from '{connector}'") + @Then("'{connector}' initiate S3 transfer process from '{connector}'") public void initiateTransferProcess(Connector sender, Connector receiver, DataTable dataTable) throws IOException { DataAddress dataAddress = createDataAddress(dataTable.asMaps().get(0)); @@ -125,16 +120,12 @@ public void initiateTransferProcess(Connector sender, Connector receiver, DataTa final DataManagementAPI dataManagementAPI = sender.getDataManagementAPI(); final String receiverIdsUrl = receiver.getEnvironment().getIdsUrl() + "/data"; - final String transferProcessId = + final Transfer transferProcess = dataManagementAPI.initiateTransferProcess( - receiverIdsUrl, contractNegotiationId, assetId, dataAddress); + receiverIdsUrl, agreementId, assetId, dataAddress); + transferProcess.waitUntilComplete(dataManagementAPI); - await() - .pollDelay(Duration.ofMillis(500)) - .atMost(Timeouts.FILE_TRANSFER) - .until(() -> isTransferComplete(dataManagementAPI, transferProcessId)); - - Assertions.assertNotNull(transferProcessId); + Assertions.assertNotNull(transferProcess.getId()); } private static final String COMPLETION_MARKER = ".complete"; @@ -161,33 +152,23 @@ private boolean isFilePresent(S3Client s3, String bucketName, String fileName) { return s3.listBucketContent(bucketName).contains(fileName); } - private List parseDataTable(DataTable table) { - final List assetsWithDataAddresses = new ArrayList<>(); + private List parseDataTable(DataTable table) { + final List assetsWithDataAddresses = new ArrayList<>(); for (Map map : table.asMaps()) { String id = map.get("id"); String description = map.get("description"); - assetsWithDataAddresses.add( - new AssetWithDataAddress(new Asset(id, description), createDataAddress(map))); + assetsWithDataAddresses.add(new Asset(id, description, createDataAddress(map))); } return assetsWithDataAddresses; } private DataAddress createDataAddress(Map map) { - Map properties = new HashMap<>(); - properties.put("type", map.get("data_address_type")); - properties.put("bucketName", map.get("data_address_s3_bucket_name")); - properties.put("region", map.get("data_address_s3_region")); - properties.put("keyName", map.get("data_address_s3_key_name")); - return new DataAddress(properties); - } - - private static boolean isTransferComplete( - DataManagementAPI dataManagementAPI, String transferProcessId) throws IOException { - var transferProcess = dataManagementAPI.getTransferProcess(transferProcessId); - return transferProcess != null - && transferProcess.getState().equals(TransferProcessState.COMPLETED); + final String bucketName = map.get("data_address_s3_bucket_name"); + final String region = map.get("data_address_s3_region"); + final String keyName = map.get("data_address_s3_key_name"); + return new S3DataAddress(bucketName, region, keyName); } @AfterAll diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Asset.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Asset.java index 1c277ac0b..acccef8d8 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Asset.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Asset.java @@ -27,4 +27,6 @@ public class Asset { @NonNull String Id; @NonNull String description; + + @NonNull DataAddress dataAddress; } diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/AssetWithDataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/AssetWithDataAddress.java deleted file mode 100644 index f35557cf8..000000000 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/AssetWithDataAddress.java +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2022 ZF Friedrichshafen AG - * 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.tests.data; - -import lombok.NonNull; -import lombok.Value; - -@Value -public class AssetWithDataAddress { - - @NonNull Asset asset; - - @NonNull DataAddress dataAddress; -} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/ContractDefinition.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/ContractDefinition.java index a4102af25..a9fca04a1 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/ContractDefinition.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/ContractDefinition.java @@ -32,4 +32,5 @@ public class ContractDefinition { @NonNull String acccessPolicyId; List assetIds; + Long validity; } diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/DataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/DataAddress.java index 61222c954..16815827f 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/DataAddress.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/DataAddress.java @@ -19,12 +19,4 @@ package org.eclipse.tractusx.edc.tests.data; -import java.util.Map; -import lombok.NonNull; -import lombok.Value; - -@Value -public class DataAddress { - - @NonNull Map properties; -} +public interface DataAddress {} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySinkDataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySinkDataAddress.java new file mode 100644 index 000000000..503701e24 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySinkDataAddress.java @@ -0,0 +1,3 @@ +package org.eclipse.tractusx.edc.tests.data; + +public class HttpProxySinkDataAddress implements DataAddress {} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySourceDataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySourceDataAddress.java new file mode 100644 index 000000000..4a5946cc9 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/HttpProxySourceDataAddress.java @@ -0,0 +1,18 @@ +package org.eclipse.tractusx.edc.tests.data; + +import lombok.NonNull; +import lombok.Value; + +@Value +public class HttpProxySourceDataAddress implements DataAddress { + @NonNull String baseUrl; + Oauth2Provision oauth2Provision; + + @Value + public static class Oauth2Provision { + @NonNull String tokenUrl; + @NonNull String clientId; + @NonNull String clientSecret; + String scope; + } +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Negotiation.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Negotiation.java new file mode 100644 index 000000000..40845e4c0 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Negotiation.java @@ -0,0 +1,34 @@ +package org.eclipse.tractusx.edc.tests.data; + +import static org.awaitility.Awaitility.await; + +import groovyjarjarantlr4.v4.runtime.misc.NotNull; +import java.io.IOException; +import java.time.Duration; +import java.util.stream.Stream; +import lombok.Value; +import org.eclipse.tractusx.edc.tests.DataManagementAPI; +import org.eclipse.tractusx.edc.tests.util.Timeouts; + +@Value +public class Negotiation { + + @NotNull String id; + + public void waitUntilComplete(DataManagementAPI dataManagementAPI) { + await() + .pollDelay(Duration.ofMillis(2000)) + .atMost(Timeouts.CONTRACT_NEGOTIATION) + .until(() -> isComplete(dataManagementAPI)); + } + + public boolean isComplete(DataManagementAPI dataManagementAPI) throws IOException { + var negotiation = dataManagementAPI.getNegotiation(id); + return negotiation != null + && Stream.of( + ContractNegotiationState.ERROR, + ContractNegotiationState.CONFIRMED, + ContractNegotiationState.DECLINED) + .anyMatch((l) -> l.equals(negotiation.getState())); + } +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/NullDataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/NullDataAddress.java new file mode 100644 index 000000000..778600b86 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/NullDataAddress.java @@ -0,0 +1,10 @@ +package org.eclipse.tractusx.edc.tests.data; + +public class NullDataAddress implements DataAddress { + + private static final NullDataAddress _instance = new NullDataAddress(); + + public static DataAddress INSTANCE = new NullDataAddress(); + + private NullDataAddress() {} +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/S3DataAddress.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/S3DataAddress.java new file mode 100644 index 000000000..a59843447 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/S3DataAddress.java @@ -0,0 +1,12 @@ +package org.eclipse.tractusx.edc.tests.data; + +import lombok.NonNull; +import lombok.Value; + +@Value +public class S3DataAddress implements DataAddress { + + @NonNull String bucketName; + @NonNull String region; + @NonNull String keyName; +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Transfer.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Transfer.java new file mode 100644 index 000000000..ebd722d07 --- /dev/null +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/Transfer.java @@ -0,0 +1,31 @@ +package org.eclipse.tractusx.edc.tests.data; + +import static org.awaitility.Awaitility.await; + +import java.io.IOException; +import java.time.Duration; +import lombok.Value; +import org.eclipse.tractusx.edc.tests.DataManagementAPI; +import org.eclipse.tractusx.edc.tests.util.Timeouts; + +@Value +public class Transfer { + + String id; + + public void waitUntilComplete(DataManagementAPI dataManagementAPI) { + await() + .pollDelay(Duration.ofMillis(2000)) + .atMost(Timeouts.FILE_TRANSFER) + .until(() -> isComplete(dataManagementAPI)); + } + + public boolean isComplete(DataManagementAPI dataManagementAPI) throws IOException { + var transferProcess = dataManagementAPI.getTransferProcess(id); + if (transferProcess == null) return false; + + var state = transferProcess.getState(); + + return state == TransferProcessState.COMPLETED || state == TransferProcessState.ERROR; + } +} diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/TransferProcessState.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/TransferProcessState.java index dfb567e73..4f5612334 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/TransferProcessState.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/data/TransferProcessState.java @@ -21,5 +21,6 @@ public enum TransferProcessState { COMPLETED, + ERROR, UNKNOWN } diff --git a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/features/ParameterTypes.java b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/features/ParameterTypes.java index 7995e8d89..c353ec2fb 100644 --- a/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/features/ParameterTypes.java +++ b/edc-tests/src/test/java/org/eclipse/tractusx/edc/tests/features/ParameterTypes.java @@ -1,3 +1,23 @@ +/* + * 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.tests.features; import io.cucumber.java.ParameterType; diff --git a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractNegotiation.feature b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractNegotiation.feature index a7ef682a5..623384d93 100644 --- a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractNegotiation.feature +++ b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractNegotiation.feature @@ -35,7 +35,24 @@ Feature: Contract Negotiation And 'Plato' has the following contract definitions | id | access policy | contract policy | asset | | contract-definition-1 | policy-1 | policy-pay-me | asset-1 | - When 'Sokrates' sends 'Plato' a counter offer without constraints + When 'Sokrates' sends 'Plato' an offer without constraints | definition id | asset id | | contract-definition-1 | asset-1 | Then the negotiation is declined + + + Scenario: An offer is rejected + Given 'Plato' has the following assets + | id | description | + | asset-1 | Example Asset | + And 'Plato' has the following policies + | id | action | payMe | + | policy-1 | USE | | + | policy-pay-me | USE | 1000 | + And 'Plato' has the following contract definitions + | id | access policy | contract policy | asset | validity | + | contract-definition-1 | policy-1 | policy-pay-me | asset-1 | 1 | + When 'Sokrates' sends 'Plato' an offer without constraints + | definition id | asset id | + | contract-definition-1 | asset-1 | + Then the negotiation is declined \ No newline at end of file diff --git a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractOffers.feature b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractOffers.feature index 553258322..3a07016aa 100644 --- a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractOffers.feature +++ b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/ContractOffers.feature @@ -83,7 +83,7 @@ Feature: Contract Offers Then the catalog contains the following offers | source definition | asset | | contract-definition-2 | asset-1 | - #| contract-definition-1 | asset-1 | # Issue https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/1764 + #| contract-definition-1 | asset-1 | # Issue https://github.com/eclipse-edc/Connector/issues/1764 Scenario: Catalog with 1000 Contract Offers Given 'Plato' has '1000' assets @@ -94,4 +94,4 @@ Feature: Contract Offers | id | access policy | contract policy | | contract-definition-1 | policy-1 | policy-1 | When 'Sokrates' requests the catalog from 'Plato' -#Then the catalog contains '1000' offers # Issue https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/2064 +#Then the catalog contains '1000' offers # Issue https://github.com/eclipse-edc/Connector/issues/2064 diff --git a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/HttpProxyDataTransfer.feature b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/HttpProxyDataTransfer.feature new file mode 100644 index 000000000..1fcb37642 --- /dev/null +++ b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/HttpProxyDataTransfer.feature @@ -0,0 +1,61 @@ +# +# 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 +# + +Feature: HttpProxy Data Transfer + + Background: The Connector State + Given 'Plato' has an empty database + Given 'Sokrates' has an empty database + + Scenario: Connector transfers data via HttpProxy + Given 'Plato' has a http proxy assets + | id | description | baseUrl | + | asset-1 | http proxy transfer asset | http://localhost:8081/api/health | + And 'Plato' has the following policies + | id | action | + | policy-1 | USE | + And 'Plato' has the following contract definitions + | id | access policy | contract policy | asset | + | contract-definition-1 | policy-1 | policy-1 | asset-1 | + When 'Sokrates' negotiates the contract successfully with 'Plato' + | contract offer id | asset id | policy id | + | contract-definition-1 | asset-1 | policy-1 | + And 'Sokrates' initiates HttpProxy transfer from 'Plato' + | asset id | receiverHttpEndpoint | + | asset-1 | http://backend:8080 | + Then the backend application of 'Sokrates' has received data + + Scenario: Connector transfers data via HttpProxy, data on provider side requires oauth2 authentication + Given 'Plato' has a http proxy assets + | id | description | baseUrl | oauth2 token url | oauth2 client id | oauth2 client secret | oauth2 scope | + | asset-1 | http proxy transfer asset | http://localhost:8081/api/health | http://ids-daps:4567 | data-plane-oauth2 | supersecret | openid | + And 'Plato' has the following policies + | id | action | + | policy-1 | USE | + And 'Plato' has the following contract definitions + | id | access policy | contract policy | asset | + | contract-definition-1 | policy-1 | policy-1 | asset-1 | + When 'Sokrates' negotiates the contract successfully with 'Plato' + | contract offer id | asset id | policy id | + | contract-definition-1 | asset-1 | policy-1 | + And 'Sokrates' initiates HttpProxy transfer from 'Plato' + | asset id | + | asset-1 | + Then the backend application of 'Sokrates' has received data diff --git a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/S3FileTransfer.feature b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/S3FileTransfer.feature index 74a77f5b3..fa96f9a8f 100644 --- a/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/S3FileTransfer.feature +++ b/edc-tests/src/test/resources/org/eclipse/tractusx/edc/tests/features/S3FileTransfer.feature @@ -28,10 +28,10 @@ Feature: S3 File Transfer Scenario: Request file transfer via S3 Given 'Plato' has the following S3 assets | id | description | data_address_type | data_address_s3_bucket_name | data_address_s3_key_name | data_address_s3_region | - | asset-1 | Example Asset | AmazonS3 | sourcebucket | testfile | us-east-1 | + | asset-1 | Example Asset | AmazonS3 | sourcebucket | testfile | us-east-1 | And 'Plato' has the following policies - | id | action | payMe | - | policy-1 | USE | | + | id | action | payMe | + | policy-1 | USE | | And 'Plato' has the following contract definitions | id | access policy | contract policy | asset | | contract-definition-1 | policy-1 | policy-1 | asset-1 | @@ -42,7 +42,7 @@ Feature: S3 File Transfer Then 'Sokrates' negotiates the contract successfully with 'Plato' | contract offer id | asset id | policy id | | contract-definition-1 | asset-1 | policy-1 | - Then 'Sokrates' initiate transfer process from 'Plato' - | data_address_type | data_address_s3_bucket_name | data_address_s3_key_name | data_address_s3_region | - | AmazonS3 | destinationbucket | testfile | us-east-1 | + Then 'Sokrates' initiate S3 transfer process from 'Plato' + | data_address_s3_bucket_name | data_address_s3_key_name | data_address_s3_region | + | destinationbucket | testfile | us-east-1 | Then 'Sokrates' has a storage bucket called 'destinationbucket' with transferred file called 'testfile' diff --git a/pom.xml b/pom.xml index 0b4be61bc..76d3cb966 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.eclipse.tractusx.edc product-edc-parent - 0.2.0 + 0.3.0 pom product-edc @@ -52,17 +52,16 @@ UTF-8 - 3.3.0 - + 3.5.0 3.3.0 - 2.28.0 + 2.32.0 3.1.0 3.4.1 2.0.0 2.22.2 - 3.0.0 + 3.1.0 3.2.1 - 3.0.0-M7 + 3.0.0-M8 3.10.1 3.3.0 1.18.20.0 @@ -73,27 +72,27 @@ 0.0.1-SNAPSHOT - 0.0.1-20221006-SNAPSHOT - 1.2.8 - 42.5.1 - 9.8.3 - 8.23 - 2.14.0-rc2 + 0.0.1-20230220-SNAPSHOT + 1.2.9 + 42.5.3 + 9.14.1 + 9.30.1 - 5.9.1 + 5.9.2 1.8.2 - 7.9.0 + 7.11.1 5.3.0 1.1.0 - 4.9.0 - 1.18.24 + 5.1.1 + 1.18.26 1.70 4.9.3 1.17.6 2.0.3 1.4.5 2.2 + 2.9.2 catenax-ng @@ -365,7 +364,22 @@ org.eclipse.tractusx.edc.extensions - custom-jsonld + provision-additional-headers + ${project.version} + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-client + ${project.version} + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-common + ${project.version} + + + org.eclipse.tractusx.edc.extensions + transferprocess-sftp-provisioner ${project.version} @@ -461,969 +475,683 @@ logback-core ${ch.qos.logback.logback-core.version} + + org.apache.sshd + sshd-core + ${org.apache.sshd.version} + + + org.apache.sshd + sshd-sftp + ${org.apache.sshd.version} + - org.eclipse.dataspaceconnector - apache-commons-pool-sql - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + sql-pool-apache-commons + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc api-configuration - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc api-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc asset-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc assetindex-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc asset-index-sql - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc auth-basic - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc auth-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc auth-tokenbased - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc aws-s3 - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc aws-test - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc azure-eventgrid - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc azure-eventgrid-config - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc azure-test - ${org.eclipse.dataspaceconnector.version} - - - org.eclipse.dataspaceconnector - azure-vault - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc + vault-azure + ${org.eclipse.edc.version} + + + org.eclipse.edc blob-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc blob-operator - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc blob-provision - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc blobstorage - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc catalog - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc catalog-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc catalog-cache - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc catalog-spi - ${org.eclipse.dataspaceconnector.version} - - - org.eclipse.dataspaceconnector - common-sql - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc + sql-core + ${org.eclipse.edc.version} + + + org.eclipse.edc common-util - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc + aggregate-service-spi + ${org.eclipse.edc.version} + + + org.eclipse.edc contract - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contractagreement-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contractdefinition-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contract-definition-store-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - contractdefinition-store-sql - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + contract-definition-store-sql + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contractnegotiation-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contract-negotiation-store-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - contractnegotiation-store-sql - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + contract-negotiation-store-sql + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc contract-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc control-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc control-plane-core - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - core-base - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + connector-core + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - core-boot - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + boot + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc core-defaults - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - core-micrometer - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + micrometer-core + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc core-policy - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc core-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc cosmos-common - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc dataloading - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - data-management-api - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + management-api + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} + + + org.eclipse.edc + data-plane-core + ${org.eclipse.edc.version} + + + org.eclipse.edc + data-plane-util + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-azure-storage - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-framework - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-http - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - data-plane-s3 - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + data-plane-http-oauth2 + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc + data-plane-aws-s3 + ${org.eclipse.edc.version} + + + org.eclipse.edc data-plane-selector-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-client - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc data-plane-selector-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector - data-plane-spi - ${org.eclipse.dataspaceconnector.version} - - - org.eclipse.dataspaceconnector - data-plane-transfer - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - data-plane-transfer-client - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + data-plane-spi + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - data-plane-transfer-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - + org.eclipse.edc + transfer-data-plane-spi + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - data-plane-transfer-sync - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + transfer-data-plane + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc decentralized-identity - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc dummy-credentials-verifier - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc fcc-node-directory-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc federated-catalog-spi - ${org.eclipse.dataspaceconnector.version} - - - org.eclipse.dataspaceconnector - filesystem-configuration - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc + configuration-filesystem + ${org.eclipse.edc.version} + + + org.eclipse.edc filesystem-vault - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc http - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc http-provisioner - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - http-receiver - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + transfer-pull-http-dynamic-receiver + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - iam-daps - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + oauth2-daps + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc iam-mock - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-common-test - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-did-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-did-crypto - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-did-service - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-did-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc identity-did-web - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-configuration - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-multipart-dispatcher-v1 - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-api-multipart-endpoint-v1 - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - ids-api-transform-v1 - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + ids-transform-v1 + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-policy - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc ids-token-validation - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - jdk-logger-monitor - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + ids-jsonld-serdes + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - ids-jsonld-serdes - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + monitor-jdk-logger + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc jersey - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc jersey-micrometer - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc jetty - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc jetty-micrometer - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc lease-sql - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc oauth2-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc oauth2-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc jwt-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc jwt-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - observability-api - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + api-observability + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc policydefinition-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc policy-engine - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc policy-engine-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc policy-evaluator - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc policy-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc policy-store-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector - policy-store-sql - ${org.eclipse.dataspaceconnector.version} + org.eclipse.edc + policy-definition-store-sql + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc registration-service - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc registration-service-api - ${org.eclipse.dataspaceconnector.version} - - - org.eclipse.dataspaceconnector - s3-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} + + + + + - org.eclipse.dataspaceconnector + org.eclipse.edc s3-operator - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc s3-provision - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc sql - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc state-machine-lib - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc token-generation-lib - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc token-validation-lib - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-atomikos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-datasource-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc transaction-local - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transaction-spi - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc transfer - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-functions-core - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-functions-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transferprocess-api - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-process-store-cosmos - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-process-store-sql - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transfer-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc transport-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc web-spi - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} - org.eclipse.dataspaceconnector + org.eclipse.edc junit - ${org.eclipse.dataspaceconnector.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - - org.eclipse.dataspaceconnector + ${org.eclipse.edc.version} + + + org.eclipse.edc junit - ${org.eclipse.dataspaceconnector.version} + ${org.eclipse.edc.version} test-fixtures - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - @@ -1448,13 +1176,6 @@ pom import - - com.fasterxml.jackson - jackson-bom - ${com.fasterxml.jackson.version} - pom - import - @@ -1463,6 +1184,12 @@ ${org.testcontainers.version} test + + org.testcontainers + testcontainers + ${org.testcontainers.version} + test + io.cucumber cucumber-java @@ -1542,7 +1269,7 @@ org.glassfish.jaxb jaxb-runtime - 4.0.1 + 4.0.2