diff --git a/.github/workflows/helm-chart-release.yaml b/.github/workflows/helm-chart-release.yaml index dc395d8955..f55d79cfc6 100644 --- a/.github/workflows/helm-chart-release.yaml +++ b/.github/workflows/helm-chart-release.yaml @@ -35,35 +35,9 @@ jobs: echo "::set-output name=current_version::$chartVersion" echo "Exported $chartVersion helm charts version" - get-helm-charts-versions-edc: - outputs: - latest_version: ${{ steps.step1.outputs.latest_version }} - current_version: ${{ steps.step2.outputs.current_version }} - permissions: - contents: write - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Get helm charts latest tag version - id: step1 - run: | - latestVersion=$(git tag | grep "irs-edc-consumer-[1-9]" | tail -1) - echo "::set-output name=latest_version::$latestVersion" - echo "Exported $latestVersion latest helm charts version" - - name: Get helm charts current version - id: step2 - run: | - chartVersion=irs-edc-consumer-$(cat ./charts/edc-consumer/Chart.yaml | grep "version:" | head -1 | cut -d ":" -d " " -f2) - echo "::set-output name=current_version::$chartVersion" - echo "Exported $chartVersion helm charts version" - release: - needs: ["get-helm-charts-versions-irs", "get-helm-charts-versions-edc"] - if: needs.get-helm-charts-versions-irs.outputs.latest_version != needs.get-helm-charts-versions-irs.outputs.current_version || needs.get-helm-charts-versions-edc.outputs.latest_version != needs.get-helm-charts-versions-edc.outputs.current_version + needs: "get-helm-charts-versions-irs" + if: needs.get-helm-charts-versions-irs.outputs.latest_version != needs.get-helm-charts-versions-irs.outputs.current_version # depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions # see: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token permissions: diff --git a/.github/workflows/helm-test.yaml b/.github/workflows/helm-test.yaml index 59986ce60c..74e71b1924 100644 --- a/.github/workflows/helm-test.yaml +++ b/.github/workflows/helm-test.yaml @@ -64,7 +64,7 @@ jobs: - name: Run chart-testing (lint) run: | - ct lint --excluded-charts=edc-consumer --validate-maintainers=false --check-version-increment=false --target-branch ${{ github.event.repository.default_branch }} + ct lint --validate-maintainers=false --check-version-increment=false --target-branch ${{ github.event.repository.default_branch }} - name: Run chart-testing (install) run: | diff --git a/.github/workflows/quality-checks.yaml b/.github/workflows/quality-checks.yaml new file mode 100644 index 0000000000..dadfbc255e --- /dev/null +++ b/.github/workflows/quality-checks.yaml @@ -0,0 +1,16 @@ +name: "Quality Checks (Release Guidelines)" + +on: + workflow_dispatch: # Trigger manually + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + check-quality: + name: Check quality guidelines + uses: eclipse-tractusx/sig-infra/.github/workflows/reusable-quality-checks.yaml@main + secrets: inherit \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 94baf72226..240c7ead13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.3.1] - 2023-07-24 +### Fixed +- Added missing field `businessPartner` for relationship aspect SingleLevelUsageAsBuilt + ## [3.3.0] - 2023-07-20 ### Changed - BPN is now taken from the submodel data while traversing the item graph @@ -287,7 +291,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Unresolved - **Select Aspects you need** You are able to select the needed aspects for which you want to collect the correct endpoint information. -[Unreleased]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.3.0...HEAD +[Unreleased]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.3.1...HEAD +[3.3.1]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.3.0...3.3.1 [3.3.0]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.2.1...3.3.0 [3.2.1]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.2.0...3.2.1 [3.2.0]: https://github.com/eclipse-tractusx/item-relationship-service/compare/3.1.0...3.2.0 diff --git a/charts/edc-consumer/.helmignore b/charts/edc-consumer/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/edc-consumer/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/edc-consumer/CHANGELOG.md b/charts/edc-consumer/CHANGELOG.md deleted file mode 100644 index a5250dceaa..0000000000 --- a/charts/edc-consumer/CHANGELOG.md +++ /dev/null @@ -1,53 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] -### Changed -- Update to EDC 0.4.1 -- Switch to EDC helm chart dependencies -- Moved vault token and api key to secret for control- and data-plane. -- Moved vault token configuration from `configuration.properties` to `edc.vault.hashicorp.token` - -## [1.1.2] - 2023-03-30 -### Added -- Add edc-postgres resource limits - -## [1.1.1] - 2023-03-28 -### Changed -- Renamed `edc.receiver.http.endpoint` to `edc.receiver.http.dynamic.endpoint` -- Renamed `edc.ids.endpoint.audience` to `edc.oauth.endpoint.audience` -- Renamed `ids` endpoint to `protocol` - -## [1.1.0] - 2023-03-24 -### Changed -- Update EDC to 0.3.0 -- Renamed controlplane property `edc.oauth.public.key.alias` to `edc.oauth.certificate.alias` -- Changed data-endpoint `/data` to management-endpoint `/api/v1/management` -- Removed management endpoint from ingress - -## [1.0.4] - 2023-02-28 -### Changed -- Downgrade EDC to 0.1.6 -- Renamed controlplane property `edc.oauth.endpoint.audience` to `edc.ids.endpoint.audience` - -## [1.0.3] - 2023-02-21 -### Changed -- Updated default memory requests - -## [1.0.2] - 2022-12-19 -### Changed -- Updated EDC to 0.2.0 -- Renamed controlplane property `edc.ids.endpoint.audience` to `edc.oauth.endpoint.audience` - -## [1.0.1] - 2022-11-27 -### Fixed -- Fixed the default callback URL config, which resulted in a Helm template error - - -## [1.0.0] - 2022-11-25 -### Added -- Introducing this Helm chart to provide the EDC consumer. - diff --git a/charts/edc-consumer/Chart.yaml b/charts/edc-consumer/Chart.yaml deleted file mode 100644 index 220794ee70..0000000000 --- a/charts/edc-consumer/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: v2 -name: irs-edc-consumer -description: IRS Helm chart for the EDC consumer - - -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -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: 2.0.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.4.1" - -dependencies: - - name: tractusx-connector - repository: https://eclipse-tractusx.github.io/charts/dev - version: 0.4.1 - - condition: postgresql.enabled - alias: edc-postgresql - name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 12.1.6 \ No newline at end of file diff --git a/charts/edc-consumer/LICENSE b/charts/edc-consumer/LICENSE deleted file mode 100644 index f49a4e16e6..0000000000 --- a/charts/edc-consumer/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://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. \ No newline at end of file diff --git a/charts/edc-consumer/values.yaml b/charts/edc-consumer/values.yaml deleted file mode 100644 index 56d0c9326c..0000000000 --- a/charts/edc-consumer/values.yaml +++ /dev/null @@ -1,154 +0,0 @@ -tractusx-connector: - install: - daps: false - vault: false - participant: - id: - controlplane: - ingresses: - - enabled: false - - endpoints: - # -- default api for health checks, should not be added to any ingress - default: - port: 8080 - path: /api - # -- data management api, used by internal users, can be added to an ingress and must not be internet facing - management: - port: 8081 - path: /management - # -- authentication key, must be attached to each 'X-Api-Key' request header - authKey: "" - # -- control api, used for internal control calls. can be added to the internal ingress, but should probably not - control: - port: 8083 - path: /control - # -- ids api, used for inter connector communication and must be internet facing - protocol: - port: 8084 - path: /api/v1/dsp - # -- metrics api, used for application metrics, must not be internet facing - metrics: - port: 9090 - path: /metrics - # -- observability api with unsecured access, must not be internet facing - observability: - port: 8085 - # -- observability api, provides /health /readiness and /liveness endpoints - path: /observability - # -- allow or disallow insecure access, i.e. access without authentication - insecure: true - - internationalDataSpaces: - id: TXDC - description: Tractus-X Eclipse IDS Data Space Connector - title: "" - maintainer: "" - curator: "" - catalogId: TXDC-Catalog - - # Explicitly declared url for reaching the ids api (e.g. if ingresses not used) - url: - ids: "" - - resources: - limits: - cpu: 500m - memory: 1Gi - requests: - cpu: 200m - memory: 512Mi - - dataplane: - ingresses: - - enabled: false - - endpoints: - default: - port: 8080 - path: /api - public: - port: 8081 - path: /api/public - control: - port: 8083 - path: /api/dataplane/control - observability: - port: 8085 - path: /observability - insecure: true - metrics: - port: 9090 - path: /metrics - - # Explicitly declared url for reaching the public api (e.g. if ingresses not used) - url: - public: "" - - resources: - limits: - cpu: 500m - memory: 1Gi - requests: - cpu: 500m - memory: 1Gi - - # URL where the EndpointDataReference callback will be sent to - backendService: - httpProxyTokenReceiverUrl: "" - - ################################ - # EDC Vault/DAPS Configuration # - ################################ - vault: - hashicorp: - url: "" - token: "" - timeout: 30 - healthCheck: - enabled: true - standbyOk: true - paths: - secret: /v1/ - health: /v1/sys/health - secretNames: - transferProxyTokenSignerPrivateKey: - transferProxyTokenSignerPublicKey: - transferProxyTokenEncryptionAesKey: - dapsPrivateKey: - dapsPublicKey: - - daps: - url: "" - clientId: "" - paths: - jwks: /.well-known/jwks.json - token: /token - - ################################## - # EDC Postgres Configuration # - ################################## - postgresql: - auth: - database: "edc" - username: - password: - enabled: true - jdbcUrl: "" - username: "" - password: "" - -############################## -# EDC Postgres Configuration # -############################## -# EDC chart do not support multiple postgres instances in the same namespace at the moment. -# Enable this to use the postgres dependency for when you want to deploy multiple EDC instances in one namespace -postgresql: - enabled: - -edc-postgresql: - auth: - username: - database: edc - postgresPassword: - password: \ No newline at end of file diff --git a/charts/irs-helm/CHANGELOG.md b/charts/irs-helm/CHANGELOG.md index 82cf2e82b8..26c1f99f5d 100644 --- a/charts/irs-helm/CHANGELOG.md +++ b/charts/irs-helm/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [6.3.1] - 2023-07-24 +### Changed +- Update IRS version to 3.3.1 + ## [6.3.0] - 2023-07-20 ### Changed - Update IRS version to 3.3.0 diff --git a/charts/irs-helm/Chart.yaml b/charts/irs-helm/Chart.yaml index 692931f28a..9e09a5fcbe 100644 --- a/charts/irs-helm/Chart.yaml +++ b/charts/irs-helm/Chart.yaml @@ -35,12 +35,12 @@ 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: 6.3.0 +version: 6.3.1 # 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: "3.3.0" +appVersion: "3.3.1" dependencies: - name: common repository: https://charts.bitnami.com/bitnami diff --git a/docs/src/docs/arc42/quality/index.adoc b/docs/src/docs/arc42/quality/index.adoc index f0520d9f94..e757205316 100644 --- a/docs/src/docs/arc42/quality/index.adoc +++ b/docs/src/docs/arc42/quality/index.adoc @@ -10,6 +10,4 @@ The quality scenarios in this section depict the fundamental quality goals as we *Source*: IEEE standard 1061 "Standard for a Software Quality Metrics Methodology" -== List of requirements - -This section will be filled soon. \ No newline at end of file +include::quality-scenarios.adoc[leveloffset=+1] diff --git a/docs/src/docs/arc42/quality/quality-scenarios.adoc b/docs/src/docs/arc42/quality/quality-scenarios.adoc new file mode 100644 index 0000000000..92577cd3d0 --- /dev/null +++ b/docs/src/docs/arc42/quality/quality-scenarios.adoc @@ -0,0 +1,12 @@ += Quality Scenarios + + +|=== +|ID |Scenario |Implementation + +|DS01 +|Any data consumption via the IRS checks if data offers are done according to "Use Case Rahmenbedingungen". + +IRS provides a configuration capability for the "Rahmenbedingungs ID" to be used in a given scenario / deployment. +|"PolicyCheckerService is used to check defined Usage Policies according to the "Rahmenbedingungsbedingungen" which is obligatory for data consumption. +|=== diff --git a/irs-api/src/test/java/org/eclipse/tractusx/irs/aaswrapper/job/delegate/RelationshipDelegateTest.java b/irs-api/src/test/java/org/eclipse/tractusx/irs/aaswrapper/job/delegate/RelationshipDelegateTest.java index f82884c95b..516551b4f5 100644 --- a/irs-api/src/test/java/org/eclipse/tractusx/irs/aaswrapper/job/delegate/RelationshipDelegateTest.java +++ b/irs-api/src/test/java/org/eclipse/tractusx/irs/aaswrapper/job/delegate/RelationshipDelegateTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.tractusx.irs.util.TestMother.jobParameter; +import static org.eclipse.tractusx.irs.util.TestMother.jobParameterUpward; import static org.eclipse.tractusx.irs.util.TestMother.shellDescriptor; import static org.eclipse.tractusx.irs.util.TestMother.submodelDescriptor; import static org.mockito.ArgumentMatchers.any; @@ -36,6 +37,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; +import java.util.Objects; import org.eclipse.tractusx.irs.aaswrapper.job.AASTransferProcess; import org.eclipse.tractusx.irs.aaswrapper.job.ItemContainer; @@ -56,13 +58,18 @@ class RelationshipDelegateTest { connectorEndpointsService, jsonUtil); final String singleLevelBomAsBuiltAspectName = "urn:bamm:com.catenax.single_level_bom_as_built:1.0.0#SingleLevelBomAsBuilt"; + final String singleLevelUsageAsBuiltAspectName = "urn:bamm:com.catenax.single_level_usage_as_built:1.0.0#SingleLevelUsageAsBuilt"; + + private static PartChainIdentificationKey createKey() { + return PartChainIdentificationKey.builder().globalAssetId("itemId").bpn("bpn123").build(); + } @Test void shouldFillItemContainerWithRelationshipAndAddChildIdsToProcess() throws EdcClientException, URISyntaxException, IOException { // given - when(submodelFacade.getSubmodelRawPayload(anyString(), anyString(), anyString())).thenReturn( - Files.readString(Paths.get(getClass().getResource("/singleLevelBomAsBuilt.json").toURI()))); + when(submodelFacade.getSubmodelRawPayload(anyString(), anyString(), anyString())).thenReturn(Files.readString( + Paths.get(Objects.requireNonNull(getClass().getResource("/singleLevelBomAsBuilt.json")).toURI()))); when(connectorEndpointsService.fetchConnectorEndpoints(any())).thenReturn(List.of("http://localhost")); final ItemContainer.ItemContainerBuilder itemContainerWithShell = ItemContainer.builder() @@ -80,10 +87,38 @@ void shouldFillItemContainerWithRelationshipAndAddChildIdsToProcess() assertThat(result).isNotNull(); assertThat(result.getRelationships()).isNotEmpty(); assertThat(aasTransferProcess.getIdsToProcess()).isNotEmpty(); + assertThat(aasTransferProcess.getIdsToProcess().get(0).getGlobalAssetId()).isNotEmpty(); + } + + @Test + void shouldFillItemContainerWithUpwardRelationshipAndAddChildIdsToProcess() + throws EdcClientException, URISyntaxException, IOException { + // given + when(submodelFacade.getSubmodelRawPayload(anyString(), anyString(), anyString())).thenReturn(Files.readString( + Paths.get(Objects.requireNonNull(getClass().getResource("/singleLevelUsageAsBuilt.json")).toURI()))); + when(connectorEndpointsService.fetchConnectorEndpoints(any())).thenReturn(List.of("http://localhost")); + + final ItemContainer.ItemContainerBuilder itemContainerWithShell = ItemContainer.builder() + .shell(shellDescriptor( + List.of(submodelDescriptor( + singleLevelUsageAsBuiltAspectName, + "address")))); + final AASTransferProcess aasTransferProcess = new AASTransferProcess(); + + // when + final ItemContainer result = relationshipDelegate.process(itemContainerWithShell, jobParameterUpward(), + aasTransferProcess, createKey()); + + // then + assertThat(result).isNotNull(); + assertThat(result.getRelationships()).isNotEmpty(); + assertThat(aasTransferProcess.getIdsToProcess()).isNotEmpty(); + assertThat(aasTransferProcess.getIdsToProcess().get(0).getGlobalAssetId()).isNotEmpty(); + assertThat(aasTransferProcess.getIdsToProcess().get(0).getBpn()).isNotEmpty(); } @Test - void shouldPutTombstoneForMissingBpn() throws EdcClientException { + void shouldPutTombstoneForMissingBpn() { final ItemContainer.ItemContainerBuilder itemContainerWithShell = ItemContainer.builder() .shell(shellDescriptor( List.of(submodelDescriptor( @@ -150,8 +185,4 @@ void shouldCatchJsonParseExceptionAndPutTombstone() throws EdcClientException { ProcessStep.SUBMODEL_REQUEST); } - private static PartChainIdentificationKey createKey() { - return PartChainIdentificationKey.builder().globalAssetId("itemId").bpn("bpn123").build(); - } - } diff --git a/irs-api/src/test/java/org/eclipse/tractusx/irs/util/TestMother.java b/irs-api/src/test/java/org/eclipse/tractusx/irs/util/TestMother.java index c14771ae96..3063dc3766 100644 --- a/irs-api/src/test/java/org/eclipse/tractusx/irs/util/TestMother.java +++ b/irs-api/src/test/java/org/eclipse/tractusx/irs/util/TestMother.java @@ -30,10 +30,9 @@ import java.util.List; import java.util.UUID; import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import net.datafaker.Faker; import org.eclipse.tractusx.irs.aaswrapper.job.AASTransferProcess; import org.eclipse.tractusx.irs.component.GlobalAssetIdentification; import org.eclipse.tractusx.irs.component.Job; @@ -61,7 +60,6 @@ import org.eclipse.tractusx.irs.connector.job.TransferProcess; import org.eclipse.tractusx.irs.edc.client.RelationshipAspect; import org.eclipse.tractusx.irs.services.MeterRegistryService; -import net.datafaker.Faker; /** * Base object mother class to create objects for testing. @@ -144,6 +142,16 @@ public static JobParameter jobParameter() { .build(); } + public static JobParameter jobParameterUpward() { + return JobParameter.builder() + .depth(0) + .bomLifecycle(BomLifecycle.AS_BUILT) + .direction(Direction.UPWARD) + .aspects(List.of(AspectType.SERIAL_PART.toString(), + AspectType.SINGLE_LEVEL_USAGE_AS_BUILT.toString())) + .build(); + } + public static JobParameter jobParameterCollectAspects() { return JobParameter.builder() .depth(0) @@ -177,54 +185,6 @@ public static MeterRegistryService simpleMeterRegistryService() { return new MeterRegistryService(new SimpleMeterRegistry()); } - public AASTransferProcess aasTransferProcess() { - return new AASTransferProcess(faker.lorem().characters(UUID_SIZE), faker.number().numberBetween(1, 100)); - } - - public Job fakeJob(JobState state) { - return Job.builder() - .id(UUID.randomUUID()) - .globalAssetId(GlobalAssetIdentification.of(UUID.randomUUID().toString())) - .state(state) - .createdOn(ZonedDateTime.now(ZoneId.of("UTC"))) - .startedOn(ZonedDateTime.now(ZoneId.of("UTC"))) - .owner(faker.lorem().characters()) - .lastModifiedOn(ZonedDateTime.now(ZoneId.of("UTC"))) - .parameter(jobParameter()) - .completedOn(ZonedDateTime.now(ZoneId.of("UTC"))) - .build(); - } - - public MultiTransferJob job() { - return job(faker.options().option(JobState.class)); - } - - public MultiTransferJob job(JobState jobState) { - return MultiTransferJob.builder().job(fakeJob(jobState)).build(); - } - - public DataRequest dataRequest() { - return new DataRequest() { - }; - } - - public TransferInitiateResponse okResponse() { - return response(ResponseStatus.OK); - } - - public TransferInitiateResponse response(ResponseStatus status) { - return TransferInitiateResponse.builder().transferId(UUID.randomUUID().toString()).status(status).build(); - } - - public TransferProcess transfer() { - final String characters = faker.lorem().characters(); - return () -> characters; - } - - public Stream dataRequests(int count) { - return IntStream.range(0, count).mapToObj(i -> dataRequest()); - } - public static Relationship relationship() { final LinkedItem linkedItem = LinkedItem.builder() .childCatenaXId( @@ -268,4 +228,48 @@ public static AssetAdministrationShellDescriptor shellDescriptor( .submodelDescriptors(submodelDescriptors) .build(); } + + public AASTransferProcess aasTransferProcess() { + return new AASTransferProcess(faker.lorem().characters(UUID_SIZE), faker.number().numberBetween(1, 100)); + } + + public Job fakeJob(JobState state) { + return Job.builder() + .id(UUID.randomUUID()) + .globalAssetId(GlobalAssetIdentification.of(UUID.randomUUID().toString())) + .state(state) + .createdOn(ZonedDateTime.now(ZoneId.of("UTC"))) + .startedOn(ZonedDateTime.now(ZoneId.of("UTC"))) + .owner(faker.lorem().characters()) + .lastModifiedOn(ZonedDateTime.now(ZoneId.of("UTC"))) + .parameter(jobParameter()) + .completedOn(ZonedDateTime.now(ZoneId.of("UTC"))) + .build(); + } + + public MultiTransferJob job() { + return job(faker.options().option(JobState.class)); + } + + public MultiTransferJob job(JobState jobState) { + return MultiTransferJob.builder().job(fakeJob(jobState)).build(); + } + + public DataRequest dataRequest() { + return new DataRequest() { + }; + } + + public TransferInitiateResponse okResponse() { + return response(ResponseStatus.OK); + } + + public TransferInitiateResponse response(ResponseStatus status) { + return TransferInitiateResponse.builder().transferId(UUID.randomUUID().toString()).status(status).build(); + } + + public TransferProcess transfer() { + final String characters = faker.lorem().characters(); + return () -> characters; + } } \ No newline at end of file diff --git a/irs-api/src/test/resources/singleLevelUsageAsBuilt.json b/irs-api/src/test/resources/singleLevelUsageAsBuilt.json new file mode 100644 index 0000000000..3518c5fd7d --- /dev/null +++ b/irs-api/src/test/resources/singleLevelUsageAsBuilt.json @@ -0,0 +1,15 @@ +{ + "parentParts": [ + { + "parentCatenaXId": "urn:uuid:e3991dff-71b4-46e6-8aa5-2a2a26f2bbba", + "quantity": { + "quantityNumber": 1, + "measurementUnit": "unit:piece" + }, + "createdOn": "2022-02-03T14:48:54.709Z", + "lastModifiedOn": "2022-02-03T14:48:54.709Z", + "businessPartner": "BPNL00000000WXYZ" + } + ], + "catenaXId": "urn:uuid:32e533c1-15f8-4cf0-8562-55900aed4fcb" +} \ No newline at end of file diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/SingleLevelUsageAsBuilt.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/SingleLevelUsageAsBuilt.java index b80a62264e..162d5aae7f 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/SingleLevelUsageAsBuilt.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/SingleLevelUsageAsBuilt.java @@ -29,6 +29,7 @@ import java.util.Set; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.jackson.Jacksonized; @@ -43,6 +44,7 @@ * SingleLevelUsageAsBuilt */ @Data +@Builder @Jacksonized @AllArgsConstructor @NoArgsConstructor @@ -70,6 +72,7 @@ public List asRelationships() { private Quantity quantity; private ZonedDateTime lastModifiedOn; private String parentCatenaXId; + private String businessPartner; public Relationship toRelationship(final String catenaXId) { final LinkedItem.LinkedItemBuilder linkedItem = LinkedItem.builder() @@ -90,6 +93,7 @@ public Relationship toRelationship(final String catenaXId) { return Relationship.builder() .catenaXId(GlobalAssetIdentification.of(this.parentCatenaXId)) .linkedItem(linkedItem.build()) + .bpn(this.businessPartner) .aspectType(AspectType.SINGLE_LEVEL_USAGE_AS_BUILT.toString()) .build(); }