diff --git a/CHANGELOG.md b/CHANGELOG.md index d8499387..4ef2e51b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,88 @@ The **need for configuration updates** is **marked bold**. ### Added +* Added backend implementation to CRUD Demand and Capacity + Notifications ([#415](https://github.com/eclipse-tractusx/puris/pull/415)) +* Added ERP response interface ([#418](https://github.com/eclipse-tractusx/puris/pull/418)) + +### Changed + +* Fixed check when answering delivery information request from a customer which prevented always to + answer ([#435](https://github.com/eclipse-tractusx/puris/pull/435)) + +### Removed + +N.A. + +### Known Knowns + +#### Security + +The Backend is currently secured via API Key while the Frontend already uses an API-KEY. +See [Admin Guide](./docs/admin/Admin_Guide.md) for further information. + +#### Upgradeability + +As currently no active user was known migrations of data are not yet supported. The chart technically is upgradeable. + +#### Data Sovereignty + +For productive use the following enhancements are encouraged + +* User FrontEnd available: Role Company Admin is able to query catalogue and see negotiations and transfers + But company rules / policies need to be configured upfront in backend (via postman) to enable automatic contract + negotiations, responsibility lies with Company Admin role + --> add section in the User Manual describing this and the (legal) importance and responsibility behind defining these + rules +* Currently only one standard policy per reg. connector / customer instance is supported (more precisely one for DTR, + one for all submodels), negotiation happens automatically based on this + --> enhance option to select partner and define specific policies (to be planned in context of BPDM Integration) + --> UI for specific configuration by dedicated role (e.g. Comp Admin) and more flexible policy configuration (without + code changes) is needed +* As a non-Admin user I do not have ability to view policies in detail --> transparency for users when interacting with + and requesting / consuming data via dashboard / views on underlying usage policies to be enhanced +* ContractReference Constraint or configuration of policies specific to one partner only not implemented --> + clarification of potential reference to "PURIS standard contract" and enabling of ContractReference for 24.08. +* unclear meaning of different stati in negotations --> add view of successfull contract agreeements wrt which data have + been closed +* current logging only done on info level --> enhance logging of policies (currently only available at debug level) +* in case of non-matching policies (tested in various scenarios) no negotiation takes place --> + **enhance visualization or specific Error message to user** +* no validation of the Schema "profile": "cx-policy:profile2405" (required to ensure interop with other PURIS apps) + +#### Styleguide + +Overall + +* Brief description at the top of each page describing content would be nice for better user experience. + +Dashboard + +* Similar for Create Delivery (here SOME entries are reset but warnings stay) (**block**) + +Stocks + +* user needs better guidance to click on a stock to update it (else error prone to enter one + slightly different attribute and Add instead of update) +* Refresh -- update request has been sent successfully. -> more information regarding data transfer needed for user + +Catalog + +* No action possible -> unclear to user when and how user will consume an offer + +Negotiations + +* Add filters for transparency (bpnl, state) + +## [v2.0.1](https://github.com/eclipse-tractusx/puris/releases/tag/2.0.1) + +The following Changelog lists the changes. Please refer to the [documentation](docs/README.md) for configuration needs +and understanding the concept changes. + +The **need for configuration updates** is **marked bold**. + +### Added + * Added Footer ### Changed diff --git a/README.md b/README.md index 1b0260c6..7cadc14c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Beside the dependencies provided in the Helm Chart, the following dependencies h | Application | App Version | Chart Version | |-------------------------------------------------------------------------------------------------------------------|-------------|---------------| -| [Tractus-X Connector](https://github.com/eclipse-tractusx/tractusx-edc/tree/main/charts/tractusx-connector) | 0.7.2 | 0.7.2 | +| [Tractus-X Connector](https://github.com/eclipse-tractusx/tractusx-edc/tree/main/charts/tractusx-connector) | 0.7.1 | 0.7.1 | | [Digital Twin Registry](https://github.com/eclipse-tractusx/sldt-digital-twin-registry/tree/main/charts/registry) | 0.4.3 | 0.4.11 | ## Known Knows diff --git a/backend/pom.xml b/backend/pom.xml index 85cb0e63..bf7d3f26 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -33,7 +33,7 @@ org.eclipse.tractusx.puris puris-backend - 2.0.1 + 2.0.2 puris-backend PURIS Backend diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java index 55f7e4fe..fcbf7b28 100644 --- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java +++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java @@ -66,7 +66,7 @@ public ResponseEntity getDeliveryMapping( log.warn("Rejecting request at Delivery Information Submodel request 2.0.0 endpoint"); return ResponseEntity.badRequest().build(); } - + if (!"$value".equals(representation)) { log.warn("Rejecting request at Delivery Information Submodel request 2.0.0 endpoint, missing '$value' in request"); if (!PatternStore.NON_EMPTY_NON_VERTICAL_WHITESPACE_PATTERN.matcher(representation).matches()) { @@ -75,8 +75,11 @@ public ResponseEntity getDeliveryMapping( log.warn("Received " + representation + " from " + bpnl); return ResponseEntity.status(501).build(); } + + log.info("Received request for " + materialNumberCx + " from " + bpnl); var samm = deliveryRequestApiSrvice.handleDeliverySubmodelRequest(bpnl, materialNumberCx); if (samm == null) { + log.error("SAMM for delivery is null, return 500."); return ResponseEntity.status(500).build(); } return ResponseEntity.ok(samm); diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java index 4d478433..409fcfe2 100644 --- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java +++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java @@ -25,7 +25,6 @@ import jakarta.validation.constraints.Pattern; import lombok.*; import lombok.experimental.SuperBuilder; - import org.eclipse.tractusx.puris.backend.common.domain.model.measurement.ItemUnitEnumeration; import org.eclipse.tractusx.puris.backend.common.util.PatternStore; import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material; @@ -108,23 +107,23 @@ public boolean equals(Object o) { final Delivery that = (Delivery) o; return this.getMaterial().getOwnMaterialNumber().equals(that.getMaterial().getOwnMaterialNumber()) && - this.getPartner().getUuid().equals(that.getPartner().getUuid()) && - this.getTrackingNumber().equals(that.getTrackingNumber()) && - this.getIncoterm().equals(that.getIncoterm()) && - this.getDestinationBpns().equals(that.getDestinationBpns()) && - this.getDestinationBpna().equals(that.getDestinationBpna()) && - this.getOriginBpns().equals(that.getOriginBpns()) && - this.getOriginBpna().equals(that.getOriginBpna()) && - this.getDateOfDeparture().equals(that.getDateOfDeparture()) && - this.getDateOfArrival().equals(that.getDateOfArrival()) && - this.getDepartureType().equals(that.getDepartureType()) && - this.getArrivalType().equals(that.getArrivalType()) && - this.getIncoterm().equals(that.getIncoterm()) && - ( - Objects.equals(this.getCustomerOrderNumber(), that.getCustomerOrderNumber()) && + this.getPartner().getUuid().equals(that.getPartner().getUuid()) && + Objects.equals(this.getTrackingNumber(), that.getTrackingNumber()) && + this.getIncoterm().equals(that.getIncoterm()) && + this.getDestinationBpns().equals(that.getDestinationBpns()) && + this.getDestinationBpna().equals(that.getDestinationBpna()) && + this.getOriginBpns().equals(that.getOriginBpns()) && + this.getOriginBpna().equals(that.getOriginBpna()) && + this.getDateOfDeparture().equals(that.getDateOfDeparture()) && + this.getDateOfArrival().equals(that.getDateOfArrival()) && + this.getDepartureType().equals(that.getDepartureType()) && + this.getArrivalType().equals(that.getArrivalType()) && + this.getIncoterm().equals(that.getIncoterm()) && + ( + Objects.equals(this.getCustomerOrderNumber(), that.getCustomerOrderNumber()) && Objects.equals(this.getCustomerOrderPositionNumber(), that.getCustomerOrderPositionNumber()) && Objects.equals(this.getSupplierOrderNumber(), that.getSupplierOrderNumber()) - ); + ); } @Override diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java index 11eb0919..b9ecfc97 100644 --- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java +++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java @@ -24,9 +24,12 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.puris.backend.common.edc.domain.model.SubmodelType; import org.eclipse.tractusx.puris.backend.common.edc.logic.service.EdcAdapterService; +import org.eclipse.tractusx.puris.backend.delivery.domain.model.DeliveryResponsibilityEnumeration; +import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery; import org.eclipse.tractusx.puris.backend.delivery.logic.adapter.DeliveryInformationSammMapper; import org.eclipse.tractusx.puris.backend.delivery.logic.dto.deliverysamm.DeliveryInformation; import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material; +import org.eclipse.tractusx.puris.backend.masterdata.domain.model.MaterialPartnerRelation; import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner; import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialPartnerRelationService; import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialService; @@ -35,7 +38,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; +import java.util.function.Predicate; @Service @Slf4j @@ -68,15 +73,33 @@ public DeliveryInformation handleDeliverySubmodelRequest(String bpnl, String mat } Material material = materialService.findByMaterialNumberCx(materialNumberCx); + MaterialPartnerRelation mpr = mprService.findByPartnerAndPartnerCXNumber(partner, materialNumberCx); + if (material == null) { // Could not identify partner cx number. I.e. we do not have that partner's // CX id in one of our MaterialPartnerRelation entities. Try to fix this by // looking for MPR's, where that partner is a supplier and where we don't have // a partnerCXId yet. Of course this can only work if there was previously an MPR // created, but for some unforeseen reason, the initial PartTypeRetrieval didn't succeed. - log.warn("Could not find " + materialNumberCx + " from partner " + partner.getBpnl()); - mprService.triggerPartTypeRetrievalTask(partner); - material = materialService.findByMaterialNumberCx(materialNumberCx); + // Sidenote: This still means that the ShellDescriptor has not been created and someone tries to access our + // api without using the href from DTR + if (mpr == null) { + log.warn("Could not find " + materialNumberCx + " from partner " + partner.getBpnl()); + log.warn("ATTENTION: PARTNER WITH BPNL {} ACCESSED THE SERVICE FOR A MATERIAL WITHOUT SHELL DESCRIPTOR " + + "IN DTR. THIS MIGHT BE A SECURITY ISSUE!", partner.getBpnl()); + mprService.triggerPartTypeRetrievalTask(partner); + // check if cx id is now given + mpr = mprService.findByPartnerAndPartnerCXNumber(partner, materialNumberCx); + if (mpr == null) { + log.error("No material partner relation for BPNL '{}' and material global asset id '{}'." + + "Abort answering delivery request.", + partner.getBpnl(), + materialNumberCx + ); + return null; + } + } + material = mpr.getMaterial(); } if (material == null) { @@ -84,13 +107,43 @@ public DeliveryInformation handleDeliverySubmodelRequest(String bpnl, String mat return null; } - var mpr = mprService.find(material,partner); - if (mpr == null || !mpr.isPartnerSuppliesMaterial()) { + // if the material number cx has been defined by us, we're returning information as an supplier + // that means our partner is acting as customer + // search mpr again by partner and material to have one mpr at hand independent of partner role + boolean partnerIsCustomer = material.getMaterialNumberCx().equals(materialNumberCx); + mpr = mprService.find(material, partner); + if (mpr == null || + (partnerIsCustomer && !mpr.isPartnerBuysMaterial()) || + (!partnerIsCustomer && !mpr.isPartnerSuppliesMaterial()) + ) { // only send an answer if partner is registered as supplier + log.warn( + "Partner acts as role '{}' but tried to access data for material number cx '{}' for the " + + "opposite role '{}'. Returning no data at all.", + partnerIsCustomer ? "Customer" : "Supplier", + materialNumberCx, + partnerIsCustomer ? "Supplier" : "Customer" + ); return null; } - var currentDeliveries = ownDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl())); + List currentDeliveries = ownDeliveryService.findAllByFilters( + Optional.of(material.getOwnMaterialNumber()), + Optional.empty(), + Optional.of(partner.getBpnl()) + ); + + Predicate parnterRoleDirectionPredicate = partnerRoleDirectionPredicate(partnerIsCustomer, mpr); + currentDeliveries = currentDeliveries.stream().filter( + parnterRoleDirectionPredicate + ).toList(); + log.debug( + "Found '{}' deliveries for material number cx '{}' for partner with bpnl '{}' asking in role '{}'.", + currentDeliveries.size(), + materialNumberCx, + bpnl, + partnerIsCustomer ? "Customer" : "Supplier" + ); return sammMapper.ownDeliveryToSamm(currentDeliveries, partner, material); } @@ -126,4 +179,38 @@ public void doReportedDeliveryRequest(Partner partner, Material material) { log.error("Error in Reported Deliveries Request for " + material.getOwnMaterialNumber() + " and partner " + partner.getBpnl(), e); } } + + /** + * filters OwnDelivery entities to be returned to a partner based on his role + *

