From f932adbe757b837fba2e22561313c457942b60ea Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Thu, 13 Mar 2025 13:50:18 +0100 Subject: [PATCH 01/21] OZG-7573 modify route-forwarding interface --- .../protobuf/route-forwarding.model.proto | 55 +++++++++++++++++-- .../src/main/protobuf/route-forwarding.proto | 2 +- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto b/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto index 46961d480..d7ebc648c 100644 --- a/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto @@ -33,16 +33,59 @@ option java_outer_classname = "RouteForwardingModelProto"; message GrpcRouteForwardingRequest { - GrpcRouteCriteria routeCriteria = 1; - de.ozgcloud.vorgang.vorgang.GrpcEingang eingang = 5; + oneof request { + GrpcRouteForwarding routeForwarding = 1; + GrpcAttachment attachment = 2; + GrpcRepresentation representation = 3; + } } message GrpcRouteForwardingResponse { - + +} + +message GrpcRouteForwarding { + GrpcEingangStub eingangStub = 1; + GrpcRouteCriteria routeCriteria = 2; +} + +message GrpcEingangStub { + de.ozgcloud.vorgang.vorgang.GrpcEingangHeader header = 1; + de.ozgcloud.vorgang.vorgang.GrpcAntragsteller antragsteller = 2; + de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle zustaendigeStelle = 3; + + de.ozgcloud.vorgang.vorgang.GrpcFormData formData = 4; } message GrpcRouteCriteria { - string gemeindeSchluessel = 1; - string webserviceUrl = 2; - string organisationseinheitenId = 3; + string organisationseinheitenId = 1; +} + +message GrpcAttachment { + oneof attachment { + GrpcAttachmentFile file = 1; + bytes content = 2; + } +} + +message GrpcAttachmentFile { + string groupName = 1; + string fileName = 2; + string contentType = 3; + string vendorId = 4; + int64 size = 5; +} + +message GrpcRepresentation { + oneof representation { + GrpcRepresentationFile file = 1; + bytes content = 2; + } +} + +message GrpcRepresentationFile { + string fileName = 1; + string contentType = 2; + string vendorId = 3; + int64 size = 4; } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto b/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto index aeb0eefd8..6af28ff3c 100644 --- a/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto +++ b/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto @@ -33,7 +33,7 @@ option java_outer_classname = "RouteForwardingProto"; service RouteForwardingService { - rpc RouteForwarding(GrpcRouteForwardingRequest) returns (GrpcRouteForwardingResponse) { + rpc RouteForwarding(stream GrpcRouteForwardingRequest) returns (GrpcRouteForwardingResponse) { } } \ No newline at end of file -- GitLab From 6db63782f86c0ef77027f75f0d95f806e3ce78f5 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Thu, 13 Mar 2025 17:11:05 +0100 Subject: [PATCH 02/21] OZG-7573 remove eingang-manager proto files --- .../protobuf/route-forwarding.model.proto | 91 ------------------- .../src/main/protobuf/route-forwarding.proto | 39 -------- 2 files changed, 130 deletions(-) delete mode 100644 vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto delete mode 100644 vorgang-manager-interface/src/main/protobuf/route-forwarding.proto diff --git a/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto b/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto deleted file mode 100644 index d7ebc648c..000000000 --- a/vorgang-manager-interface/src/main/protobuf/route-forwarding.model.proto +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -syntax = "proto3"; - -package de.ozgcloud.eingang.forwarder; - -import "vorgang.model.proto"; - -option java_multiple_files = true; -option java_package = "de.ozgcloud.eingang.forwarding"; -option java_outer_classname = "RouteForwardingModelProto"; - - -message GrpcRouteForwardingRequest { - oneof request { - GrpcRouteForwarding routeForwarding = 1; - GrpcAttachment attachment = 2; - GrpcRepresentation representation = 3; - } -} - -message GrpcRouteForwardingResponse { - -} - -message GrpcRouteForwarding { - GrpcEingangStub eingangStub = 1; - GrpcRouteCriteria routeCriteria = 2; -} - -message GrpcEingangStub { - de.ozgcloud.vorgang.vorgang.GrpcEingangHeader header = 1; - de.ozgcloud.vorgang.vorgang.GrpcAntragsteller antragsteller = 2; - de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle zustaendigeStelle = 3; - - de.ozgcloud.vorgang.vorgang.GrpcFormData formData = 4; -} - -message GrpcRouteCriteria { - string organisationseinheitenId = 1; -} - -message GrpcAttachment { - oneof attachment { - GrpcAttachmentFile file = 1; - bytes content = 2; - } -} - -message GrpcAttachmentFile { - string groupName = 1; - string fileName = 2; - string contentType = 3; - string vendorId = 4; - int64 size = 5; -} - -message GrpcRepresentation { - oneof representation { - GrpcRepresentationFile file = 1; - bytes content = 2; - } -} - -message GrpcRepresentationFile { - string fileName = 1; - string contentType = 2; - string vendorId = 3; - int64 size = 4; -} \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto b/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto deleted file mode 100644 index 6af28ff3c..000000000 --- a/vorgang-manager-interface/src/main/protobuf/route-forwarding.proto +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -syntax = "proto3"; - -package de.ozgcloud.eingang.forwarder; - -import "route-forwarding.model.proto"; - -option java_multiple_files = true; -option java_package = "de.ozgcloud.eingang.forwarder"; -option java_outer_classname = "RouteForwardingProto"; - -service RouteForwardingService { - - rpc RouteForwarding(stream GrpcRouteForwardingRequest) returns (GrpcRouteForwardingResponse) { - } - -} \ No newline at end of file -- GitLab From ebd1f98b134719ded1a1f7c16b31e82acb28a20b Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Mon, 17 Mar 2025 16:22:57 +0100 Subject: [PATCH 03/21] OZG-7573 OZG-7923 Create ForwardingRemoteService --- vorgang-manager-server/pom.xml | 6 ++ .../redirect/ForwardingRemoteService.java | 75 ++++++++++++++++ .../vorgang/redirect/ForwardingService.java | 31 +++---- .../src/main/resources/application-local.yml | 4 + .../src/main/resources/application.yml | 2 + .../redirect/ForwardingRemoteServiceTest.java | 85 +++++++++++++++++++ .../redirect/ForwardingServiceTest.java | 22 +++-- 7 files changed, 199 insertions(+), 26 deletions(-) create mode 100644 vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 4e13b2009..b25865e77 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -60,6 +60,7 @@ <collaboration-manager.version>0.7.0</collaboration-manager.version> <archive-manager.version>0.3.0</archive-manager.version> <document-manager.version>1.2.0</document-manager.version> + <eingang-manager-interface.version>2.19.0-SNAPSHOT</eingang-manager-interface.version> <zip.version>2.11.5</zip.version> <jsoup.version>1.15.3</jsoup.version> @@ -171,6 +172,11 @@ <artifactId>api-lib-core</artifactId> <version>${api-lib.version}</version> </dependency> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>eingang-manager-interface</artifactId> + <version>${eingang-manager-interface.version}</version> + </dependency> <!-- Spring --> <dependency> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java new file mode 100644 index 000000000..b1b2e73f0 --- /dev/null +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import org.springframework.stereotype.Service; + +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; +import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@Service +class ForwardingRemoteService { + + @GrpcClient("forwarder") + private RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; + + public void forward(ForwardingRequest request) { + CompletableFuture<Void> responseFuture = new CompletableFuture<>(); + var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) + .routeForwarding(new ForwardingResponseObserver(responseFuture)); + try { + responseFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new TechnicalException("Forwarding failed", e); + } + } + + @RequiredArgsConstructor + static class ForwardingResponseObserver implements StreamObserver<GrpcRouteForwardingResponse> { + private final CompletableFuture<Void> future; + + @Override + public void onNext(GrpcRouteForwardingResponse value) { + // noop + } + + @Override + public void onError(Throwable t) { + future.completeExceptionally(t); + } + + @Override + public void onCompleted() { + future.complete(null); + } + } +} diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java index ed26c9e98..6af4a3cd0 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java @@ -35,7 +35,6 @@ import java.util.stream.Stream; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -56,10 +55,12 @@ import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import jakarta.mail.util.ByteArrayDataSource; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Service @Log4j2 +@RequiredArgsConstructor public class ForwardingService { static final String MAIL_TEMPLATE = "/mail/redirect.txt.ftlh"; @@ -87,26 +88,15 @@ public class ForwardingService { static final String SUBJECT_BESTAETIGUNG_TEMPL = "Ihr Antrag auf %s - Az: %s"; static final String ZIP_FILENAME_TMPL = "%s.zip"; - @Autowired - private ForwardingRepository repository; - - @Autowired - private Configuration freemarkerCfg; - @Autowired - private ZipBuilderService zipService; - - @Autowired - private MailService emailService; - - @Autowired - private VorgangService vorgangService; - + private final ForwardingRepository repository; + private final Configuration freemarkerCfg; + private final ZipBuilderService zipService; + private final MailService emailService; + private final VorgangService vorgangService; // TODO abhängigkeit entfernen - @Autowired - private StatusService statusService; - - @Autowired - private ApplicationEventPublisher publisher; + private final StatusService statusService; + private final ForwardingRemoteService forwardingRemoteService; + private final ApplicationEventPublisher publisher; @Value("${ozgcloud.redirect.mail-from}") private String mailFrom; @@ -332,5 +322,6 @@ public class ForwardingService { public void forward(ForwardingRequest request) { statusService.setStatusToWeitergeleitet(request.getVorgangId(), request.getVersion()); + forwardingRemoteService.forward(request); } } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/resources/application-local.yml b/vorgang-manager-server/src/main/resources/application-local.yml index 6dc2ce987..d320959ed 100644 --- a/vorgang-manager-server/src/main/resources/application-local.yml +++ b/vorgang-manager-server/src/main/resources/application-local.yml @@ -38,6 +38,10 @@ grpc: negotiationType: PLAINTEXT vorgang-manager: negotiationType: PLAINTEXT + forwarder: + address: static://127.0.0.1:9292 + negotiationType: PLAINTEXT + server: security: enabled: false diff --git a/vorgang-manager-server/src/main/resources/application.yml b/vorgang-manager-server/src/main/resources/application.yml index 7bf48c56c..db37a3d59 100644 --- a/vorgang-manager-server/src/main/resources/application.yml +++ b/vorgang-manager-server/src/main/resources/application.yml @@ -44,6 +44,8 @@ grpc: negotiationType: PLAINTEXT zufi-manager: negotiationType: TLS + forwarder: + negotiationType: TLS server: security: diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java new file mode 100644 index 000000000..cf85265b4 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; + +class ForwardingRemoteServiceTest { + + @Mock + private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; + @Spy + @InjectMocks + private ForwardingRemoteService service; + + @Nested + class TestForward { + + private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + + @BeforeEach + void init() { + when(serviceStub.withInterceptors(any())).thenReturn(serviceStub); + } + + @Test + void shouldAttachClientCallContext() { + givenGrpcCallCompletedSuccessfully(); + + forward(); + + verify(serviceStub).withInterceptors(any(VorgangManagerClientCallContextAttachingInterceptor.class)); + } + + @Test + void shouldMakeGrpcCallToRouteForwarding() { + givenGrpcCallCompletedSuccessfully(); + + forward(); + + verify(serviceStub).routeForwarding(any(ForwardingRemoteService.ForwardingResponseObserver.class)); + } + + private void givenGrpcCallCompletedSuccessfully() { + when(serviceStub.routeForwarding(any())).thenAnswer(invocation -> { + ((ForwardingRemoteService.ForwardingResponseObserver) invocation.getArgument(0)).onCompleted(); + return null; + }); + } + + private void forward() { + service.forward(request); + } + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java index 1b864c7a9..326cf45dd 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java @@ -64,19 +64,16 @@ class ForwardingServiceTest { private ForwardingService service; @Mock private ForwardingRepository repository; - @Mock private ZipBuilderService zipService; - @Mock private MailService mailService; - @Mock private VorgangService vorgangService; - @Mock private StatusService statusService; - + @Mock + private ForwardingRemoteService remoteService; @Mock private ApplicationEventPublisher publisher; @@ -626,11 +623,24 @@ class ForwardingServiceTest { @Nested class TestForward { + private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + @Test void shouldSetStatusToWeitergeleitet() { - service.forward(ForwardingRequestTestFactory.create()); + forward(); verify(statusService).setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION); } + + @Test + void shouldCallRemoteService() { + forward(); + + verify(remoteService).forward(request); + } + + private void forward() { + service.forward(request); + } } } \ No newline at end of file -- GitLab From 5668c35bb602d47351a78f802d691e47c5063262 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 18 Mar 2025 11:46:33 +0100 Subject: [PATCH 04/21] OZG-7573 OZG-7923 Mapping for GrpcRouteForwarding --- .../vorgang/vorgang/EingangMapper.java | 2 +- .../redirect/ForwardingRequestMapper.java | 29 +++++++- .../vorgang/GrpcEingangTestFactory.java | 5 +- .../redirect/ForwardingRequestMapperTest.java | 73 +++++++++++++++++++ .../redirect/GrpcEingangStubTestFactory.java | 43 +++++++++++ .../GrpcRouteCriteriaTestFactory.java | 38 ++++++++++ .../GrpcRouteForwardingTestFactory.java | 39 ++++++++++ .../common/grpc/GrpcFormDataTestFactory.java | 2 +- 8 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java index f072e0ec6..0c5dcaafc 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java @@ -36,7 +36,7 @@ import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) -interface EingangMapper { +public interface EingangMapper { @Mapping(source = "attachmentsList", target = "attachments") @Mapping(source = "representationsList", target = "representations") diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java index e47ae180e..2e3211010 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java @@ -26,12 +26,24 @@ package de.ozgcloud.vorgang.vorgang.redirect; import java.util.Map; import org.apache.commons.collections4.MapUtils; +import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.NullValuePropertyMappingStrategy; import de.ozgcloud.command.Command; +import de.ozgcloud.eingang.forwarding.GrpcEingangStub; +import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding; +import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.EingangMapper; +import de.ozgcloud.vorgang.vorgang.GrpcEingang; -@Mapper(imports = MapUtils.class) +@Mapper(imports = MapUtils.class, uses = EingangMapper.class, // + nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // + collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) interface ForwardingRequestMapper { interface CommandBodyFields { @@ -42,7 +54,7 @@ interface ForwardingRequestMapper { String PLZ = "plz"; String ORT = "ort"; } - + @Mapping(target = "version", source = "relationVersion") @Mapping(target = "organisationEinheit", source = "bodyObject") ForwardingRequest fromCommand(Command command); @@ -57,4 +69,17 @@ interface ForwardingRequestMapper { @Mapping(target = "zipCode", expression = "java(MapUtils.getString(body, CommandBodyFields.PLZ))") @Mapping(target = "city", expression = "java(MapUtils.getString(body, CommandBodyFields.ORT))") Address toAddress(Map<String, Object> body); + + @Mapping(target = "routeCriteria", source = "request") + @Mapping(target = "eingangStub", source = "eingang") + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcRouteForwarding toGrpcRouteForwarding(ForwardingRequest request, Eingang eingang); + + @Mapping(target = "organisationEinheitId", source = "organisationEinheit.id") + GrpcRouteCriteria toGrpcRouteCriteria(ForwardingRequest request); + + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcEingangStub toGrpcEingangStub(GrpcEingang eingang); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java index 79acc665d..e149cbf5b 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java @@ -25,12 +25,11 @@ package de.ozgcloud.vorgang.vorgang; import java.util.UUID; -import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory; +import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; public class GrpcEingangTestFactory { public static final String ID = UUID.randomUUID().toString(); - public static final GrpcSubForm SUB_FORM = GrpcSubFormTestFactory.create(); public static GrpcEingang create() { return createBuilder().build(); @@ -42,7 +41,7 @@ public class GrpcEingangTestFactory { .setHeader(GrpcEingangHeaderTestFactory.create()) .setAntragsteller(GrpcAntragstellerTestFactory.create()) .setZustaendigeStelle(GrpcZustaendigeStelleTestFactory.create()) - .setFormData(GrpcFormData.newBuilder().addForm(GrpcSubFormTestFactory.create()).build()) + .setFormData(GrpcFormDataTestFactory.create()) .addAttachments(GrpcIncomingFileGroupTestFactory.create()) .setNumberOfAttachments(4) .addRepresentations(GrpcIncomingFileTestFactory.create()) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java index 715529e26..ffa519710 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java @@ -32,14 +32,26 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; +import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding; import de.ozgcloud.vorgang.command.CommandTestFactory; +import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.EingangMapper; +import de.ozgcloud.vorgang.vorgang.EingangTestFactory; +import de.ozgcloud.vorgang.vorgang.GrpcEingang; +import de.ozgcloud.vorgang.vorgang.GrpcEingangTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRequestMapper.CommandBodyFields; class ForwardingRequestMapperTest { + @Mock + private EingangMapper eingangMapper; @Spy + @InjectMocks private ForwardingRequestMapper mapper = Mappers.getMapper(ForwardingRequestMapper.class); private final Map<String, Object> bodyObject = Map.of( CommandBodyFields.ORGANISATION_EINHEIT_ID, OrganisationEinheitTestFactory.ID, @@ -118,4 +130,65 @@ class ForwardingRequestMapperTest { return mapper.toAddress(bodyObject); } } + + @Nested + class TestToGrpcRouteForwarding { + + private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + private final Eingang eingang = EingangTestFactory.create(); + private final GrpcEingang grpcEingang = GrpcEingangTestFactory.create(); + + @BeforeEach + void init() { + doReturn(GrpcRouteCriteriaTestFactory.create()).when(mapper).toGrpcRouteCriteria(any()); + when(eingangMapper.toGrpc(any())).thenReturn(grpcEingang); + } + + @Test + void shouldCallEingangMapper() { + map(); + + verify(eingangMapper).toGrpc(eingang); + } + + @Test + void shouldMapToGrpcRouteCriteria() { + map(); + + verify(mapper).toGrpcRouteCriteria(request); + } + + @Test + void shouldMapToGrpcEingangStub() { + map(); + + verify(mapper).toGrpcEingangStub(grpcEingang); + } + + @Test + void shouldMapToGrpcRouteForwarding() { + var mapped = map(); + + assertThat(mapped).isEqualTo(GrpcRouteForwardingTestFactory.create()); + } + + private GrpcRouteForwarding map() { + return mapper.toGrpcRouteForwarding(request, eingang); + } + } + + @Nested + class TestToGrpcRouteCriteria { + + @Test + void shouldMap() { + var mapped = map(); + + assertThat(mapped).isEqualTo(GrpcRouteCriteriaTestFactory.create()); + } + + private GrpcRouteCriteria map() { + return mapper.toGrpcRouteCriteria(ForwardingRequestTestFactory.create()); + } + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java new file mode 100644 index 000000000..6cdd06a4a --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcEingangStub; +import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; +import de.ozgcloud.vorgang.vorgang.GrpcAntragstellerTestFactory; +import de.ozgcloud.vorgang.vorgang.GrpcEingangHeaderTestFactory; + +class GrpcEingangStubTestFactory { + + public static GrpcEingangStub create() { + return createBuilder().build(); + } + + public static GrpcEingangStub.Builder createBuilder() { + return GrpcEingangStub.newBuilder() + .setHeader(GrpcEingangHeaderTestFactory.create()) + .setAntragsteller(GrpcAntragstellerTestFactory.create()) + .setFormData(GrpcFormDataTestFactory.create()); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java new file mode 100644 index 000000000..e28c74034 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria; + +class GrpcRouteCriteriaTestFactory { + + public static GrpcRouteCriteria create() { + return createBuilder().build(); + } + + public static GrpcRouteCriteria.Builder createBuilder() { + return GrpcRouteCriteria.newBuilder() + .setOrganisationEinheitId(OrganisationEinheitTestFactory.ID); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java new file mode 100644 index 000000000..badf9c7b5 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding; + +class GrpcRouteForwardingTestFactory { + + public static GrpcRouteForwarding create() { + return createBuilder().build(); + } + + public static GrpcRouteForwarding.Builder createBuilder() { + return GrpcRouteForwarding.newBuilder() + .setRouteCriteria(GrpcRouteCriteriaTestFactory.create()) + .setEingangStub(GrpcEingangStubTestFactory.create()); + } +} diff --git a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java index b715c9098..b2ece13fb 100644 --- a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java +++ b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java @@ -34,6 +34,6 @@ public class GrpcFormDataTestFactory { public static Builder createBuilder() { return GrpcFormData.newBuilder() - .addField(GrpcFormFieldTestFactory.create()); + .addForm(GrpcSubFormTestFactory.create()); } } -- GitLab From 7f710cd0bcb6db778f4558543912e8537cd78757 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 18 Mar 2025 16:42:06 +0100 Subject: [PATCH 05/21] OZG-7573 OZG-7923 Send GrpcRouteForwardingRequest --- .../redirect/ForwardingRemoteService.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index b1b2e73f0..dc4206747 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -30,22 +30,53 @@ import org.springframework.stereotype.Service; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.VorgangService; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @Service +@RequiredArgsConstructor class ForwardingRemoteService { + private final VorgangService vorgangService; + private final ForwardingRequestMapper forwardingRequestMapper; @GrpcClient("forwarder") - private RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; + private final RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; public void forward(ForwardingRequest request) { CompletableFuture<Void> responseFuture = new CompletableFuture<>(); + routeForwarding(request, new ForwardingResponseObserver(responseFuture)); + waitForCompletion(responseFuture); + } + + void routeForwarding(ForwardingRequest request, ForwardingResponseObserver responseObserver) { var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) - .routeForwarding(new ForwardingResponseObserver(responseFuture)); + .routeForwarding(responseObserver); + try { + sendEingang(request, requestStreamObserver); + requestStreamObserver.onCompleted(); + } catch (Throwable t) { + requestStreamObserver.onError(t); + } + } + + void sendEingang(ForwardingRequest request, StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { + var eingang = vorgangService.getById(request.getVorgangId()).getEingangs().getFirst(); + requestStreamObserver.onNext(buildRouteForwardingRequest(request, eingang)); + + } + + GrpcRouteForwardingRequest buildRouteForwardingRequest(ForwardingRequest request, Eingang eingang) { + var routeForwarding = forwardingRequestMapper.toGrpcRouteForwarding(request, eingang); + return GrpcRouteForwardingRequest.newBuilder().setRouteForwarding(routeForwarding).build(); + } + + private static void waitForCompletion(CompletableFuture<Void> responseFuture) { try { responseFuture.get(); } catch (InterruptedException | ExecutionException e) { -- GitLab From ea5c5e8516ea48e6dd1d7131a867f3c4764d1888 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 18 Mar 2025 16:42:28 +0100 Subject: [PATCH 06/21] OZG-7573 OZG-7923 Lombok config --- lombok.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lombok.config b/lombok.config index a06fa130e..f881e23c3 100644 --- a/lombok.config +++ b/lombok.config @@ -28,4 +28,5 @@ lombok.log.log4j.flagUsage = ERROR lombok.data.flagUsage = ERROR lombok.nonNull.exceptionType = IllegalArgumentException lombok.addLombokGeneratedAnnotation = true -lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier \ No newline at end of file +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier +lombok.copyableAnnotations += net.devh.boot.grpc.client.inject.GrpcClient \ No newline at end of file -- GitLab From bc463db7d47aa52709e4583bfed7f35564c7c82c Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Wed, 19 Mar 2025 10:55:22 +0100 Subject: [PATCH 07/21] OZG-7573 OZG-7923 Fix tests --- .../redirect/ForwardingRemoteService.java | 5 +- .../redirect/ForwardingRemoteServiceTest.java | 109 ++++++++++++++++-- ...GrpcRouteForwardingRequestTestFactory.java | 37 ++++++ 3 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index dc4206747..416b80956 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -46,7 +46,7 @@ class ForwardingRemoteService { private final VorgangService vorgangService; private final ForwardingRequestMapper forwardingRequestMapper; @GrpcClient("forwarder") - private final RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; + private final RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; public void forward(ForwardingRequest request) { CompletableFuture<Void> responseFuture = new CompletableFuture<>(); @@ -55,13 +55,14 @@ class ForwardingRemoteService { } void routeForwarding(ForwardingRequest request, ForwardingResponseObserver responseObserver) { - var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) + var requestStreamObserver = serviceStub.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) .routeForwarding(responseObserver); try { sendEingang(request, requestStreamObserver); requestStreamObserver.onCompleted(); } catch (Throwable t) { requestStreamObserver.onError(t); + throw t; } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index cf85265b4..df3940325 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -23,6 +23,7 @@ */ package de.ozgcloud.vorgang.vorgang.redirect; +import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; @@ -33,20 +34,39 @@ import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.vorgang.VorgangService; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver; +import io.grpc.stub.StreamObserver; class ForwardingRemoteServiceTest { + @Mock + private VorgangService vorgangService; + @Mock + private ForwardingRemoteService forwardingRemoteService; @Mock private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; @Spy @InjectMocks private ForwardingRemoteService service; + @Mock + private StreamObserver<GrpcRouteForwardingRequest> requestObserver; + private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + @Nested class TestForward { - private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + } + + @Nested + class TestRouteForwarding { + + @Mock + private ForwardingResponseObserver responseObserver; @BeforeEach void init() { @@ -54,10 +74,11 @@ class ForwardingRemoteServiceTest { } @Test - void shouldAttachClientCallContext() { + void shouldAttachClientCallContextToServiceStub() { givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); - forward(); + routeForwarding(); verify(serviceStub).withInterceptors(any(VorgangManagerClientCallContextAttachingInterceptor.class)); } @@ -65,21 +86,91 @@ class ForwardingRemoteServiceTest { @Test void shouldMakeGrpcCallToRouteForwarding() { givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); + + routeForwarding(); - forward(); + verify(serviceStub).routeForwarding(any(ForwardingResponseObserver.class)); + } + + @Nested + class OnSuccess { + + @BeforeEach + void init() { + givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); + } + + @Test + void shouldSendEingang() { + routeForwarding(); + + verify(service).sendEingang(request, requestObserver); + } - verify(serviceStub).routeForwarding(any(ForwardingRemoteService.ForwardingResponseObserver.class)); + @Test + void shouldCallOnCompleted() { + routeForwarding(); + + verify(requestObserver).onCompleted(); + } + } + + @Nested + class OnFailure { + + private final RuntimeException error = new RuntimeException(); + + @BeforeEach + void init() { + givenGrpcCallCompletedSuccessfully(); + doThrow(error).when(service).sendEingang(any(), any()); + } + + @Test + void shouldCallOnError() { + catchThrowableOfType(RuntimeException.class, TestRouteForwarding.this::routeForwarding); + + verify(requestObserver).onError(error); + } + + @Test + void shouldThrowError() { + assertThatThrownBy(TestRouteForwarding.this::routeForwarding).isSameAs(error); + } } private void givenGrpcCallCompletedSuccessfully() { when(serviceStub.routeForwarding(any())).thenAnswer(invocation -> { - ((ForwardingRemoteService.ForwardingResponseObserver) invocation.getArgument(0)).onCompleted(); - return null; + ((ForwardingResponseObserver) invocation.getArgument(0)).onCompleted(); + return requestObserver; }); } - private void forward() { - service.forward(request); + private void routeForwarding() { + service.routeForwarding(request, responseObserver); + } + } + + @Nested + class TestSendEingang { + + @BeforeEach + void init() { + when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); + doReturn(GrpcRouteForwardingRequestTestFactory.create()).when(service).buildRouteForwardingRequest(any(), any()); + } + + @Test + void shouldGetVorgangById() { + sendEingang(); + + verify(vorgangService).getById(VorgangTestFactory.ID); + } + + private void sendEingang() { + service.sendEingang(request, requestObserver); } } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java new file mode 100644 index 000000000..d09b7af52 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; + +class GrpcRouteForwardingRequestTestFactory { + + public static GrpcRouteForwardingRequest create() { + return createBuilder().build(); + } + + public static GrpcRouteForwardingRequest.Builder createBuilder() { + return GrpcRouteForwardingRequest.newBuilder(); + } +} -- GitLab From e4c0844598fa164ac0e0ccd326b556cddba7e3d9 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Wed, 19 Mar 2025 11:23:03 +0100 Subject: [PATCH 08/21] OZG-7573 OZG-7923 More tests --- .../redirect/ForwardingRemoteServiceTest.java | 58 ++++++++++++++++++- ...GrpcRouteForwardingRequestTestFactory.java | 3 +- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index df3940325..bef62d1fa 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -34,8 +34,12 @@ import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.EingangTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; import de.ozgcloud.vorgang.vorgang.VorgangService; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver; @@ -46,7 +50,7 @@ class ForwardingRemoteServiceTest { @Mock private VorgangService vorgangService; @Mock - private ForwardingRemoteService forwardingRemoteService; + private ForwardingRequestMapper forwardingRequestMapper; @Mock private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; @Spy @@ -56,10 +60,13 @@ class ForwardingRemoteServiceTest { @Mock private StreamObserver<GrpcRouteForwardingRequest> requestObserver; private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + private final Eingang eingang = EingangTestFactory.create(); + private final Vorgang vorgang = VorgangTestFactory.createBuilder().clearEingangs().eingang(eingang).build(); @Nested class TestForward { + } @Nested @@ -156,10 +163,12 @@ class ForwardingRemoteServiceTest { @Nested class TestSendEingang { + private final GrpcRouteForwardingRequest routeForwardingRequest = GrpcRouteForwardingRequestTestFactory.create(); + @BeforeEach void init() { - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); - doReturn(GrpcRouteForwardingRequestTestFactory.create()).when(service).buildRouteForwardingRequest(any(), any()); + when(vorgangService.getById(any())).thenReturn(vorgang); + doReturn(routeForwardingRequest).when(service).buildRouteForwardingRequest(any(), any()); } @Test @@ -169,8 +178,51 @@ class ForwardingRemoteServiceTest { verify(vorgangService).getById(VorgangTestFactory.ID); } + @Test + void shouldBuildRouteForwardingRequest() { + sendEingang(); + + verify(service).buildRouteForwardingRequest(request, eingang); + } + + @Test + void shouldSendForwardingRequest() { + sendEingang(); + + verify(requestObserver).onNext(routeForwardingRequest); + } + private void sendEingang() { service.sendEingang(request, requestObserver); } } + + @Nested + class TestBuildRouteForwardingRequest { + + private final GrpcRouteForwarding routeForwarding = GrpcRouteForwardingTestFactory.create(); + + @BeforeEach + void init() { + when(forwardingRequestMapper.toGrpcRouteForwarding(any(), any())).thenReturn(routeForwarding); + } + + @Test + void shouldMapToRouteForwarding() { + buildRouteForwardingRequest(); + + verify(forwardingRequestMapper).toGrpcRouteForwarding(request, eingang); + } + + @Test + void shouldReturnRouteForwardingRequest() { + var builtRequest = buildRouteForwardingRequest(); + + assertThat(builtRequest).isEqualTo(GrpcRouteForwardingRequestTestFactory.create()); + } + + private GrpcRouteForwardingRequest buildRouteForwardingRequest() { + return service.buildRouteForwardingRequest(request, eingang); + } + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java index d09b7af52..bd937f978 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -32,6 +32,7 @@ class GrpcRouteForwardingRequestTestFactory { } public static GrpcRouteForwardingRequest.Builder createBuilder() { - return GrpcRouteForwardingRequest.newBuilder(); + return GrpcRouteForwardingRequest.newBuilder() + .setRouteForwarding(GrpcRouteForwardingTestFactory.create()); } } -- GitLab From 8ecc982ea79ae0e72aad15ae99d64c4319fd0f70 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Wed, 19 Mar 2025 14:43:10 +0100 Subject: [PATCH 09/21] OZG-7573 OZG-7923 More tests --- .../redirect/ForwardingRemoteService.java | 7 +- .../redirect/ForwardingRemoteServiceTest.java | 94 +++++++++++++++++++ 2 files changed, 97 insertions(+), 4 deletions(-) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index 416b80956..533e68341 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -24,7 +24,6 @@ package de.ozgcloud.vorgang.vorgang.redirect; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import org.springframework.stereotype.Service; @@ -77,11 +76,11 @@ class ForwardingRemoteService { return GrpcRouteForwardingRequest.newBuilder().setRouteForwarding(routeForwarding).build(); } - private static void waitForCompletion(CompletableFuture<Void> responseFuture) { + void waitForCompletion(CompletableFuture<Void> responseFuture) { try { responseFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new TechnicalException("Forwarding failed", e); + } catch (Throwable t) { + throw new TechnicalException("Forwarding failed", t); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index bef62d1fa..4ddbc9bc2 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -26,13 +26,19 @@ package de.ozgcloud.vorgang.vorgang.redirect; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.concurrent.CompletableFuture; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.common.test.ReflectionTestUtils; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; @@ -44,6 +50,7 @@ import de.ozgcloud.vorgang.vorgang.VorgangService; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver; import io.grpc.stub.StreamObserver; +import lombok.SneakyThrows; class ForwardingRemoteServiceTest { @@ -66,7 +73,36 @@ class ForwardingRemoteServiceTest { @Nested class TestForward { + @Captor + private ArgumentCaptor<ForwardingResponseObserver> responseObserverCaptor; + @Captor + private ArgumentCaptor<CompletableFuture<Void>> futureCaptor; + + @BeforeEach + void init() { + doNothing().when(service).routeForwarding(any(), any()); + doNothing().when(service).waitForCompletion(any()); + } + + @Test + void shouldRouteForwarding() { + forward(); + + verify(service).routeForwarding(eq(request), any(ForwardingResponseObserver.class)); + } + + @Test + void shouldWaitForCompletion() { + forward(); + + verify(service).waitForCompletion(futureCaptor.capture()); + verify(service).routeForwarding(any(), responseObserverCaptor.capture()); + assertThat(futureCaptor.getValue()).isSameAs(ReflectionTestUtils.getField(responseObserverCaptor.getValue(), "future", CompletableFuture.class)); + } + private void forward() { + service.forward(request); + } } @Nested @@ -135,6 +171,7 @@ class ForwardingRemoteServiceTest { doThrow(error).when(service).sendEingang(any(), any()); } + @SuppressWarnings("ResultOfMethodCallIgnored") @Test void shouldCallOnError() { catchThrowableOfType(RuntimeException.class, TestRouteForwarding.this::routeForwarding); @@ -225,4 +262,61 @@ class ForwardingRemoteServiceTest { return service.buildRouteForwardingRequest(request, eingang); } } + + @Nested + class TestWaitForCompletion { + + @Mock + private CompletableFuture<Void> future; + + @SneakyThrows + @Test + void shouldGetFromFuture() { + waitForCompletion(); + + verify(future).get(); + } + + @SneakyThrows + @Test + void shouldThrowTechnicalException() { + var exception = new RuntimeException(); + when(future.get()).thenThrow(exception); + + assertThatThrownBy(this::waitForCompletion).isInstanceOf(TechnicalException.class).hasCause(exception); + } + + private void waitForCompletion() { + service.waitForCompletion(future); + } + } + + @Nested + class ForwardingResponseObserverTest { + + @Mock + private CompletableFuture<Void> future; + private ForwardingResponseObserver responseObserver; + + @BeforeEach + void init() { + responseObserver = new ForwardingResponseObserver(future); + } + + @Test + void shouldCompleteExceptionallyOnError() { + var error = new Throwable(); + + responseObserver.onError(error); + + verify(future).completeExceptionally(error); + } + + @Test + void shouldCompleteOnCompleted() { + responseObserver.onCompleted(); + + verify(future).complete(null); + } + } } -- GitLab From 0f7d5bacf17b933b5bc92547203811ef143d1534 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 19 Mar 2025 15:15:02 +0100 Subject: [PATCH 10/21] OZG-7573 OZG-7930 forward attachments to eingang-manger --- vorgang-manager-server/pom.xml | 14 +- .../vorgang/vorgang/IncomingFileMapper.java | 15 + .../redirect/ForwardingRemoteService.java | 87 +++- .../vorgang/vorgang/EingangTestFactory.java | 4 +- .../vorgang/IncomingFileMapperTest.java | 12 + .../redirect/ForwardingRemoteServiceTest.java | 424 +++++++++++++++++- .../GrpcAttachmentFileTestFactory.java | 48 ++ .../redirect/GrpcAttachmentTestFactory.java | 47 ++ .../redirect/GrpcFileContentTestFactory.java | 52 +++ ...GrpcRouteForwardingRequestTestFactory.java | 16 + 10 files changed, 710 insertions(+), 9 deletions(-) create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentFileTestFactory.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentTestFactory.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcFileContentTestFactory.java diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index b25865e77..30ca31258 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -32,7 +32,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.11.0</version> + <version>4.12.0-OZG-7573-GrpcUpload-utils-SNAPSHOT</version> <relativePath /> </parent> @@ -51,7 +51,7 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/vorgang-manager:build-latest</spring-boot.build-image.imageName> <zufi-manager-interface.version>1.6.0</zufi-manager-interface.version> - + <common-lib.version>4.12.0-OZG-7573-GrpcUpload-utils-SNAPSHOT</common-lib.version> <user-manager-interface.version>2.12.0</user-manager-interface.version> <processor-manager.version>0.5.0</processor-manager.version> <nachrichten-manager.version>2.18.0</nachrichten-manager.version> @@ -60,7 +60,7 @@ <collaboration-manager.version>0.7.0</collaboration-manager.version> <archive-manager.version>0.3.0</archive-manager.version> <document-manager.version>1.2.0</document-manager.version> - <eingang-manager-interface.version>2.19.0-SNAPSHOT</eingang-manager-interface.version> + <eingang-manager-interface.version>2.19.0-OZG-7573-forward-vorgang-SNAPSHOT</eingang-manager-interface.version> <zip.version>2.11.5</zip.version> <jsoup.version>1.15.3</jsoup.version> @@ -82,6 +82,11 @@ <version>${project.version}</version> </dependency> + <dependency> + <groupId>de.ozgcloud.common</groupId> + <artifactId>ozgcloud-common-lib</artifactId> + <version>${common-lib.version}</version> + </dependency> <dependency> <groupId>de.ozgcloud.nachrichten</groupId> <artifactId>nachrichten-manager-server</artifactId> @@ -402,7 +407,8 @@ <env> <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS> <BPE_APPEND_JAVA_TOOL_OPTIONS>-Dfile.encoding=UTF-8</BPE_APPEND_JAVA_TOOL_OPTIONS> - <BPE_APPEND_JAVA_TOOL_OPTIONS>-Dio.grpc.netty.shaded.io.netty.maxDirectMemory=0</BPE_APPEND_JAVA_TOOL_OPTIONS> + <BPE_APPEND_JAVA_TOOL_OPTIONS> + -Dio.grpc.netty.shaded.io.netty.maxDirectMemory=0</BPE_APPEND_JAVA_TOOL_OPTIONS> <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=512m</BPE_APPEND_JAVA_TOOL_OPTIONS> <BPE_APPEND_LC_ALL>en_US.UTF-8</BPE_APPEND_LC_ALL> </env> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java index aefc6d34e..2e8f8d7ca 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java @@ -24,9 +24,11 @@ package de.ozgcloud.vorgang.vorgang; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import com.google.protobuf.ByteString; +import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile; import de.ozgcloud.vorgang.files.FileIdMapper; @Mapper(uses = FileIdMapper.class) @@ -37,4 +39,17 @@ public interface IncomingFileMapper { default byte[] map(ByteString value) { return value.toByteArray(); } + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "contentTypeBytes", ignore = true) + @Mapping(target = "fileNameBytes", ignore = true) + @Mapping(target = "groupNameBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "vendorIdBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "fileName", source = "file.name") + GrpcAttachmentFile toAttachmentFile(String groupName, IncomingFile file); } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index 416b80956..c615f1720 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -23,18 +23,35 @@ */ package de.ozgcloud.vorgang.vorgang.redirect; +import java.io.InputStream; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Function; +import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Service; +import com.google.protobuf.ByteString; + +import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; +import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcAttachment; +import de.ozgcloud.eingang.forwarding.GrpcFileContent; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.files.FileService; import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.IncomingFile; +import de.ozgcloud.vorgang.vorgang.IncomingFileGroup; +import de.ozgcloud.vorgang.vorgang.IncomingFileMapper; import de.ozgcloud.vorgang.vorgang.VorgangService; +import io.grpc.stub.CallStreamObserver; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -43,10 +60,13 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @RequiredArgsConstructor class ForwardingRemoteService { + private static final int TIMEOUT_MINUTES = 2; private final VorgangService vorgangService; private final ForwardingRequestMapper forwardingRequestMapper; @GrpcClient("forwarder") private final RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; + private final FileService fileService; + private final IncomingFileMapper incomingFileMapper; public void forward(ForwardingRequest request) { CompletableFuture<Void> responseFuture = new CompletableFuture<>(); @@ -69,7 +89,7 @@ class ForwardingRemoteService { void sendEingang(ForwardingRequest request, StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { var eingang = vorgangService.getById(request.getVorgangId()).getEingangs().getFirst(); requestStreamObserver.onNext(buildRouteForwardingRequest(request, eingang)); - + sendAttachments(eingang.getAttachments(), requestStreamObserver); } GrpcRouteForwardingRequest buildRouteForwardingRequest(ForwardingRequest request, Eingang eingang) { @@ -77,6 +97,71 @@ class ForwardingRemoteService { return GrpcRouteForwardingRequest.newBuilder().setRouteForwarding(routeForwarding).build(); } + void sendAttachments(List<IncomingFileGroup> attachments, StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { + for (var attachment : attachments) { + var groupName = attachment.getName(); + attachment.getFiles().forEach(file -> sendAttachmentFile(requestStreamObserver, groupName, file)); + } + } + + private void sendAttachmentFile(StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file) { + var fileContentStream = fileService.getUploadedFileStream(file.getId()); + var fileSender = createFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); + waitForFinishedFileUpload(fileSender, fileContentStream); + } + + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender( + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file, InputStream fileContentStream) { + return GrpcFileUploadUtils + .createSender(this::buildAttachmentChunk, fileContentStream, requestCallStreamObserverProvider(requestStreamObserver), false) + .withMetaData(buildGrpcAttachmentFile(groupName, file)); + } + + private Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>> requestCallStreamObserverProvider( + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { + return response -> (CallStreamObserver<GrpcRouteForwardingRequest>) requestStreamObserver; + } + + GrpcRouteForwardingRequest buildAttachmentChunk(byte[] chunk, int length) { + var fileContentBuilder = GrpcFileContent.newBuilder(); + if (length <= 0) { + fileContentBuilder.setIsEndOfFile(true); + } else { + fileContentBuilder.setContent(ByteString.copyFrom(chunk)); + } + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setContent(fileContentBuilder) + .build()) + .build(); + } + + GrpcRouteForwardingRequest buildGrpcAttachmentFile(String name, IncomingFile file) { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setFile(incomingFileMapper.toAttachmentFile(name, file)) + .build()) + .build(); + } + + void waitForFinishedFileUpload(FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender, InputStream inputStream) { + try { + fileSender.getResultFuture().get(TIMEOUT_MINUTES, TimeUnit.MINUTES); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + fileSender.cancelOnError(e); + throw new TechnicalException("Waiting for finishing file upload was interrupted.", e); + } catch (ExecutionException e) { + fileSender.cancelOnError(e); + throw new TechnicalException("Error on uploading file content.", e); + } catch (TimeoutException e) { + fileSender.cancelOnTimeout(); + throw new TechnicalException("Timeout on uploading file content.", e); + } finally { + IOUtils.closeQuietly(inputStream); + } + } + private static void waitForCompletion(CompletableFuture<Void> responseFuture) { try { responseFuture.get(); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java index 9fa8813dd..b12ea789a 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java @@ -49,6 +49,8 @@ public class EingangTestFactory { public static final Map<String, Object> SUBFORM_FLAT = Map.of(SUBFORM_FIELD_NAME, SUBFORM_FIELD); public static final Map<String, Object> FORM_DATA = Map.of(SINGLE_FIELD_NAME, SINGLE_FIELD, SUBFORM_NAME, SUBFORM); + public static final IncomingFileGroup ATTACHMENT = IncomingFileGroupTestFactory.create(); + public static Eingang create() { return createBuilder().build(); } @@ -59,7 +61,7 @@ public class EingangTestFactory { .header(EingangHeaderTestFactory.create()) .antragsteller(AntragstellerTestFactory.create()) .formData(FORM_DATA) - .attachment(IncomingFileGroupTestFactory.create()) + .attachment(ATTACHMENT) .representation(IncomingFileTestFactory.create()) .zustaendigeStelle(ZustaendigeStelleTestFactory.create()); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java index e59250ca0..d6f41ddfe 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java @@ -32,6 +32,7 @@ import org.mockito.InjectMocks; import org.mockito.Spy; import de.ozgcloud.vorgang.files.FileIdMapper; +import de.ozgcloud.vorgang.vorgang.redirect.GrpcAttachmentFileTestFactory; class IncomingFileMapperTest { @@ -50,4 +51,15 @@ class IncomingFileMapperTest { assertThat(result).isNotNull().usingRecursiveComparison().isEqualTo(IncomingFileTestFactory.create()); } } + + @Nested + class TestToAttachmentFile { + + @Test + void shouldMapToGrpcAttachmentFile() { + var result = mapper.toAttachmentFile(GrpcAttachmentFileTestFactory.GROUP_NAME, IncomingFileTestFactory.create()); + + assertThat(result).isEqualTo(GrpcAttachmentFileTestFactory.create()); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index df3940325..ccebcdf91 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -24,34 +24,67 @@ package de.ozgcloud.vorgang.vorgang.redirect; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.io.InputStream; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.BiFunction; +import java.util.function.Function; + +import org.apache.commons.lang3.RandomUtils; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Spy; +import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; +import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; +import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.files.FileService; +import de.ozgcloud.vorgang.vorgang.EingangTestFactory; +import de.ozgcloud.vorgang.vorgang.IncomingFile; +import de.ozgcloud.vorgang.vorgang.IncomingFileGroup; +import de.ozgcloud.vorgang.vorgang.IncomingFileGroupTestFactory; +import de.ozgcloud.vorgang.vorgang.IncomingFileMapper; +import de.ozgcloud.vorgang.vorgang.IncomingFileTestFactory; import de.ozgcloud.vorgang.vorgang.VorgangService; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver; +import io.grpc.stub.CallStreamObserver; import io.grpc.stub.StreamObserver; +import lombok.SneakyThrows; class ForwardingRemoteServiceTest { + @Spy + @InjectMocks + private ForwardingRemoteService service; @Mock private VorgangService vorgangService; @Mock private ForwardingRemoteService forwardingRemoteService; @Mock private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; - @Spy - @InjectMocks - private ForwardingRemoteService service; + @Mock + private FileService fileService; + @Mock + private IncomingFileMapper incomingFileMapper; @Mock private StreamObserver<GrpcRouteForwardingRequest> requestObserver; @@ -160,6 +193,7 @@ class ForwardingRemoteServiceTest { void init() { when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); doReturn(GrpcRouteForwardingRequestTestFactory.create()).when(service).buildRouteForwardingRequest(any(), any()); + doNothing().when(service).sendAttachments(any(), any()); } @Test @@ -169,8 +203,392 @@ class ForwardingRemoteServiceTest { verify(vorgangService).getById(VorgangTestFactory.ID); } + @Test + void shouldCallSendAttachments() { + sendEingang(); + + verify(service).sendAttachments(List.of(EingangTestFactory.ATTACHMENT), requestObserver); + } + private void sendEingang() { service.sendEingang(request, requestObserver); } } + + @Nested + class TestSendAttachments { + + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private InputStream inputStream; + + private final IncomingFileGroup attachment = IncomingFileGroupTestFactory.create(); + + @BeforeEach + void init() { + when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); + doReturn(fileSender).when(service).createFileSender(any(), any(), any(), any()); + when(fileSender.send()).thenReturn(fileSender); + } + + @Test + void shouldGetUploadedFileContent() { + sendAttachments(); + + verify(fileService).getUploadedFileStream(IncomingFileTestFactory.ID); + } + + @Test + void shouldCallCreateFileSender() { + sendAttachments(); + + verify(service).createFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + inputStream); + } + + @Test + void shouldSend() { + sendAttachments(); + + verify(fileSender).send(); + } + + @Test + void shouldCallWaitForFinishedFileUploadAfterSend() { + var inOrder = inOrder(fileSender, service); + + sendAttachments(); + + inOrder.verify(fileSender).send(); + inOrder.verify(service).waitForFinishedFileUpload(fileSender, inputStream); + } + + private void sendAttachments() { + service.sendAttachments(List.of(attachment), requestObserver); + } + } + + @Nested + class TestCreateFileSender { + + private MockedStatic<GrpcFileUploadUtils> grpcFileUploadUtilsMock; + @Mock + private CallStreamObserver<GrpcRouteForwardingRequest> requestCallStreamObserver; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSenderWithMetadata; + @Mock + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Mock + private InputStream inputStream; + @Captor + private ArgumentCaptor<BiFunction<byte[], Integer, GrpcRouteForwardingRequest>> chunkBuilderCaptor; + @Captor + private ArgumentCaptor<Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>>> reqObserverBuilderCaptor; + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + private final GrpcRouteForwardingRequest metadataRequest = GrpcRouteForwardingRequestTestFactory.create(); + + @BeforeEach + void init() { + grpcFileUploadUtilsMock = mockStatic(GrpcFileUploadUtils.class); + grpcFileUploadUtilsMock.when(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), anyBoolean())).thenReturn(fileSender); + doReturn(metadataRequest).when(service).buildGrpcAttachmentFile(any(), any()); + when(fileSender.withMetaData(any())).thenReturn(fileSenderWithMetadata); + } + + @AfterEach + void tearDown() { + grpcFileUploadUtilsMock.close(); + } + + @Test + void shouldCreateFileSenderWithChunkBuilder() { + createFileSender(); + + grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(chunkBuilderCaptor.capture(), any(), any(), anyBoolean())); + chunkBuilderCaptor.getValue().apply(chunk, chunk.length); + verify(service).buildAttachmentChunk(chunk, chunk.length); + } + + @Test + void shouldCreateFileSenderWithInputStream() { + createFileSender(); + + grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), eq(inputStream), any(), anyBoolean())); + } + + @Test + void shouldCreateFileSenderWithRequestObserverBuilder() { + createFileSender(); + + grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), reqObserverBuilderCaptor.capture(), anyBoolean())); + assertThat(reqObserverBuilderCaptor.getValue().apply(responseObserver)).isSameAs(requestCallStreamObserver); + } + + @Test + void shouldCreateFileSenderWithNotCompleteOnFileSent() { + createFileSender(); + + grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), eq(false))); + } + + @Test + void shouldCallBuildGrpcAttachmentFile() { + createFileSender(); + + verify(service).buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE); + } + + @Test + void shouldSetMetaData() { + createFileSender(); + + verify(fileSender).withMetaData(metadataRequest); + } + + @Test + void shouldReturnBuiltFileSender() { + var returnedFileSender = createFileSender(); + + assertThat(returnedFileSender).isSameAs(fileSenderWithMetadata); + } + + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender() { + return service.createFileSender(requestCallStreamObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + inputStream); + } + } + + @Nested + class TestBuildAttachmentChunk { + + @Nested + class TestOnEndOfFile { + + @Test + void shouldBuildEndOfFileChunk() { + var fileContent = service.buildAttachmentChunk(new byte[0], -1).getAttachment().getContent(); + + assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.createEndOfFile()); + } + } + + @Nested + class TestOnContentProvided { + + @Test + void shouldBuildEndOfFileChunk() { + var fileContent = service.buildAttachmentChunk(GrpcFileContentTestFactory.CONTENT, GrpcFileContentTestFactory.CONTENT.length) + .getAttachment().getContent(); + + assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.create()); + } + } + } + + @Nested + class TestBuildGrpcAttachmentFile { + + private IncomingFile file = IncomingFileTestFactory.create(); + + @BeforeEach + void mock() { + when(incomingFileMapper.toAttachmentFile(any(), any())).thenReturn(GrpcAttachmentFileTestFactory.create()); + } + + @Test + void shouldCallIncomingFileMapper() { + service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + verify(incomingFileMapper).toAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + } + + @Test + void shoudlReturnAttachmentMetadataRequest() { + var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); + } + } + + @Nested + class TestWaitForFinishedFileUpload { + + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private InputStream inputStream; + @Mock + private CompletableFuture<GrpcRouteForwardingResponse> resultFuture; + + @BeforeEach + void mock() { + when(fileSender.getResultFuture()).thenReturn(resultFuture); + } + + @Test + void shouldGetResultFuture() { + waitForFinishedFileUpload(); + + verify(fileSender).getResultFuture(); + } + + @Test + @SneakyThrows + void shouldGetResultFromFuture() { + waitForFinishedFileUpload(); + + verify(resultFuture).get(2, TimeUnit.MINUTES); + } + + @Test + @SneakyThrows + void shouldCloseInputStream() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(inputStream).close(); + } + + @Nested + class TestOnInterruptedException { + + private InterruptedException exception = new InterruptedException(); + + @BeforeEach + @SneakyThrows + void mock() { + when(resultFuture.get(anyLong(), any())).thenThrow(exception); + } + + @Test + void shouldThrowTechnicalException() { + assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); + } + + @Test + void shouldInterruptThread() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + assertThat(Thread.currentThread().isInterrupted()).isTrue(); + } + + @Test + void shouldCancelOnError() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(fileSender).cancelOnError(exception); + } + + @Test + @SneakyThrows + void shouldCloseInputStream() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(inputStream).close(); + } + } + + @Nested + class TestOnExecutionException { + + private ExecutionException exception = new ExecutionException(new Exception()); + + @BeforeEach + @SneakyThrows + void mock() { + when(resultFuture.get(anyLong(), any())).thenThrow(exception); + } + + @Test + void shouldThrowTechnicalException() { + assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); + } + + @Test + void shouldCancelOnError() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(fileSender).cancelOnError(exception); + } + + @Test + @SneakyThrows + void shouldCloseInputStream() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(inputStream).close(); + } + } + + @Nested + class TestOnTimeoutException { + + private TimeoutException exception = new TimeoutException(); + + @BeforeEach + @SneakyThrows + void mock() { + when(resultFuture.get(anyLong(), any())).thenThrow(exception); + } + + @Test + void shouldThrowTechnicalException() { + assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); + } + + @Test + void shouldCancelOnTimeout() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(fileSender).cancelOnTimeout(); + } + + @Test + @SneakyThrows + void shouldCloseInputStream() { + try { + waitForFinishedFileUpload(); + } catch (TechnicalException e) { + // expected + } + + verify(inputStream).close(); + } + } + + private void waitForFinishedFileUpload() { + service.waitForFinishedFileUpload(fileSender, inputStream); + } + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentFileTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentFileTestFactory.java new file mode 100644 index 000000000..8c954a3e1 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentFileTestFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile; +import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile.Builder; +import de.ozgcloud.vorgang.vorgang.IncomingFileGroupTestFactory; +import de.ozgcloud.vorgang.vorgang.IncomingFileTestFactory; + +public class GrpcAttachmentFileTestFactory { + + public static final String GROUP_NAME = IncomingFileGroupTestFactory.NAME; + + public static GrpcAttachmentFile create() { + return createBuilder().build(); + } + + public static Builder createBuilder() { + return GrpcAttachmentFile.newBuilder() + .setGroupName(GROUP_NAME) + .setFileName(IncomingFileTestFactory.NAME) + .setContentType(IncomingFileTestFactory.CONTENT_TYPE_STR) + .setVendorId(IncomingFileTestFactory.VENDOR_ID) + .setSize(IncomingFileTestFactory.SIZE); + } + +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentTestFactory.java new file mode 100644 index 000000000..4e0e278a9 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcAttachmentTestFactory.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcAttachment; +import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile; +import de.ozgcloud.eingang.forwarding.GrpcFileContent; + +public class GrpcAttachmentTestFactory { + + public static final GrpcAttachmentFile FILE = GrpcAttachmentFileTestFactory.create(); + public static final GrpcFileContent CONTENT = GrpcFileContentTestFactory.create(); + + public static GrpcAttachment createWithFile() { + return GrpcAttachment.newBuilder() + .setFile(FILE) + .build(); + } + + public static GrpcAttachment createWithContent() { + return GrpcAttachment.newBuilder() + .setContent(CONTENT) + .build(); + } + +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcFileContentTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcFileContentTestFactory.java new file mode 100644 index 000000000..c37286a4d --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcFileContentTestFactory.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import org.apache.commons.lang3.RandomUtils; + +import com.google.protobuf.ByteString; + +import de.ozgcloud.eingang.forwarding.GrpcFileContent; +import de.ozgcloud.eingang.forwarding.GrpcFileContent.Builder; + +public class GrpcFileContentTestFactory { + + public static final boolean IS_END_OF_FILE = false; + public static final byte[] CONTENT = RandomUtils.insecure().randomBytes(10);; + + public static GrpcFileContent create() { + return createBuilder().build(); + } + + public static Builder createBuilder() { + return GrpcFileContent.newBuilder() + .setContent(ByteString.copyFrom(CONTENT)) + .setIsEndOfFile(IS_END_OF_FILE); + } + + public static GrpcFileContent createEndOfFile() { + return GrpcFileContent.newBuilder().setIsEndOfFile(true).build(); + } + +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java index d09b7af52..58b939a41 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -23,10 +23,14 @@ */ package de.ozgcloud.vorgang.vorgang.redirect; +import de.ozgcloud.eingang.forwarding.GrpcAttachment; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; class GrpcRouteForwardingRequestTestFactory { + public static final GrpcAttachment ATTACHMENT_METADATA = GrpcAttachmentTestFactory.createWithFile(); + public static final GrpcAttachment ATTACHMENT_COTNENT = GrpcAttachmentTestFactory.createWithContent(); + public static GrpcRouteForwardingRequest create() { return createBuilder().build(); } @@ -34,4 +38,16 @@ class GrpcRouteForwardingRequestTestFactory { public static GrpcRouteForwardingRequest.Builder createBuilder() { return GrpcRouteForwardingRequest.newBuilder(); } + + public static GrpcRouteForwardingRequest createWithAttachmentMetadata() { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(ATTACHMENT_METADATA) + .build(); + } + + public static GrpcRouteForwardingRequest createWithAttachmentContent() { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(ATTACHMENT_METADATA) + .build(); + } } -- GitLab From 8253d9939685bf5df2a7ab048b2b8c393374352b Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Wed, 19 Mar 2025 16:08:21 +0100 Subject: [PATCH 11/21] OZG-7573 OZG-7923 Fix integration test --- .../de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java | 2 +- .../ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java index 24d8152f7..dbb11b274 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java @@ -223,7 +223,7 @@ class VorgangGrpcServiceITCase { } private static GrpcFormData expectedFormData() { - var grpcFormData = GrpcFormDataTestFactory.createBuilder().clearField().addAllField(formFields); + var grpcFormData = GrpcFormDataTestFactory.createBuilder().clearField().addAllField(formFields).clearForm(); for (String subFormName : List.of(TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3)) { grpcFormData.addForm(GrpcSubForm.newBuilder() .setTitle(subFormName) diff --git a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java index b2ece13fb..760f1e903 100644 --- a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java +++ b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java @@ -34,6 +34,7 @@ public class GrpcFormDataTestFactory { public static Builder createBuilder() { return GrpcFormData.newBuilder() + .addField(GrpcFormFieldTestFactory.create()) .addForm(GrpcSubFormTestFactory.create()); } } -- GitLab From ac9454c581082b0d0b1652106bb970d97a0b01e4 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 19 Mar 2025 16:27:15 +0100 Subject: [PATCH 12/21] OZG-7573 OZG-7930 forward representations to eingang-manager --- .../vorgang/vorgang/IncomingFileMapper.java | 13 + .../redirect/ForwardingRemoteService.java | 69 +++- .../vorgang/vorgang/EingangTestFactory.java | 3 +- .../vorgang/IncomingFileMapperTest.java | 12 + .../redirect/ForwardingRemoteServiceTest.java | 315 +++++++++++++++--- .../GrpcRepresentationFileTestFactory.java | 44 +++ .../GrpcRepresentationTestFactory.java | 46 +++ ...GrpcRouteForwardingRequestTestFactory.java | 19 +- 8 files changed, 454 insertions(+), 67 deletions(-) create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java index 2e8f8d7ca..1170b27d7 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java @@ -29,6 +29,7 @@ import org.mapstruct.Mapping; import com.google.protobuf.ByteString; import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; import de.ozgcloud.vorgang.files.FileIdMapper; @Mapper(uses = FileIdMapper.class) @@ -52,4 +53,16 @@ public interface IncomingFileMapper { @Mapping(target = "allFields", ignore = true) @Mapping(target = "fileName", source = "file.name") GrpcAttachmentFile toAttachmentFile(String groupName, IncomingFile file); + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "contentTypeBytes", ignore = true) + @Mapping(target = "fileNameBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "vendorIdBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "fileName", source = "name") + GrpcRepresentationFile toRepresentationFile(IncomingFile file); } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index 7f74468d3..f9d26cb6d 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -29,6 +29,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.BiFunction; import java.util.function.Function; import org.apache.commons.io.IOUtils; @@ -42,6 +43,7 @@ import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; import de.ozgcloud.eingang.forwarding.GrpcAttachment; import de.ozgcloud.eingang.forwarding.GrpcFileContent; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; @@ -90,6 +92,7 @@ class ForwardingRemoteService { var eingang = vorgangService.getById(request.getVorgangId()).getEingangs().getFirst(); requestStreamObserver.onNext(buildRouteForwardingRequest(request, eingang)); sendAttachments(eingang.getAttachments(), requestStreamObserver); + sendRepresentations(eingang.getRepresentations(), requestStreamObserver); } GrpcRouteForwardingRequest buildRouteForwardingRequest(ForwardingRequest request, Eingang eingang) { @@ -106,40 +109,80 @@ class ForwardingRemoteService { private void sendAttachmentFile(StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file) { var fileContentStream = fileService.getUploadedFileStream(file.getId()); - var fileSender = createFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); + var fileSender = createAttachmentFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); waitForFinishedFileUpload(fileSender, fileContentStream); } - FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender( + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createAttachmentFileSender( StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file, InputStream fileContentStream) { - return GrpcFileUploadUtils - .createSender(this::buildAttachmentChunk, fileContentStream, requestCallStreamObserverProvider(requestStreamObserver), false) + return createSenderWithoutMetadata(this::buildAttachmentChunk, requestStreamObserver, fileContentStream) .withMetaData(buildGrpcAttachmentFile(groupName, file)); } + GrpcRouteForwardingRequest buildAttachmentChunk(byte[] chunk, int length) { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setContent(buildGrpcFileContent(chunk, length)) + .build()) + .build(); + } + + GrpcRouteForwardingRequest buildGrpcAttachmentFile(String name, IncomingFile file) { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setFile(incomingFileMapper.toAttachmentFile(name, file)) + .build()) + .build(); + } + + void sendRepresentations(List<IncomingFile> representations, StreamObserver<GrpcRouteForwardingRequest> requestObserver) { + representations.forEach(representation -> { + var fileContentStream = fileService.getUploadedFileStream(representation.getId()); + var fileSender = createRepresentationFileSender(requestObserver, representation, fileContentStream).send(); + waitForFinishedFileUpload(fileSender, fileContentStream); + }); + } + + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createRepresentationFileSender( + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, IncomingFile file, InputStream fileContentStream) { + return createSenderWithoutMetadata(this::buildRepresentationChunk, requestStreamObserver, fileContentStream) + .withMetaData(buildGrpcRepresentationFile(file)); + } + + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createSenderWithoutMetadata( + BiFunction<byte[], Integer, GrpcRouteForwardingRequest> chunkBuilder, + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, InputStream fileContentStream) { + return GrpcFileUploadUtils + .createSender(chunkBuilder, fileContentStream, requestCallStreamObserverProvider(requestStreamObserver), false); + } + private Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>> requestCallStreamObserverProvider( StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { return response -> (CallStreamObserver<GrpcRouteForwardingRequest>) requestStreamObserver; } - GrpcRouteForwardingRequest buildAttachmentChunk(byte[] chunk, int length) { + GrpcRouteForwardingRequest buildRepresentationChunk(byte[] chunk, int length) { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(GrpcRepresentation.newBuilder() + .setContent(buildGrpcFileContent(chunk, length)) + .build()) + .build(); + } + + GrpcFileContent buildGrpcFileContent(byte[] chunk, int length) { var fileContentBuilder = GrpcFileContent.newBuilder(); if (length <= 0) { fileContentBuilder.setIsEndOfFile(true); } else { fileContentBuilder.setContent(ByteString.copyFrom(chunk)); } - return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(GrpcAttachment.newBuilder() - .setContent(fileContentBuilder) - .build()) - .build(); + return fileContentBuilder.build(); } - GrpcRouteForwardingRequest buildGrpcAttachmentFile(String name, IncomingFile file) { + GrpcRouteForwardingRequest buildGrpcRepresentationFile(IncomingFile file) { return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(GrpcAttachment.newBuilder() - .setFile(incomingFileMapper.toAttachmentFile(name, file)) + .setRepresentation(GrpcRepresentation.newBuilder() + .setFile(incomingFileMapper.toRepresentationFile(file)) .build()) .build(); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java index b12ea789a..458d34b19 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java @@ -50,6 +50,7 @@ public class EingangTestFactory { public static final Map<String, Object> FORM_DATA = Map.of(SINGLE_FIELD_NAME, SINGLE_FIELD, SUBFORM_NAME, SUBFORM); public static final IncomingFileGroup ATTACHMENT = IncomingFileGroupTestFactory.create(); + public static final IncomingFile REPRESENTATION = IncomingFileTestFactory.create(); public static Eingang create() { return createBuilder().build(); @@ -62,7 +63,7 @@ public class EingangTestFactory { .antragsteller(AntragstellerTestFactory.create()) .formData(FORM_DATA) .attachment(ATTACHMENT) - .representation(IncomingFileTestFactory.create()) + .representation(REPRESENTATION) .zustaendigeStelle(ZustaendigeStelleTestFactory.create()); } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java index d6f41ddfe..771c11f67 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java @@ -33,6 +33,7 @@ import org.mockito.Spy; import de.ozgcloud.vorgang.files.FileIdMapper; import de.ozgcloud.vorgang.vorgang.redirect.GrpcAttachmentFileTestFactory; +import de.ozgcloud.vorgang.vorgang.redirect.GrpcRepresentationFileTestFactory; class IncomingFileMapperTest { @@ -62,4 +63,15 @@ class IncomingFileMapperTest { assertThat(result).isEqualTo(GrpcAttachmentFileTestFactory.create()); } } + + @Nested + class TestToRepresentationFile { + + @Test + void shouldMapToGrpcRepresentationFile() { + var result = mapper.toRepresentationFile(IncomingFileTestFactory.create()); + + assertThat(result).isEqualTo(GrpcRepresentationFileTestFactory.create()); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index 653549de0..8a1de85f2 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -234,6 +234,7 @@ class ForwardingRemoteServiceTest { when(vorgangService.getById(any())).thenReturn(vorgang); doReturn(routeForwardingRequest).when(service).buildRouteForwardingRequest(any(), any()); doNothing().when(service).sendAttachments(any(), any()); + doNothing().when(service).sendRepresentations(any(), any()); } @Test @@ -263,6 +264,13 @@ class ForwardingRemoteServiceTest { verify(service).sendAttachments(List.of(EingangTestFactory.ATTACHMENT), requestObserver); } + @Test + void shouldCallSendRepresentations() { + sendEingang(); + + verify(service).sendRepresentations(List.of(EingangTestFactory.REPRESENTATION), requestObserver); + } + private void sendEingang() { service.sendEingang(request, requestObserver); } @@ -310,8 +318,9 @@ class ForwardingRemoteServiceTest { @BeforeEach void init() { when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); - doReturn(fileSender).when(service).createFileSender(any(), any(), any(), any()); + doReturn(fileSender).when(service).createAttachmentFileSender(any(), any(), any(), any()); when(fileSender.send()).thenReturn(fileSender); + doNothing().when(service).waitForFinishedFileUpload(any(), any()); } @Test @@ -322,10 +331,10 @@ class ForwardingRemoteServiceTest { } @Test - void shouldCallCreateFileSender() { + void shouldCallCreateAttachmentFileSender() { sendAttachments(); - verify(service).createFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + verify(service).createAttachmentFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, inputStream); } @@ -352,107 +361,312 @@ class ForwardingRemoteServiceTest { } @Nested - class TestCreateFileSender { + class TestCreateAttachmentFileSender { - private MockedStatic<GrpcFileUploadUtils> grpcFileUploadUtilsMock; @Mock - private CallStreamObserver<GrpcRouteForwardingRequest> requestCallStreamObserver; + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Mock + private InputStream inputStream; @Mock private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; @Mock private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSenderWithMetadata; - @Mock - private StreamObserver<GrpcRouteForwardingResponse> responseObserver; - @Mock - private InputStream inputStream; @Captor private ArgumentCaptor<BiFunction<byte[], Integer, GrpcRouteForwardingRequest>> chunkBuilderCaptor; - @Captor - private ArgumentCaptor<Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>>> reqObserverBuilderCaptor; private final byte[] chunk = RandomUtils.insecure().randomBytes(5); private final GrpcRouteForwardingRequest metadataRequest = GrpcRouteForwardingRequestTestFactory.create(); @BeforeEach void init() { - grpcFileUploadUtilsMock = mockStatic(GrpcFileUploadUtils.class); - grpcFileUploadUtilsMock.when(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), anyBoolean())).thenReturn(fileSender); + doReturn(fileSender).when(service).createSenderWithoutMetadata(any(), any(), any()); doReturn(metadataRequest).when(service).buildGrpcAttachmentFile(any(), any()); when(fileSender.withMetaData(any())).thenReturn(fileSenderWithMetadata); } - @AfterEach - void tearDown() { - grpcFileUploadUtilsMock.close(); - } - @Test - void shouldCreateFileSenderWithChunkBuilder() { - createFileSender(); + void shouldCallCreateSenderWithoutMetadata() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(chunkBuilderCaptor.capture(), any(), any(), anyBoolean())); + verify(service).createSenderWithoutMetadata(chunkBuilderCaptor.capture(), eq(requestObserver), eq(inputStream)); chunkBuilderCaptor.getValue().apply(chunk, chunk.length); verify(service).buildAttachmentChunk(chunk, chunk.length); } @Test - void shouldCreateFileSenderWithInputStream() { - createFileSender(); + void shouldCallBuildGrpcAttachmentFile() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), eq(inputStream), any(), anyBoolean())); + verify(service).buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE); } @Test - void shouldCreateFileSenderWithRequestObserverBuilder() { - createFileSender(); + void shouldSetMetaData() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), reqObserverBuilderCaptor.capture(), anyBoolean())); - assertThat(reqObserverBuilderCaptor.getValue().apply(responseObserver)).isSameAs(requestCallStreamObserver); + verify(fileSender).withMetaData(metadataRequest); + } + + @Test + void shouldReturnBuiltFileSender() { + var returnedFileSender = createAttachmentFileSender(); + + assertThat(returnedFileSender).isSameAs(fileSenderWithMetadata); + } + + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createAttachmentFileSender() { + return service.createAttachmentFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + inputStream); + } + } + + @Nested + class TestBuildAttachmentChunk { + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + + @BeforeEach + void mock() { + doReturn(GrpcAttachmentTestFactory.CONTENT).when(service).buildGrpcFileContent(any(), anyInt()); } @Test - void shouldCreateFileSenderWithNotCompleteOnFileSent() { - createFileSender(); + void shouldCallBuildGrpcFileContent() { + service.buildAttachmentChunk(chunk, chunk.length); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), eq(false))); + verify(service).buildGrpcFileContent(chunk, chunk.length); } @Test - void shouldCallBuildGrpcAttachmentFile() { - createFileSender(); + void shouldReturnGrpcRouteForwardingRequest() { + var result = service.buildAttachmentChunk(chunk, chunk.length); - verify(service).buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE); + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentContent()); + } + } + + @Nested + class TestBuildGrpcAttachmentFile { + + private IncomingFile file = IncomingFileTestFactory.create(); + + @BeforeEach + void mock() { + when(incomingFileMapper.toAttachmentFile(any(), any())).thenReturn(GrpcAttachmentFileTestFactory.create()); + } + + @Test + void shouldCallIncomingFileMapper() { + service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + verify(incomingFileMapper).toAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + } + + @Test + void shoudlReturnAttachmentMetadataRequest() { + var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); + } + } + + @Nested + class TestSendRepresentations { + + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private InputStream inputStream; + + private final IncomingFile representation = IncomingFileTestFactory.create(); + + @BeforeEach + void init() { + when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); + doReturn(fileSender).when(service).createRepresentationFileSender(any(), any(), any()); + when(fileSender.send()).thenReturn(fileSender); + doNothing().when(service).waitForFinishedFileUpload(any(), any()); + } + + @Test + void shouldGetUploadedFileContent() { + sendRepresentations(); + + verify(fileService).getUploadedFileStream(IncomingFileTestFactory.ID); + } + + @Test + void shouldCallCreateRepresentationFileSender() { + sendRepresentations(); + + verify(service).createRepresentationFileSender(requestObserver, representation, inputStream); + } + + @Test + void shouldSend() { + sendRepresentations(); + + verify(fileSender).send(); + } + + @Test + void shouldCallWaitForFinishedFileUploadAfterSend() { + var inOrder = inOrder(fileSender, service); + + sendRepresentations(); + + inOrder.verify(fileSender).send(); + inOrder.verify(service).waitForFinishedFileUpload(fileSender, inputStream); + } + + private void sendRepresentations() { + service.sendRepresentations(List.of(representation), requestObserver); + } + } + + @Nested + class TestCreateRepresentationFileSender { + + @Mock + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Mock + private InputStream inputStream; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSenderWithMetadata; + @Captor + private ArgumentCaptor<BiFunction<byte[], Integer, GrpcRouteForwardingRequest>> chunkBuilderCaptor; + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + private final GrpcRouteForwardingRequest metadataRequest = GrpcRouteForwardingRequestTestFactory.create(); + private final IncomingFile incomingFile = IncomingFileTestFactory.create(); + + @BeforeEach + void init() { + doReturn(fileSender).when(service).createSenderWithoutMetadata(any(), any(), any()); + doReturn(metadataRequest).when(service).buildGrpcRepresentationFile(any()); + when(fileSender.withMetaData(any())).thenReturn(fileSenderWithMetadata); + } + + @Test + void shouldCallCreateSenderWithoutMetadata() { + createRepresentationFileSender(); + + verify(service).createSenderWithoutMetadata(chunkBuilderCaptor.capture(), eq(requestObserver), eq(inputStream)); + chunkBuilderCaptor.getValue().apply(chunk, chunk.length); + verify(service).buildRepresentationChunk(chunk, chunk.length); + } + + @Test + void shouldCallBuildGrpcRepresentationFile() { + createRepresentationFileSender(); + + verify(service).buildGrpcRepresentationFile(incomingFile); } @Test void shouldSetMetaData() { - createFileSender(); + createRepresentationFileSender(); verify(fileSender).withMetaData(metadataRequest); } @Test void shouldReturnBuiltFileSender() { - var returnedFileSender = createFileSender(); + var returnedFileSender = createRepresentationFileSender(); assertThat(returnedFileSender).isSameAs(fileSenderWithMetadata); } - private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender() { - return service.createFileSender(requestCallStreamObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, - inputStream); + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createRepresentationFileSender() { + return service.createRepresentationFileSender(requestObserver, incomingFile, inputStream); } } @Nested - class TestBuildAttachmentChunk { + class TestCreateSenderWithoutMetadata { + + private MockedStatic<GrpcFileUploadUtils> grpcFileUploadUtilsMock; + @Mock + private BiFunction<byte[], Integer, GrpcRouteForwardingRequest> chunkBuilder; + @Mock + private CallStreamObserver<GrpcRouteForwardingRequest> requestCallStreamObserver; + @Mock + private InputStream inputStream; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Captor + private ArgumentCaptor<Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>>> reqObserverBuilderCaptor; + + @BeforeEach + void init() { + grpcFileUploadUtilsMock = mockStatic(GrpcFileUploadUtils.class); + grpcFileUploadUtilsMock.when(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), anyBoolean())).thenReturn(fileSender); + } + + @AfterEach + void tearDown() { + grpcFileUploadUtilsMock.close(); + } + + @Test + void shouldCreateFileSender() { + createSenderWithoutMetadata(); + + grpcFileUploadUtilsMock + .verify(() -> GrpcFileUploadUtils.createSender(eq(chunkBuilder), eq(inputStream), reqObserverBuilderCaptor.capture(), eq(false))); + assertThat(reqObserverBuilderCaptor.getValue().apply(responseObserver)).isSameAs(requestCallStreamObserver); + } + + @Test + void shouldReturnCreatedFileSender() { + var returnedFileSender = createSenderWithoutMetadata(); + + assertThat(returnedFileSender).isSameAs(fileSender); + } + + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createSenderWithoutMetadata() { + return service.createSenderWithoutMetadata(chunkBuilder, requestCallStreamObserver, inputStream); + } + } + + @Nested + class TestBuildRepresentationChunk { + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + + @BeforeEach + void mock() { + doReturn(GrpcRepresentationTestFactory.CONTENT).when(service).buildGrpcFileContent(any(), anyInt()); + } + + @Test + void shouldCallBuildGrpcFileContent() { + service.buildRepresentationChunk(chunk, chunk.length); + + verify(service).buildGrpcFileContent(chunk, chunk.length); + } + + @Test + void shouldReturnGrpcRouteForwardingRequest() { + var result = service.buildRepresentationChunk(chunk, chunk.length); + + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithRepresentationContent()); + } + } + + @Nested + class TestBuildGrpcFileContent { @Nested class TestOnEndOfFile { @Test void shouldBuildEndOfFileChunk() { - var fileContent = service.buildAttachmentChunk(new byte[0], -1).getAttachment().getContent(); + var fileContent = service.buildGrpcFileContent(new byte[0], -1); assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.createEndOfFile()); } @@ -463,8 +677,7 @@ class ForwardingRemoteServiceTest { @Test void shouldBuildEndOfFileChunk() { - var fileContent = service.buildAttachmentChunk(GrpcFileContentTestFactory.CONTENT, GrpcFileContentTestFactory.CONTENT.length) - .getAttachment().getContent(); + var fileContent = service.buildGrpcFileContent(GrpcFileContentTestFactory.CONTENT, GrpcFileContentTestFactory.CONTENT.length); assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.create()); } @@ -472,27 +685,27 @@ class ForwardingRemoteServiceTest { } @Nested - class TestBuildGrpcAttachmentFile { + class TestBuildGrpcRepresentationFile { private IncomingFile file = IncomingFileTestFactory.create(); @BeforeEach void mock() { - when(incomingFileMapper.toAttachmentFile(any(), any())).thenReturn(GrpcAttachmentFileTestFactory.create()); + when(incomingFileMapper.toRepresentationFile(any())).thenReturn(GrpcRepresentationFileTestFactory.create()); } @Test void shouldCallIncomingFileMapper() { - service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + service.buildGrpcRepresentationFile(file); - verify(incomingFileMapper).toAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + verify(incomingFileMapper).toRepresentationFile(file); } @Test - void shoudlReturnAttachmentMetadataRequest() { - var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + void shoudlReturnRepresentationMetadataRequest() { + var result = service.buildGrpcRepresentationFile(file); - assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithRepresentationMetadata()); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java new file mode 100644 index 000000000..d832cbc58 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile.Builder; +import de.ozgcloud.vorgang.vorgang.IncomingFileTestFactory; + +public class GrpcRepresentationFileTestFactory { + + public static GrpcRepresentationFile create() { + return createBuilder().build(); + } + + public static Builder createBuilder() { + return GrpcRepresentationFile.newBuilder() + .setFileName(IncomingFileTestFactory.NAME) + .setContentType(IncomingFileTestFactory.CONTENT_TYPE_STR) + .setVendorId(IncomingFileTestFactory.VENDOR_ID) + .setSize(IncomingFileTestFactory.SIZE); + } + +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java new file mode 100644 index 000000000..4dce5a27e --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcFileContent; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; + +public class GrpcRepresentationTestFactory { + + public static final GrpcRepresentationFile FILE = GrpcRepresentationFileTestFactory.create(); + public static final GrpcFileContent CONTENT = GrpcFileContentTestFactory.create(); + + public static GrpcRepresentation createWithFile() { + return GrpcRepresentation.newBuilder() + .setFile(FILE) + .build(); + } + + public static GrpcRepresentation createWithContent() { + return GrpcRepresentation.newBuilder() + .setContent(CONTENT) + .build(); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java index c5ef1c9d5..7d463347d 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -24,12 +24,15 @@ package de.ozgcloud.vorgang.vorgang.redirect; import de.ozgcloud.eingang.forwarding.GrpcAttachment; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; class GrpcRouteForwardingRequestTestFactory { public static final GrpcAttachment ATTACHMENT_METADATA = GrpcAttachmentTestFactory.createWithFile(); - public static final GrpcAttachment ATTACHMENT_COTNENT = GrpcAttachmentTestFactory.createWithContent(); + public static final GrpcAttachment ATTACHMENT_CONTENT = GrpcAttachmentTestFactory.createWithContent(); + public static final GrpcRepresentation REPRESENTATION_METADATA = GrpcRepresentationTestFactory.createWithFile(); + public static final GrpcRepresentation REPRESENTATION_CONTENT = GrpcRepresentationTestFactory.createWithContent(); public static GrpcRouteForwardingRequest create() { return createBuilder().build(); @@ -48,7 +51,19 @@ class GrpcRouteForwardingRequestTestFactory { public static GrpcRouteForwardingRequest createWithAttachmentContent() { return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(ATTACHMENT_METADATA) + .setAttachment(ATTACHMENT_CONTENT) + .build(); + } + + public static GrpcRouteForwardingRequest createWithRepresentationMetadata() { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(REPRESENTATION_METADATA) + .build(); + } + + public static GrpcRouteForwardingRequest createWithRepresentationContent() { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(REPRESENTATION_CONTENT) .build(); } } -- GitLab From 9ff7fb3a46f2c4165c6cccdda9137ec284153b50 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Thu, 20 Mar 2025 11:57:44 +0100 Subject: [PATCH 13/21] OZG-7573 remove waitForFinishedFileUpload --- .../redirect/ForwardingRemoteService.java | 24 +-- .../redirect/ForwardingRemoteServiceTest.java | 171 ++---------------- 2 files changed, 16 insertions(+), 179 deletions(-) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index f9d26cb6d..18a53bf2f 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -32,7 +32,6 @@ import java.util.concurrent.TimeoutException; import java.util.function.BiFunction; import java.util.function.Function; -import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Service; import com.google.protobuf.ByteString; @@ -109,8 +108,7 @@ class ForwardingRemoteService { private void sendAttachmentFile(StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file) { var fileContentStream = fileService.getUploadedFileStream(file.getId()); - var fileSender = createAttachmentFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); - waitForFinishedFileUpload(fileSender, fileContentStream); + createAttachmentFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); } FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createAttachmentFileSender( @@ -138,8 +136,7 @@ class ForwardingRemoteService { void sendRepresentations(List<IncomingFile> representations, StreamObserver<GrpcRouteForwardingRequest> requestObserver) { representations.forEach(representation -> { var fileContentStream = fileService.getUploadedFileStream(representation.getId()); - var fileSender = createRepresentationFileSender(requestObserver, representation, fileContentStream).send(); - waitForFinishedFileUpload(fileSender, fileContentStream); + createRepresentationFileSender(requestObserver, representation, fileContentStream).send(); }); } @@ -187,29 +184,16 @@ class ForwardingRemoteService { .build(); } - void waitForFinishedFileUpload(FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender, InputStream inputStream) { + void waitForCompletion(CompletableFuture<Void> responseFuture) { try { - fileSender.getResultFuture().get(TIMEOUT_MINUTES, TimeUnit.MINUTES); + responseFuture.get(TIMEOUT_MINUTES, TimeUnit.MINUTES); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - fileSender.cancelOnError(e); throw new TechnicalException("Waiting for finishing file upload was interrupted.", e); } catch (ExecutionException e) { - fileSender.cancelOnError(e); throw new TechnicalException("Error on uploading file content.", e); } catch (TimeoutException e) { - fileSender.cancelOnTimeout(); throw new TechnicalException("Timeout on uploading file content.", e); - } finally { - IOUtils.closeQuietly(inputStream); - } - } - - void waitForCompletion(CompletableFuture<Void> responseFuture) { - try { - responseFuture.get(); - } catch (Throwable t) { - throw new TechnicalException("Forwarding failed", t); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index 8a1de85f2..dab4e8bae 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -320,7 +320,6 @@ class ForwardingRemoteServiceTest { when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); doReturn(fileSender).when(service).createAttachmentFileSender(any(), any(), any(), any()); when(fileSender.send()).thenReturn(fileSender); - doNothing().when(service).waitForFinishedFileUpload(any(), any()); } @Test @@ -345,16 +344,6 @@ class ForwardingRemoteServiceTest { verify(fileSender).send(); } - @Test - void shouldCallWaitForFinishedFileUploadAfterSend() { - var inOrder = inOrder(fileSender, service); - - sendAttachments(); - - inOrder.verify(fileSender).send(); - inOrder.verify(service).waitForFinishedFileUpload(fileSender, inputStream); - } - private void sendAttachments() { service.sendAttachments(List.of(attachment), requestObserver); } @@ -485,7 +474,6 @@ class ForwardingRemoteServiceTest { when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); doReturn(fileSender).when(service).createRepresentationFileSender(any(), any(), any()); when(fileSender.send()).thenReturn(fileSender); - doNothing().when(service).waitForFinishedFileUpload(any(), any()); } @Test @@ -509,16 +497,6 @@ class ForwardingRemoteServiceTest { verify(fileSender).send(); } - @Test - void shouldCallWaitForFinishedFileUploadAfterSend() { - var inOrder = inOrder(fileSender, service); - - sendRepresentations(); - - inOrder.verify(fileSender).send(); - inOrder.verify(service).waitForFinishedFileUpload(fileSender, inputStream); - } - private void sendRepresentations() { service.sendRepresentations(List.of(representation), requestObserver); } @@ -710,45 +688,17 @@ class ForwardingRemoteServiceTest { } @Nested - class TestWaitForFinishedFileUpload { + class TestWaitForCompletion { @Mock - private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; - @Mock - private InputStream inputStream; - @Mock - private CompletableFuture<GrpcRouteForwardingResponse> resultFuture; - - @BeforeEach - void mock() { - when(fileSender.getResultFuture()).thenReturn(resultFuture); - } - - @Test - void shouldGetResultFuture() { - waitForFinishedFileUpload(); - - verify(fileSender).getResultFuture(); - } + private CompletableFuture<Void> future; - @Test @SneakyThrows - void shouldGetResultFromFuture() { - waitForFinishedFileUpload(); - - verify(resultFuture).get(2, TimeUnit.MINUTES); - } - @Test - @SneakyThrows - void shouldCloseInputStream() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } + void shouldGetFromFuture() { + waitForCompletion(); - verify(inputStream).close(); + verify(future).get(2, TimeUnit.MINUTES); } @Nested @@ -759,47 +709,24 @@ class ForwardingRemoteServiceTest { @BeforeEach @SneakyThrows void mock() { - when(resultFuture.get(anyLong(), any())).thenThrow(exception); + when(future.get(anyLong(), any())).thenThrow(exception); } @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); + assertThrows(TechnicalException.class, () -> waitForCompletion()); } @Test void shouldInterruptThread() { try { - waitForFinishedFileUpload(); + waitForCompletion(); } catch (TechnicalException e) { // expected } assertThat(Thread.currentThread().isInterrupted()).isTrue(); } - - @Test - void shouldCancelOnError() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(fileSender).cancelOnError(exception); - } - - @Test - @SneakyThrows - void shouldCloseInputStream() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(inputStream).close(); - } } @Nested @@ -810,35 +737,12 @@ class ForwardingRemoteServiceTest { @BeforeEach @SneakyThrows void mock() { - when(resultFuture.get(anyLong(), any())).thenThrow(exception); + when(future.get(anyLong(), any())).thenThrow(exception); } @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); - } - - @Test - void shouldCancelOnError() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(fileSender).cancelOnError(exception); - } - - @Test - @SneakyThrows - void shouldCloseInputStream() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(inputStream).close(); + assertThrows(TechnicalException.class, () -> waitForCompletion()); } } @@ -850,64 +754,13 @@ class ForwardingRemoteServiceTest { @BeforeEach @SneakyThrows void mock() { - when(resultFuture.get(anyLong(), any())).thenThrow(exception); + when(future.get(anyLong(), any())).thenThrow(exception); } @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForFinishedFileUpload()); + assertThrows(TechnicalException.class, () -> waitForCompletion()); } - - @Test - void shouldCancelOnTimeout() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(fileSender).cancelOnTimeout(); - } - - @Test - @SneakyThrows - void shouldCloseInputStream() { - try { - waitForFinishedFileUpload(); - } catch (TechnicalException e) { - // expected - } - - verify(inputStream).close(); - } - } - - private void waitForFinishedFileUpload() { - service.waitForFinishedFileUpload(fileSender, inputStream); - } - } - - @Nested - class TestWaitForCompletion { - - @Mock - private CompletableFuture<Void> future; - - @SneakyThrows - @Test - void shouldGetFromFuture() { - waitForCompletion(); - - verify(future).get(); - } - - @SneakyThrows - @Test - void shouldThrowTechnicalException() { - var exception = new RuntimeException(); - when(future.get()).thenThrow(exception); - - assertThatThrownBy(this::waitForCompletion).isInstanceOf(TechnicalException.class).hasCause(exception); } private void waitForCompletion() { -- GitLab From 1e07ddfee398051a73e126cfd7352c23d193f192 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Thu, 20 Mar 2025 18:00:58 +0100 Subject: [PATCH 14/21] OZG-7573 Add missing Test-annotation & remove IDE warnings --- .../redirect/ForwardingRemoteServiceTest.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index dab4e8bae..175a515fe 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -244,6 +244,7 @@ class ForwardingRemoteServiceTest { verify(vorgangService).getById(VorgangTestFactory.ID); } + @Test void shouldBuildRouteForwardingRequest() { sendEingang(); @@ -352,8 +353,6 @@ class ForwardingRemoteServiceTest { @Nested class TestCreateAttachmentFileSender { - @Mock - private StreamObserver<GrpcRouteForwardingResponse> responseObserver; @Mock private InputStream inputStream; @Mock @@ -437,7 +436,7 @@ class ForwardingRemoteServiceTest { @Nested class TestBuildGrpcAttachmentFile { - private IncomingFile file = IncomingFileTestFactory.create(); + private final IncomingFile file = IncomingFileTestFactory.create(); @BeforeEach void mock() { @@ -452,7 +451,7 @@ class ForwardingRemoteServiceTest { } @Test - void shoudlReturnAttachmentMetadataRequest() { + void shouldReturnAttachmentMetadataRequest() { var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); @@ -505,8 +504,6 @@ class ForwardingRemoteServiceTest { @Nested class TestCreateRepresentationFileSender { - @Mock - private StreamObserver<GrpcRouteForwardingResponse> responseObserver; @Mock private InputStream inputStream; @Mock @@ -665,7 +662,7 @@ class ForwardingRemoteServiceTest { @Nested class TestBuildGrpcRepresentationFile { - private IncomingFile file = IncomingFileTestFactory.create(); + private final IncomingFile file = IncomingFileTestFactory.create(); @BeforeEach void mock() { @@ -680,7 +677,7 @@ class ForwardingRemoteServiceTest { } @Test - void shoudlReturnRepresentationMetadataRequest() { + void shouldReturnRepresentationMetadataRequest() { var result = service.buildGrpcRepresentationFile(file); assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithRepresentationMetadata()); @@ -704,7 +701,7 @@ class ForwardingRemoteServiceTest { @Nested class TestOnInterruptedException { - private InterruptedException exception = new InterruptedException(); + private final InterruptedException exception = new InterruptedException(); @BeforeEach @SneakyThrows @@ -714,7 +711,7 @@ class ForwardingRemoteServiceTest { @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForCompletion()); + assertThrows(TechnicalException.class, TestWaitForCompletion.this::waitForCompletion); } @Test @@ -732,7 +729,7 @@ class ForwardingRemoteServiceTest { @Nested class TestOnExecutionException { - private ExecutionException exception = new ExecutionException(new Exception()); + private final ExecutionException exception = new ExecutionException(new Exception()); @BeforeEach @SneakyThrows @@ -742,14 +739,14 @@ class ForwardingRemoteServiceTest { @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForCompletion()); + assertThrows(TechnicalException.class, TestWaitForCompletion.this::waitForCompletion); } } @Nested class TestOnTimeoutException { - private TimeoutException exception = new TimeoutException(); + private final TimeoutException exception = new TimeoutException(); @BeforeEach @SneakyThrows @@ -759,7 +756,7 @@ class ForwardingRemoteServiceTest { @Test void shouldThrowTechnicalException() { - assertThrows(TechnicalException.class, () -> waitForCompletion()); + assertThrows(TechnicalException.class, TestWaitForCompletion.this::waitForCompletion); } } -- GitLab From f48347270ef5c4958033d8987ee8094f07d4cb13 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 21 Mar 2025 11:10:24 +0100 Subject: [PATCH 15/21] OZG-7573 Small fixes --- .../vorgang/vorgang/redirect/ForwardingRemoteService.java | 6 +++--- .../vorgang/redirect/ForwardingRemoteServiceTest.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index 18a53bf2f..63323fb8e 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -81,9 +81,9 @@ class ForwardingRemoteService { try { sendEingang(request, requestStreamObserver); requestStreamObserver.onCompleted(); - } catch (Throwable t) { - requestStreamObserver.onError(t); - throw t; + } catch (Exception e) { + requestStreamObserver.onError(e); + throw e; } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index 175a515fe..5e6e63b58 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -160,7 +160,7 @@ class ForwardingRemoteServiceTest { routeForwarding(); - verify(serviceStub).routeForwarding(any(ForwardingResponseObserver.class)); + verify(serviceStub).routeForwarding(responseObserver); } @Nested -- GitLab From 9a611e0d0bc71d8d1824a416ca2826e2136a0d51 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 21 Mar 2025 12:21:30 +0100 Subject: [PATCH 16/21] OZG-7573 update common-lib version --- vorgang-manager-server/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 30ca31258..209897503 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -51,7 +51,7 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/vorgang-manager:build-latest</spring-boot.build-image.imageName> <zufi-manager-interface.version>1.6.0</zufi-manager-interface.version> - <common-lib.version>4.12.0-OZG-7573-GrpcUpload-utils-SNAPSHOT</common-lib.version> + <common-lib.version>4.12.0-SNAPSHOT</common-lib.version> <user-manager-interface.version>2.12.0</user-manager-interface.version> <processor-manager.version>0.5.0</processor-manager.version> <nachrichten-manager.version>2.18.0</nachrichten-manager.version> -- GitLab From f070bed03a905366ddfa94fd0df235252a01d7a6 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 21 Mar 2025 12:21:55 +0100 Subject: [PATCH 17/21] OZG-7573 add conditional egress for forwarding --- src/main/helm/templates/network_policy.yaml | 34 +- src/test/helm/network_policy_test.yaml | 545 +++++++++++--------- 2 files changed, 315 insertions(+), 264 deletions(-) diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml index b87509495..4e6fb3e0a 100644 --- a/src/main/helm/templates/network_policy.yaml +++ b/src/main/helm/templates/network_policy.yaml @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -{{- if not (.Values.networkPolicy).disabled }} +{{- if not (.Values.networkPolicy).disabled }} apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: @@ -39,10 +39,10 @@ spec: - ports: - port: 9090 from: - - podSelector: + - podSelector: matchLabels: component: alfa - - podSelector: + - podSelector: matchLabels: ozg-component: eingangsadapter - podSelector: @@ -50,7 +50,7 @@ spec: ozg-component: xta-adapter {{- if ((.Values.ozgcloud).aggregationManager).enabled }} - from: - - podSelector: + - podSelector: matchLabels: component: aggregation-manager ports: @@ -69,7 +69,7 @@ spec: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: {{((.Values.ozgcloud).antragraum).antragraumProxyNamespace | default "antragraum-proxy"}} - podSelector: + podSelector: matchLabels: component: antragraum-proxy {{- end }} @@ -87,7 +87,7 @@ spec: - xta-adapter ports: - protocol: TCP - port: 9090 + port: 9090 {{- with (.Values.networkPolicy).additionalIngressConfigLocal }} {{ toYaml . | indent 2 }} @@ -114,7 +114,7 @@ spec: - port: 27017 protocol: TCP - to: - - podSelector: + - podSelector: matchLabels: component: user-manager ports: @@ -122,7 +122,7 @@ spec: protocol: TCP {{- if ((.Values.ozgcloud).bayernid).enabled }} - to: - - podSelector: + - podSelector: matchLabels: component: bayernid-proxy namespaceSelector: @@ -130,14 +130,14 @@ spec: kubernetes.io/metadata.name: {{ required "ozgcloud.bayernid.proxy.namespace must be set if bayernid is enabled" (((.Values.ozgcloud).bayernid).proxy).namespace }} ports: - port: 9090 - protocol: TCP + protocol: TCP {{- end }} {{- if ((.Values.ozgcloud).antragraum).enabled }} - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: {{((.Values.ozgcloud).infoManager).namespace | default "info-manager"}} - podSelector: + podSelector: matchLabels: component: info-manager {{- end }} @@ -146,13 +146,25 @@ spec: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: {{ required "zufiManager.namespace must be set if zufiManager server is enabled" (.Values.zufiManager).namespace }} - podSelector: + podSelector: matchLabels: component: zufi-server ports: - port: 9090 protocol: TCP {{- end }} +{{- if (.Values.forwarding).enabled }} + - to: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: {{ required "forwarding.namespace must be set if forwarding is enabled" (.Values.forwarding).namespace }} + podSelector: + matchLabels: + component: {{ required "forwarding.serviceName must be set if forwarding is enabled" (.Values.forwarding).serviceName }} + ports: + - port: 9090 + protocol: TCP +{{- end }} {{- if ((.Values.ozgcloud).muk).enabled }} - to: - podSelector: diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml index 17c7a4761..fff3066c0 100644 --- a/src/test/helm/network_policy_test.yaml +++ b/src/test/helm/network_policy_test.yaml @@ -30,7 +30,7 @@ templates: tests: - it: should match apiVersion - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -38,7 +38,7 @@ tests: of: networking.k8s.io/v1 - it: should match kind - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -46,7 +46,7 @@ tests: of: NetworkPolicy - it: validate metadata - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -57,7 +57,7 @@ tests: namespace: by-helm-test - it: should set policy target matchLabel - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -67,9 +67,8 @@ tests: matchLabels: component: vorgang-manager - - it: should add policyType Egress - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -78,7 +77,7 @@ tests: content: Egress - it: should add policyType Ingress - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: @@ -87,44 +86,44 @@ tests: content: Ingress - it: should add ingress rule for eingangsmanager and alfa - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: - contains: path: spec.ingress content: - ports: + ports: - port: 9090 - from: - - podSelector: + from: + - podSelector: matchLabels: component: alfa - - podSelector: + - podSelector: matchLabels: ozg-component: eingangsadapter - podSelector: - matchLabels: - ozg-component: xta-adapter + matchLabels: + ozg-component: xta-adapter - it: should add ingress rule for monitoring scraper - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: - contains: path: spec.ingress content: - ports: + ports: - port: 8081 protocol: TCP - from: - - namespaceSelector: + from: + - namespaceSelector: matchLabels: name: openshift-user-workload-monitoring - it: should set monitoring namespace for monitoring scraper ingress rule - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace monitoringNamespace: test-monitoring @@ -132,11 +131,11 @@ tests: - contains: path: spec.ingress content: - ports: + ports: - port: 8081 protocol: TCP - from: - - namespaceSelector: + from: + - namespaceSelector: matchLabels: name: test-monitoring @@ -148,16 +147,16 @@ tests: antragraum: enabled: true asserts: - - contains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: antragraum-proxy - podSelector: - matchLabels: - component: antragraum-proxy + - contains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: antragraum-proxy + podSelector: + matchLabels: + component: antragraum-proxy - it: should set ingress rule for antragraum-proxy if antragraum is enabled set: @@ -168,17 +167,16 @@ tests: enabled: true antragraumProxyNamespace: antragraum-proxy asserts: - - contains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: antragraum-proxy - podSelector: - matchLabels: - component: antragraum-proxy - + - contains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: antragraum-proxy + podSelector: + matchLabels: + component: antragraum-proxy - it: should not add ingress rule for antragraum if antragraum is disabled set: @@ -188,16 +186,16 @@ tests: antragraum: enabled: false asserts: - - notContains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: antragraum - podSelector: - matchLabels: - component: antragraum-server + - notContains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: antragraum + podSelector: + matchLabels: + component: antragraum-server - it: should not add ingress rule for antragraum-proxy if antragraum is disabled set: @@ -207,40 +205,40 @@ tests: antragraum: enabled: false asserts: - - notContains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: antragraum-proxy - podSelector: - matchLabels: - component: antragraum-proxy - any: true + - notContains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: antragraum-proxy + podSelector: + matchLabels: + component: antragraum-proxy + any: true - it: should add default ingress rule for zentraler-eingang set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: - - contains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zentraler-eingang - podSelector: - matchExpressions: - - key: ozg-component - operator: In - values: - - eingangsadapter - - xta-adapter - ports: - - protocol: TCP - port: 9090 + - contains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zentraler-eingang + podSelector: + matchExpressions: + - key: ozg-component + operator: In + values: + - eingangsadapter + - xta-adapter + ports: + - protocol: TCP + port: 9090 - it: should add ingress rule for zentraler-eingang set: @@ -248,24 +246,23 @@ tests: dnsServerNamespace: test-dns-namespace zentralerEingangNamespace: custom-namespace asserts: - - contains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: custom-namespace - podSelector: - matchExpressions: - - key: ozg-component - operator: In - values: - - eingangsadapter - - xta-adapter - ports: - - protocol: TCP - port: 9090 - + - contains: + path: spec.ingress + content: + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: custom-namespace + podSelector: + matchExpressions: + - key: ozg-component + operator: In + values: + - eingangsadapter + - xta-adapter + ports: + - protocol: TCP + port: 9090 - it: should add egress rule to elasticsearch set: @@ -275,16 +272,16 @@ tests: - contains: path: spec.egress content: - to: + to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: elastic-system podSelector: matchLabels: - elasticsearch.k8s.elastic.co/cluster-name : ozg-search-cluster - ports: - - port: 9200 - protocol: TCP + elasticsearch.k8s.elastic.co/cluster-name: ozg-search-cluster + ports: + - port: 9200 + protocol: TCP - it: should add egress rule to mongodb set: @@ -294,13 +291,13 @@ tests: - contains: path: spec.egress content: - to: + to: - podSelector: matchLabels: component: ozgcloud-mongodb - ports: - - port: 27017 - protocol: TCP + ports: + - port: 27017 + protocol: TCP - it: should add egress rule to user-manager set: @@ -310,13 +307,13 @@ tests: - contains: path: spec.egress content: - to: - - podSelector: + to: + - podSelector: matchLabels: component: user-manager - ports: - - port: 9000 - protocol: TCP + ports: + - port: 9000 + protocol: TCP - it: should add egress rule to nachrichten-bayernid-proxy if bayernid is enabled set: @@ -332,15 +329,15 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - component: bayernid-proxy - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: bayernidProxyNamespace + - podSelector: + matchLabels: + component: bayernid-proxy + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: bayernidProxyNamespace ports: - - port: 9090 - protocol: TCP + - port: 9090 + protocol: TCP - it: should not add egress rule to bayernid-proxy if bayernid is disabled set: @@ -354,16 +351,16 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - component: bayernid-proxy - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: bayernidProxyNamespace + - podSelector: + matchLabels: + component: bayernid-proxy + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: bayernidProxyNamespace ports: - - port: 9090 - protocol: TCP - + - port: 9090 + protocol: TCP + - it: should throw error if bayernid-proxy is enabled but bayernid namespace is not set set: networkPolicy: @@ -390,7 +387,7 @@ tests: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: info-manager - podSelector: + podSelector: matchLabels: component: info-manager @@ -411,7 +408,7 @@ tests: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: info-manager2 - podSelector: + podSelector: matchLabels: component: info-manager @@ -430,7 +427,7 @@ tests: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: info-manager - podSelector: + podSelector: matchLabels: component: info-manager @@ -446,16 +443,15 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - component: zufi-server - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi + - podSelector: + matchLabels: + component: zufi-server + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zufi ports: - - port: 9090 - protocol: TCP - + - port: 9090 + protocol: TCP - it: should not add egress rule to zufi server if zufi is disabled set: @@ -469,14 +465,58 @@ tests: path: spec.egress content: to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi - podSelector: - matchLabels: - component: zufi-server + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zufi + podSelector: + matchLabels: + component: zufi-server + any: true + + - it: should add egress rule to forwarding service if forwarding is enabled + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + forwarding: + enabled: true + namespace: zentraler-eingang + serviceName: fs-adapter + asserts: + - contains: + path: spec.egress + content: + to: + - podSelector: + matchLabels: + component: fs-adapter + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zentraler-eingang + ports: + - port: 9090 + protocol: TCP + + - it: should not add egress rule to forwarding service if forwarding is disabled + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + forwarding: + enabled: false + namespace: zentraler-eingang + serviceName: fs-adapter + asserts: + - notContains: + path: spec.egress + content: + to: + - podSelector: + matchLabels: + component: fs-adapter + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zentraler-eingang any: true - + - it: should throw error if zufi is enabled but zufi namespace is not set set: networkPolicy: @@ -496,17 +536,16 @@ tests: asserts: - notContains: path: spec.egress - content: + content: to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi - podSelector: - matchLabels: - component: zufi-server + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: zufi + podSelector: + matchLabels: + component: zufi-server any: true - - it: should add egress rule to dns service set: networkPolicy: @@ -515,19 +554,19 @@ tests: - contains: path: spec.egress content: - to: + to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: test-dns-namespace - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - port: 5353 - protocol: UDP - - port: 5353 - protocol: TCP + ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + - port: 5353 + protocol: UDP + - port: 5353 + protocol: TCP - it: add ingress rule local by values set: @@ -535,89 +574,89 @@ tests: dnsServerNamespace: test-dns-namespace ssoPublicIp: 51.89.117.53/32 additionalIngressConfigGlobal: - - from: - - podSelector: - matchLabels: - component: client2 + - from: + - podSelector: + matchLabels: + component: client2 asserts: - contains: path: spec.ingress content: from: - - podSelector: - matchLabels: - component: client2 + - podSelector: + matchLabels: + component: client2 - it: add ingress rule global by values set: networkPolicy: dnsServerNamespace: test-dns-namespace ssoPublicIp: 51.89.117.53/32 additionalIngressConfigLocal: - - from: - - podSelector: - matchLabels: - component: client2 + - from: + - podSelector: + matchLabels: + component: client2 asserts: - contains: path: spec.ingress content: from: - - podSelector: - matchLabels: - component: client2 + - podSelector: + matchLabels: + component: client2 - it: add egress rules local by values set: networkPolicy: dnsServerNamespace: test-dns-namespace additionalEgressConfigGlobal: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - - to: - - podSelector: - matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP - asserts: - - contains: - path: spec.egress - content: - to: - - ipBlock: - cidr: 1.2.3.4/32 - - contains: - path: spec.egress - content: - to: - - podSelector: - matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP + - to: + - ipBlock: + cidr: 1.2.3.4/32 + - to: + - podSelector: + matchLabels: + component: ozg-testservice + ports: + - port: 12345 + protocol: TCP + asserts: + - contains: + path: spec.egress + content: + to: + - ipBlock: + cidr: 1.2.3.4/32 + - contains: + path: spec.egress + content: + to: + - podSelector: + matchLabels: + component: ozg-testservice + ports: + - port: 12345 + protocol: TCP - it: add egress rules global by values set: networkPolicy: dnsServerNamespace: test-dns-namespace additionalEgressConfigLocal: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - - to: - - podSelector: - matchLabels: - additionalEgressConfigLocal: yes - asserts: - - contains: - path: spec.egress - content: - to: - - podSelector: - matchLabels: - additionalEgressConfigLocal: yes + - to: + - ipBlock: + cidr: 1.2.3.4/32 + - to: + - podSelector: + matchLabels: + additionalEgressConfigLocal: yes + asserts: + - contains: + path: spec.egress + content: + to: + - podSelector: + matchLabels: + additionalEgressConfigLocal: yes - it: test network policy disabled set: @@ -676,15 +715,15 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - app.kubernetes.io/name: elster-transfer - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: elster-transfer + - podSelector: + matchLabels: + app.kubernetes.io/name: elster-transfer + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: elster-transfer ports: - - port: 8081 - protocol: TCP + - port: 8081 + protocol: TCP - it: should set elster transfer name set: @@ -701,15 +740,15 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - app.kubernetes.io/name: elster-transfer-test - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: elster-transfer + - podSelector: + matchLabels: + app.kubernetes.io/name: elster-transfer-test + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: elster-transfer ports: - - port: 8081 - protocol: TCP + - port: 8081 + protocol: TCP - it: should not add egress rule for elster-transfer if muk is disabled set: @@ -725,15 +764,15 @@ tests: path: spec.egress content: to: - - podSelector: - matchLabels: - app.kubernetes.io/name: elster-transfer - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: elster-transfer + - podSelector: + matchLabels: + app.kubernetes.io/name: elster-transfer + namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: elster-transfer any: true - it: should add ingress rule for aggregation-manager - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace ozgcloud: @@ -743,26 +782,26 @@ tests: - contains: path: spec.ingress content: - ports: + ports: - port: 9090 protocol: TCP - from: - - podSelector: + from: + - podSelector: matchLabels: component: aggregation-manager - it: should not add ingress rule for aggregation-manager - set: + set: networkPolicy: dnsServerNamespace: test-dns-namespace asserts: - notContains: path: spec.ingress content: - ports: + ports: - port: 9090 protocol: TCP - from: - - podSelector: + from: + - podSelector: matchLabels: component: aggregation-manager -- GitLab From 803ee1e0294d67de596ccffa72fe55750f06d074 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 21 Mar 2025 12:59:19 +0100 Subject: [PATCH 18/21] OZG-7573 OZG-7987 forwarder settings in deployment template --- src/main/helm/templates/deployment.yaml | 5 ++ .../helm/deployment_forwarder_env_test.yaml | 66 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/test/helm/deployment_forwarder_env_test.yaml diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 4b9faa2ee..5d1d5fc03 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -163,6 +163,11 @@ spec: - name: grpc_client_zufi-manager_negotiationType value: {{ (.Values.zufiManager).grpcClientNegotiationType | default "PLAINTEXT" }} {{- end}} + - name: grpc_client_forwarder_address + value: {{ ((.Values.ozgcloud).forwarder).address }} + - name: grpc_client_forwarder_negotiationType + value: {{ ((.Values.ozgcloud).forwarder).grpcClientNegotiationType | default "TLS" }} + {{- if not (.Values.database).useExternal }} - name: spring_data_mongodb_uri valueFrom: diff --git a/src/test/helm/deployment_forwarder_env_test.yaml b/src/test/helm/deployment_forwarder_env_test.yaml new file mode 100644 index 000000000..77d32f017 --- /dev/null +++ b/src/test/helm/deployment_forwarder_env_test.yaml @@ -0,0 +1,66 @@ +# +# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test forwarder environment +release: + name: vorgang-manager + namespace: by-helm-test +templates: + - templates/deployment.yaml +set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + environment: dev + bezeichner: helm + imagePullSecret: test-image-pull-secret +tests: + - it: should set the grpc forwarder client address + set: + ozgcloud: + forwarder: + address: https://forwarder.my-wonderful-domain.local:9000 + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_forwarder_address + value: https://forwarder.my-wonderful-domain.local:9000 + - it: should set the default negotiation type + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_forwarder_negotiationType + value: TLS + - it: should set the negotiation type + set: + ozgcloud: + forwarder: + grpcClientNegotiationType: PLAINTEXT + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_forwarder_negotiationType + value: PLAINTEXT \ No newline at end of file -- GitLab From c7dd67f85a8cb7cb6eda6a1d4da4de0493cc7bf1 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 21 Mar 2025 13:05:14 +0100 Subject: [PATCH 19/21] OZG-7573 OZG-7987 adjust names of variables --- src/main/helm/templates/deployment.yaml | 4 ++-- src/test/helm/deployment_forwarder_env_test.yaml | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 5d1d5fc03..ca7565997 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -164,9 +164,9 @@ spec: value: {{ (.Values.zufiManager).grpcClientNegotiationType | default "PLAINTEXT" }} {{- end}} - name: grpc_client_forwarder_address - value: {{ ((.Values.ozgcloud).forwarder).address }} + value: {{ (.Values.forwarder).address }} - name: grpc_client_forwarder_negotiationType - value: {{ ((.Values.ozgcloud).forwarder).grpcClientNegotiationType | default "TLS" }} + value: {{ (.Values.forwarder).grpcClientNegotiationType | default "TLS" }} {{- if not (.Values.database).useExternal }} - name: spring_data_mongodb_uri diff --git a/src/test/helm/deployment_forwarder_env_test.yaml b/src/test/helm/deployment_forwarder_env_test.yaml index 77d32f017..fefb761dc 100644 --- a/src/test/helm/deployment_forwarder_env_test.yaml +++ b/src/test/helm/deployment_forwarder_env_test.yaml @@ -37,9 +37,8 @@ set: tests: - it: should set the grpc forwarder client address set: - ozgcloud: - forwarder: - address: https://forwarder.my-wonderful-domain.local:9000 + forwarder: + address: https://forwarder.my-wonderful-domain.local:9000 asserts: - contains: path: spec.template.spec.containers[0].env @@ -55,9 +54,8 @@ tests: value: TLS - it: should set the negotiation type set: - ozgcloud: - forwarder: - grpcClientNegotiationType: PLAINTEXT + forwarder: + grpcClientNegotiationType: PLAINTEXT asserts: - contains: path: spec.template.spec.containers[0].env -- GitLab From a5be0bc9c9c87ea8498de0e5e76b6d346b5938c6 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 21 Mar 2025 14:14:27 +0100 Subject: [PATCH 20/21] OZG-7573 OZG-7987 check if enabled --- src/main/helm/templates/deployment.yaml | 7 ++++--- .../helm/deployment_forwarder_env_test.yaml | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index ca7565997..a59322362 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -163,11 +163,12 @@ spec: - name: grpc_client_zufi-manager_negotiationType value: {{ (.Values.zufiManager).grpcClientNegotiationType | default "PLAINTEXT" }} {{- end}} + {{- if (.Values.forwarding).enabled }} - name: grpc_client_forwarder_address - value: {{ (.Values.forwarder).address }} + value: {{ (.Values.forwarding).address }} - name: grpc_client_forwarder_negotiationType - value: {{ (.Values.forwarder).grpcClientNegotiationType | default "TLS" }} - + value: {{ (.Values.forwarding).grpcClientNegotiationType | default "TLS" }} + {{- end }} {{- if not (.Values.database).useExternal }} - name: spring_data_mongodb_uri valueFrom: diff --git a/src/test/helm/deployment_forwarder_env_test.yaml b/src/test/helm/deployment_forwarder_env_test.yaml index fefb761dc..fd7a77f81 100644 --- a/src/test/helm/deployment_forwarder_env_test.yaml +++ b/src/test/helm/deployment_forwarder_env_test.yaml @@ -35,9 +35,22 @@ set: bezeichner: helm imagePullSecret: test-image-pull-secret tests: + - it: should be disabled by default + asserts: + - notContains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_forwarder_address + any: true + - notContains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_forwarder_negotiationType + any: true - it: should set the grpc forwarder client address set: - forwarder: + forwarding: + enabled: true address: https://forwarder.my-wonderful-domain.local:9000 asserts: - contains: @@ -46,6 +59,9 @@ tests: name: grpc_client_forwarder_address value: https://forwarder.my-wonderful-domain.local:9000 - it: should set the default negotiation type + set: + forwarding: + enabled: true asserts: - contains: path: spec.template.spec.containers[0].env @@ -54,7 +70,8 @@ tests: value: TLS - it: should set the negotiation type set: - forwarder: + forwarding: + enabled: true grpcClientNegotiationType: PLAINTEXT asserts: - contains: -- GitLab From 493b2692dd042192e7f2efd3ebaca1311e11788c Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 21 Mar 2025 14:44:52 +0100 Subject: [PATCH 21/21] OZG-7573 set eingang-manager version --- vorgang-manager-server/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 209897503..4a4c00bcf 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -60,7 +60,7 @@ <collaboration-manager.version>0.7.0</collaboration-manager.version> <archive-manager.version>0.3.0</archive-manager.version> <document-manager.version>1.2.0</document-manager.version> - <eingang-manager-interface.version>2.19.0-OZG-7573-forward-vorgang-SNAPSHOT</eingang-manager-interface.version> + <eingang-manager-interface.version>2.19.0-SNAPSHOT</eingang-manager-interface.version> <zip.version>2.11.5</zip.version> <jsoup.version>1.15.3</jsoup.version> -- GitLab