From 50f612b9302281a4d7a9d3e90e4bd69e6902d7d4 Mon Sep 17 00:00:00 2001 From: Ghiles ABDELLAH Date: Fri, 4 Sep 2026 11:12:31 +0200 Subject: [PATCH 1/8] feat: add network existance check before applying modification this may be temporary before the refactore of the create+apply modification endpoint --- pom.xml | 4 +++ .../service/NetworkModificationService.java | 5 +++ .../service/ModificationIndexationTest.java | 1 + .../NetworkModificationServiceTest.java | 31 +++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/pom.xml b/pom.xml index fd9af2c9a..85c3e34c9 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,8 @@ gridsuite org.gridsuite:network-modification-server 1.7.0 + + 1.51.0-SNAPSHOT @@ -129,6 +131,8 @@ com.powsybl powsybl-network-store-client + + ${network-store-client.version} org.gridsuite diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java index 63268025f..d78d6c3b5 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -507,6 +507,11 @@ void mapUuidsFromTwoModificationsLists( } private CompletableFuture> applyModifications(UUID networkUuid, String variantId, ModificationApplicationGroup modificationGroupInfos) { + if (!networkStoreService.networkExists(networkUuid)) { + // The network is not loaded + return CompletableFuture.completedFuture(Optional.empty()); + } + if (!modificationGroupInfos.modifications().isEmpty()) { PreloadingStrategy preloadingStrategy = modificationGroupInfos.modifications().stream() .filter(m -> m.getActivated() && !m.getStashed()) diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java index c8c46f0c5..d5a83d0cd 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java @@ -95,6 +95,7 @@ void setUp() { when(networkInfos.getNetwork()).thenReturn(network); when(networkInfos.getNetworkUuuid()).thenReturn(networkUuid); when(networkStoreService.getNetwork(eq(networkInfos.getNetworkUuuid()), any(PreloadingStrategy.class))).thenReturn(network); + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(true); } @AfterEach diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java index fb563352d..ee4fc789a 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java @@ -6,23 +6,30 @@ */ package org.gridsuite.modification.server.service; +import com.powsybl.network.store.client.NetworkStoreService; import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.LoadModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.server.dto.ModificationApplicationContext; +import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.repositories.ModificationRepository; import org.gridsuite.modification.server.repositories.NetworkModificationRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.modification.server.service.NetworkModificationService.MODIFICATION_LIST_SIZE_MISMATCH_ERROR; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; /** * @author Mathieu Deharbe @@ -39,6 +46,9 @@ class NetworkModificationServiceTest { @Autowired private ModificationRepository modificationRepository; + @MockitoBean + private NetworkStoreService networkStoreService; + @Test void shouldMapUuidsFromTwoModificationsLists() { UUID sourceModificationUuid1 = UUID.randomUUID(); @@ -210,6 +220,27 @@ void shouldFindParentCompositeOnlyForModificationsNestedInAComposite() { assertFalse(parentComposites.containsKey(directGroupChildUuid)); } + @Test + void shouldNotApplyModificationsWhenNetworkDoesNotExist() { + UUID networkUuid = UUID.randomUUID(); + UUID targetGroupUuid = UUID.randomUUID(); + List saved = networkModificationRepository.saveModifications( + UUID.randomUUID(), List.of(ModificationEntity.fromDTO(dummyModification(UUID.randomUUID())))); + + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(false); + + NetworkModificationsResult result = networkModificationService.duplicateModifications( + targetGroupUuid, + null, + saved.stream().map(ModificationInfos::getUuid).toList(), + List.of(new ModificationApplicationContext(networkUuid, "variant", UUID.randomUUID(), UUID.randomUUID(), Set.of())) + ).join(); + + assertEquals(1, result.modificationUuids().size()); + assertEquals(1, result.modificationResults().size()); + assertTrue(result.modificationResults().get(0).isEmpty()); + } + private static LoadModificationInfos dummyModification(UUID uuid) { return LoadModificationInfos.builder() .equipmentId("dummyEquipmentId") From 6aea0a90b415f84d7c6512280e32f1a5230efc47 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 13:21:03 +0200 Subject: [PATCH 2/8] Override all network-store artefacts Signed-off-by: Etienne Homer --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 85c3e34c9..fdecb48d4 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,18 @@ ${network-store-client.version} + + + com.powsybl + powsybl-network-store-iidm-impl + ${network-store.version} + + + + com.powsybl + powsybl-network-store-model + ${network-store.version} + org.gridsuite gridsuite-network-modification From dee8c39b9dad30d489e09e5020aa55a39c467ac3 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 13:22:45 +0200 Subject: [PATCH 3/8] fix network-store-client.version Signed-off-by: Etienne Homer --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fdecb48d4..f2f5ceae6 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ org.gridsuite:network-modification-server 1.7.0 - 1.51.0-SNAPSHOT + 1.51.0 From 49a2fd0883e02286bf1c7448bab60840c6dd885d Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 15:31:32 +0200 Subject: [PATCH 4/8] Fix pom Signed-off-by: Etienne Homer --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d016c73c7..95183b610 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ org.gridsuite:network-modification-server 1.8.0 - 1.51.0 + 1.51.0 1.8.0 @@ -133,7 +133,7 @@ com.powsybl powsybl-network-store-client - ${network-store-client.version} + ${network-store.version} From f698e08cf159712c2670d90f1d199d3af634dd0a Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 18:04:29 +0200 Subject: [PATCH 5/8] Fix test Signed-off-by: Etienne Homer --- .../server/service/NetworkModificationServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java index ee4fc789a..dd71854c9 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java @@ -233,7 +233,7 @@ void shouldNotApplyModificationsWhenNetworkDoesNotExist() { targetGroupUuid, null, saved.stream().map(ModificationInfos::getUuid).toList(), - List.of(new ModificationApplicationContext(networkUuid, "variant", UUID.randomUUID(), UUID.randomUUID(), Set.of())) + List.of(new ModificationApplicationContext(networkUuid, "variant", UUID.randomUUID(), UUID.randomUUID(), "tag1")) ).join(); assertEquals(1, result.modificationUuids().size()); From a4670ba543ef7f2288dff77a3061ab3b50228ec9 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 18:10:25 +0200 Subject: [PATCH 6/8] remove unused import Signed-off-by: Etienne Homer --- .../server/service/NetworkModificationServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java index dd71854c9..43c154fd6 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationServiceTest.java @@ -23,7 +23,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import static org.gridsuite.modification.server.service.NetworkModificationService.MODIFICATION_LIST_SIZE_MISMATCH_ERROR; From 47ccfeedf3b64428db1bacdb88b28805f5ce04f1 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Tue, 8 Sep 2026 18:44:37 +0200 Subject: [PATCH 7/8] Fix all tests Signed-off-by: Etienne Homer --- .../modification/server/CompositeControllerTest.java | 4 ++-- .../modification/server/ModificationControllerTest.java | 1 + .../server/modifications/AbstractNetworkModificationTest.java | 1 + .../org/gridsuite/modification/server/service/BuildTest.java | 1 + .../modification/server/service/EquipmentIndexationTest.java | 4 ++-- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index d1564521e..5f53b5273 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -55,8 +55,7 @@ import static org.gridsuite.modification.server.utils.TestUtils.runRequestAsync; import static org.gridsuite.modification.server.utils.assertions.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -105,6 +104,7 @@ void setUp() { objectWriter = mapper.writer().withDefaultPrettyPrinter(); network = NetworkCreation.create(TEST_NETWORK_ID, true); when(networkStoreService.getNetwork(eq(TEST_NETWORK_ID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> network); + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(true); networkModificationRepository.deleteAll(); } diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index e11dbf9c9..8b7d35770 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -172,6 +172,7 @@ void setUp() { when(networkStoreService.getNetwork(eq(TEST_NETWORK_MIXED_TOPOLOGY_ID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> NetworkCreation.createMixedTopology(TEST_NETWORK_MIXED_TOPOLOGY_ID)); + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(true); doThrow(new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "Internal server error")) .when(networkStoreService).flush(argThat(n -> TEST_NETWORK_WITH_FLUSH_ERROR_ID.toString().equals(n.getId()))); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java index 3b48912c4..fcd16207a 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java @@ -106,6 +106,7 @@ public void setUp() { when(networkStoreService.getNetwork(eq(NOT_FOUND_NETWORK_ID), any(PreloadingStrategy.class))).thenThrow(new PowsyblException()); when(networkStoreService.getNetwork(eq(TEST_NETWORK_ID), any(PreloadingStrategy.class))).then((Answer) invocation -> network); + when(networkStoreService.networkExists(eq(TEST_NETWORK_ID))).thenReturn(true); wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); wireMockUtils = new WireMockUtils(wireMockServer); diff --git a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java index 4e736d036..3c72af186 100644 --- a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java @@ -171,6 +171,7 @@ public void setUp(final MockWebServer mockWebServer) { network = NetworkCreation.create(TEST_NETWORK_ID, true); return network; }); + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(true); waitStartBuild = new CountDownLatch(1); blockBuild = new CountDownLatch(1); diff --git a/src/test/java/org/gridsuite/modification/server/service/EquipmentIndexationTest.java b/src/test/java/org/gridsuite/modification/server/service/EquipmentIndexationTest.java index 0894f872b..e64b25a62 100644 --- a/src/test/java/org/gridsuite/modification/server/service/EquipmentIndexationTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/EquipmentIndexationTest.java @@ -35,8 +35,7 @@ import static com.powsybl.iidm.network.VariantManagerConstants.INITIAL_VARIANT_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -87,6 +86,7 @@ class EquipmentIndexationTest { void setUp() { network = NetworkCreation.create(NETWORK_UUID, true); when(networkStoreService.getNetwork(eq(NETWORK_UUID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> network); + when(networkStoreService.networkExists(any(UUID.class))).thenReturn(true); // clean DB modificationApplicationRepository.deleteAll(); From 71632bbd1fde9053d1816160b4caaad149d79f41 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Wed, 9 Sep 2026 09:56:04 +0200 Subject: [PATCH 8/8] checkstyle Signed-off-by: Etienne Homer --- .../server/modifications/AbstractNetworkModificationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java index fcd16207a..bc0ad6fc1 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java @@ -106,7 +106,7 @@ public void setUp() { when(networkStoreService.getNetwork(eq(NOT_FOUND_NETWORK_ID), any(PreloadingStrategy.class))).thenThrow(new PowsyblException()); when(networkStoreService.getNetwork(eq(TEST_NETWORK_ID), any(PreloadingStrategy.class))).then((Answer) invocation -> network); - when(networkStoreService.networkExists(eq(TEST_NETWORK_ID))).thenReturn(true); + when(networkStoreService.networkExists(TEST_NETWORK_ID)).thenReturn(true); wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); wireMockUtils = new WireMockUtils(wireMockServer);