+ * Based on accuracy the following rules apply: + *

  • use role derived from cx id and incoterm responsibility
  • + *
  • use mpr role, if only one is present and no incoterms are given
  • + * + * @param partnerIsCustomer to use as role in combination with incoterms (derived from material number cx) + * @param mpr to check the supplies / orders relation in case of missing incoterms + * @return Predicate returning true if incoterms and role match or no incoterm but only one role on mpr is given, else false + */ + public static Predicate partnerRoleDirectionPredicate(boolean partnerIsCustomer, MaterialPartnerRelation mpr) { + return delivery -> { + // return all, if no incoterm is set but partner only acts in one role + if (delivery.getIncoterm() == null) { + // unlikely that we have a mpr without any role set but then we also don't return something + if (mpr.isPartnerBuysMaterial() && mpr.isPartnerSuppliesMaterial()) { + return false; + } else return mpr.isPartnerBuysMaterial() || mpr.isPartnerSuppliesMaterial(); + } + + // if we have incoterms set, filter more sophisticatedly based on responsbility of incoterms and role + // derived from material number cx + DeliveryResponsibilityEnumeration responsibility = delivery.getIncoterm().getResponsibility(); + if (partnerIsCustomer) { + return responsibility == DeliveryResponsibilityEnumeration.SUPPLIER || + responsibility == DeliveryResponsibilityEnumeration.PARTIAL; + } else { + return responsibility == DeliveryResponsibilityEnumeration.CUSTOMER || + responsibility == DeliveryResponsibilityEnumeration.PARTIAL; + } + }; + } } diff --git a/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java b/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java new file mode 100644 index 00000000..9cdc187a --- /dev/null +++ b/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2024 Volkswagen AG + * Copyright (c) 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.puris.backend.delivery.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.puris.backend.common.domain.model.measurement.ItemUnitEnumeration; +import org.eclipse.tractusx.puris.backend.common.edc.logic.service.EdcAdapterService; +import org.eclipse.tractusx.puris.backend.delivery.domain.model.EventTypeEnumeration; +import org.eclipse.tractusx.puris.backend.delivery.domain.model.IncotermEnumeration; +import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery; +import org.eclipse.tractusx.puris.backend.delivery.logic.adapter.DeliveryInformationSammMapper; +import org.eclipse.tractusx.puris.backend.delivery.logic.service.DeliveryRequestApiService; +import org.eclipse.tractusx.puris.backend.delivery.logic.service.OwnDeliveryService; +import org.eclipse.tractusx.puris.backend.delivery.logic.service.ReportedDeliveryService; +import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material; +import org.eclipse.tractusx.puris.backend.masterdata.domain.model.MaterialPartnerRelation; +import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner; +import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialPartnerRelationService; +import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialService; +import org.eclipse.tractusx.puris.backend.masterdata.logic.service.PartnerService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; +import java.util.function.Predicate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@Slf4j +public class DeliveryRequestApiServiceTest { + + @InjectMocks + private DeliveryRequestApiService deliveryRequestApiService; + + @Mock + private PartnerService partnerService; + @Mock + private MaterialService materialService; + @Mock + private MaterialPartnerRelationService mprService; + @Mock + private OwnDeliveryService ownDeliveryService; + @Mock + private ReportedDeliveryService reportedDeliveryService; + @Mock + private EdcAdapterService edcAdapterService; + @Mock + private DeliveryInformationSammMapper sammMapper; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + private static final String MATERIAL_NUMBER_CX_CUSTOMER = UUID.randomUUID().toString(); + private static final String BPNL_CUSTOMER = "BPNL4444444444XX"; + private static final String BPNS_CUSTOMER = "BPNS4444444444XX"; + private static final String BPNA_CUSTOMER = "BPNA4444444444AA"; + + private static final String MATERIAL_NUMBER_CX_SUPPLIER = UUID.randomUUID().toString(); + private static final String BPNL_SUPPLIER = "BPNL1234567890ZZ"; + private static final String BPNS_SUPPLIER = "BPNS1234567890ZZ"; + private static final String BPNA_SUPPLIER = "BPNA1234567890AA"; + + private Partner CUSTOMER_PARTNER; + private Partner SUPPLIER_PARTNER; + + private static final Material TEST_MATERIAL = new Material( + true, + true, + "Own-Mnr", + MATERIAL_NUMBER_CX_CUSTOMER, + "Test Material" + ); + + private static final Material TEST_MATERIAL_SUPPLIER = new Material( + true, + true, + "Own-Mnr", + MATERIAL_NUMBER_CX_SUPPLIER, + "Test Material" + ); + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + + CUSTOMER_PARTNER = new Partner( + "Test Customer", + "http://some-edc.com", + BPNL_CUSTOMER, + BPNS_CUSTOMER, + "Site Name", + BPNA_CUSTOMER, + "Street 10", + "40468 Testdorf", + "DE" + ); + CUSTOMER_PARTNER.setUuid(UUID.randomUUID()); + + SUPPLIER_PARTNER = new Partner( + "Test Supplier", + "http://some-edc.com", + BPNL_SUPPLIER, + BPNS_SUPPLIER, + "Site Name", + BPNA_SUPPLIER, + "Street 10", + "40468 Testdorf", + "DE" + ); + SUPPLIER_PARTNER.setUuid(UUID.randomUUID()); + } + + @Test + /** + * tests that the part type information task is triggered to get the cx id if neither material is + * neither found via material nor mpr + *

    + * NOTE: This test is very theoretical as this means, that someone queries the service while we didn't even + * create the ShellDescriptor with the HREF. + */ + void customerGetsRequestNoCxId_testHandleDeliverySubmodelRequest_works() { + // given + // Delivery with incoterm with Customer responsibility + OwnDelivery delivery = getDelivery(); + delivery.setIncoterm(IncotermEnumeration.EXW); + + // Delivery with incoterm with PARTIAL responsibility + OwnDelivery delivery2 = getDelivery(); + delivery2.setIncoterm(IncotermEnumeration.FCA); + + // Delivery with incoterm with SUPPLIER responsibility + OwnDelivery delivery3 = getDelivery(); + delivery3.setIncoterm(IncotermEnumeration.DAP); + + List deliveries = Arrays.asList(delivery, delivery2, delivery3); + + // partner supplies only + MaterialPartnerRelation mpr = getMpr(SUPPLIER_PARTNER, true, false); + + // when - Customer gets request from supplier + when(partnerService.findByBpnl(BPNL_SUPPLIER)).thenReturn(SUPPLIER_PARTNER); + // cx id should be on mpr as case is customer + when(materialService.findByMaterialNumberCx(MATERIAL_NUMBER_CX_SUPPLIER)).thenReturn(null); + // return null to trigger update of Partner CX Id, then return valid mpr after update + when(mprService.findByPartnerAndPartnerCXNumber(SUPPLIER_PARTNER, MATERIAL_NUMBER_CX_SUPPLIER)) + .thenReturn(null) + .thenReturn(mpr); + + // update the partnerCxNumber mocked wise - could be done differently, but is closer to workflow + doAnswer((Answer) invocation -> { + mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER); + return null; + }).when(mprService).triggerPartTypeRetrievalTask(SUPPLIER_PARTNER); + + // return all deliveries defined above + // predicate for customer case will return delivery, delivery2 + when(ownDeliveryService.findAllByFilters( + Optional.of(mpr.getMaterial().getOwnMaterialNumber()), + Optional.empty(), + Optional.of(BPNL_SUPPLIER) + )).thenReturn(deliveries); + + // return mpr after update + when(mprService.find(mpr.getMaterial(), SUPPLIER_PARTNER)).thenReturn(mpr); + + // trigger the api handling, we don't care about the answer as we don't mock the samm mapper + deliveryRequestApiService.handleDeliverySubmodelRequest(BPNL_SUPPLIER, MATERIAL_NUMBER_CX_SUPPLIER); + + //then + // verify that update has been triggered due to missing cx id as customer + verify(mprService, times(1)).triggerPartTypeRetrievalTask(SUPPLIER_PARTNER); + // we don't mock the samm mapper and do not evaluate it results as it will be null (no mock implementation). + // verfy that samm mapper has been called correctly (our concern) + verify(sammMapper) + .ownDeliveryToSamm( + eq(Arrays.asList(delivery, delivery2)), + eq(SUPPLIER_PARTNER), + eq(mpr.getMaterial()) + ); + } + + @Test + void noIncotermsUniqueMprRole_testPartnerRolePredicate_returnsTrue() { + // given + // Delivery without incoterm + OwnDelivery delivery = getDelivery(); + + List deliveries = Collections.singletonList(delivery); + + // partner buys only + MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, false, true); + mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER); + + // when - Supplier gets request from customer + Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService. + partnerRoleDirectionPredicate(true, mpr); + + List filteredDeliveries = deliveries.stream().filter( + partnerRoleDirectionPredicate + ).toList(); + + //then + assertEquals(deliveries, filteredDeliveries); + } + + @Test + void noIncotermsNonUniqueMprRole_testPartnerRolePredicate_returnsFalse() { + // given + // Delivery without incoterm + OwnDelivery delivery = getDelivery(); + + List deliveries = Collections.singletonList(delivery); + + // partner buys only + MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true); + mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER); + + // when - Supplier gets request from customer + Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService. + partnerRoleDirectionPredicate(true, mpr); + + List filteredDeliveries = deliveries.stream().filter( + partnerRoleDirectionPredicate + ).toList(); + + //then + assertEquals(0, filteredDeliveries.size()); + } + + @Test + void setIncotermsCustomerRole_testPartnerRolePredicate_filters() { + // given + // Delivery with incoterm with Customer responsibility + OwnDelivery delivery = getDelivery(); + delivery.setIncoterm(IncotermEnumeration.EXW); + + // Delivery with incoterm with PARTIAL responsibility + OwnDelivery delivery2 = getDelivery(); + delivery2.setIncoterm(IncotermEnumeration.FCA); + + // Delivery with incoterm with SUPPLIER responsibility + OwnDelivery delivery3 = getDelivery(); + delivery3.setIncoterm(IncotermEnumeration.DAP); + + List deliveries = Arrays.asList(delivery, delivery2, delivery3); + + // partner buys and supplies + MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true); + mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER); + + // when - Supplier gets request from customer + Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService. + partnerRoleDirectionPredicate(true, mpr); + + List filteredDeliveries = deliveries.stream().filter( + partnerRoleDirectionPredicate + ).toList(); + + //then + assertEquals(2, filteredDeliveries.size()); + // Responsibilities SUPPLIER and PARTIAL have been found, order IS relevant + assertEquals(Arrays.asList(delivery2, delivery3), filteredDeliveries); + } + + @Test + void setIncotermsSupplierRole_testPartnerRolePredicate_filters() { + // given + // Delivery with incoterm with Customer responsibility + OwnDelivery delivery = getDelivery(); + delivery.setIncoterm(IncotermEnumeration.EXW); + + // Delivery with incoterm with PARTIAL responsibility + OwnDelivery delivery2 = getDelivery(); + delivery2.setIncoterm(IncotermEnumeration.FCA); + + // Delivery with incoterm with SUPPLIER responsibility + OwnDelivery delivery3 = getDelivery(); + delivery3.setIncoterm(IncotermEnumeration.DAP); + + List deliveries = Arrays.asList(delivery, delivery2, delivery3); + + // partner supplies only + MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true); + mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER); + + // when - Supplier gets request from customer + Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService. + partnerRoleDirectionPredicate(false, mpr); + + List filteredDeliveries = deliveries.stream().filter( + partnerRoleDirectionPredicate + ).toList(); + + //then + assertEquals(2, filteredDeliveries.size()); + // Responsibilities PARTIAL and CUSTOMER have been found, order IS relevant + assertEquals(Arrays.asList(delivery, delivery2), filteredDeliveries); + } + + private OwnDelivery getDelivery() { + LocalDate tomorrow = LocalDate.now().plusDays(1); + Date tomorrowDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant()); + return OwnDelivery.builder() + .material(TEST_MATERIAL) + .partner(CUSTOMER_PARTNER) + .originBpna(BPNS_SUPPLIER) + .originBpna(BPNA_SUPPLIER) + .departureType(EventTypeEnumeration.ESTIMATED_DEPARTURE) + .dateOfDeparture(tomorrowDate) + .destinationBpns(BPNS_CUSTOMER) + .destinationBpna(BPNA_CUSTOMER) + .arrivalType(EventTypeEnumeration.ESTIMATED_ARRIVAL) + .dateOfArrival(new Date()) + .incoterm(null) + .measurementUnit(ItemUnitEnumeration.UNIT_PIECE) + .quantity(200) + .build(); + } + + private MaterialPartnerRelation getMpr(Partner partner, boolean partnerSupplies, boolean partnerBuys) { + return new MaterialPartnerRelation( + TEST_MATERIAL, + partner, + "Partner Material Number", + partnerSupplies, + partnerBuys + ); + } +} diff --git a/charts/puris/Chart.yaml b/charts/puris/Chart.yaml index 5b563bc2..f95fbeac 100644 --- a/charts/puris/Chart.yaml +++ b/charts/puris/Chart.yaml @@ -35,10 +35,10 @@ dependencies: # 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.6.2 +version: 2.6.3 # 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: "2.0.1" +appVersion: "2.0.2" diff --git a/charts/puris/README.md b/charts/puris/README.md index 3432a6e4..91802d70 100644 --- a/charts/puris/README.md +++ b/charts/puris/README.md @@ -1,12 +1,13 @@ # puris -![Version: 2.6.2](https://img.shields.io/badge/Version-2.6.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.0.1](https://img.shields.io/badge/AppVersion-2.0.1-informational?style=flat-square) +![Version: 2.6.3](https://img.shields.io/badge/Version-2.6.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.0.2](https://img.shields.io/badge/AppVersion-2.0.2-informational?style=flat-square) A helm chart for Kubernetes deployment of PURIS **Homepage:** ## Prerequisites + - Kubernetes 1.19+ - Helm 3.2.0+ @@ -18,6 +19,7 @@ To install the chart with the release name `puris`: $ helm repo add tractusx-dev https://eclipse-tractusx.github.io/charts/dev $ helm install puris tractusx-dev/policy-hub ``` + To install the helm chart into your cluster with your values: ```shell @@ -28,9 +30,9 @@ To use the helm chart as a dependency: ```yaml dependencies: - - name: puris - repository: https://eclipse-tractusx.github.io/charts/dev - version: YOUR_VERSION + - name: puris + repository: https://eclipse-tractusx.github.io/charts/dev + version: YOUR_VERSION ``` ## Source Code @@ -39,182 +41,182 @@ dependencies: ## Requirements -| Repository | Name | Version | -|------------|------|---------| +| Repository | Name | Version | +|------------------------------------|------------|---------| | https://charts.bitnami.com/bitnami | postgresql | 12.12.x | ## Values -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod | -| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity | -| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster | -| backend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods | -| backend.env | object | `{}` | Extra environment variables that will be passed onto the backend deployment pods | -| backend.image.pullPolicy | string | `"Always"` | THe policy for the image pull process | -| backend.image.repository | string | `"tractusx/app-puris-backend"` | Repository of the docker image | -| backend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. | -| backend.imagePullSecrets | list | `[]` | List of used secrets | -| backend.ingress.annotations | object | `{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/backend-protocol":"HTTP","nginx.ingress.kubernetes.io/force-ssl-redirect":"true","nginx.ingress.kubernetes.io/ssl-passthrough":"true"}` | Annotations for the Ingress controller | -| backend.ingress.annotations."kubernetes.io/ingress.class" | string | `"nginx"` | Kubernetes Ingress class annotation for direct bindings | -| backend.ingress.annotations."nginx.ingress.kubernetes.io/backend-protocol" | string | `"HTTP"` | The backend protocol type (e.g. HTTP) | -| backend.ingress.annotations."nginx.ingress.kubernetes.io/force-ssl-redirect" | string | `"true"` | Force redirects from HTTP to HTTPS | -| backend.ingress.annotations."nginx.ingress.kubernetes.io/ssl-passthrough" | string | `"true"` | Pass SSL traffic to the backend ports | -| backend.ingress.enabled | bool | `false` | Enable the Ingress | -| backend.ingress.hosts | list | `[{"host":"your-backend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller | -| backend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller | -| backend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not | -| backend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe | -| backend.livenessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial liveness probe is checked | -| backend.livenessProbe.periodSeconds | int | `25` | Wait time in seconds between liveness probes | -| backend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive | -| backend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe | -| backend.nameOverride | string | `""` | Possibility to override the name | -| backend.nodeSelector | object | `{}` | Constrains for the node selector | -| backend.podAnnotations | object | `{}` | Annotations added to a running pod | -| backend.podSecurityContext | object | `{}` | Added security contexts for a pod | -| backend.puris.api.key | string | `"test"` | The API key of the PURIS application | -| backend.puris.api.rootDir | string | `"/catena"` | The root directory of the API | -| backend.puris.baseurl | string | `"your-backend-host-address.com"` | Base url of the PURIS backend | -| backend.puris.datasource.driverClassName | string | `"org.postgresql.Driver"` | Driver class name of the database | -| backend.puris.datasource.password | string | `""` | Password for the database user. Ignored if postgres.enabled is true. | -| backend.puris.datasource.url | string | `"jdbc:postgresql://postgresql-name:5432/puris-database"` | URL of the database. Ignored if postgres.enabled is true. | -| backend.puris.datasource.username | string | `"db-user"` | Username of the database. Ignored if postgres.enabled is true. | -| backend.puris.deliverysubmodel.apiassetid | string | `"deliverysubmodel-api-asset"` | Asset ID for DeliverySubmodel API | -| backend.puris.demandsubmodel.apiassetid | string | `"demandsubmodel-api-asset"` | Asset ID for DemandSubmodel API | -| backend.puris.demonstrator.role | string | `nil` | Current role of the PURIS demonstrator. Default value should be empty. Can be set to "customer" or "supplier" to enable demonstration setup | -| backend.puris.dtr.idp.clients.edc.id | string | `"FOSS-EDC-CLIENT"` | id of the client that has a service account with roles to view the DTR. Used by the application to create DTR asset in the edc with read only access. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. | -| backend.puris.dtr.idp.clients.edc.secret.alias | string | `"path/secret-name"` | alias for the vault used by the EDC in which the secret is stored. Mandatory if backend.puris.dtr.idp.enabled = true. | -| backend.puris.dtr.idp.clients.puris.id | string | `"FOSS-PURIS-CLIENT"` | id of the client that has a service account with roles to manage the DTR. Used by the application to create and update digital twins. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. | -| backend.puris.dtr.idp.clients.puris.secret | string | `""` | secret of the client with write access (no vault alias). No default value will be created if empty. Mandatory if backend.puris.dtr.idp.enabled = true. | -| backend.puris.dtr.idp.enabled | bool | `true` | enables the usage of the IDP for the DTR. | -| backend.puris.dtr.idp.tokenurl | string | `"https://keycloak-service.com/realms/your-realm/openid-connect/token"` | token url of the idp for your specific realm. May be different to other idp token url in this config. Mandatory if backend.puris.dtr.idp.enabled = true. | -| backend.puris.dtr.url | string | `"http://localhost:4243"` | Endpoint for DTR | -| backend.puris.edc.controlplane.host | string | `"172.17.0.2"` | | -| backend.puris.edc.controlplane.key | string | `"password"` | Key for the EDC control plane | -| backend.puris.edc.controlplane.management.url | string | `"https:/your-edc-address:8181/management"` | Url to the EDC controlplane management of the edc | -| backend.puris.edc.controlplane.protocol.url | string | `"https://your-edc-address:8184/api/v1/dsp"` | Url to the EDC controlplane protocol API of the edc | -| backend.puris.edc.dataplane.public.url | string | `"https://your-data-plane:8285/api/public/"` | Url of one of your data plane's public api | -| backend.puris.existingSecret | string | `"secret-puris-backend"` | Secret for backend passwords. For more information look into 'backend-secrets.yaml' file. | -| backend.puris.frameworkagreement.credential | string | `"Puris"` | The name of the framework agreement. Starting with Uppercase and using CamelCase. | -| backend.puris.frameworkagreement.version | string | `"1.0"` | The version of the framework agreement, NEEDS TO BE PUT AS "STRING"! | -| backend.puris.generatematerialcatenaxid | bool | `true` | Flag that decides whether the auto-generation feature of the puris backend is enabled. Since all Material entities are required to have a CatenaX-Id, you must enter any pre-existing CatenaX-Id via the materials-API of the backend, when you are inserting a new Material entity to the backend's database. If a CatenaX-Id was not assigned to your Material so far, then this feature can auto-generate one randomly. In a real-world-scenario, you must then use this randomly generated CatenaX-Id for the lifetime of that Material entity. | -| backend.puris.itemstocksubmodel.apiassetid | string | `"itemstocksubmodel-api-asset"` | Asset ID for ItemStockSubmodel API | -| backend.puris.jpa.hibernate.ddl-auto | string | `"create"` | Initialises SQL database with Hibernate property "create" to allow Hibernate to first drop all tables and then create new ones | -| backend.puris.jpa.properties.hibernate.enable_lazy_load_no_trans | bool | `true` | Enables "Lazy load no trans" property to fetch of each lazy entity to open a temporary session and run inside a separate transaction | -| backend.puris.own.bpna | string | `"BPNA4444444444ZZ"` | Own BPNA of the EDC | -| backend.puris.own.bpnl | string | `"BPNL4444444444XX"` | Own BPNL of the EDC | -| backend.puris.own.bpns | string | `"BPNS4444444444XX"` | Own BPNS of the EDC | -| backend.puris.own.country | string | `"Germany"` | Own country | -| backend.puris.own.name | string | `"YOUR-COMPANY-NAME"` | Own name (self-description) | -| backend.puris.own.site.name | string | `"YOUR-SITE-NAME"` | Own site name | -| backend.puris.own.streetnumber | string | `"Musterstraße 110A"` | Own street and number | -| backend.puris.own.zipcodeandcity | string | `"12345 Musterhausen"` | Own zipcode and city | -| backend.puris.productionsubmodel.apiassetid | string | `"productionsubmodel-api-asset"` | Asset ID for ProductionSubmodel API | -| backend.puris.purpose.name | string | `"cx.puris.base"` | The name of the purpose to use for submodel contracts | -| backend.puris.purpose.version | string | `"1"` | The version of the purpose to use for submodel contracts. NEEDS TO BE PUT AS "STRING"! | -| backend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate | -| backend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe | -| backend.readinessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial readiness probe is checked | -| backend.readinessProbe.periodSeconds | int | `25` | Wait time in seconds between readiness probes | -| backend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready | -| backend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe | -| backend.replicaCount | int | `1` | Number of replicas of the Kubernetes deployment | -| backend.resources.limits | object | `{"cpu":"3000m","memory":"2048Mi"}` | Maximum resource limits of CPU und memory | -| backend.resources.requests | object | `{"cpu":"1000m","memory":"2048Mi"}` | Minimum requested resources for CPU und memory | -| backend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":8877}` | Security configurations | -| backend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process | -| backend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run | -| backend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run | -| backend.securityContext.runAsUser | int | `8877` | Configures the user id for a run | -| backend.service.port | int | `8081` | The port of the service | -| backend.service.type | string | `"ClusterIP"` | Type of the service | -| backend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account | -| backend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created | -| backend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | -| backend.tolerations | list | `[]` | Constrains for tolerations | -| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod | -| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity | -| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster | -| frontend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods | -| frontend.autoscaling.maxReplicas | int | `100` | Number of maximum replica pods for autoscaling | -| frontend.autoscaling.minReplicas | int | `1` | Number of minimum replica pods for autoscaling | -| frontend.autoscaling.targetCPUUtilizationPercentage | int | `80` | Value of CPU usage in percentage for autoscaling decisions | -| frontend.env | object | `{}` | Extra environment variables that will be passed onto the frontend deployment pods | -| frontend.image.pullPolicy | string | `"IfNotPresent"` | THe policy for the image pull process | -| frontend.image.repository | string | `"tractusx/app-puris-frontend"` | Repository of the docker image | -| frontend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. | -| frontend.imagePullSecrets | list | `[]` | List of used secrets | -| frontend.ingress.annotations | object | `{}` | Annotations for the Ingress controller | -| frontend.ingress.className | string | `"nginx"` | Class name for the Ingress controller | -| frontend.ingress.enabled | bool | `false` | Enable the Ingress | -| frontend.ingress.hosts | list | `[{"host":"your-frontend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller | -| frontend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller | -| frontend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not | -| frontend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe | -| frontend.livenessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial liveness probe is checked | -| frontend.livenessProbe.periodSeconds | int | `10` | Wait time in seconds between liveness probes | -| frontend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive | -| frontend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe | -| frontend.nameOverride | string | `""` | Possibility to override the name | -| frontend.nodeSelector | object | `{}` | Constrains for the node selector | -| frontend.podAnnotations | object | `{}` | Annotations added to a running pod | -| frontend.podSecurityContext | object | `{}` | Added security contexts for a pod | -| frontend.puris.appName | string | `"PURIS"` | The name of the app displayed in the frontend | -| frontend.puris.baseUrl | string | `"your-backend-host-address.com"` | The base URL for the backend base URL without further endpoints | -| frontend.puris.endpointCustomer | string | `"stockView/customer?ownMaterialNumber="` | The endpoint for the customers who buy a material identified via the own material number for the stock view | -| frontend.puris.endpointDelivery | string | `"delivery"` | The endpoint for the delivery submodel | -| frontend.puris.endpointDemand | string | `"demand"` | The endpoint for the demand submodel | -| frontend.puris.endpointMaterialStocks | string | `"stockView/material-stocks"` | The endpoint for material stocks for the stock view | -| frontend.puris.endpointMaterials | string | `"stockView/materials"` | The endpoint for materials for the stock view | -| frontend.puris.endpointPartners | string | `"partners"` | The endpoint for partner information | -| frontend.puris.endpointProductStocks | string | `"stockView/product-stocks"` | The endpoint for product stocks for the stock view | -| frontend.puris.endpointProduction | string | `"production"` | The endpoint for the production submodel | -| frontend.puris.endpointProductionRange | string | `"production/range"` | The endpoint for the production range of the production submodel | -| frontend.puris.endpointProducts | string | `"stockView/products"` | The endpoint for products for the stock view | -| frontend.puris.endpointReportedMaterialStocks | string | `"stockView/reported-material-stocks?ownMaterialNumber="` | The endpoint for the partners' (supplier) material stocks that they potentially will deliver to me | -| frontend.puris.endpointReportedProductStocks | string | `"stockView/reported-product-stocks?ownMaterialNumber="` | The endpoint for the partners' (customer) product stocks that they received from me | -| frontend.puris.endpointSupplier | string | `"stockView/supplier?ownMaterialNumber="` | The endpoint for the suppliers who buy a material identified via the own material number for the stock view | -| frontend.puris.endpointUpdateReportedMaterialStocks | string | `"stockView/update-reported-material-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your material stocks on your partners side | -| frontend.puris.endpointUpdateReportedProductStocks | string | `"stockView/update-reported-product-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your product stocks on your partners side | -| frontend.puris.keycloak.clientId | string | `"appXYZ"` | Name of the client which is used for the application. | -| frontend.puris.keycloak.disabled | bool | `true` | Disable the Keycloak integration. | -| frontend.puris.keycloak.realm | string | `"Catena-X"` | Name of the Realm of the keycloak instance. | -| frontend.puris.keycloak.redirectUrlFrontend | string | `"https://your-frontend-url.com"` | URL to use as keycloak redirect url. | -| frontend.puris.keycloak.url | string | `"https://idp.com/auth"` | The URL to the IDP that should be used. | -| frontend.puris.rateLimiting.burst | int | `30` | Burst rate limiting for nginx. | -| frontend.puris.rateLimiting.limit | string | `"10m"` | Bucket zone limit for rate limiting in nginx. | -| frontend.puris.rateLimiting.rate | string | `"10r/s"` | Allowed rates per second for nginx rate limiting. | -| frontend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate | -| frontend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe | -| frontend.readinessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial readiness probe is checked | -| frontend.readinessProbe.periodSeconds | int | `10` | Wait time in seconds between readiness probes | -| frontend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready | -| frontend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe | -| frontend.replicaCount | int | `1` | | -| frontend.resources.limits | object | `{"cpu":"600m","memory":"128Mi"}` | Maximum resource limits of CPU und memory | -| frontend.resources.requests | object | `{"cpu":"200m","memory":"128Mi"}` | Minimum requested resources for CPU und memory | -| frontend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":101}` | Security configurations | -| frontend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process | -| frontend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run | -| frontend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run | -| frontend.securityContext.runAsUser | int | `101` | Configures the user id for a run | -| frontend.service.port | int | `8080` | The port of the service | -| frontend.service.type | string | `"ClusterIP"` | Type of the service | -| frontend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account | -| frontend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created | -| frontend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | -| frontend.tolerations | list | `[]` | Constrains for tolerations | -| global.domain.backend.ingress | string | `"your-backend-host-address.com"` | | -| postgresql.auth.database | string | `"postgres"` | Name of the database. | -| postgresql.auth.existingSecret | string | `"secret-puris-postgres-init"` | Secret containing the password. For more information look into 'backend-secrets-postgres.yaml' file. | -| postgresql.auth.password | string | `""` | Password for the custom database user. Secret-key 'password' | -| postgresql.auth.passwordPostgres | string | `""` | Password for the database. Secret-key 'postgres-password'. | -| postgresql.auth.username | string | `"puris"` | Username for the custom database user. | -| postgresql.enabled | bool | `true` | Enable postgres by default, set to false to use existing postgres. Make sure to set backend.puris.jpa.hibernate.ddl-auto accordingly (by default database is created using hibernate ddl from backend). | -| postgresql.service | object | `{"ports":{"postgresql":5432}}` | Possibility to override the name nameOverride: "" | -| postgresql.service.ports.postgresql | int | `5432` | Port of postgres database. | +| Key | Type | Default | Description | +|-------------------------------------------------------------------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod | +| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity | +| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster | +| backend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods | +| backend.env | object | `{}` | Extra environment variables that will be passed onto the backend deployment pods | +| backend.image.pullPolicy | string | `"Always"` | THe policy for the image pull process | +| backend.image.repository | string | `"tractusx/app-puris-backend"` | Repository of the docker image | +| backend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. | +| backend.imagePullSecrets | list | `[]` | List of used secrets | +| backend.ingress.annotations | object | `{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/backend-protocol":"HTTP","nginx.ingress.kubernetes.io/force-ssl-redirect":"true","nginx.ingress.kubernetes.io/ssl-passthrough":"true"}` | Annotations for the Ingress controller | +| backend.ingress.annotations."kubernetes.io/ingress.class" | string | `"nginx"` | Kubernetes Ingress class annotation for direct bindings | +| backend.ingress.annotations."nginx.ingress.kubernetes.io/backend-protocol" | string | `"HTTP"` | The backend protocol type (e.g. HTTP) | +| backend.ingress.annotations."nginx.ingress.kubernetes.io/force-ssl-redirect" | string | `"true"` | Force redirects from HTTP to HTTPS | +| backend.ingress.annotations."nginx.ingress.kubernetes.io/ssl-passthrough" | string | `"true"` | Pass SSL traffic to the backend ports | +| backend.ingress.enabled | bool | `false` | Enable the Ingress | +| backend.ingress.hosts | list | `[{"host":"your-backend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller | +| backend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller | +| backend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not | +| backend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe | +| backend.livenessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial liveness probe is checked | +| backend.livenessProbe.periodSeconds | int | `25` | Wait time in seconds between liveness probes | +| backend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive | +| backend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe | +| backend.nameOverride | string | `""` | Possibility to override the name | +| backend.nodeSelector | object | `{}` | Constrains for the node selector | +| backend.podAnnotations | object | `{}` | Annotations added to a running pod | +| backend.podSecurityContext | object | `{}` | Added security contexts for a pod | +| backend.puris.api.key | string | `"test"` | The API key of the PURIS application | +| backend.puris.api.rootDir | string | `"/catena"` | The root directory of the API | +| backend.puris.baseurl | string | `"your-backend-host-address.com"` | Base url of the PURIS backend | +| backend.puris.datasource.driverClassName | string | `"org.postgresql.Driver"` | Driver class name of the database | +| backend.puris.datasource.password | string | `""` | Password for the database user. Ignored if postgres.enabled is true. | +| backend.puris.datasource.url | string | `"jdbc:postgresql://postgresql-name:5432/puris-database"` | URL of the database. Ignored if postgres.enabled is true. | +| backend.puris.datasource.username | string | `"db-user"` | Username of the database. Ignored if postgres.enabled is true. | +| backend.puris.deliverysubmodel.apiassetid | string | `"deliverysubmodel-api-asset"` | Asset ID for DeliverySubmodel API | +| backend.puris.demandsubmodel.apiassetid | string | `"demandsubmodel-api-asset"` | Asset ID for DemandSubmodel API | +| backend.puris.demonstrator.role | string | `nil` | Current role of the PURIS demonstrator. Default value should be empty. Can be set to "customer" or "supplier" to enable demonstration setup | +| backend.puris.dtr.idp.clients.edc.id | string | `"FOSS-EDC-CLIENT"` | id of the client that has a service account with roles to view the DTR. Used by the application to create DTR asset in the edc with read only access. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. | +| backend.puris.dtr.idp.clients.edc.secret.alias | string | `"path/secret-name"` | alias for the vault used by the EDC in which the secret is stored. Mandatory if backend.puris.dtr.idp.enabled = true. | +| backend.puris.dtr.idp.clients.puris.id | string | `"FOSS-PURIS-CLIENT"` | id of the client that has a service account with roles to manage the DTR. Used by the application to create and update digital twins. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. | +| backend.puris.dtr.idp.clients.puris.secret | string | `""` | secret of the client with write access (no vault alias). No default value will be created if empty. Mandatory if backend.puris.dtr.idp.enabled = true. | +| backend.puris.dtr.idp.enabled | bool | `true` | enables the usage of the IDP for the DTR. | +| backend.puris.dtr.idp.tokenurl | string | `"https://keycloak-service.com/realms/your-realm/openid-connect/token"` | token url of the idp for your specific realm. May be different to other idp token url in this config. Mandatory if backend.puris.dtr.idp.enabled = true. | +| backend.puris.dtr.url | string | `"http://localhost:4243"` | Endpoint for DTR | +| backend.puris.edc.controlplane.host | string | `"172.17.0.2"` | | +| backend.puris.edc.controlplane.key | string | `"password"` | Key for the EDC control plane | +| backend.puris.edc.controlplane.management.url | string | `"https:/your-edc-address:8181/management"` | Url to the EDC controlplane management of the edc | +| backend.puris.edc.controlplane.protocol.url | string | `"https://your-edc-address:8184/api/v1/dsp"` | Url to the EDC controlplane protocol API of the edc | +| backend.puris.edc.dataplane.public.url | string | `"https://your-data-plane:8285/api/public/"` | Url of one of your data plane's public api | +| backend.puris.existingSecret | string | `"secret-puris-backend"` | Secret for backend passwords. For more information look into 'backend-secrets.yaml' file. | +| backend.puris.frameworkagreement.credential | string | `"Puris"` | The name of the framework agreement. Starting with Uppercase and using CamelCase. | +| backend.puris.frameworkagreement.version | string | `"1.0"` | The version of the framework agreement, NEEDS TO BE PUT AS "STRING"! | +| backend.puris.generatematerialcatenaxid | bool | `true` | Flag that decides whether the auto-generation feature of the puris backend is enabled. Since all Material entities are required to have a CatenaX-Id, you must enter any pre-existing CatenaX-Id via the materials-API of the backend, when you are inserting a new Material entity to the backend's database. If a CatenaX-Id was not assigned to your Material so far, then this feature can auto-generate one randomly. In a real-world-scenario, you must then use this randomly generated CatenaX-Id for the lifetime of that Material entity. | +| backend.puris.itemstocksubmodel.apiassetid | string | `"itemstocksubmodel-api-asset"` | Asset ID for ItemStockSubmodel API | +| backend.puris.jpa.hibernate.ddl-auto | string | `"create"` | Initialises SQL database with Hibernate property "create" to allow Hibernate to first drop all tables and then create new ones | +| backend.puris.jpa.properties.hibernate.enable_lazy_load_no_trans | bool | `true` | Enables "Lazy load no trans" property to fetch of each lazy entity to open a temporary session and run inside a separate transaction | +| backend.puris.own.bpna | string | `"BPNA4444444444ZZ"` | Own BPNA of the EDC | +| backend.puris.own.bpnl | string | `"BPNL4444444444XX"` | Own BPNL of the EDC | +| backend.puris.own.bpns | string | `"BPNS4444444444XX"` | Own BPNS of the EDC | +| backend.puris.own.country | string | `"Germany"` | Own country | +| backend.puris.own.name | string | `"YOUR-COMPANY-NAME"` | Own name (self-description) | +| backend.puris.own.site.name | string | `"YOUR-SITE-NAME"` | Own site name | +| backend.puris.own.streetnumber | string | `"Musterstraße 110A"` | Own street and number | +| backend.puris.own.zipcodeandcity | string | `"12345 Musterhausen"` | Own zipcode and city | +| backend.puris.productionsubmodel.apiassetid | string | `"productionsubmodel-api-asset"` | Asset ID for ProductionSubmodel API | +| backend.puris.purpose.name | string | `"cx.puris.base"` | The name of the purpose to use for submodel contracts | +| backend.puris.purpose.version | string | `"1"` | The version of the purpose to use for submodel contracts. NEEDS TO BE PUT AS "STRING"! | +| backend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate | +| backend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe | +| backend.readinessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial readiness probe is checked | +| backend.readinessProbe.periodSeconds | int | `25` | Wait time in seconds between readiness probes | +| backend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready | +| backend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe | +| backend.replicaCount | int | `1` | Number of replicas of the Kubernetes deployment | +| backend.resources.limits | object | `{"cpu":"3000m","memory":"2048Mi"}` | Maximum resource limits of CPU und memory | +| backend.resources.requests | object | `{"cpu":"1000m","memory":"2048Mi"}` | Minimum requested resources for CPU und memory | +| backend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":8877}` | Security configurations | +| backend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process | +| backend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run | +| backend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run | +| backend.securityContext.runAsUser | int | `8877` | Configures the user id for a run | +| backend.service.port | int | `8081` | The port of the service | +| backend.service.type | string | `"ClusterIP"` | Type of the service | +| backend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| backend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created | +| backend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| backend.tolerations | list | `[]` | Constrains for tolerations | +| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod | +| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity | +| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster | +| frontend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods | +| frontend.autoscaling.maxReplicas | int | `100` | Number of maximum replica pods for autoscaling | +| frontend.autoscaling.minReplicas | int | `1` | Number of minimum replica pods for autoscaling | +| frontend.autoscaling.targetCPUUtilizationPercentage | int | `80` | Value of CPU usage in percentage for autoscaling decisions | +| frontend.env | object | `{}` | Extra environment variables that will be passed onto the frontend deployment pods | +| frontend.image.pullPolicy | string | `"IfNotPresent"` | THe policy for the image pull process | +| frontend.image.repository | string | `"tractusx/app-puris-frontend"` | Repository of the docker image | +| frontend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. | +| frontend.imagePullSecrets | list | `[]` | List of used secrets | +| frontend.ingress.annotations | object | `{}` | Annotations for the Ingress controller | +| frontend.ingress.className | string | `"nginx"` | Class name for the Ingress controller | +| frontend.ingress.enabled | bool | `false` | Enable the Ingress | +| frontend.ingress.hosts | list | `[{"host":"your-frontend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller | +| frontend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller | +| frontend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not | +| frontend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe | +| frontend.livenessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial liveness probe is checked | +| frontend.livenessProbe.periodSeconds | int | `10` | Wait time in seconds between liveness probes | +| frontend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive | +| frontend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe | +| frontend.nameOverride | string | `""` | Possibility to override the name | +| frontend.nodeSelector | object | `{}` | Constrains for the node selector | +| frontend.podAnnotations | object | `{}` | Annotations added to a running pod | +| frontend.podSecurityContext | object | `{}` | Added security contexts for a pod | +| frontend.puris.appName | string | `"PURIS"` | The name of the app displayed in the frontend | +| frontend.puris.baseUrl | string | `"your-backend-host-address.com"` | The base URL for the backend base URL without further endpoints | +| frontend.puris.endpointCustomer | string | `"stockView/customer?ownMaterialNumber="` | The endpoint for the customers who buy a material identified via the own material number for the stock view | +| frontend.puris.endpointDelivery | string | `"delivery"` | The endpoint for the delivery submodel | +| frontend.puris.endpointDemand | string | `"demand"` | The endpoint for the demand submodel | +| frontend.puris.endpointMaterialStocks | string | `"stockView/material-stocks"` | The endpoint for material stocks for the stock view | +| frontend.puris.endpointMaterials | string | `"stockView/materials"` | The endpoint for materials for the stock view | +| frontend.puris.endpointPartners | string | `"partners"` | The endpoint for partner information | +| frontend.puris.endpointProductStocks | string | `"stockView/product-stocks"` | The endpoint for product stocks for the stock view | +| frontend.puris.endpointProduction | string | `"production"` | The endpoint for the production submodel | +| frontend.puris.endpointProductionRange | string | `"production/range"` | The endpoint for the production range of the production submodel | +| frontend.puris.endpointProducts | string | `"stockView/products"` | The endpoint for products for the stock view | +| frontend.puris.endpointReportedMaterialStocks | string | `"stockView/reported-material-stocks?ownMaterialNumber="` | The endpoint for the partners' (supplier) material stocks that they potentially will deliver to me | +| frontend.puris.endpointReportedProductStocks | string | `"stockView/reported-product-stocks?ownMaterialNumber="` | The endpoint for the partners' (customer) product stocks that they received from me | +| frontend.puris.endpointSupplier | string | `"stockView/supplier?ownMaterialNumber="` | The endpoint for the suppliers who buy a material identified via the own material number for the stock view | +| frontend.puris.endpointUpdateReportedMaterialStocks | string | `"stockView/update-reported-material-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your material stocks on your partners side | +| frontend.puris.endpointUpdateReportedProductStocks | string | `"stockView/update-reported-product-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your product stocks on your partners side | +| frontend.puris.keycloak.clientId | string | `"appXYZ"` | Name of the client which is used for the application. | +| frontend.puris.keycloak.disabled | bool | `true` | Disable the Keycloak integration. | +| frontend.puris.keycloak.realm | string | `"Catena-X"` | Name of the Realm of the keycloak instance. | +| frontend.puris.keycloak.redirectUrlFrontend | string | `"https://your-frontend-url.com"` | URL to use as keycloak redirect url. | +| frontend.puris.keycloak.url | string | `"https://idp.com/auth"` | The URL to the IDP that should be used. | +| frontend.puris.rateLimiting.burst | int | `30` | Burst rate limiting for nginx. | +| frontend.puris.rateLimiting.limit | string | `"10m"` | Bucket zone limit for rate limiting in nginx. | +| frontend.puris.rateLimiting.rate | string | `"10r/s"` | Allowed rates per second for nginx rate limiting. | +| frontend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate | +| frontend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe | +| frontend.readinessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial readiness probe is checked | +| frontend.readinessProbe.periodSeconds | int | `10` | Wait time in seconds between readiness probes | +| frontend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready | +| frontend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe | +| frontend.replicaCount | int | `1` | | +| frontend.resources.limits | object | `{"cpu":"600m","memory":"128Mi"}` | Maximum resource limits of CPU und memory | +| frontend.resources.requests | object | `{"cpu":"200m","memory":"128Mi"}` | Minimum requested resources for CPU und memory | +| frontend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":101}` | Security configurations | +| frontend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process | +| frontend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run | +| frontend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run | +| frontend.securityContext.runAsUser | int | `101` | Configures the user id for a run | +| frontend.service.port | int | `8080` | The port of the service | +| frontend.service.type | string | `"ClusterIP"` | Type of the service | +| frontend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| frontend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created | +| frontend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| frontend.tolerations | list | `[]` | Constrains for tolerations | +| global.domain.backend.ingress | string | `"your-backend-host-address.com"` | | +| postgresql.auth.database | string | `"postgres"` | Name of the database. | +| postgresql.auth.existingSecret | string | `"secret-puris-postgres-init"` | Secret containing the password. For more information look into 'backend-secrets-postgres.yaml' file. | +| postgresql.auth.password | string | `""` | Password for the custom database user. Secret-key 'password' | +| postgresql.auth.passwordPostgres | string | `""` | Password for the database. Secret-key 'postgres-password'. | +| postgresql.auth.username | string | `"puris"` | Username for the custom database user. | +| postgresql.enabled | bool | `true` | Enable postgres by default, set to false to use existing postgres. Make sure to set backend.puris.jpa.hibernate.ddl-auto accordingly (by default database is created using hibernate ddl from backend). | +| postgresql.service | object | `{"ports":{"postgresql":5432}}` | Possibility to override the name nameOverride: "" | +| postgresql.service.ports.postgresql | int | `5432` | Port of postgres database. | ## NOTICE diff --git a/frontend/package.json b/frontend/package.json index 54d949db..15e0bee2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,7 +2,7 @@ "name": "puris-frontend", "description": "Puris frontend", "license": "Apache-2.0", - "version": "2.0.1", + "version": "2.0.2", "type": "module", "scripts": { "dev": "vite --host",