From 835c4bcf75d90df96fc8e79297aff2b65d1e1482 Mon Sep 17 00:00:00 2001 From: Kamil Czaja <46053356+kamilczaja@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:02:35 +0200 Subject: [PATCH 1/2] chore: sync crawler db migration with ap (#997) --- .../resources/db-crawler/migration/V9__Broker_Integration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/catalog-crawler/catalog-crawler-db/src/main/resources/db-crawler/migration/V9__Broker_Integration.sql b/extensions/catalog-crawler/catalog-crawler-db/src/main/resources/db-crawler/migration/V9__Broker_Integration.sql index a93987578..25b2e4ca3 100644 --- a/extensions/catalog-crawler/catalog-crawler-db/src/main/resources/db-crawler/migration/V9__Broker_Integration.sql +++ b/extensions/catalog-crawler/catalog-crawler-db/src/main/resources/db-crawler/migration/V9__Broker_Integration.sql @@ -104,4 +104,4 @@ create table crawler_execution_time_measurement error_status measurement_error_status not null ); - +alter type component_type add value 'CATALOG_CRAWLER'; From 329bfc4d4d15665a6228ce1c2fe7c29e70c81f5e Mon Sep 17 00:00:00 2001 From: Richard Treier Date: Mon, 15 Jul 2024 10:01:46 +0300 Subject: [PATCH 2/2] chore: prepare release (#999) --- .env | 6 +- .github/ISSUE_TEMPLATE/release.md | 5 +- CHANGELOG.md | 50 ++++- SUMMARY.md | 2 - .../catalog-crawler-production/README.md | 2 +- .../goals/development/README.md | 2 +- .../goals/local-demo/4.2.0/README.md | 63 ------ .../goals/local-demo/README.md | 4 +- .../goals/production/4.2.0/README.md | 182 ------------------ .../production/4.2.0/public-endpoints.yaml | 30 --- .../goals/production/README.md | 2 - extensions/catalog-crawler/README.md | 7 +- .../api/usecase/UseCaseApiWrapperTest.java | 2 +- 13 files changed, 61 insertions(+), 296 deletions(-) delete mode 100644 docs/deployment-guide/goals/local-demo/4.2.0/README.md delete mode 100644 docs/deployment-guide/goals/production/4.2.0/README.md delete mode 100644 docs/deployment-guide/goals/production/4.2.0/public-endpoints.yaml diff --git a/.env b/.env index e415c2283..1d0ed94d1 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # Env variables for docker-compose.yaml -EDC_IMAGE=ghcr.io/sovity/edc-dev:8.1.0 -TEST_BACKEND_IMAGE=ghcr.io/sovity/test-backend:8.1.0 -EDC_UI_IMAGE=ghcr.io/sovity/edc-ui:3.2.2 +EDC_IMAGE=ghcr.io/sovity/edc-dev:9.0.0 +TEST_BACKEND_IMAGE=ghcr.io/sovity/test-backend:9.0.0 +EDC_UI_IMAGE=ghcr.io/sovity/edc-ui:4.0.0 EDC_UI_ACTIVE_PROFILE=sovity-open-source diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md index 466f65ea1..66e703df3 100644 --- a/.github/ISSUE_TEMPLATE/release.md +++ b/.github/ISSUE_TEMPLATE/release.md @@ -32,14 +32,15 @@ Feel free to edit this release checklist in-progress depending on what tasks nee - [ ] Add a clean `Unreleased` version. - [ ] Add the version to the old section. - [ ] Add the current date to the old version. + - [ ] Add all relevant changelog entries from the newer EDC UI release(s), merge and reword them. + - [ ] Add all deployment migration notes from the newer EDC UI release(s), merge and reword them. - [ ] Check the commit history for commits that might be product-relevant and thus should be added to the changelog. Maybe they were forgotten. - [ ] Write or review the `Deployment Migration Notes` section, check the commit history for changed / added configuration properties. + - [ ] Reorder, reword or combine changelog entries from a product perspective for consistency. - [ ] Write or review a release summary. - [ ] Write or review the compatible versions section. - - [ ] Add a link to the EDC UI Release to the "EDC UI" section. - - [ ] Add a link to the EDC UI Release Deployment Migration Notes from the Deployment Migration section if the EDC UI has Deployment Migration Notes. - [ ] Remove empty sections from the patch notes. - [ ] Replace the existing `docker-compose.yaml` with `docker-compose-dev.yaml`. - [ ] Set the version for `EDC_IMAGE` of diff --git a/CHANGELOG.md b/CHANGELOG.md index 06b4f7b35..4c677656c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,15 +11,46 @@ please see [changelog_updates.md](docs/dev/changelog_updates.md). #### Major Changes -- The Broker has been removed in favor of the Authority Portal and the new Deployment Unit, the "Data Catalog Crawler": +#### Minor Changes + +#### Patch Changes + +### Deployment Migration Notes + +#### Compatible Versions + +- Connector Backend Docker Images: + - Dev EDC: `ghcr.io/sovity/edc-dev:{{ VERSION }}` + - sovity EDC CE: `ghcr.io/sovity/edc-ce:{{ VERSION }}` + - MDS EDC CE: `ghcr.io/sovity/edc-ce-mds:{{ VERSION }}` + - Dev Catalog Crawler: `ghcr.io/sovity/catalog-crawler-dev:{{ VERSION }}` + - Catalog Crawler CE: `ghcr.io/sovity/catalog-crawler-ce:{{ VERSION }}` +- Connector UI Docker Image: `ghcr.io/sovity/edc-ui:{{ UI VERSION }}` + +## [9.0.0] - 2024-07-15 + +### Overview + +MDS 2.2 intermediate release + +### Detailed Changes + +#### Major Changes + +- API Wrapper UI API: Data sources are now well-typed. +- The Broker has been removed in favor of the Authority Portal: + - A new Deployment Unit, the ["Data Catalog Crawler"](extensions/catalog-crawler/README.md), has been added. - Each "Data Catalog Crawler" connects to an existing Authority Portal Deployment's DB. - Each "Data Catalog Crawler" is responsible for crawling exactly one environment. - The Data Catalog functionality of the Broker has been integrated into the Authority Portal. -- API Wrapper UI API: Moved to well-typed data sources, breaking changes to the asset model and API. #### Minor Changes -- Add the SovityMessenger extension +- Additional ToS check during contract negotiation via the UI. +- "On Request" Data Offers + - Full support in the API Wrapper UI API + - Create support in the Connector UI. Full support in the UI is still in progress. +- Added the `sovity-messenger` extension for easy Connector-to-Connector messages. #### Patch Changes @@ -28,14 +59,23 @@ please see [changelog_updates.md](docs/dev/changelog_updates.md). ### Deployment Migration Notes - Connector: - - The database migration system has been moved from multiple migration history tables to a single one. Although this - process has been extensively tested in the enterprise edition already, it should be tested once more on a copy of a productive connector. + - The database migration system has been moved from multiple migration history tables to a single one. - Broker: - The broker has been removed. For Authority Portal users, please check out the new [Data Catalog Crawler Productive Deployment Guide](docs/deployment-guide/goals/catalog-crawler-production/README.md). - Any previous broker deployment's database is not required anymore. - Please care that only some environment variables look similar. It is recommended to create fresh deployments. +#### Compatible Versions + +- Connector Backend Docker Images: + - Dev EDC: `ghcr.io/sovity/edc-dev:9.0.0` + - sovity EDC CE: `ghcr.io/sovity/edc-ce:9.0.0` + - MDS EDC CE: `ghcr.io/sovity/edc-ce-mds:9.0.0` + - Dev Catalog Crawler: `ghcr.io/sovity/catalog-crawler-dev:9.0.0` + - Catalog Crawler CE: `ghcr.io/sovity/catalog-crawler-ce:9.0.0` +- Connector UI Docker Image: `ghcr.io/sovity/edc-ui:4.0.0` + ## [8.1.0] - 2024-06-14 ### Overview diff --git a/SUMMARY.md b/SUMMARY.md index ea8baafc3..1f70b94fc 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -19,8 +19,6 @@ * [Deployment Goal: Local Demo](./docs/deployment-guide/goals/local-demo) * [Deployment Goal: Development](./docs/deployment-guide/goals/development) * [Deployment Goal: Production](./docs/deployment-guide/goals/production) - * [Productive Deployment Guide](./docs/deployment-guide/goals/production) - * [Productive Deployment Guide 4.2.0 / MS8 / MDS 1.2](docs/deployment-guide/goals/production/4.2.0/README.md) ## Developer Documentation diff --git a/docs/deployment-guide/goals/catalog-crawler-production/README.md b/docs/deployment-guide/goals/catalog-crawler-production/README.md index 5bbbddecf..2136c6bc6 100644 --- a/docs/deployment-guide/goals/catalog-crawler-production/README.md +++ b/docs/deployment-guide/goals/catalog-crawler-production/README.md @@ -51,5 +51,5 @@ EDC_OAUTH_CERTIFICATE_ALIAS: 1 EDC_OAUTH_PRIVATE_KEY_ALIAS: 1 ``` -All pre-configured config values for either the catalog crawler can be found +Additional available configuration options can be found in [launcher/.env.catalog-crawler](../../../../launchers/.env.catalog-crawler). diff --git a/docs/deployment-guide/goals/development/README.md b/docs/deployment-guide/goals/development/README.md index b8af69d87..09239430c 100644 --- a/docs/deployment-guide/goals/development/README.md +++ b/docs/deployment-guide/goals/development/README.md @@ -16,7 +16,7 @@ the [docker-compose-dev.yaml](../../../../docker-compose-dev.yaml), execute: Launch two sovity EDC CE Connectors -Launch two MDS EDC CE +Launch two MDS EDC CE Connectors diff --git a/docs/deployment-guide/goals/local-demo/4.2.0/README.md b/docs/deployment-guide/goals/local-demo/4.2.0/README.md deleted file mode 100644 index 9880da6a9..000000000 --- a/docs/deployment-guide/goals/local-demo/4.2.0/README.md +++ /dev/null @@ -1,63 +0,0 @@ -Deployment Goal: Local Demo -======== -> This is for an old major version sovity EDC CE 4.2.0. [Go back](../README.md) - -> On how to deploy a productive connector with joining an existing Data Space, please refer -> to our [Productive Deployment Guide](../../production/4.2.0/README.md). - -## Quick Start - -To quickly start using our sovity EDC CE or MDS EDC CE, we offer a quick -start [docker-compose.yaml](https://github.com/sovity/edc-ce/blob/v4.2.0/docker-compose.yaml) file. - - - - - - - - - - - - - - -
Launch two sovity EDC CE ConnectorsLaunch two MDS EDC CE
- -```shell script -# Run with Bash from the root directory of the project -# Use the release tag 4.2.0: https://github.com/sovity/edc-ce/releases/tag/v4.2.0 - -# Log-In to the Github Container Registry -docker login ghcr.io - -# Start sovity EDC Connectors -docker compose up -``` - - - -```shell script -# Run with Bash from the root directory of the project -# Use the release tag 4.2.0: https://github.com/sovity/edc-ce/releases/tag/v4.2.0 - -# Log-In to the Github Container Registry -docker login ghcr.io - -# Start MDS EDC Connectors -EDC_UI_ACTIVE_PROFILE=mds-open-source docker compose up -``` - -
- -## Quick Start: Default Configuration - -The default configuration launches two local EDC Connectors with the following credentials: - -| | First Connector | Second Connector | -|---------------------|-----------------------------------------------------------------------|:--------------------------------------------------------------------------------| -| Homepage | http://localhost:11000 | http://localhost:22000 | -| Management Endpoint | http://localhost:11002/api/v1/management | http://localhost:22002/api/v1/management | -| Management API Key | `ApiKeyDefaultValue` | `ApiKeyDefaultValue` | -| Connector Endpoint | http://edc:11003/api/v1/ids/data
Requires Docker Compose Network | http://edc2:22003/api/v1/ids/data
Requires Docker Compose Network | diff --git a/docs/deployment-guide/goals/local-demo/README.md b/docs/deployment-guide/goals/local-demo/README.md index d52d6c1f5..7d15efd51 100644 --- a/docs/deployment-guide/goals/local-demo/README.md +++ b/docs/deployment-guide/goals/local-demo/README.md @@ -1,8 +1,6 @@ Deployment Goal: Local Demo ======== -> This is for our latest version. There is another guide for [4.2.0](4.2.0/README.md). - > On how to deploy a productive connector with joining an existing Data Space, please refer > to our [Productive Deployment Guide](../production/README.md). @@ -15,7 +13,7 @@ start [docker-compose.yaml](../../../../docker-compose.yaml) file. Launch two sovity EDC CE Connectors -Launch two MDS EDC CE +Launch two MDS EDC CE Connectors diff --git a/docs/deployment-guide/goals/production/4.2.0/README.md b/docs/deployment-guide/goals/production/4.2.0/README.md deleted file mode 100644 index ee9f58d48..000000000 --- a/docs/deployment-guide/goals/production/4.2.0/README.md +++ /dev/null @@ -1,182 +0,0 @@ -Deployment Goal: Production -======== - -> This is for an old major version sovity EDC CE 4.2.0. [Go back](../README.md) - -## About this Guide - -This is a productive deployment guide for self-hosting a functional sovity CE EDC Connector or MDS CE EDC Connector. - -## Requirements - -A productive EDC Connector deployment has strict requirements, with slight errors in configuration already causing -contract negotiations / data transfer to fail. - -In general a productive EDC Connector requires a DAPS Server, DAPS Credentials, a reverse proxy configured in detail due -to technical reasons, reachability via the internet and well-defined URLs across all configurations. - -## Deployment Units - -To deploy an EDC multiple deployment units must be deployed and configured. - -| Deployment Unit | Version / Details | -|----------------------------------------------------------------|------------------------------------------------------------------------------------------------| -| An Auth Proxy / Auth solution of your choice. | (deployment specific, required to secure UI and management API) | -| Reverse Proxy that merges the UI+Backend and removes the ports | (deployment specific) | -| Postgresql | 13 or compatible version | -| EDC Backend | edc-ce or edc-ce-mds, see [CHANGELOG.md](../../../../../CHANGELOG.md) for compatible versions. | -| EDC UI | edc-ui, see [CHANGELOG.md](../../../../../CHANGELOG.md) for compatible versions. | - -## Configuration - -### Reverse Proxy Configuration - -To make the deployment work, the connector needs to be exposed to the internet. Connector-to-Connector -communication is asynchronous and done with authentication via the DAPS. Thus, if the target connector cannot reach -your connector under its self-declared URLs, contract negotiation and transfer processes will fail. - -The EDC Backend opens up multiple ports with different functionalities. They are expected to be merged by a reverse -proxy (at least the protocol endpoint needs to be). - -- The sovity EDC Connector is meant to be deployed with a reverse proxy merging the following ports: - - The UI's `80` port. Henceforth, called the UI. - - The Backend's `11002` port. Henceforth, called the Management API. - - The Backend's `11003` port. Henceforth, called the Protocol API. -- The mapping should look like this: - - `/api/v1/ids` -> `edc:11003/api/v1/ids` - - `/api/v1/management` -> `edc:11002/api/v1/management` - - All other requests should be mapped to `edc-ui:80` -- Regarding TLS/HTTPS: - - All endpoints need to be secured by TLS/HTTPS. A productive connector won't work without it. - - The UI and the Management API should have HTTP to HTTPS redirects. - - The Protocol API must allow HTTP traffic to pass through. This is due to some loopback requests - mistakenly using HTTP instead of HTTPS that would otherwise be blocked or have their credentials wiped. -- Regarding Authentication: - - The UI and the Management API need to be secured by an auth proxy. Otherwise, access to either would mean full - control of the application. - - The backend's `11003` port needs to be unsecured. Authentication between connectors is done via the Data Space - Authority / DAPS and the configured certificates. -- Exposing to the internet: - - The Protocol API must be reachable via the internet. The required endpoints can be found in - this [public-endpoints.yaml](public-endpoints.yaml) - - Exposing the UI or the Management Endpoint to the internet requires an intermediate auth proxy, we recommend restricting the access to the Management Endpoint to your internal network. -- Security: - - Limit the header size in the proxy so that only a certain number of API Keys can be tested with one API-request (e.g. limit to 8kb). - - Limit the access rate to the API endpoints and monitor access for attacks like brute force attacks. - -## EDC UI Configuration - -A sovity EDC UI deployment requires the following config properties: - -```yaml -# Active Profile -EDC_UI_ACTIVE_PROFILE: sovity-open-source (or mds-open-source) - -# Management API URL -EDC_UI_DATA_MANAGEMENT_API_URL: https://[EDC URL]/api/v1/management - -# Management API Key -EDC_UI_DATA_MANAGEMENT_API_KEY: "ApiKeyDefaultValue" - -# Enable config fetching from the backend -EDC_UI_CONFIG_URL: "edc-ui-config" -``` - -## EDC Backend Configuration - -A sovity EDC CE or MDS EDC CE Backend deployment requires: - -- A running DAPS -- (MDS Only) A running Clearing House -- DAPS Access - and [a generated SKI/AKI pair and .jks file](#faq) -- The following configuration properties - -> [!WARNING] -> Please be careful with overriding any of the ENV Vars set in our [launchers/.env.connector](../../../../../launchers/.env.connector). -> Our defaults will respect overrides, and the Core EDC ENV Vars can be in some cases sensitive to edge cases such as -> trailing slashes. - -```yaml -# Connector Host Name -MY_EDC_FQDN: "my-edc-deployment1.example.com" - -# Connector Technical Name -MY_EDC_NAME_KEBAB_CASE: "example-connector" - -# Connector Localized Name / Title -MY_EDC_TITLE: "EDC Connector" - -# Connector Description Text -MY_EDC_DESCRIPTION: "sovity Community Edition EDC Connector" - -# Connector Curator -# The company using the EDC Connector, configuring data offers, etc. -MY_EDC_CURATOR_URL: "https://example.com" -MY_EDC_CURATOR_NAME: "Example GmbH" - -# Database Connection -MY_EDC_JDBC_URL: jdbc:postgresql://postgresql:5432/edc -MY_EDC_JDBC_USER: edc -MY_EDC_JDBC_PASSWORD: edc - -# Management API Key -# high entropy recommended when configuring the value (length, complexity, e.g. [a-zA-Z0-9+special chars]{32+ chars}) -EDC_API_AUTH_KEY: ApiKeyDefaultValue - -# Connector Maintainer -# The company hosting the EDC Connector -MY_EDC_MAINTAINER_URL: "https://sovity.de" -MY_EDC_MAINTAINER_NAME: "sovity GmbH" - -# (MDS Only) Clearing House -EDC_CLEARINGHOUSE_LOG_URL: 'https://clearing.test.mobility-dataspace.eu/messages/log' - -# DAPS URL -EDC_OAUTH_TOKEN_URL: 'https://daps.test.mobility-dataspace.eu/token' -EDC_OAUTH_PROVIDER_JWKS_URL: 'https://daps.test.mobility-dataspace.eu/jwks.json' - -# DAPS Credentials -EDC_OAUTH_CLIENT_ID: '_your SKI/AKI_' -EDC_KEYSTORE: '_path to .jks file in container_' -EDC_KEYSTORE_PASSWORD: '_your keystore password_' -EDC_OAUTH_CERTIFICATE_ALIAS: 1 -EDC_OAUTH_PRIVATE_KEY_ALIAS: 1 -``` - -## FAQ - -### What should the client ID entry look like? - -Example of a client-ID entry: - -`EDC_OAUTH_CLIENT_ID: 7X:7Y:...:B2:94:keyid:6A:2B:...:28:80` - -### How do you get the SKI and AKI of a p12 and how do you convert it to a jks? - -You can use a script (if you're on WSL or Linux) to generate the SKI, AKI and jks file. - -1. Make sure you're on Linux or on a bash console (e.g. WSL or Git Bash) and have openssl and keytool installed -2. Navigate in the console to the resources/docs directory -3. Run the [script](../generate_ski_aki.sh) `./generate_ski_aki.sh [filepath].p12 [password]` and - substitute `[filepath]` to the p12 certificate - filepath and `[password]` to the certificate password -4. The jks file will be generated in the same folder as your p12 file and the SKI/AKI combination is printed out in the - console. - Copy the SKI:AKI combination and use it to start the EDC (optionally also save it to your password manager). -5. The generated `.jks` file needs to be mounted into your productive running container. - -### Can I run a connector locally and consume data from an online connector? - -No, locally run connectors cannot exchange data with online connectors. A connector must have a proper URL + -configuration and be accessible from the data provider via REST calls. - -### (MDS Only) Can I disable the ClearingHouse-Client-Extensions dynamically? - -Yes, if the two extensions are included, they can still be disabled via properties. -The default settings can be found in `docker-compose.yaml` and can be changed there. - -```yaml -# Extension Configuration -CLEARINGHOUSE_CLIENT_EXTENSION_ENABLED: true # enabled by default -``` diff --git a/docs/deployment-guide/goals/production/4.2.0/public-endpoints.yaml b/docs/deployment-guide/goals/production/4.2.0/public-endpoints.yaml deleted file mode 100644 index 421213278..000000000 --- a/docs/deployment-guide/goals/production/4.2.0/public-endpoints.yaml +++ /dev/null @@ -1,30 +0,0 @@ -openapi: 3.0.1 -info: - title: sovity EDC CE Public Endpoints - description: Required publicly exposed EDC Connector endpoints - version: 4.2.0 -servers: - - url: https://[MY_EDC_FQDN] -tags: - - name: Protocol API - description: Port 11003 on the Backend Container. -paths: - /api/v1/ids/data: - post: - tags: - - Protocol API - description: IDS Message Endpoint - requestBody: - content: - multipart/form-data: - schema: - type: object - responses: - '200': - description: OK or empty response if token validation failed - content: - multipart/form-data: - schema: - type: object - - diff --git a/docs/deployment-guide/goals/production/README.md b/docs/deployment-guide/goals/production/README.md index be879d009..b679811e6 100644 --- a/docs/deployment-guide/goals/production/README.md +++ b/docs/deployment-guide/goals/production/README.md @@ -1,7 +1,5 @@ # Productive Deployment Guide -> This is for our latest version. There is another guide for [4.2.0](4.2.0/README.md). - ## About this Guide This is a productive deployment guide for self-hosting a functional sovity CE EDC Connector or MDS CE EDC Connector. diff --git a/extensions/catalog-crawler/README.md b/extensions/catalog-crawler/README.md index 28de136de..881dbbf40 100644 --- a/extensions/catalog-crawler/README.md +++ b/extensions/catalog-crawler/README.md @@ -18,6 +18,7 @@ The catalog crawler is a deployment unit depending on an existing Authority Portal's database: +- It is a modified EDC connector with the task to crawl the other connector's public data offers. - It periodically checks the Authority Portal's connector list for its environment. - It crawls the given connectors in regular intervals. - It writes the data offers and connector statuses back into the Authority Portal DB. @@ -27,9 +28,13 @@ The catalog crawler is a deployment unit depending on an existing Authority Port The Authority Portal uses a non-EDC stack, and the EDC stack cannot handle multiple sources of authority at once. -With the `DB -> UI` part of the broker having been moved to the Authority Portal, only the `Catalog -> DB` part remains as the Catalog Crawler, +With the `DB -> UI` part of the broker having been moved to the Authority Portal, only the `Catalog -> DB` part remains as the Catalog Crawler, as it requires Connector-to-Connector IAM within the given Dataspace. +## Deployment + +Please see the [Catalog Crawler Productive Deployment Guide](../../docs/deployment-guide/goals/catalog-crawler-production/README.md) for more information. + ## License Apache License 2.0 - see [LICENSE](../../LICENSE) diff --git a/extensions/wrapper/wrapper/src/test/java/de/sovity/edc/ext/wrapper/api/usecase/UseCaseApiWrapperTest.java b/extensions/wrapper/wrapper/src/test/java/de/sovity/edc/ext/wrapper/api/usecase/UseCaseApiWrapperTest.java index efcdb4ab6..fc92c506e 100644 --- a/extensions/wrapper/wrapper/src/test/java/de/sovity/edc/ext/wrapper/api/usecase/UseCaseApiWrapperTest.java +++ b/extensions/wrapper/wrapper/src/test/java/de/sovity/edc/ext/wrapper/api/usecase/UseCaseApiWrapperTest.java @@ -47,7 +47,7 @@ @ApiTest @ExtendWith(EdcExtension.class) -public class UseCaseApiWrapperTest { +class UseCaseApiWrapperTest { private EdcClient client; private String assetId1 = "test-asset-1";