From 397d0bd89743694b64f21f5fc468b99e932a48a2 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Fri, 3 Feb 2023 08:51:09 +0100 Subject: [PATCH] OZG-2220 OZG-3412 WIP added Registering VorgangManager --- pluto-server/pom.xml | 7 ++ .../ozg/pluto/registry/RegistryScheduler.java | 18 +++++ .../ozg/pluto/registry/RegistryService.java | 35 ++++++++++ ...erOrganisationsEinheitenRemoteService.java | 14 ++++ .../ozg/pluto/registry/ZufiRemoteService.java | 42 ++++++++++++ ...itional-spring-configuration-metadata.json | 10 +++ .../src/main/resources/application.yml | 9 ++- .../pluto/registry/RegistrySchedulerTest.java | 31 +++++++++ .../pluto/registry/RegistryServiceTest.java | 68 +++++++++++++++++++ .../ZufiManagerRemoteServiceTest.java | 37 ++++++++++ 10 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java create mode 100644 pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java create mode 100644 pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java create mode 100644 pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 9bdd80d5d..42231e157 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -48,6 +48,7 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName> <kop.license.version>1.3.0</kop.license.version> + <kop.zufi.version>0.1.0-SNAPSHOT</kop.zufi.version> <zip.version>2.11.1</zip.version> <jsoup.version>1.15.3</jsoup.version> @@ -81,6 +82,12 @@ <version>${project.version}</version> <scope>runtime</scope> </dependency> + + <dependency> + <groupId>de.itvsh.kop.zufi</groupId> + <artifactId>kop-zufi-api</artifactId> + <version>${kop.zufi.version}</version> + </dependency> <!-- Spring --> <dependency> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java new file mode 100644 index 000000000..06ca63659 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java @@ -0,0 +1,18 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +class RegistryScheduler { + @Autowired + private RegistryService registryService; + + @Scheduled(fixedDelayString = "${kop.vorgangmanager.registry.intervall}", initialDelay = 5, timeUnit = TimeUnit.MINUTES) + void register() { + registryService.registerVorgangManager(); + } +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java new file mode 100644 index 000000000..e683f37e3 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java @@ -0,0 +1,35 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import lombok.extern.log4j.Log4j2; + +@Service +@Log4j2 +class RegistryService { + @Autowired + private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService; + + @Autowired + private ZufiRemoteService zufiRemoteService; + + void registerVorgangManager() { + try { + register(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()); + } catch (Exception e) { + LOG.error("Error registering this VorgangsManager.", e); + } + } + + private void register(List<String> supportedOrganisationsEinheiten) { + if (CollectionUtils.isNotEmpty(supportedOrganisationsEinheiten)) { + zufiRemoteService.registerVorgangManager(supportedOrganisationsEinheiten); + } else { + LOG.info("No OrganistationsEinheitenIds provided. Not registering this VorgangsManager"); + } + } +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java new file mode 100644 index 000000000..9babe2cd3 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java @@ -0,0 +1,14 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.springframework.stereotype.Service; + +@Service +class UserOrganisationsEinheitenRemoteService { + + List<String> getSupportedOrganisationsEinheiten() { + return null; + } + +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java new file mode 100644 index 000000000..569f6d36d --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java @@ -0,0 +1,42 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import de.itvsh.kop.zufi.grpc.registration.GrpcRegistrationRequest; +import de.itvsh.kop.zufi.grpc.registration.RegistrationServiceGrpc; +import lombok.NonNull; +import lombok.extern.log4j.Log4j2; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@Log4j2 +@Service +class ZufiRemoteService { + @Value(value = "${kop.vorgangmanager.register.external.address:}") + private String externalVorgangManagerAddress; + + @GrpcClient("zufi-manager") + private RegistrationServiceGrpc.RegistrationServiceBlockingStub registryGrpcService; + + void registerVorgangManager(@NonNull List<String> organistationsEinheitenIds) { + var proceed = checkPreconditions(); + + if (proceed) { + var request = GrpcRegistrationRequest.newBuilder().addAllOrganisationseinheitenId(organistationsEinheitenIds) + .setAddress(externalVorgangManagerAddress).build(); + registryGrpcService.register(request); + } + } + + boolean checkPreconditions() { + if (StringUtils.isEmpty(externalVorgangManagerAddress)) { + LOG.warn("Property kop.vorgangmanager.register.external.address not set. Not registering this VorgangsManager"); + return false; + } + + return true; + } +} diff --git a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 8eff43ef3..b87f57218 100644 --- a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -33,5 +33,15 @@ "name": "kop.usermanager.url", "type": "java.lang.String", "description": "Url of the user manager migration endpoint" + }, + { + "name": "kop.notification.mail-from", + "type": "java.lang.String", + "description": "The sender email address used in notification emails" + }, + { + "name": "kop.vorgangmanager.registry.intervall", + "type": "java.lang.String", + "description": "The update intervall of the VorgangManager OrgansisationsEinheiten Ids in minutes" } ]} \ No newline at end of file diff --git a/pluto-server/src/main/resources/application.yml b/pluto-server/src/main/resources/application.yml index 3864230ae..f37dba65d 100644 --- a/pluto-server/src/main/resources/application.yml +++ b/pluto-server/src/main/resources/application.yml @@ -29,7 +29,11 @@ grpc: negotiationType: PLAINTEXT email: address: self:self - negotiationType: PLAINTEXT + negotiationType: PLAINTEXT + zufi-manager: + address: static://127.0.0.1:9010 + negotiationType: PLAINTEXT + pluto: redirect: mail-from: EA-Poststelle@itvsh.de @@ -65,3 +69,6 @@ kop: enabled: true notification: mail-from: hilfe@kop.support + vorgangmanager: + registry: + intervall: 360 diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java new file mode 100644 index 000000000..c4dc3915a --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java @@ -0,0 +1,31 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class RegistrySchedulerTest { + + @DisplayName("Test the registry scheduler") + @Nested + class TestScheduler { + @Spy + @InjectMocks + private RegistryScheduler registryScheduler; + + @Mock + private RegistryService registryService; + + @Test + void shouldCallService() { + registryScheduler.register(); + + verify(registryService).registerVorgangManager(); + } + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java new file mode 100644 index 000000000..54be62dd2 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java @@ -0,0 +1,68 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.elasticsearch.core.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class RegistryServiceTest { + + @DisplayName("Test registry service") + @Nested + class TestService { + @Spy + @InjectMocks + private RegistryService registryService; + + @Mock + private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService; + + @Mock + private ZufiRemoteService zufiRemoteService; + + @BeforeEach + void init() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of("123456", "987654")); + } + + @Test + void shouldCallUserRemoteService() { + registryService.registerVorgangManager(); + + verify(userOrganisationsEinheitenRemoteService).getSupportedOrganisationsEinheiten(); + } + + @Test + void shouldCallZuFiRemoteService() { + registryService.registerVorgangManager(); + + verify(zufiRemoteService).registerVorgangManager(any()); + } + + @Test + void shouldNotCallZuFiRemoteServiceOnEmptyOrganisationsEinheitenIds() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of()); + + registryService.registerVorgangManager(); + + verify(zufiRemoteService, never()).registerVorgangManager(any()); + } + + @Test + void shouldNotCallZuFiRemoteServiceOnException() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenThrow(Exception.class); + + registryService.registerVorgangManager(); + + verify(zufiRemoteService, never()).registerVorgangManager(any()); + } + } + +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java new file mode 100644 index 000000000..7cca9cb85 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java @@ -0,0 +1,37 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.util.ReflectionTestUtils; + +class ZufiManagerRemoteServiceTest { + @DisplayName("Test ZuFiRemoteService") + @Nested + class TestZufiManagerRemoteService { + + @Spy + @InjectMocks + private ZufiRemoteService zufiRemoteService; + + @Test + void shouldProceed() { + ReflectionTestUtils.setField(zufiRemoteService, "externalVorgangManagerAddress", "value"); + + var proceed = zufiRemoteService.checkPreconditions(); + + assertThat(proceed).isTrue(); + } + + @Test + void shouldNotProceed() { + var proceed = zufiRemoteService.checkPreconditions(); + + assertThat(proceed).isFalse(); + } + } +} -- GitLab