From adf1eaf0ee3d574eb27f49dd632460af35e10ce4 Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 31 Jan 2024 20:13:12 +0100 Subject: [PATCH 01/24] chore(logo):replace logo --- README.md | 3 ++- logo.png | Bin 32040 -> 71293 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 53664b07d4..20b81a4d64 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# ![Item Relationship Service (IRS)](https://raw.githubusercontent.com/eclipse-tractusx/item-relationship-service/main/logo.png) +# ![Item Relationship Service (IRS)](https://github.com/catenax-ng/tx-item-relationship-service/blob/main/docs/logo/IRS_Logo.png) + [![Apache 2 License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/eclipse-tractusx/item-relationship-service/blob/main/LICENSE) [![Build](https://github.com/eclipse-tractusx/item-relationship-service/actions/workflows/irs-build.yml/badge.svg)](https://github.com/eclipse-tractusx/item-relationship-service/actions/workflows/irs-build.yml) diff --git a/logo.png b/logo.png index 14e1894060067ff12bfb61107bf78095010a3d58..4fddcbe5592fa07256433ecdc9699af63f08cb2e 100644 GIT binary patch literal 71293 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%0A^f|BL;XB%bZh( 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 Bix&U@ literal 32040 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 From d7dd4c55d8005842acc56a4750e63a383cd1e26e Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 31 Jan 2024 20:15:50 +0100 Subject: [PATCH 02/24] chore(logo): adjust url to logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20b81a4d64..b2ee8c0ba9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![Item Relationship Service (IRS)](https://github.com/catenax-ng/tx-item-relationship-service/blob/main/docs/logo/IRS_Logo.png) +# ![Item Relationship Service (IRS)](https://github.com/catenax-ng/tx-item-relationship-service/blob/main/logo.png) [![Apache 2 License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/eclipse-tractusx/item-relationship-service/blob/main/LICENSE) From 38f83c39f2229cb3b08f7d4e9d506b0bfa412b2f Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 31 Jan 2024 20:17:46 +0100 Subject: [PATCH 03/24] chore(logo): adjust url to eclipse repos --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b2ee8c0ba9..e8e7135b0c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![Item Relationship Service (IRS)](https://github.com/catenax-ng/tx-item-relationship-service/blob/main/logo.png) +# ![Item Relationship Service (IRS)](https://github.com/eclipse-tractusx/item-relationship-service/blob/main/logo.png) [![Apache 2 License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/eclipse-tractusx/item-relationship-service/blob/main/LICENSE) From ad739f2f3d21f2f4daaa1aab6877eb68960b8b6a Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 31 Jan 2024 20:18:15 +0100 Subject: [PATCH 04/24] chore(logo): add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 458cdcad76..abaec79550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated license header to "Copyright (c) 2021,2024 Contributors to the Eclipse Foundation" - Changed lookupGlobalAssetIds to lookupShellsByBPN, which provides full object. - Suppressed CVE-2024-20932 from graal-sdk-21.2.0.jar because this is not applicable for IRS. +- Change logo of irs ### Fixed - Update to Spring Boot 3.1.8. This fixes the following CVEs: From 360f7bf3e9e0549af659ef40befaf2e9d3278799 Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 21 Feb 2024 14:19:22 +0100 Subject: [PATCH 05/24] fix(concept):[#367] fix typos --- .../#367-adapt-to-changes-industry-core.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md index 8aa18a942d..5ba1446538 100644 --- a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md +++ b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md @@ -72,6 +72,9 @@ The product IRS MUST align with the Industry Code Standard CX-126 and CX-127. For serialized parts, batches, and JIS parts this will be deprecated with new version 3.x.x of AAS. ASS parameter assetLifecyclePhase will not be used anymore to detect BOMLifecycle. Parameter 'digitalTwinType' is used instead. +**assetLifecyclePhase is not used to detect BomLifecyle any more.** + + ### Use parameter 'digitalTwinType' to detect BOMLifecycle **Parameter 'digitalTwinType'** @@ -99,17 +102,9 @@ alt aas contains 'digitalTwinType' else digitalTwinType any other value or null BOMLifecycleDetector -->> IRS : throw Exception end -else aas contains 'assetLifecyclePhase' - alt assetLifecyclePhase="AsBuilt" - BOMLifecycleDetector -->> IRS : return asBuilt - else assetLifecyclePhase="AsPlanned" - BOMLifecycleDetector -->> IRS : return asPlanned - else assetLifecyclePhase any other value or null - BOMLifecycleDetector -->> IRS : throw Exception - end else IRS -->> BOMLifecycleDetector : throw Exception (BOMLifecylce could not be detected) - BOMLifecycleDetector -->> IRS : retrun BOMLifecyle + BOMLifecycleDetector -->> IRS : return BOMLifecyle end ```` From e07fe75339655a4431b8049af95a51f0d548c16b Mon Sep 17 00:00:00 2001 From: mk Date: Wed, 21 Feb 2024 14:23:53 +0100 Subject: [PATCH 06/24] fix(concept):[#367] assetLifecyclePhase is not used any more in 24.5 --- .../#367-adapt-to-changes-industry-core.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md index 5ba1446538..c4242f6b5d 100644 --- a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md +++ b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md @@ -111,13 +111,14 @@ end #### Configuration of parameter 'digitalTwinType' Parameter is configurable for dDTR instance and has to be configured for integration test. +Setup dDTR registry on used environments. INT, DEV, PEN, STABLE - [Values.yaml](https://github.com/eclipse-tractusx/sldt-digital-twin-registry/blob/f438fe96a7ae1f1b920e8e4fb4114fb7af32643d/charts/registry/values.yaml#L51) - [README.md](https://github.com/eclipse-tractusx/sldt-digital-twin-registry/blob/f438fe96a7ae1f1b920e8e4fb4114fb7af32643d/charts/registry/README.md#:~:text=externalSubjectIdWildcardAllowedTypes) values.yaml ````json - registry.externalSubjectIdWildcardAllowedTypes = manufacturerPartId,assetLifecyclePhase,digitalTwinType + registry.externalSubjectIdWildcardAllowedTypes = manufacturerPartId,digitalTwinType ```` @@ -181,7 +182,7 @@ values.yaml |manufacturerId | Mandatory | The Business Partner Number (BPNL) of the manufacturer of the part. | |manufacturerPartId | Mandatory | | |customerPartId | Optional | | -|assetLifecyclePhase | asPlanned(Mandatory) / asBuilt(Optional) | @Deprecated For serialized parts, batches, and JIS parts, use the value AsBuilt. For catalog parts in a Digital Twin As-Planned lifecycle phase, use the value AsPlanned. | +|assetLifecyclePhase | asPlanned(Mandatory) / asBuilt(Optional) | @Deprecated Not used any more. For serialized parts, batches, and JIS parts, use the value AsBuilt. For catalog parts in a Digital Twin As-Planned lifecycle phase, use the value AsPlanned. | |digitalTwinType | Mandatory | digitalTwinType="PartType" OR digitalTwinType="PartInstance" For parts on an instance level (e.g. serialized parts, batches, and JIS parts), use the value PartInstance. For parts on a part type level (e.g. catalog parts), use the value PartType. | | | # PartAsPlanned From a31f72c00180cde2b5cd6e2e76fc924eb49fa53f Mon Sep 17 00:00:00 2001 From: mk Date: Thu, 22 Feb 2024 10:40:29 +0100 Subject: [PATCH 07/24] chore(concept):[#367] update to industry core for R24.5 --- .../#367-adapt-to-changes-industry-core.md | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md index c4242f6b5d..c839bcbc1d 100644 --- a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md +++ b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md @@ -37,20 +37,17 @@ The product IRS MUST align with the Industry Code Standard CX-126 and CX-127. ## Version matrix -| Artefact | Version | Availability | link | -|----------------------------|---------|-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| -| AAS | | | | -| PartAsPlanned | 1.0.1 | Mandatory | [PartAsPlanned 1.0.1](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.part_as_planned/1.0.1) | -| PartAsPlanned | 2.0.0 | Optional (Mandatory for next version of CX-0126) | [PartAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.part_as_planned/2.0.0) | -| SingleLevelBomAsPlanned | 1.1.0 | Mandatory | [SingleLevelBomAsPlanned 1.1.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_planned/1.1.0)] | -| SingleLevelBomAsPlanned | 2.0.0 | Optional (Mandatory for next version of CX-0126) | [SingleLevelBomAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_planned/2.2.0)] | -| SerialPart | 1.0.1 | Mandatory | [SerialPart 1.0.1](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.serial_part/1.0.1) | -| SerialPart | 2.0.0 | Optional | [SerialPart 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.serial_part/2.0.0) | -| Batch | 2.0.0 | Mandatory | [Batch 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.batch/2.0.0) | -| Batch | 2.0.1 | Optional | [Batch 2.0.1](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.batch/2.0.1) | -| JustInSequencePart | 2.0.0 | Optional | [JustInSequencePart 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.just_in_sequence_part/2.0.0) | -| SingleLevelBomAsBuilt | 2.0.0 | Mandatory | [SingleLevelBomAsBuilt 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_built/2.0.0) | -| PartSiteInformationAsBuilt | 1.0.0 | Integrated in Aspects JustInSequencePart / Batch / SerialPart | https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.shared.part_site_information_as_built/1.0.0 | + +|Artefact| Version | Availability | link | +|---|---------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| AAS | | | | +|PartAsPlanned | 2.0.0 | Mandatory | [PartAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.part_as_planned/2.0.0) | +| SingleLevelBomAsPlanned| 2.0.0 | Mandatory | [SingleLevelBomAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_planned/2.2.0) | +| SerialPart| 3.0.0 | Mandatory | [SerialPart 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.serial_part/3.0.0/gen) | +| Batch| 3.0.0 | Mandatory | [Batch 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.batch/3.0.0) | +| JustInSequencePart| 3.0.0 | Mandatory | [JustInSequencePart 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.just_in_sequence_part/3.0.0) | +| SingleLevelBomAsBuilt| 2.0.0 | Mandatory | [SingleLevelBomAsBuilt 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_built/2.0.0) | +| PartSiteInformationAsBuilt| 1.0.0 | Integrated in Aspects JustInSequencePart / Batch / SerialPart | https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.shared.part_site_information_as_built/1.0.0 | - JustInSequencePart: https://github.com/eclipse-tractusx/sldt-semantic-models/pull/563 From 98ae9f7a7d90d3e9714826b78870f849b0569e97 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 09:25:49 +0100 Subject: [PATCH 08/24] feature: 420 add /management/v2/contractagreements/request and GET /management/v2/contractagreements/{contractAgreementId}/negotiation to irs-edc-client lib --- CHANGELOG.md | 1 + .../irs/edc/client/EdcConfiguration.java | 1 + .../EdcContractAgreementListWrapper.java | 37 +++++ .../exception/ContractAgreementException.java | 27 +++ .../service/EdcContractAgreementService.java | 82 +++++++++ .../EdcContractAgreementServiceTest.java | 155 ++++++++++++++++++ 6 files changed, 303 insertions(+) create mode 100644 irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java create mode 100644 irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java create mode 100644 irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java create mode 100644 irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 671abfac4a..f5e0eb5765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added - DigitalTwinRegistryCreateShellService in irs-registry-client for creating shells in DTR directly +- POST /management/v2/contractagreements/request and GET /management/v2/contractagreements/{contractAgreementId}/negotiation to irs-edc-client lib ## [4.6.0] - 2024-02-20 diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java index 3eebea2e4a..019781a863 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java @@ -72,6 +72,7 @@ public static class EndpointConfig { private String policyDefinition; private String transferProcess; private String stateSuffix; + private String contractAgreements; } diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java new file mode 100644 index 0000000000..722fdf9d37 --- /dev/null +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java @@ -0,0 +1,37 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 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.irs.edc.client.contract.model; + +import java.util.List; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; + +@ToString +@Builder +@RequiredArgsConstructor +@Getter +public class EdcContractAgreementListWrapper { + final private List contractAgreementList; + +} diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java new file mode 100644 index 0000000000..c9535aa963 --- /dev/null +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java @@ -0,0 +1,27 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 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.irs.edc.client.contract.model.exception; + +public class ContractAgreementException extends RuntimeException { + + public ContractAgreementException(final String message) { + super(message); + } +} diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java new file mode 100644 index 0000000000..d98cb7e27c --- /dev/null +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -0,0 +1,82 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 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.irs.edc.client.contract.service; + +import java.util.Arrays; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.tractusx.irs.edc.client.EdcConfiguration; +import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementListWrapper; +import org.eclipse.tractusx.irs.edc.client.contract.model.exception.ContractAgreementException; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@RequiredArgsConstructor +public class EdcContractAgreementService { + + private final EdcConfiguration config; + private final RestTemplate restTemplate; + + public List getContractAgreements(String... contractAgreementIds) { + + QuerySpec querySpec = buildQuerySpec(contractAgreementIds); + final ResponseEntity edcContractAgreementListResponseEntity = restTemplate.postForEntity( + config.getControlplane().getEndpoint().getContractAgreements(), querySpec, + EdcContractAgreementListWrapper.class); + + System.out.println("QuerySpec: " + querySpec.toString()); + + if (edcContractAgreementListResponseEntity.getBody() != null) { + return edcContractAgreementListResponseEntity.getBody().getContractAgreementList(); + } else { + throw new ContractAgreementException( + "Empty message body on edc response: " + edcContractAgreementListResponseEntity); + } + + } + + public ContractNegotiation getContractAgreementNegotiation(String contractAgreementId) { + final ResponseEntity contractNegotiationResponseEntity = restTemplate.getForEntity( + config.getControlplane().getEndpoint().getContractAgreements() + "/" + contractAgreementId + + "/negotiation", ContractNegotiation.class); + return contractNegotiationResponseEntity.getBody(); + } + + private QuerySpec buildQuerySpec(final String[] contractAgreementIds) { + + final List criterionList = Arrays.stream(contractAgreementIds) + .map(id -> Criterion.Builder.newInstance() + .operandLeft( + "https://w3id.org/edc/v0.0.1/ns/assetId") + .operator("=") + .operandRight(id) + .build()) + .toList(); + return QuerySpec.Builder.newInstance().filter(criterionList).build(); + } + +} diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java new file mode 100644 index 0000000000..e13a7f0b03 --- /dev/null +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java @@ -0,0 +1,155 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 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.irs.edc.client.contract.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import java.util.List; + +import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.tractusx.irs.edc.client.EdcConfiguration; +import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementListWrapper; +import org.eclipse.tractusx.irs.edc.client.contract.model.exception.ContractAgreementException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +@ExtendWith(MockitoExtension.class) +class EdcContractAgreementServiceTest { + + @Mock + private RestTemplate restTemplate; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private EdcConfiguration edcConfiguration; + + private EdcContractAgreementService edcContractAgreementService; + + @BeforeEach + void setUp() { + this.edcContractAgreementService = new EdcContractAgreementService(edcConfiguration, restTemplate); + } + + @Test + void shouldReturnContractAgreements() { + //GIVEN + String[] contractAgreementIds = { "contractAgreementId" }; + when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( + "/management/v2/contractagreements/request"); + + final ContractAgreement contractAgreement = ContractAgreement.Builder.newInstance() + .id("id") + .assetId("assetId") + .consumerId("consumerId") + .providerId("providerId") + .policy(Policy.Builder.newInstance() + .build()) + .build(); + final EdcContractAgreementListWrapper edcContractAgreementListWrapper = EdcContractAgreementListWrapper.builder() + .contractAgreementList( + List.of(contractAgreement)) + .build(); + when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementListWrapper.class))).thenReturn( + ResponseEntity.ok(edcContractAgreementListWrapper)); + + //WHEN + final List contractAgreements = edcContractAgreementService.getContractAgreements( + contractAgreementIds); + + //THEN + Mockito.verify(restTemplate) + .postForEntity(eq("/management/v2/contractagreements/request"), any(), + eq(EdcContractAgreementListWrapper.class)); + assertNotNull(contractAgreements); + } + + @Test + void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { + //GIVEN + String[] contractAgreementIds = { "contractAgreementId" }; + when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( + "/management/v2/contractagreements/request"); + + final ContractAgreement contractAgreement = ContractAgreement.Builder.newInstance() + .id("id") + .assetId("assetId") + .consumerId("consumerId") + .providerId("providerId") + .policy(Policy.Builder.newInstance() + .build()) + .build(); + final EdcContractAgreementListWrapper edcContractAgreementListWrapper = EdcContractAgreementListWrapper.builder() + .contractAgreementList( + List.of(contractAgreement)) + .build(); + when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementListWrapper.class))).thenReturn( + ResponseEntity.ok().build()); + + //WHEN + final ContractAgreementException contractAgreementException = assertThrows(ContractAgreementException.class, + () -> edcContractAgreementService.getContractAgreements(contractAgreementIds)); + + //THEN + Mockito.verify(restTemplate) + .postForEntity(eq("/management/v2/contractagreements/request"), any(), + eq(EdcContractAgreementListWrapper.class)); + assertEquals("Empty message body on edc response: <200 OK OK,[]>", contractAgreementException.getMessage()); + } + + @Test + void shouldReturnContractAgreementNegotiation() { + //GIVEN + String contractAgreementId = "contractAgreementId"; + when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( + "/management/v2/contractagreements"); + + final ContractNegotiation contractAgreementNegotiationMock = ContractNegotiation.Builder.newInstance() + .id("id") + .counterPartyId("") + .counterPartyAddress("") + .protocol("") + .build(); + when(restTemplate.getForEntity(anyString(), eq(ContractNegotiation.class))).thenReturn( + ResponseEntity.ok(contractAgreementNegotiationMock)); + + //WHEN + final ContractNegotiation contractAgreementNegotiation = edcContractAgreementService.getContractAgreementNegotiation( + contractAgreementId); + + //THEN + Mockito.verify(restTemplate) + .getForEntity(eq("/management/v2/contractagreements/contractAgreementId/negotiation"), + eq(ContractNegotiation.class)); + assertNotNull(contractAgreementNegotiation); + } +} \ No newline at end of file From 0c171ad710f6cd8547042162e829b54ab325d52c Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 09:53:36 +0100 Subject: [PATCH 09/24] feature: 420 add javadoc --- .../contract/model/EdcContractAgreementListWrapper.java | 6 +++++- .../model/exception/ContractAgreementException.java | 3 +++ .../contract/service/EdcContractAgreementService.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java index 722fdf9d37..18a975204f 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java @@ -27,11 +27,15 @@ import lombok.ToString; import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; +/** + * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request where a List of + * {@link ContractAgreement} is returned. + */ @ToString @Builder @RequiredArgsConstructor @Getter public class EdcContractAgreementListWrapper { - final private List contractAgreementList; + private final List contractAgreementList; } diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java index c9535aa963..6ec118728e 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java @@ -19,6 +19,9 @@ ********************************************************************************/ package org.eclipse.tractusx.irs.edc.client.contract.model.exception; +/** + * ContractAgreementException used for failures in {@link org.eclipse.tractusx.irs.edc.client.contract.service.EdcContractAgreementService} + */ public class ContractAgreementException extends RuntimeException { public ContractAgreementException(final String message) { diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java index d98cb7e27c..58660adc99 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -34,6 +34,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; + +/** + * EdcContractAgreementService used for contract agreements and contract agreement negotiation details + */ @Slf4j @RequiredArgsConstructor public class EdcContractAgreementService { From 87d40ccc5058102acf482dc56b6a88eb7e6eaf99 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 09:58:42 +0100 Subject: [PATCH 10/24] feature: 420 fix PMD failures --- .../contract/model/EdcContractAgreementListWrapper.java | 4 ++-- .../model/exception/ContractAgreementException.java | 3 ++- .../contract/service/EdcContractAgreementService.java | 8 +++----- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java index 18a975204f..f86c6d4bc5 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java @@ -28,8 +28,8 @@ import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; /** - * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request where a List of - * {@link ContractAgreement} is returned. + * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request where + * a List of {@link ContractAgreement} is returned. */ @ToString @Builder diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java index 6ec118728e..b996d80c3e 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java @@ -20,7 +20,8 @@ package org.eclipse.tractusx.irs.edc.client.contract.model.exception; /** - * ContractAgreementException used for failures in {@link org.eclipse.tractusx.irs.edc.client.contract.service.EdcContractAgreementService} + * ContractAgreementException used for failures in + * {@link org.eclipse.tractusx.irs.edc.client.contract.service.EdcContractAgreementService} */ public class ContractAgreementException extends RuntimeException { diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java index 58660adc99..3d70ef0d14 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -45,15 +45,13 @@ public class EdcContractAgreementService { private final EdcConfiguration config; private final RestTemplate restTemplate; - public List getContractAgreements(String... contractAgreementIds) { + public List getContractAgreements(final String... contractAgreementIds) { - QuerySpec querySpec = buildQuerySpec(contractAgreementIds); + final QuerySpec querySpec = buildQuerySpec(contractAgreementIds); final ResponseEntity edcContractAgreementListResponseEntity = restTemplate.postForEntity( config.getControlplane().getEndpoint().getContractAgreements(), querySpec, EdcContractAgreementListWrapper.class); - System.out.println("QuerySpec: " + querySpec.toString()); - if (edcContractAgreementListResponseEntity.getBody() != null) { return edcContractAgreementListResponseEntity.getBody().getContractAgreementList(); } else { @@ -63,7 +61,7 @@ public List getContractAgreements(String... contractAgreement } - public ContractNegotiation getContractAgreementNegotiation(String contractAgreementId) { + public ContractNegotiation getContractAgreementNegotiation(final String contractAgreementId) { final ResponseEntity contractNegotiationResponseEntity = restTemplate.getForEntity( config.getControlplane().getEndpoint().getContractAgreements() + "/" + contractAgreementId + "/negotiation", ContractNegotiation.class); From 69edc86d0fcc6347e662d0ab8ddde153c03e46af Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 10:57:28 +0100 Subject: [PATCH 11/24] feature: 420 fix PMD failures --- .../contract/model/EdcContractAgreementListWrapper.java | 4 ++-- .../client/contract/service/EdcContractAgreementService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java index f86c6d4bc5..15bea6831c 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java @@ -28,8 +28,8 @@ import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; /** - * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request where - * a List of {@link ContractAgreement} is returned. + * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request + * where a List of {@link ContractAgreement} is returned. */ @ToString @Builder diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java index 3d70ef0d14..1ec1f40ab4 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -68,7 +68,7 @@ public ContractNegotiation getContractAgreementNegotiation(final String contract return contractNegotiationResponseEntity.getBody(); } - private QuerySpec buildQuerySpec(final String[] contractAgreementIds) { + private QuerySpec buildQuerySpec(final String... contractAgreementIds) { final List criterionList = Arrays.stream(contractAgreementIds) .map(id -> Criterion.Builder.newInstance() From dc399df30d29ba9b31fb158777e0f07074727667 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 11:02:04 +0100 Subject: [PATCH 12/24] feature: 420 fix PMD failures --- .../contract/model/EdcContractAgreementListWrapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java index 15bea6831c..d4ed191ca5 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java @@ -28,8 +28,8 @@ import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; /** - * EdcContractAgreementListWrapper used for wrapping the response of /management/v2/contractagreements/request - * where a List of {@link ContractAgreement} is returned. + * EdcContractAgreementListWrapper used for wrapping the response of + * /management/v2/contractagreements/request where a List of {@link ContractAgreement} is returned. */ @ToString @Builder From 890c9c3d45c26cf008f7a2eb274fbddbe756a2f1 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 11:07:06 +0100 Subject: [PATCH 13/24] feature: 420 fix PMD failures --- .../client/contract/service/EdcContractAgreementService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java index 1ec1f40ab4..41413be38d 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -52,8 +52,9 @@ public List getContractAgreements(final String... contractAgr config.getControlplane().getEndpoint().getContractAgreements(), querySpec, EdcContractAgreementListWrapper.class); - if (edcContractAgreementListResponseEntity.getBody() != null) { - return edcContractAgreementListResponseEntity.getBody().getContractAgreementList(); + final EdcContractAgreementListWrapper contractAgreementListWrapper = edcContractAgreementListResponseEntity.getBody(); + if (contractAgreementListWrapper != null) { + return contractAgreementListWrapper.getContractAgreementList(); } else { throw new ContractAgreementException( "Empty message body on edc response: " + edcContractAgreementListResponseEntity); From be4a28d2f79a74a2f457f41275f8b89f2f775ec3 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 11:08:57 +0100 Subject: [PATCH 14/24] feature: 420 fix PMD failures --- .../service/EdcContractAgreementServiceTest.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java index e13a7f0b03..7048b2f322 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java @@ -100,18 +100,6 @@ void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( "/management/v2/contractagreements/request"); - final ContractAgreement contractAgreement = ContractAgreement.Builder.newInstance() - .id("id") - .assetId("assetId") - .consumerId("consumerId") - .providerId("providerId") - .policy(Policy.Builder.newInstance() - .build()) - .build(); - final EdcContractAgreementListWrapper edcContractAgreementListWrapper = EdcContractAgreementListWrapper.builder() - .contractAgreementList( - List.of(contractAgreement)) - .build(); when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementListWrapper.class))).thenReturn( ResponseEntity.ok().build()); From 971fdbf0133e669488bba5632f162b299b87a09e Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 12:21:10 +0100 Subject: [PATCH 15/24] feature: 420 fix sonar findings --- .../contract/service/EdcContractAgreementServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java index 7048b2f322..aedeb839c1 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java @@ -136,8 +136,8 @@ void shouldReturnContractAgreementNegotiation() { //THEN Mockito.verify(restTemplate) - .getForEntity(eq("/management/v2/contractagreements/contractAgreementId/negotiation"), - eq(ContractNegotiation.class)); + .getForEntity("/management/v2/contractagreements/contractAgreementId/negotiation", + ContractNegotiation.class); assertNotNull(contractAgreementNegotiation); } } \ No newline at end of file From bdf831adc0c0ea20a4f97e7c0da6f43863624ad6 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 16:24:42 +0100 Subject: [PATCH 16/24] feature: 420 refactor --- charts/irs-helm/values.yaml | 7 +++--- ...ava => EdcContractAgreementsResponse.java} | 2 +- .../exception/ContractAgreementException.java | 2 +- .../service/EdcContractAgreementService.java | 19 ++++++++------- .../EdcContractAgreementServiceTest.java | 24 +++++++++---------- 5 files changed, 28 insertions(+), 26 deletions(-) rename irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/{EdcContractAgreementListWrapper.java => EdcContractAgreementsResponse.java} (97%) diff --git a/charts/irs-helm/values.yaml b/charts/irs-helm/values.yaml index a62c3cff2e..63977c4b0d 100644 --- a/charts/irs-helm/values.yaml +++ b/charts/irs-helm/values.yaml @@ -173,10 +173,11 @@ edc: controlplane: endpoint: data: "" # - catalog: /v2/catalog/request # EDC consumer controlplane catalog path - contractnegotiation: /v2/contractnegotiations # EDC consumer controlplane contract negotiation path - transferprocess: /v2/transferprocesses # EDC consumer controlplane transfer process path + catalog: /management/v2/catalog/request # EDC consumer controlplane catalog path + contractnegotiation: /management/v2/contractnegotiations # EDC consumer controlplane contract negotiation path + transferprocess: /management/v2/transferprocesses # EDC consumer controlplane transfer process path statesuffix: /state # Path of the state suffix for contract negotiation and transfer process + contractAgreements: /management/v2/contractagreements # EDC consumer controlplane contract agreements path request: ttl: PT10M # Requests to controlplane will time out after this duration (see https://en.wikipedia.org/wiki/ISO_8601#Durations) provider: diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementsResponse.java similarity index 97% rename from irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java rename to irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementsResponse.java index d4ed191ca5..45232cbc87 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementListWrapper.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/EdcContractAgreementsResponse.java @@ -35,7 +35,7 @@ @Builder @RequiredArgsConstructor @Getter -public class EdcContractAgreementListWrapper { +public class EdcContractAgreementsResponse { private final List contractAgreementList; } diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java index b996d80c3e..ca3715fc95 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java @@ -23,7 +23,7 @@ * ContractAgreementException used for failures in * {@link org.eclipse.tractusx.irs.edc.client.contract.service.EdcContractAgreementService} */ -public class ContractAgreementException extends RuntimeException { +public class ContractAgreementException extends Exception { public ContractAgreementException(final String message) { super(message); diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java index 41413be38d..3064b5f5f3 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementService.java @@ -29,12 +29,11 @@ import org.eclipse.edc.spi.query.Criterion; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.tractusx.irs.edc.client.EdcConfiguration; -import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementListWrapper; +import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementsResponse; import org.eclipse.tractusx.irs.edc.client.contract.model.exception.ContractAgreementException; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; - /** * EdcContractAgreementService used for contract agreements and contract agreement negotiation details */ @@ -42,17 +41,20 @@ @RequiredArgsConstructor public class EdcContractAgreementService { + public static final String EDC_REQUEST_SUFFIX = "/request"; + public static final String EDC_ASSET_ID = "https://w3id.org/edc/v0.0.1/ns/assetId"; private final EdcConfiguration config; private final RestTemplate restTemplate; - public List getContractAgreements(final String... contractAgreementIds) { + public List getContractAgreements(final String... contractAgreementIds) + throws ContractAgreementException { final QuerySpec querySpec = buildQuerySpec(contractAgreementIds); - final ResponseEntity edcContractAgreementListResponseEntity = restTemplate.postForEntity( - config.getControlplane().getEndpoint().getContractAgreements(), querySpec, - EdcContractAgreementListWrapper.class); + final ResponseEntity edcContractAgreementListResponseEntity = restTemplate.postForEntity( + config.getControlplane().getEndpoint().getContractAgreements() + EDC_REQUEST_SUFFIX, querySpec, + EdcContractAgreementsResponse.class); - final EdcContractAgreementListWrapper contractAgreementListWrapper = edcContractAgreementListResponseEntity.getBody(); + final EdcContractAgreementsResponse contractAgreementListWrapper = edcContractAgreementListResponseEntity.getBody(); if (contractAgreementListWrapper != null) { return contractAgreementListWrapper.getContractAgreementList(); } else { @@ -73,8 +75,7 @@ private QuerySpec buildQuerySpec(final String... contractAgreementIds) { final List criterionList = Arrays.stream(contractAgreementIds) .map(id -> Criterion.Builder.newInstance() - .operandLeft( - "https://w3id.org/edc/v0.0.1/ns/assetId") + .operandLeft(EDC_ASSET_ID) .operator("=") .operandRight(id) .build()) diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java index aedeb839c1..f58c118ac9 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java @@ -33,7 +33,7 @@ import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; import org.eclipse.edc.policy.model.Policy; import org.eclipse.tractusx.irs.edc.client.EdcConfiguration; -import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementListWrapper; +import org.eclipse.tractusx.irs.edc.client.contract.model.EdcContractAgreementsResponse; import org.eclipse.tractusx.irs.edc.client.contract.model.exception.ContractAgreementException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -61,11 +61,11 @@ void setUp() { } @Test - void shouldReturnContractAgreements() { + void shouldReturnContractAgreements() throws ContractAgreementException { //GIVEN String[] contractAgreementIds = { "contractAgreementId" }; when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( - "/management/v2/contractagreements/request"); + "/management/v2/contractagreements"); final ContractAgreement contractAgreement = ContractAgreement.Builder.newInstance() .id("id") @@ -75,12 +75,12 @@ void shouldReturnContractAgreements() { .policy(Policy.Builder.newInstance() .build()) .build(); - final EdcContractAgreementListWrapper edcContractAgreementListWrapper = EdcContractAgreementListWrapper.builder() - .contractAgreementList( + final EdcContractAgreementsResponse edcContractAgreementsResponse = EdcContractAgreementsResponse.builder() + .contractAgreementList( List.of(contractAgreement)) - .build(); - when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementListWrapper.class))).thenReturn( - ResponseEntity.ok(edcContractAgreementListWrapper)); + .build(); + when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementsResponse.class))).thenReturn( + ResponseEntity.ok(edcContractAgreementsResponse)); //WHEN final List contractAgreements = edcContractAgreementService.getContractAgreements( @@ -89,7 +89,7 @@ void shouldReturnContractAgreements() { //THEN Mockito.verify(restTemplate) .postForEntity(eq("/management/v2/contractagreements/request"), any(), - eq(EdcContractAgreementListWrapper.class)); + eq(EdcContractAgreementsResponse.class)); assertNotNull(contractAgreements); } @@ -98,9 +98,9 @@ void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { //GIVEN String[] contractAgreementIds = { "contractAgreementId" }; when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( - "/management/v2/contractagreements/request"); + "/management/v2/contractagreements"); - when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementListWrapper.class))).thenReturn( + when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementsResponse.class))).thenReturn( ResponseEntity.ok().build()); //WHEN @@ -110,7 +110,7 @@ void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { //THEN Mockito.verify(restTemplate) .postForEntity(eq("/management/v2/contractagreements/request"), any(), - eq(EdcContractAgreementListWrapper.class)); + eq(EdcContractAgreementsResponse.class)); assertEquals("Empty message body on edc response: <200 OK OK,[]>", contractAgreementException.getMessage()); } From 975eda7f8026000da612d5f705a95e377ce792aa Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 26 Feb 2024 16:25:37 +0100 Subject: [PATCH 17/24] feature: 420 refactor --- .../contract/model/exception/ContractAgreementException.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java index ca3715fc95..d8343e91d9 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/contract/model/exception/ContractAgreementException.java @@ -19,11 +19,13 @@ ********************************************************************************/ package org.eclipse.tractusx.irs.edc.client.contract.model.exception; +import org.eclipse.tractusx.irs.edc.client.exceptions.EdcClientException; + /** * ContractAgreementException used for failures in * {@link org.eclipse.tractusx.irs.edc.client.contract.service.EdcContractAgreementService} */ -public class ContractAgreementException extends Exception { +public class ContractAgreementException extends EdcClientException { public ContractAgreementException(final String message) { super(message); From ae866924e32094f1076b0bb3f44758460b36f3da Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Tue, 27 Feb 2024 08:22:50 +0100 Subject: [PATCH 18/24] feature: 420 refactor --- .../templates/configmap-spring-app-config.yaml | 1 + charts/irs-helm/values.yaml | 8 ++++---- .../service/EdcContractAgreementServiceTest.java | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/charts/irs-helm/templates/configmap-spring-app-config.yaml b/charts/irs-helm/templates/configmap-spring-app-config.yaml index c5811fc1a7..6c4c0fd430 100644 --- a/charts/irs-helm/templates/configmap-spring-app-config.yaml +++ b/charts/irs-helm/templates/configmap-spring-app-config.yaml @@ -108,6 +108,7 @@ data: contract-negotiation: {{ .Values.edc.controlplane.endpoint.contractnegotiation | default "/v2/contractnegotiations" | quote }} transfer-process: {{ .Values.edc.controlplane.endpoint.transferprocess | default "/v2/transferprocesses" | quote }} state-suffix: {{ .Values.edc.controlplane.endpoint.statesuffix | default "/state" | quote }} + contract-agreements: {{ .Values.edc.controlplane.endpoint.contractAgreements | default "/v2/contractagreements" | quote }} provider-suffix: {{ tpl .Values.edc.controlplane.provider.suffix . | quote }} catalog-limit: {{ .Values.edc.controlplane.catalog.limit }} catalog-page-size: {{ .Values.edc.controlplane.catalog.pagesize }} diff --git a/charts/irs-helm/values.yaml b/charts/irs-helm/values.yaml index 63977c4b0d..e3a2b759d6 100644 --- a/charts/irs-helm/values.yaml +++ b/charts/irs-helm/values.yaml @@ -173,11 +173,11 @@ edc: controlplane: endpoint: data: "" # - catalog: /management/v2/catalog/request # EDC consumer controlplane catalog path - contractnegotiation: /management/v2/contractnegotiations # EDC consumer controlplane contract negotiation path - transferprocess: /management/v2/transferprocesses # EDC consumer controlplane transfer process path + catalog: /v2/catalog/request # EDC consumer controlplane catalog path + contractnegotiation: /v2/contractnegotiations # EDC consumer controlplane contract negotiation path + transferprocess: /v2/transferprocesses # EDC consumer controlplane transfer process path statesuffix: /state # Path of the state suffix for contract negotiation and transfer process - contractAgreements: /management/v2/contractagreements # EDC consumer controlplane contract agreements path + contractAgreements: /v2/contractagreements # EDC consumer controlplane contract agreements path request: ttl: PT10M # Requests to controlplane will time out after this duration (see https://en.wikipedia.org/wiki/ISO_8601#Durations) provider: diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java index f58c118ac9..38e14d5677 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/contract/service/EdcContractAgreementServiceTest.java @@ -65,7 +65,7 @@ void shouldReturnContractAgreements() throws ContractAgreementException { //GIVEN String[] contractAgreementIds = { "contractAgreementId" }; when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( - "/management/v2/contractagreements"); + "/v2/contractagreements"); final ContractAgreement contractAgreement = ContractAgreement.Builder.newInstance() .id("id") @@ -88,7 +88,7 @@ void shouldReturnContractAgreements() throws ContractAgreementException { //THEN Mockito.verify(restTemplate) - .postForEntity(eq("/management/v2/contractagreements/request"), any(), + .postForEntity(eq("/v2/contractagreements/request"), any(), eq(EdcContractAgreementsResponse.class)); assertNotNull(contractAgreements); } @@ -98,7 +98,7 @@ void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { //GIVEN String[] contractAgreementIds = { "contractAgreementId" }; when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( - "/management/v2/contractagreements"); + "/v2/contractagreements"); when(restTemplate.postForEntity(anyString(), any(), eq(EdcContractAgreementsResponse.class))).thenReturn( ResponseEntity.ok().build()); @@ -109,7 +109,7 @@ void shouldThrowContractAgreementExceptionWhenResponseBodyIsEmtpy() { //THEN Mockito.verify(restTemplate) - .postForEntity(eq("/management/v2/contractagreements/request"), any(), + .postForEntity(eq("/v2/contractagreements/request"), any(), eq(EdcContractAgreementsResponse.class)); assertEquals("Empty message body on edc response: <200 OK OK,[]>", contractAgreementException.getMessage()); } @@ -119,7 +119,7 @@ void shouldReturnContractAgreementNegotiation() { //GIVEN String contractAgreementId = "contractAgreementId"; when(edcConfiguration.getControlplane().getEndpoint().getContractAgreements()).thenReturn( - "/management/v2/contractagreements"); + "/v2/contractagreements"); final ContractNegotiation contractAgreementNegotiationMock = ContractNegotiation.Builder.newInstance() .id("id") @@ -136,7 +136,7 @@ void shouldReturnContractAgreementNegotiation() { //THEN Mockito.verify(restTemplate) - .getForEntity("/management/v2/contractagreements/contractAgreementId/negotiation", + .getForEntity("/v2/contractagreements/contractAgreementId/negotiation", ContractNegotiation.class); assertNotNull(contractAgreementNegotiation); } From 12dfc2b857f1eca7ccf00eb7f2fb221bcb2a8eda Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Tue, 27 Feb 2024 08:24:11 +0100 Subject: [PATCH 19/24] feature: 420 refactor --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5e0eb5765..a449e8c3c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added - DigitalTwinRegistryCreateShellService in irs-registry-client for creating shells in DTR directly -- POST /management/v2/contractagreements/request and GET /management/v2/contractagreements/{contractAgreementId}/negotiation to irs-edc-client lib +- POST /management/v2/contractagreements/request and GET /management/v2/contractagreements/{contractAgreementId}/negotiation to irs-edc-client lib ## [4.6.0] - 2024-02-20 From eb40a9f9d763271c15770f93715d82b766416cd2 Mon Sep 17 00:00:00 2001 From: "Krzysztof Massalski (Extern)" Date: Tue, 27 Feb 2024 10:20:35 +0100 Subject: [PATCH 20/24] feat(impl):[#312] irs local helm setup --- local/deployment/irs-local/Chart.yaml | 35 ++++++++ local/deployment/irs-local/README.md | 113 +++++++++++++++++++++++++ local/deployment/irs-local/values.yaml | 50 +++++++++++ 3 files changed, 198 insertions(+) create mode 100644 local/deployment/irs-local/Chart.yaml create mode 100644 local/deployment/irs-local/README.md create mode 100644 local/deployment/irs-local/values.yaml diff --git a/local/deployment/irs-local/Chart.yaml b/local/deployment/irs-local/Chart.yaml new file mode 100644 index 0000000000..41742cf1a6 --- /dev/null +++ b/local/deployment/irs-local/Chart.yaml @@ -0,0 +1,35 @@ +# Copyright (c) 2021,2022,2023 +# 2022: ZF Friedrichshafen AG +# 2022: ISTOS GmbH +# 2022,2023: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# 2022,2023: BOSCH AG +# Copyright (c) 2021,2022,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 +# +apiVersion: v2 +name: irs-helm-local +description: IRS Helm chart for local Kubernetes +home: https://eclipse-tractusx.github.io/ +sources: + - https://github.com/eclipse-tractusx/item-relationship-service +type: application +version: 6.14.0 +appVersion: "4.5.0" + +dependencies: + - name: irs-helm + repository: https://eclipse-tractusx.github.io/item-relationship-service + version: 6.14.0 diff --git a/local/deployment/irs-local/README.md b/local/deployment/irs-local/README.md new file mode 100644 index 0000000000..20cccbd201 --- /dev/null +++ b/local/deployment/irs-local/README.md @@ -0,0 +1,113 @@ +# Item Relationship Service + +## Local deployment of IRS with minimum dependencies setup + +### Step 1: Prerequisites + +1. [Docker](https://docs.docker.com/get-docker/) is installed and the Docker deamon is running with at least 8GB of memory +2. [helm](https://helm.sh/docs/intro/install/) is installed +3. Any Kubernetes cluster is installed and running, eg. [Minikube](https://minikube.sigs.k8s.io/docs/start/) +4. [kubectl](https://kubernetes.io/docs/tasks/tools/) is installed + +### Step 2: Update and build the irs-helm chart + +```bash +$ helm dependency build +``` +You should see console output with messages like below: +```bash +Hang tight while we grab the latest from your chart repositories... +...Successfully got an update from the "irs" chart repository +...Successfully got an update from the "tractusx-dev" chart repository +...Successfully got an update from the "prometheus-community" chart repository +Update Complete. ⎈Happy Helming!⎈ +Saving 1 charts +Downloading irs-helm from repo https://eclipse-tractusx.github.io/item-relationship-service +Deleting outdated charts +``` +Please note that irs repository has to be added to helm repo list +```bash +$ helm repo add irs https://eclipse-tractusx.github.io/item-relationship-service +$ helm repo list +NAME URL +irs https://eclipse-tractusx.github.io/item-relationship-service +``` + +### Step 3: Installing the IRS + +#### 1. Start the cluster + +To deploy IRS on kubernetes with helm run + +```bash +$ helm install irs-local . +``` + +##### 1.1 Get the Status of the deployment + +Helm can give you feedback on the release status: + +```bash +$ helm list +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +irs-local default 1 2024-02-26 11:36:46.399546 +0100 CET deployed irs-helm-local-6.14.0 4.5.0 +``` +Kubectl can give you feedback on how the status of the deployment currently is, there should be two pods deployed - IRS and Minio: +```bash +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +irs-local-minio-7cc78d8985-qggrx 1/1 Running 0 10m +irs-local-irs-helm-c84f98ffb-zg59z 1/1 Running 0 10m + +``` + +#### 2. Forward Ports + +When the deployment has been finished please use the command to forward the port: + +```bash +$ kubectl port-forward svc/irs-local-irs-helm 8080:8080 +``` + +After that you can access the Swagger UI page: + +* **IRS Swagger:** [http://localhost:8080/api/swagger-ui/index.html](http://localhost:8080/api/swagger-ui/index.html) + +## Testing the Item Relationship Service + +You can use any approach to access exposed by IRS API endpoints, for example mentioned above Swagger UI page. There is also prepared Insomnia collection with example calls to IRS, see [IRS_Request_Collection.json](../../testing/IRS_Request_Collection.json) + +### Valid Global Asset Ids for testing + +IRS is loading with mocked data from Testdata file, see [CX_Testdata.json](../../../irs-models/src/main/resources/test_data/CX_Testdata.json) + +### Valid test requests for testing + +You can use these snippets for testing purposes. + +```json +{ + "bomLifecycle": "asBuilt", + "lookupBPNs": true, + "direction": "downward", + "depth": 10, + "auditContractNegotiation": false, + "key": { + "globalAssetId": "urn:uuid:951f1ebf-ebcf-427c-8a4d-7fe1f67c8d58", + "bpn": "BPNL00000003B0Q0" + } +} +```` + +```json +{ + "aspects": [ + "SerialPart" + ], + "depth": 1, + "key": { + "globalAssetId": "urn:uuid:951f1ebf-ebcf-427c-8a4d-7fe1f67c8d58", + "bpn": "BPNL00000003B0Q0" + } +} +``` \ No newline at end of file diff --git a/local/deployment/irs-local/values.yaml b/local/deployment/irs-local/values.yaml new file mode 100644 index 0000000000..0e2b74461c --- /dev/null +++ b/local/deployment/irs-local/values.yaml @@ -0,0 +1,50 @@ +irs-helm: + ##################### + # IRS Configuration # + ##################### + irsUrl: "http://localhost:8080" + bpn: "BPNL000000000000" + apiKeyAdmin: "01234567890123456789" + apiKeyRegular: "09876543210987654321" + env: + - name: SPRING_PROFILES_ACTIVE + value: local + + digitalTwinRegistry: + type: central + discovery: + discoveryFinderUrl: https://localhost + semanticshub: + url: https://localhost + bpdm: + url: https://localhost + + minioUser: "testtest" + minioPassword: "testtest" + + resources: + limits: + cpu: "1000m" + memory: "500Mi" + requests: + cpu: "50m" + memory: "100Mi" + + ####################### + # Minio Configuration # + ####################### + minio: + rootUser: "testtest" + rootPassword: "testtest" + + ######################### + # Grafana Configuration # + ######################### + grafana: + enabled: false + + ############################ + # Prometheus Configuration # + ############################ + prometheus: + enabled: false From 728bb77d5f75e8923041c8d2f97c2b9b73dec0bd Mon Sep 17 00:00:00 2001 From: "Krzysztof Massalski (Extern)" Date: Tue, 27 Feb 2024 13:07:24 +0100 Subject: [PATCH 21/24] feat(impl):[#312] fix review comments --- local/deployment/irs-local/Chart.yaml | 8 ++++---- local/deployment/irs-local/values.yaml | 23 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/local/deployment/irs-local/Chart.yaml b/local/deployment/irs-local/Chart.yaml index 41742cf1a6..c6992876b6 100644 --- a/local/deployment/irs-local/Chart.yaml +++ b/local/deployment/irs-local/Chart.yaml @@ -1,9 +1,9 @@ -# Copyright (c) 2021,2022,2023 +# Copyright (c) 2022,2024 # 2022: ZF Friedrichshafen AG # 2022: ISTOS GmbH -# 2022,2023: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) # 2022,2023: BOSCH AG -# Copyright (c) 2021,2022,2023 Contributors to the Eclipse Foundation +# Copyright (c) 2021,2024 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -18,7 +18,7 @@ # under the License. # # SPDX-License-Identifier: Apache-2.0 -# + apiVersion: v2 name: irs-helm-local description: IRS Helm chart for local Kubernetes diff --git a/local/deployment/irs-local/values.yaml b/local/deployment/irs-local/values.yaml index 0e2b74461c..c78e7b77df 100644 --- a/local/deployment/irs-local/values.yaml +++ b/local/deployment/irs-local/values.yaml @@ -1,3 +1,24 @@ +# Copyright (c) 2022,2024 +# 2022: ZF Friedrichshafen AG +# 2022: ISTOS GmbH +# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# 2022,2023: BOSCH AG +# Copyright (c) 2021,2024 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 + irs-helm: ##################### # IRS Configuration # @@ -28,7 +49,7 @@ irs-helm: memory: "500Mi" requests: cpu: "50m" - memory: "100Mi" + memory: "500Mi" ####################### # Minio Configuration # From a5e939a28f96701df97293ab644cb0c8528207b0 Mon Sep 17 00:00:00 2001 From: "Krzysztof Massalski (Extern)" Date: Tue, 27 Feb 2024 14:44:57 +0100 Subject: [PATCH 22/24] feat(impl):[#312] update copyright --- Dockerfile | 6 +----- local/deployment/irs-local/Chart.yaml | 6 +----- local/deployment/irs-local/values.yaml | 6 +----- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index ad62273994..a6f0be30ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,4 @@ -# Copyright (c) 2022,2024 -# 2022: ZF Friedrichshafen AG -# 2022: ISTOS GmbH -# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -# 2022,2023: BOSCH AG +# Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) # Copyright (c) 2021,2024 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional diff --git a/local/deployment/irs-local/Chart.yaml b/local/deployment/irs-local/Chart.yaml index c6992876b6..cd18449143 100644 --- a/local/deployment/irs-local/Chart.yaml +++ b/local/deployment/irs-local/Chart.yaml @@ -1,8 +1,4 @@ -# Copyright (c) 2022,2024 -# 2022: ZF Friedrichshafen AG -# 2022: ISTOS GmbH -# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -# 2022,2023: BOSCH AG +# Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) # Copyright (c) 2021,2024 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional diff --git a/local/deployment/irs-local/values.yaml b/local/deployment/irs-local/values.yaml index c78e7b77df..1efcafc82f 100644 --- a/local/deployment/irs-local/values.yaml +++ b/local/deployment/irs-local/values.yaml @@ -1,8 +1,4 @@ -# Copyright (c) 2022,2024 -# 2022: ZF Friedrichshafen AG -# 2022: ISTOS GmbH -# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -# 2022,2023: BOSCH AG +# Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) # Copyright (c) 2021,2024 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional From 1811f32ad04d0f8dfbf99797458cd54f286a12ab Mon Sep 17 00:00:00 2001 From: "Krzysztof Massalski (Extern)" Date: Tue, 27 Feb 2024 14:57:36 +0100 Subject: [PATCH 23/24] feat(impl):[#312] update copyright --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a6f0be30ea..ad62273994 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,8 @@ -# Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# Copyright (c) 2022,2024 +# 2022: ZF Friedrichshafen AG +# 2022: ISTOS GmbH +# 2022,2024: Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# 2022,2023: BOSCH AG # Copyright (c) 2021,2024 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional From dfd3cc4aad7a627abea5734a2925c96fab90907d Mon Sep 17 00:00:00 2001 From: Jaro Hartmann <57985712+ds-jhartmann@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:05:42 +0100 Subject: [PATCH 24/24] fix(concept):[#367] fix URL schema in version matrix --- .../#367-adapt-to-changes-industry-core.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md index c839bcbc1d..372aa549da 100644 --- a/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md +++ b/docs/concept/#367-adapt-to-changes-of-industry-core/#367-adapt-to-changes-industry-core.md @@ -42,12 +42,12 @@ The product IRS MUST align with the Industry Code Standard CX-126 and CX-127. |---|---------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| | AAS | | | | |PartAsPlanned | 2.0.0 | Mandatory | [PartAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.part_as_planned/2.0.0) | -| SingleLevelBomAsPlanned| 2.0.0 | Mandatory | [SingleLevelBomAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_planned/2.2.0) | -| SerialPart| 3.0.0 | Mandatory | [SerialPart 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.serial_part/3.0.0/gen) | +| SingleLevelBomAsPlanned| 2.0.0 | Mandatory | [SingleLevelBomAsPlanned 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_planned/2.0.0) | +| SerialPart| 3.0.0 | Mandatory | [SerialPart 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.serial_part/3.0.0) | | Batch| 3.0.0 | Mandatory | [Batch 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.batch/3.0.0) | | JustInSequencePart| 3.0.0 | Mandatory | [JustInSequencePart 3.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.just_in_sequence_part/3.0.0) | | SingleLevelBomAsBuilt| 2.0.0 | Mandatory | [SingleLevelBomAsBuilt 2.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.single_level_bom_as_built/2.0.0) | -| PartSiteInformationAsBuilt| 1.0.0 | Integrated in Aspects JustInSequencePart / Batch / SerialPart | https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.shared.part_site_information_as_built/1.0.0 | +| PartSiteInformationAsBuilt| 1.0.0 | Integrated in Aspects JustInSequencePart / Batch / SerialPart | [PartSiteInformationAsBuilt 1.0.0](https://github.com/eclipse-tractusx/sldt-semantic-models/tree/main/io.catenax.shared.part_site_information_as_built/1.0.0) | - JustInSequencePart: https://github.com/eclipse-tractusx/sldt-semantic-models/pull/563