diff --git a/src/main/java/org/gridsuite/modification/server/NamingStrategyConfiguration.java b/src/main/java/org/gridsuite/modification/server/NamingStrategyConfiguration.java new file mode 100644 index 000000000..599420329 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/NamingStrategyConfiguration.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server; + +import com.powsybl.iidm.modification.topology.DefaultNamingStrategy; +import com.powsybl.iidm.modification.topology.NamingStrategiesServiceLoader; +import com.powsybl.iidm.modification.topology.NamingStrategy; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Joris Mancini + */ +@Configuration +public class NamingStrategyConfiguration { + + private final NamingStrategiesServiceLoader namingStrategiesServiceLoader = new NamingStrategiesServiceLoader(); + + @Value("${naming-strategy:Default}") + private String namingStrategy; + + @Bean + public NamingStrategy getNamingStrategy() { + return namingStrategiesServiceLoader.findNamingStrategyByName(namingStrategy).orElse(new DefaultNamingStrategy()); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/dto/ModificationApplicationGroup.java b/src/main/java/org/gridsuite/modification/server/dto/ModificationApplicationGroup.java index 688a8bdf4..873c297f8 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/ModificationApplicationGroup.java +++ b/src/main/java/org/gridsuite/modification/server/dto/ModificationApplicationGroup.java @@ -12,7 +12,21 @@ import java.util.UUID; /** + * This object is used as entrypoint for NetworkModificationApplicator, + * then it forces to contain only applicable modifications. Otherwise, it would not make sense. + * * @author Slimane Amar */ -public record ModificationApplicationGroup(UUID groupUuid, List modifications, ReportInfos reportInfos) { +public record ModificationApplicationGroup( + UUID groupUuid, + List modifications, + ReportInfos reportInfos +) { + public ModificationApplicationGroup(UUID groupUuid, List modifications, ReportInfos reportInfos) { + this.groupUuid = groupUuid; + this.modifications = modifications.stream() + .filter(m -> m.getActivated() && !m.getStashed()) + .toList(); + this.reportInfos = reportInfos; + } } diff --git a/src/main/java/org/gridsuite/modification/server/dto/NetworkInfos.java b/src/main/java/org/gridsuite/modification/server/dto/NetworkInfos.java deleted file mode 100644 index 4c2790074..000000000 --- a/src/main/java/org/gridsuite/modification/server/dto/NetworkInfos.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.modification.server.dto; - -import com.powsybl.iidm.network.Network; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.UUID; - -/** - * @author Franck Lecuyer - */ -@AllArgsConstructor -@Getter -@Schema(description = "Network infos") -public class NetworkInfos { - private Network network; - - private UUID networkUuuid; - - private boolean isVariantPresent; -} diff --git a/src/main/java/org/gridsuite/modification/server/service/LargeNetworkModificationExecutionService.java b/src/main/java/org/gridsuite/modification/server/modifications/LargeNetworkModificationExecutionService.java similarity index 66% rename from src/main/java/org/gridsuite/modification/server/service/LargeNetworkModificationExecutionService.java rename to src/main/java/org/gridsuite/modification/server/modifications/LargeNetworkModificationExecutionService.java index 27211d2d4..3744a2805 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LargeNetworkModificationExecutionService.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LargeNetworkModificationExecutionService.java @@ -1,14 +1,15 @@ -/** - * Copyright (c) 2024, RTE (http://www.rte-france.com) +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.service; +package org.gridsuite.modification.server.modifications; import jakarta.annotation.PreDestroy; import lombok.NonNull; +import org.gridsuite.modification.server.service.NetworkModificationObserver; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -21,12 +22,12 @@ * @author Slimane Amar */ @Service -public class LargeNetworkModificationExecutionService { +class LargeNetworkModificationExecutionService { - private ThreadPoolExecutor executorService; + private final ThreadPoolExecutor executorService; - public LargeNetworkModificationExecutionService(@Value("${max-large-concurrent-applications}") int maxConcurrentLargeModifications, - @NonNull NetworkModificationObserver networkModificationObserver) { + LargeNetworkModificationExecutionService(@Value("${max-large-concurrent-applications}") int maxConcurrentLargeModifications, + @NonNull NetworkModificationObserver networkModificationObserver) { executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(maxConcurrentLargeModifications); networkModificationObserver.createThreadPoolMetric(executorService); } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java index ef7eea6b3..f238ecca4 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java @@ -11,33 +11,31 @@ import com.powsybl.commons.report.ReportConstants; import com.powsybl.commons.report.ReportNode; import com.powsybl.commons.report.TypedValue; -import com.powsybl.iidm.modification.topology.DefaultNamingStrategy; -import com.powsybl.iidm.modification.topology.NamingStrategiesServiceLoader; -import com.powsybl.iidm.network.Network; -import com.powsybl.network.store.client.NetworkStoreService; +import com.powsybl.iidm.modification.topology.NamingStrategy; import com.powsybl.network.store.client.PreloadingStrategy; -import lombok.Getter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.modifications.AbstractModification; import org.gridsuite.modification.server.dto.ModificationApplicationGroup; -import org.gridsuite.modification.server.dto.NetworkInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus; -import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; -import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; +import org.gridsuite.modification.server.network.ModificationNetwork; +import org.gridsuite.modification.server.network.ModificationNetworkService; import org.gridsuite.modification.server.service.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import static org.gridsuite.modification.server.network.NetworkUtils.switchOnExistingVariant; +import static org.gridsuite.modification.server.network.NetworkUtils.switchOnNewVariant; import static org.gridsuite.modification.server.report.NetworkModificationServerReportResourceBundle.ERROR_MESSAGE_KEY; /** @@ -47,184 +45,160 @@ public class NetworkModificationApplicator { private static final Logger LOGGER = LoggerFactory.getLogger(NetworkModificationApplicator.class); - private final NetworkStoreService networkStoreService; - - private final EquipmentInfosService equipmentInfosService; - - private final ModificationApplicationInfosService applicationInfosService; - private final ReportService reportService; - @Getter private final FilterService filterService; + private final FilterService filterService; - @Getter private final LoadFlowService loadFlowService; + private final LoadFlowService loadFlowService; private final LargeNetworkModificationExecutionService largeNetworkModificationExecutionService; private final NetworkModificationObserver networkModificationObserver; - @Value("${impacts.collection-threshold:50}") - private Integer collectionThreshold; + private final NamingStrategy namingStrategy; - @Value("${naming-strategy:Default}") - private String namingStrategy; + private final ModificationNetworkService modificationNetworkService; - public NetworkModificationApplicator(NetworkStoreService networkStoreService, EquipmentInfosService equipmentInfosService, - ModificationApplicationInfosService applicationInfosService, - ReportService reportService, FilterService filterService, - LoadFlowService loadFlowService, - NetworkModificationObserver networkModificationObserver, - LargeNetworkModificationExecutionService largeNetworkModificationExecutionService) { - this.networkStoreService = networkStoreService; - this.equipmentInfosService = equipmentInfosService; - this.applicationInfosService = applicationInfosService; + public NetworkModificationApplicator( + ReportService reportService, + FilterService filterService, + LoadFlowService loadFlowService, + NetworkModificationObserver networkModificationObserver, + LargeNetworkModificationExecutionService largeNetworkModificationExecutionService, + NamingStrategy namingStrategy, ModificationNetworkService modificationNetworkService + ) { this.reportService = reportService; this.filterService = filterService; this.loadFlowService = loadFlowService; this.networkModificationObserver = networkModificationObserver; this.largeNetworkModificationExecutionService = largeNetworkModificationExecutionService; + this.namingStrategy = namingStrategy; + this.modificationNetworkService = modificationNetworkService; } - /* This method is used for incremental modifications - * Since there is no queue for these operations and they can be memory consuming when the preloading strategy is large - * (for example for VOLTAGE_INIT_MODIFICATION), - * we limit the number of concurrent applications of these modifications to avoid out of memory issues. - * We keep the possibility to apply small or medium modifications immediately in parallel without limits. - * And if in the future we also need to limit the memory consumption of medium modifications we can add more code here. - * Note : we currently have 3 sizes of modifications : - * small : preloadingStrategy = NONE - * medium : preloadingStrategy = COLLECTION - * large : preloadingStrategy = ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW - */ - public CompletableFuture applyModifications(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) { - PreloadingStrategy preloadingStrategy = modificationInfosGroup.modifications().stream() - .filter(m -> m.getActivated() && !m.getStashed()) - .map(ModificationEntity::getType) - .map(ModificationType::valueOf) - .reduce(ModificationType::maxStrategy) - .map(ModificationType::getStrategy) - .orElse(PreloadingStrategy.NONE); - - NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService, applicationInfosService, collectionThreshold); - if (preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW) { - return largeNetworkModificationExecutionService - .supplyAsync(() -> applyAndFlush(modificationInfosGroup, listener)); - } else { - return CompletableFuture.completedFuture(applyAndFlush(modificationInfosGroup, listener)); + public CompletableFuture applyModificationGroupIncremental( + ModificationApplicationGroup modificationApplicationGroup, + UUID networkUuid, + String variantId + ) { + if (modificationApplicationGroup.modifications().isEmpty()) { + // In case there are no modifications to apply + return CompletableFuture.completedFuture( + NetworkModificationResult.builder() + .applicationStatus(ApplicationStatus.ALL_OK) + .lastGroupApplicationStatus(ApplicationStatus.ALL_OK) + .build() + ); + } + PreloadingStrategy preloadingStrategy = getPreloadingStrategy(modificationApplicationGroup.modifications()); + ModificationNetwork modificationNetwork = modificationNetworkService.getNetwork( + networkUuid, + preloadingStrategy + ); + if (switchOnExistingVariant(modificationNetwork.network(), variantId)) { + return executeApplications( + () -> applyModificationGroups(List.of(modificationApplicationGroup), modificationNetwork), + preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW + ); + } else { // In case the variant does not exist i.e. the node is not built + return CompletableFuture.completedFuture(null); } - } - - private NetworkModificationResult applyAndFlush(ModificationApplicationGroup modificationInfosGroup, - NetworkStoreListener listener) { - return flushModificationApplications(apply(modificationInfosGroup, listener), listener); - } - - private NetworkModificationResult flushModificationApplications(ApplicationStatus groupApplicationStatus, NetworkStoreListener listener) { - List networkImpacts = listener.flushModificationApplications(); - return NetworkModificationResult.builder() - .applicationStatus(groupApplicationStatus) - .lastGroupApplicationStatus(groupApplicationStatus) - .networkImpacts(networkImpacts) - .build(); } /* This method is used when building a variant - * building a variant is limited to ${consumer.concurrency} (typically 2) concurrent builds thanks to rabbitmq queue - * but since the other operations (create, insert, move, duplicate) are not inserted in the same rabbitmq queue - * we use the same ExecutorService to globally limit the number of concurrent large modifications in order to avoid out of memory issues - * We keep the possibility to apply small or medium modifications immediately. - * And if in the future we also need to limit the memory consumption of medium modifications we can add more code here. - * Note : it is possible that the rabbitmq consumer threads here will be blocked by modifications applied directly in the other applyModifications method + * Building a variant is limited to ${consumer.concurrency} (typically 2) concurrent builds thanks to rabbitmq queue. + * Note : it is possible that the rabbitmq consumer threads here will be blocked by modifications applied directly in the other applyModificationGroupIncremental method * and no more builds can go through. If this causes problems we should put them in separate rabbitmq queues. */ - public NetworkModificationResult applyModifications(List modificationInfosGroups, NetworkInfos networkInfos) { - PreloadingStrategy preloadingStrategy = modificationInfosGroups.stream() - .map(ModificationApplicationGroup::modifications) - .flatMap(List::stream) - .filter(m -> m.getActivated() && !m.getStashed()) - .map(ModificationEntity::getType) - .map(ModificationType::valueOf) - .reduce(ModificationType::maxStrategy) - .map(ModificationType::getStrategy) - .orElse(PreloadingStrategy.NONE); - - NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService, applicationInfosService, collectionThreshold); - if (preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW) { - return largeNetworkModificationExecutionService - .supplyAsync(() -> applyAndFlush(modificationInfosGroups, listener)) - .join(); - } else { - return applyAndFlush(modificationInfosGroups, listener); - } - } - - private NetworkModificationResult applyAndFlush(List modificationInfosGroups, - NetworkStoreListener listener) { - return flushModificationApplications(apply(modificationInfosGroups, listener), listener); - } - - // This method is used when building a variant - private List apply(List modificationInfosGroups, NetworkStoreListener listener) { - return modificationInfosGroups.stream() - .map(g -> apply(g, listener)) + public NetworkModificationResult applyModificationGroups( + List modificationApplicationGroups, + UUID networkUuid, + String originVariantId, + String destinationVariantId + ) { + var modifications = modificationApplicationGroups.stream() + .map(ModificationApplicationGroup::modifications) + .flatMap(Collection::stream) .toList(); + PreloadingStrategy preloadingStrategy = getPreloadingStrategy(modifications); + ModificationNetwork modificationNetwork = modificationNetworkService.getNetwork(networkUuid, preloadingStrategy); + switchOnNewVariant(modificationNetwork.network(), originVariantId, destinationVariantId); + return executeApplications( + () -> applyModificationGroups(modificationApplicationGroups, modificationNetwork), + preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW + ).join(); } - // This method is used when building a variant - private NetworkModificationResult flushModificationApplications(List groupsApplicationStatuses, NetworkStoreListener listener) { - List networkImpacts = listener.flushModificationApplications(); + private NetworkModificationResult applyModificationGroups( + List modificationApplicationGroups, + ModificationNetwork modificationNetwork + ) { + List statuses = modificationApplicationGroups.stream() + .map(g -> applyModificationGroup(g, modificationNetwork)) + .toList(); + List networkImpacts = modificationNetwork.flush(); return NetworkModificationResult.builder() - .applicationStatus(groupsApplicationStatuses.stream().reduce(ApplicationStatus::max).orElse(ApplicationStatus.ALL_OK)) - .lastGroupApplicationStatus(Streams.findLast(groupsApplicationStatuses.stream()).orElse(ApplicationStatus.ALL_OK)) + .applicationStatus(statuses.stream().reduce(ApplicationStatus::max).orElse(ApplicationStatus.ALL_OK)) + .lastGroupApplicationStatus(Streams.findLast(statuses.stream()).orElse(ApplicationStatus.ALL_OK)) .networkImpacts(networkImpacts) .build(); } - private ApplicationStatus apply(ModificationApplicationGroup modificationGroupInfos, NetworkStoreListener listener) { - ReportNode reportNode; - if (modificationGroupInfos.reportInfos().getNodeUuid() != null) { - UUID reporterId = modificationGroupInfos.reportInfos().getNodeUuid(); - reportNode = ReportNode.newRootReportNode() - .withAllResourceBundlesFromClasspath() - .withMessageTemplate("network.modification.server.nodeUuid") - .withUntypedValue("nodeUuid", reporterId.toString()) - .build(); - } else { - reportNode = ReportNode.NO_OP; - } + private ApplicationStatus applyModificationGroup( + ModificationApplicationGroup modificationGroupInfos, + ModificationNetwork modificationNetwork + ) { + ReportNode reportNode = createModificationApplicationGroupReportNode(modificationGroupInfos); ApplicationStatus groupApplicationStatus = modificationGroupInfos.modifications().stream() - .filter(ModificationEntity::getActivated) - .map(m -> { - listener.initModificationApplication(modificationGroupInfos.groupUuid(), m); - return apply(m.toModificationInfos(), listener.getNetwork(), reportNode); - }) - .reduce(ApplicationStatus::max) - .orElse(ApplicationStatus.ALL_OK); + .map(m -> { + modificationNetwork.initModificationApplication(modificationGroupInfos.groupUuid(), m); + return applyModification(m.toModificationInfos(), modificationNetwork, reportNode); + }) + .reduce(ApplicationStatus::max) + .orElse(ApplicationStatus.ALL_OK); if (modificationGroupInfos.reportInfos().getReportUuid() != null) { reportService.sendReport(modificationGroupInfos.reportInfos().getReportUuid(), reportNode); } return groupApplicationStatus; } - private ApplicationStatus apply(ModificationInfos modificationInfos, Network network, ReportNode reportNode) { + private ApplicationStatus applyModification( + ModificationInfos modificationInfos, + ModificationNetwork modificationNetwork, + ReportNode reportNode + ) { ReportNode subReportNode = modificationInfos.createSubReportNode(reportNode); try { - networkModificationObserver.observeApply(modificationInfos.getType(), () -> apply(modificationInfos.toModification(), network, subReportNode)); + networkModificationObserver.observeApply(modificationInfos.getType(), () -> { + AbstractModification modification = modificationInfos.toModification(); + modification.check(modificationNetwork.network()); // check input data but don't change the network + modification.initApplicationContext(filterService, loadFlowService); + modification.apply(modificationNetwork.network(), namingStrategy, subReportNode); + }); } catch (Exception e) { handleException(subReportNode, e); } return getApplicationStatus(reportNode); } - private void apply(AbstractModification modification, Network network, ReportNode subReportNode) { - // check input data but don't change the network - modification.check(network); - - // init application context - modification.initApplicationContext(this.filterService, this.loadFlowService); - - // apply all changes on the network - modification.apply(network, new NamingStrategiesServiceLoader().findNamingStrategyByName(namingStrategy).orElse(new DefaultNamingStrategy()), subReportNode); + /* For all memory intensive applications we want to use the same ExecutorService to globally limit the number + * of concurrent large modifications in order to avoid out of memory issues. + * We keep the possibility to applyModification small or medium modifications immediately. + * And if in the future we also need to limit the memory consumption of medium modifications we can add more code here. + * Note : we currently have 3 sizes of modifications : + * small : preloadingStrategy = NONE + * medium : preloadingStrategy = COLLECTION + * large : preloadingStrategy = ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW + */ + private CompletableFuture executeApplications( + Supplier supplier, + boolean isLarge + ) { + if (isLarge) { + return largeNetworkModificationExecutionService.supplyAsync(supplier); + } else { + return CompletableFuture.completedFuture(supplier.get()); + } } private void handleException(ReportNode subReportNode, Exception e) { @@ -242,10 +216,35 @@ private void handleException(ReportNode subReportNode, Exception e) { .add(); } - public static boolean areSeveritiesEquals(TypedValue s1, TypedValue s2) { + private ReportNode createModificationApplicationGroupReportNode(ModificationApplicationGroup modificationGroupInfos) { + ReportNode reportNode; + if (modificationGroupInfos.reportInfos().getNodeUuid() != null) { + UUID reporterId = modificationGroupInfos.reportInfos().getNodeUuid(); + reportNode = ReportNode.newRootReportNode() + .withAllResourceBundlesFromClasspath() + .withMessageTemplate("network.modification.server.nodeUuid") + .withUntypedValue("nodeUuid", reporterId.toString()) + .build(); + } else { + reportNode = ReportNode.NO_OP; + } + return reportNode; + } + + private PreloadingStrategy getPreloadingStrategy(List modificationApplicationGroup) { + return modificationApplicationGroup.stream() + .map(ModificationEntity::getType) + .map(ModificationType::valueOf) + .reduce(ModificationType::maxStrategy) + .map(ModificationType::getStrategy) + .orElse(PreloadingStrategy.NONE); + } + + private static boolean areSeveritiesEquals(TypedValue s1, TypedValue s2) { return s1.getValue().toString().equals(s2.getValue().toString()); } + // public only for tests public static ApplicationStatus getApplicationStatus(ReportNode reportNode) { if (reportNode.getChildren() != null && !reportNode.getChildren().isEmpty()) { return reportNode.getChildren().stream().map(NetworkModificationApplicator::getApplicationStatus) @@ -254,7 +253,11 @@ public static ApplicationStatus getApplicationStatus(ReportNode reportNode) { } TypedValue severity = reportNode.getValues().get(ReportConstants.SEVERITY_KEY); - if (severity == null || areSeveritiesEquals(severity, TypedValue.TRACE_SEVERITY) || areSeveritiesEquals(severity, TypedValue.DEBUG_SEVERITY) || areSeveritiesEquals(severity, TypedValue.INFO_SEVERITY) || areSeveritiesEquals(severity, TypedValue.DETAIL_SEVERITY)) { + if (severity == null + || areSeveritiesEquals(severity, TypedValue.TRACE_SEVERITY) + || areSeveritiesEquals(severity, TypedValue.DEBUG_SEVERITY) + || areSeveritiesEquals(severity, TypedValue.INFO_SEVERITY) + || areSeveritiesEquals(severity, TypedValue.DETAIL_SEVERITY)) { return ApplicationStatus.ALL_OK; } else if (areSeveritiesEquals(severity, TypedValue.WARN_SEVERITY)) { return ApplicationStatus.WITH_WARNINGS; diff --git a/src/main/java/org/gridsuite/modification/server/network/ModificationNetwork.java b/src/main/java/org/gridsuite/modification/server/network/ModificationNetwork.java new file mode 100644 index 000000000..7355b169f --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/network/ModificationNetwork.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server.network; + +import com.powsybl.iidm.network.Network; +import org.gridsuite.modification.server.entities.ModificationEntity; +import org.gridsuite.modification.server.impacts.AbstractBaseImpact; + +import java.util.List; +import java.util.UUID; + +/** + * @author Joris Mancini + */ +public record ModificationNetwork( + UUID networkUuid, + Network network, + NetworkStoreListener networkStoreListener +) { + + public List flush() { + return networkStoreListener.flushModificationApplications(); + } + + public void initModificationApplication(UUID groupUuid, ModificationEntity modification) { + networkStoreListener.initModificationApplication(groupUuid, modification); + } +} + diff --git a/src/main/java/org/gridsuite/modification/server/network/ModificationNetworkService.java b/src/main/java/org/gridsuite/modification/server/network/ModificationNetworkService.java new file mode 100644 index 000000000..995c8929c --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/network/ModificationNetworkService.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server.network; + +import com.powsybl.commons.PowsyblException; +import com.powsybl.iidm.network.Network; +import com.powsybl.network.store.client.NetworkStoreService; +import com.powsybl.network.store.client.PreloadingStrategy; +import org.gridsuite.modification.NetworkModificationException; +import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; +import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +import static org.gridsuite.modification.NetworkModificationException.Type.NETWORK_NOT_FOUND; + +/** + * @author Joris Mancini + */ +@Service +public class ModificationNetworkService { + + private final NetworkStoreService networkStoreService; + private final EquipmentInfosService equipmentInfosService; + private final ModificationApplicationInfosService applicationInfosService; + + @Value("${impacts.collection-threshold:50}") + private Integer collectionThreshold; + + public ModificationNetworkService(NetworkStoreService networkStoreService, EquipmentInfosService equipmentInfosService, ModificationApplicationInfosService applicationInfosService) { + this.networkStoreService = networkStoreService; + this.equipmentInfosService = equipmentInfosService; + this.applicationInfosService = applicationInfosService; + } + + public ModificationNetwork getNetwork(UUID networkUuid, PreloadingStrategy preloadingStrategy) { + Network network; + try { + network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); + } catch (PowsyblException e) { + throw new NetworkModificationException(NETWORK_NOT_FOUND, networkUuid.toString()); + } + network.addListener(new NetworkVariantsListener(networkUuid, equipmentInfosService)); + NetworkStoreListener listener = NetworkStoreListener.create( + network, + networkUuid, + networkStoreService, + equipmentInfosService, + applicationInfosService, + collectionThreshold + ); + return new ModificationNetwork(networkUuid, network, listener); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java b/src/main/java/org/gridsuite/modification/server/network/NetworkStoreListener.java similarity index 96% rename from src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java rename to src/main/java/org/gridsuite/modification/server/network/NetworkStoreListener.java index da23c0bc6..27cf25e18 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java +++ b/src/main/java/org/gridsuite/modification/server/network/NetworkStoreListener.java @@ -1,15 +1,14 @@ /* - Copyright (c) 2020, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.modifications; +package org.gridsuite.modification.server.network; import com.powsybl.commons.extensions.Extension; import com.powsybl.iidm.network.*; import com.powsybl.network.store.client.NetworkStoreService; -import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.server.dto.elasticsearch.BasicEquipmentInfos; @@ -23,6 +22,8 @@ import org.gridsuite.modification.server.impacts.CollectionElementImpact; import org.gridsuite.modification.server.impacts.SimpleElementImpact; import org.gridsuite.modification.server.impacts.SimpleElementImpact.SimpleImpactType; +import org.gridsuite.modification.server.modifications.ImpactedEquipmentsInfos; +import org.gridsuite.modification.server.modifications.IndexedImpactedEquipmentInfos; import java.util.*; import java.util.stream.Stream; @@ -35,11 +36,10 @@ * @author Franck Lecuyer * @author Slimane Amar */ -public class NetworkStoreListener implements NetworkListener { +class NetworkStoreListener implements NetworkListener { private final UUID networkUuid; - @Getter private final Network network; private final NetworkStoreService networkStoreService; @@ -74,7 +74,7 @@ private void updateImpactedEquipment(BasicEquipmentInfos impactedEquipment, Simp } } - public static NetworkStoreListener create(Network network, UUID networkUuid, NetworkStoreService networkStoreService, + static NetworkStoreListener create(Network network, UUID networkUuid, NetworkStoreService networkStoreService, EquipmentInfosService equipmentInfosService, ModificationApplicationInfosService modificationApplicationInfosService, Integer collectionThreshold) { var listener = new NetworkStoreListener(network, networkUuid, networkStoreService, equipmentInfosService, modificationApplicationInfosService, collectionThreshold); network.addListener(listener); @@ -249,7 +249,7 @@ public void afterRemoval(String identifiableId) { // Do nothing } - public void initModificationApplication(UUID groupUuid, ModificationEntity modification) { + void initModificationApplication(UUID groupUuid, ModificationEntity modification) { ModificationApplicationInfos modificationApplication = ModificationApplicationInfos.builder() .groupUuid(groupUuid) .modificationUuid(modification.getId()) @@ -259,7 +259,7 @@ public void initModificationApplication(UUID groupUuid, ModificationEntity modif modificationApplicationInfosList.add(modificationApplication); } - public List flushModificationApplications() { + List flushModificationApplications() { try { networkStoreService.flush(network); // At first flushImpactedEquipments(); diff --git a/src/main/java/org/gridsuite/modification/server/network/NetworkUtils.java b/src/main/java/org/gridsuite/modification/server/network/NetworkUtils.java new file mode 100644 index 000000000..b3100bcf1 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/network/NetworkUtils.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server.network; + +import com.powsybl.commons.PowsyblException; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.VariantManagerConstants; +import org.apache.commons.lang3.StringUtils; +import org.gridsuite.modification.NetworkModificationException; + +import static org.gridsuite.modification.NetworkModificationException.Type.VARIANT_NOT_FOUND; + +/** + * @author Joris Mancini + */ +public final class NetworkUtils { + + private NetworkUtils() { + // Do not instantiate + } + + public static boolean switchOnExistingVariant(Network network, String variantId) { + boolean isVariantPresent = true; + if (variantId != null) { + if (network.getVariantManager().getVariantIds().stream().anyMatch(id -> id.equals(variantId))) { + network.getVariantManager().setWorkingVariant(variantId); + } else { + isVariantPresent = false; + } + } + return isVariantPresent; + } + + public static void switchOnNewVariant(Network network, String originVariantId, String destinationVariantId) { + String startingVariant = StringUtils.isBlank(originVariantId) ? VariantManagerConstants.INITIAL_VARIANT_ID : originVariantId; + try { + network.getVariantManager().cloneVariant(startingVariant, destinationVariantId, true); // cloning variant + network.getVariantManager().setWorkingVariant(destinationVariantId); // set current variant to destination variant + } catch (PowsyblException e) { + throw new NetworkModificationException(VARIANT_NOT_FOUND, startingVariant); + } + } +} diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkVariantsListener.java b/src/main/java/org/gridsuite/modification/server/network/NetworkVariantsListener.java similarity index 82% rename from src/main/java/org/gridsuite/modification/server/service/NetworkVariantsListener.java rename to src/main/java/org/gridsuite/modification/server/network/NetworkVariantsListener.java index 30b098a18..8c0864c77 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkVariantsListener.java +++ b/src/main/java/org/gridsuite/modification/server/network/NetworkVariantsListener.java @@ -1,14 +1,13 @@ /* - Copyright (c) 2022, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.service; +package org.gridsuite.modification.server.network; import com.powsybl.commons.extensions.Extension; import com.powsybl.iidm.network.Identifiable; -import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.NetworkListener; import com.powsybl.iidm.network.VariantManagerConstants; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; @@ -19,16 +18,13 @@ /** * @author Nicolas Noir */ -public class NetworkVariantsListener implements NetworkListener { +class NetworkVariantsListener implements NetworkListener { private final UUID networkUuid; - private final Network network; - private final EquipmentInfosService equipmentInfosService; - protected NetworkVariantsListener(Network network, UUID networkUuid, EquipmentInfosService equipmentInfosService) { - this.network = network; + NetworkVariantsListener(UUID networkUuid, EquipmentInfosService equipmentInfosService) { this.networkUuid = networkUuid; this.equipmentInfosService = equipmentInfosService; } 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 691c4a1ec..46f4020e0 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -10,22 +10,15 @@ import co.elastic.clients.elasticsearch._types.query_dsl.Query; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Streams; -import com.powsybl.commons.PowsyblException; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.VariantManagerConstants; -import com.powsybl.network.store.client.NetworkStoreService; -import com.powsybl.network.store.client.PreloadingStrategy; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.GenerationDispatchInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.NetworkModificationServerException; import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos; -import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; @@ -49,7 +42,7 @@ import static org.gridsuite.modification.NetworkModificationException.Type.*; import static org.gridsuite.modification.server.NetworkModificationServerException.Type.DUPLICATION_ARGUMENT_INVALID; -import static org.gridsuite.modification.server.modifications.AsyncUtils.scheduleApplyModifications; +import static org.gridsuite.modification.server.utils.AsyncUtils.scheduleApplyModifications; /** * @author Franck Lecuyer @@ -57,14 +50,11 @@ */ @Service public class NetworkModificationService { - private final NetworkStoreService networkStoreService; private final NetworkModificationRepository networkModificationRepository; private final NetworkModificationApplicator modificationApplicator; - private final EquipmentInfosService equipmentInfosService; - private final NotificationService notificationService; private final ObjectMapper objectMapper; @@ -82,21 +72,17 @@ public class NetworkModificationService { private final ModificationRepository modificationRepository; private static final int PAGE_MAX_SIZE = 500; - public NetworkModificationService(NetworkStoreService networkStoreService, - NetworkModificationRepository networkModificationRepository, - EquipmentInfosService equipmentInfosService, + public NetworkModificationService(NetworkModificationRepository networkModificationRepository, NotificationService notificationService, - NetworkModificationApplicator applicationService, + NetworkModificationApplicator modificationApplicator, ObjectMapper objectMapper, ModificationApplicationInfosService applicationInfosService, ElasticsearchOperations elasticsearchOperations, ModificationRepository modificationRepository, FilterService filterService) { - this.networkStoreService = networkStoreService; this.networkModificationRepository = networkModificationRepository; - this.equipmentInfosService = equipmentInfosService; this.notificationService = notificationService; - this.modificationApplicator = applicationService; + this.modificationApplicator = modificationApplicator; this.objectMapper = objectMapper; this.applicationInfosService = applicationInfosService; this.elasticsearchOperations = elasticsearchOperations; @@ -196,24 +182,6 @@ public void deleteIndexedModificationGroup(List groupUuids, UUID networkUu applicationInfosService.deleteAllByGroupUuidsAndNetworkUuid(groupUuids, networkUuid); } - public NetworkInfos getNetworkInfos(UUID networkUuid, String variantId, PreloadingStrategy preloadingStrategy) { - Network network; - try { - network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); - } catch (PowsyblException e) { - throw new NetworkModificationException(NETWORK_NOT_FOUND, networkUuid.toString()); - } - boolean isVariantPresent = true; - if (variantId != null) { - if (network.getVariantManager().getVariantIds().stream().anyMatch(id -> id.equals(variantId))) { - network.getVariantManager().setWorkingVariant(variantId); - } else { - isVariantPresent = false; - } - } - return new NetworkInfos(network, networkUuid, isVariantPresent); - } - @Transactional public void updateNetworkModification(@NonNull UUID modificationUuid, @NonNull ModificationInfos modificationInfos) { networkModificationRepository.updateModification(modificationUuid, modificationInfos); @@ -243,86 +211,68 @@ public void restoreNetworkModifications(UUID groupUuid, @NonNull List modi public CompletableFuture createNetworkModification(@NonNull UUID groupUuid, @NonNull ModificationInfos modificationInfo, @NonNull List applicationContexts) { List modificationEntities = networkModificationRepository.saveModificationInfos(groupUuid, List.of(modificationInfo)); List ids = modificationEntities.stream().map(ModificationEntity::getId).toList(); - return applyModifications(groupUuid, modificationEntities, applicationContexts).thenApply(results -> + return applyModificationsOnNetworks(groupUuid, modificationEntities, applicationContexts).thenApply(results -> new NetworkModificationsResult(ids, results)); } /** * Apply modifications on several networks */ - private CompletableFuture>> applyModifications(UUID groupUuid, List modifications, List applicationContexts) { + private CompletableFuture>> applyModificationsOnNetworks( + UUID groupUuid, + List modifications, + List applicationContexts + ) { // Do we want to do these all in parallel (CompletableFuture.allOf) or sequentially (like in Flux.concatMap) or something in between ? // sequentially like before for now - return scheduleApplyModifications( - modificationApplicationContext -> - applyModifications( + return scheduleApplyModifications(modificationApplicationContext -> { + ReportInfos reportInfos = new ReportInfos( + modificationApplicationContext.reportUuid(), + modificationApplicationContext.reporterId() + ); + List applicableModifications = modifications.stream() + .filter(m -> m.getActivated() && !m.getStashed()) + .filter(m -> !modificationApplicationContext.excludedModifications().contains(m.getId())) + .toList(); + return modificationApplicator.applyModificationGroupIncremental( + new ModificationApplicationGroup(groupUuid, applicableModifications, reportInfos), modificationApplicationContext.networkUuid(), - modificationApplicationContext.variantId(), - new ModificationApplicationGroup(groupUuid, - modifications.stream().filter(m -> !modificationApplicationContext.excludedModifications().contains(m.getId())).toList(), - new ReportInfos(modificationApplicationContext.reportUuid(), modificationApplicationContext.reporterId()) - ) - ), + modificationApplicationContext.variantId() + ).thenApply(Optional::ofNullable); + }, applicationContexts ); } - public Network cloneNetworkVariant(UUID networkUuid, - String originVariantId, - String destinationVariantId, - PreloadingStrategy preloadingStrategy) { - Network network; - try { - network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); - network.addListener(new NetworkVariantsListener(network, networkUuid, equipmentInfosService)); - } catch (PowsyblException e) { - throw new NetworkModificationException(NETWORK_NOT_FOUND, networkUuid.toString()); - } - String startingVariant = StringUtils.isBlank(originVariantId) ? VariantManagerConstants.INITIAL_VARIANT_ID : originVariantId; - try { - network.getVariantManager().cloneVariant(startingVariant, destinationVariantId, true); // cloning variant - network.getVariantManager().setWorkingVariant(destinationVariantId); // set current variant to destination variant - } catch (PowsyblException e) { - throw new NetworkModificationException(VARIANT_NOT_FOUND, startingVariant); - } - return network; - } - public NetworkModificationResult buildVariant(@NonNull UUID networkUuid, @NonNull BuildInfos buildInfos) { // Apply all modifications belonging to the modification groups uuids in buildInfos List modificationGroupsInfos = new ArrayList<>(); Streams.forEachPair(buildInfos.getModificationGroupUuids().stream(), buildInfos.getReportsInfos().stream(), (groupUuid, reportInfos) -> { Set modificationsToExclude = buildInfos.getModificationUuidsToExclude().get(groupUuid); - List modifications = List.of(); + List applicableModifications = List.of(); try { // FullDto needed for toModificationInfos() after the modifications have been applied - modifications = networkModificationRepository.getModificationsEntities(List.of(groupUuid), false) + applicableModifications = networkModificationRepository.getModificationsEntities(List.of(groupUuid), false) .stream() .filter(m -> modificationsToExclude == null || !modificationsToExclude.contains(m.getId())) - .filter(m -> !m.getStashed()) + .filter(m -> m.getActivated() && !m.getStashed()) .toList(); } catch (NetworkModificationException e) { if (e.getType() != MODIFICATION_GROUP_NOT_FOUND) { // May not exist throw e; } } - modificationGroupsInfos.add(new ModificationApplicationGroup(groupUuid, modifications, reportInfos)); - + modificationGroupsInfos.add(new ModificationApplicationGroup(groupUuid, applicableModifications, reportInfos)); } ); - PreloadingStrategy preloadingStrategy = modificationGroupsInfos.stream().map(ModificationApplicationGroup::modifications) - .flatMap(Collection::stream) - .filter(m -> m.getActivated() && !m.getStashed()) - .map(ModificationEntity::getType) - .map(ModificationType::valueOf) - .reduce(ModificationType::maxStrategy).map(ModificationType::getStrategy).orElse(PreloadingStrategy.NONE); - - Network network = cloneNetworkVariant(networkUuid, buildInfos.getOriginVariantId(), buildInfos.getDestinationVariantId(), preloadingStrategy); - NetworkInfos networkInfos = new NetworkInfos(network, networkUuid, true); - - return modificationApplicator.applyModifications(modificationGroupsInfos, networkInfos); + return modificationApplicator.applyModificationGroups( + modificationGroupsInfos, + networkUuid, + buildInfos.getOriginVariantId(), + buildInfos.getDestinationVariantId() + ); } public void buildVariantRequest(UUID networkUuid, BuildInfos buildInfos, String receiver, WorkflowType workflowType, String workflowInfos) { @@ -346,7 +296,7 @@ public CompletableFuture moveModifications(@NonNull // FullDto needed for toModificationInfos() after the modifications have been applied List modificationEntities = networkModificationRepository.moveModifications(destinationGroupUuid, originGroupUuid, modificationsToMoveUuids, beforeModificationUuid); - CompletableFuture>> futureResult = applyModifications && !modificationEntities.isEmpty() ? applyModifications(destinationGroupUuid, modificationEntities, applicationContexts) : CompletableFuture.completedFuture(List.of()); + CompletableFuture>> futureResult = applyModifications && !modificationEntities.isEmpty() ? applyModificationsOnNetworks(destinationGroupUuid, modificationEntities, applicationContexts) : CompletableFuture.completedFuture(List.of()); return futureResult.thenApply(result -> new NetworkModificationsResult(modificationEntities.stream().map(ModificationEntity::getId).toList(), result)); } @@ -369,37 +319,20 @@ public Map duplicateGroup(UUID sourceGroupUuid, UUID groupUuid) { } } - private CompletableFuture> applyModifications(UUID networkUuid, String variantId, ModificationApplicationGroup modificationGroupInfos) { - if (!modificationGroupInfos.modifications().isEmpty()) { - PreloadingStrategy preloadingStrategy = modificationGroupInfos.modifications().stream() - .filter(m -> m.getActivated() && !m.getStashed()) - .map(ModificationEntity::getType) - .map(ModificationType::valueOf) - .reduce(ModificationType::maxStrategy).map(ModificationType::getStrategy).orElse(PreloadingStrategy.NONE); - NetworkInfos networkInfos = getNetworkInfos(networkUuid, variantId, preloadingStrategy); - - // try to apply the duplicated modifications (incremental mode) - if (networkInfos.isVariantPresent()) { - return modificationApplicator.applyModifications(modificationGroupInfos, networkInfos).thenApply(Optional::of); - } - } - return CompletableFuture.completedFuture(Optional.empty()); - } - public CompletableFuture duplicateModifications(@NonNull UUID targetGroupUuid, UUID originGroupUuid, @NonNull List modificationsUuids, @NonNull List applicationContexts) { if (originGroupUuid != null && !modificationsUuids.isEmpty()) { // Duplicate modifications from a group or from a list only throw new NetworkModificationServerException(DUPLICATION_ARGUMENT_INVALID); } List duplicateModifications = networkModificationRepository.saveDuplicateModifications(targetGroupUuid, originGroupUuid, modificationsUuids); List ids = duplicateModifications.stream().map(ModificationEntity::getId).toList(); - return applyModifications(targetGroupUuid, duplicateModifications, applicationContexts).thenApply(result -> + return applyModificationsOnNetworks(targetGroupUuid, duplicateModifications, applicationContexts).thenApply(result -> new NetworkModificationsResult(ids, result)); } public CompletableFuture insertCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List modificationsUuids, @NonNull List applicationContexts) { List modificationEntities = networkModificationRepository.saveCompositeModifications(targetGroupUuid, modificationsUuids); List ids = modificationEntities.stream().map(ModificationEntity::getId).toList(); - return applyModifications(targetGroupUuid, modificationEntities, applicationContexts).thenApply(result -> + return applyModificationsOnNetworks(targetGroupUuid, modificationEntities, applicationContexts).thenApply(result -> new NetworkModificationsResult(ids, result)); } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/AsyncUtils.java b/src/main/java/org/gridsuite/modification/server/utils/AsyncUtils.java similarity index 98% rename from src/main/java/org/gridsuite/modification/server/modifications/AsyncUtils.java rename to src/main/java/org/gridsuite/modification/server/utils/AsyncUtils.java index 8bf1bae1b..6fff14ada 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/AsyncUtils.java +++ b/src/main/java/org/gridsuite/modification/server/utils/AsyncUtils.java @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.modifications; +package org.gridsuite.modification.server.utils; import org.gridsuite.modification.server.dto.ModificationApplicationContext; import org.gridsuite.modification.server.dto.NetworkModificationResult; diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 648c7eb5b..2f1edf613 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -307,7 +307,7 @@ void testRestoreNetworkModifications() throws Exception { String switchStatusModificationInfosJson = getJsonBody(switchStatusModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID); mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI).content(switchStatusModificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); - testElementModificationImpact(mapper, mvcResult.getResponse().getContentAsString(), Set.of("s1")); + testEmptyImpacts(mapper, mvcResult.getResponse().getContentAsString()); List modifications = modificationRepository.getModifications(TEST_GROUP_ID, true, true, false); assertEquals(1, modifications.size()); @@ -334,7 +334,7 @@ void testStashNetworkModifications() throws Exception { String switchStatusModificationInfosJson = getJsonBody(switchStatusModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID); mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI).content(switchStatusModificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); - testElementModificationImpact(mapper, mvcResult.getResponse().getContentAsString(), Set.of("s1")); + testEmptyImpacts(mapper, mvcResult.getResponse().getContentAsString()); List modifications = modificationRepository.getModifications(TEST_GROUP_ID, false, true); assertEquals(1, modifications.size()); diff --git a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java index c80ea253e..41c7d547b 100644 --- a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java +++ b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java @@ -16,11 +16,12 @@ import lombok.extern.slf4j.Slf4j; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.server.dto.ModificationApplicationGroup; -import org.gridsuite.modification.server.dto.NetworkInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus; import org.gridsuite.modification.server.dto.ReportInfos; import org.gridsuite.modification.server.entities.ModificationEntity; +import org.gridsuite.modification.server.network.ModificationNetwork; +import org.gridsuite.modification.server.network.ModificationNetworkService; import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; import org.gridsuite.modification.server.repositories.NetworkModificationRepository; import org.gridsuite.modification.server.service.ReportService; @@ -38,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.nio.file.Files; import java.nio.file.Paths; @@ -45,11 +47,12 @@ import java.util.List; import java.util.UUID; +import static com.powsybl.iidm.network.VariantManagerConstants.INITIAL_VARIANT_ID; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.verify; +import static org.mockito.ArgumentMatchers.eq; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; @Slf4j @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -58,6 +61,9 @@ @DisableElasticsearch class VoltageInitReportTest { + @MockitoBean + private ModificationNetworkService modificationNetworkService; + @Autowired private NetworkModificationRepository modificationRepository; @@ -83,6 +89,10 @@ class VoltageInitReportTest { void testVoltageInitDuplicationLogs(final ApplicationStatus resultStatus, final String logsJsonFile, final VoltageInitModificationInfos modificationInfos) throws Exception { final Network network = Network.read(Paths.get(this.getClass().getClassLoader().getResource("fourSubstations_testsOpenReac.xiidm").toURI())); + ModificationNetwork modificationNetwork = mock(ModificationNetwork.class); + when(modificationNetwork.network()).thenReturn(network); + when(modificationNetworkService.getNetwork(eq(NETWORK_ID), any())).thenReturn(modificationNetwork); + // apply a VoltageInit modification and check status assertThat(applyModification(network, modificationInfos)) .as("voltage init result status") @@ -105,7 +115,7 @@ private ApplicationStatus applyModification(Network network, VoltageInitModifica List modificationInfosGroups = List.of( new ModificationApplicationGroup(GROUP_ID, entities, new ReportInfos(REPORT_ID, NODE_ID)) ); - NetworkModificationResult result = networkModificationApplicator.applyModifications(modificationInfosGroups, new NetworkInfos(network, NETWORK_ID, true)); + NetworkModificationResult result = networkModificationApplicator.applyModificationGroups(modificationInfosGroups, NETWORK_ID, INITIAL_VARIANT_ID, "variant"); return result.getApplicationStatus(); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/CompositeModificationsTest.java index 185e62b4f..6b72dcc23 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/CompositeModificationsTest.java @@ -12,24 +12,17 @@ import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; -import org.gridsuite.modification.server.dto.ModificationApplicationGroup; -import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.utils.ModificationCreation; import org.gridsuite.modification.server.utils.NetworkCreation; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.util.List; import java.util.UUID; -import java.util.concurrent.CompletableFuture; import static com.vladmihalcea.sql.SQLStatementCountValidator.assertSelectCount; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -40,21 +33,6 @@ @Tag("IntegrationTest") class CompositeModificationsTest extends AbstractNetworkModificationTest { - @MockitoBean - private NetworkModificationApplicator networkModificationApplicator; - - @BeforeEach - void specificSetUp() { - // Currently we never apply composite modifications (apply mocked) - CompletableFuture networkModificationResultMock = CompletableFuture.completedFuture(NetworkModificationResult.builder() - .applicationStatus(NetworkModificationResult.ApplicationStatus.ALL_OK) - .lastGroupApplicationStatus(NetworkModificationResult.ApplicationStatus.ALL_OK) - .networkImpacts(List.of()) - .build()); - when(networkModificationApplicator.applyModifications(any(ModificationApplicationGroup.class), any())) - .then(invocation -> networkModificationResultMock); - } - @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.create(networkUuid, false); @@ -111,4 +89,22 @@ void testCheckSqlRequestsCount() throws Exception { .andExpect(status().isOk()); SQLStatementCountValidator.assertSelectCount(8); } + + @Override + @Test + public void testCopy() { + // Ignored because we cannot apply this modification yet + } + + @Override + @Test + public void testCreateDisabledModification() { + // Ignored because we cannot apply this modification yet + } + + @Override + @Test + public void testCreate() { + // Ignored because we cannot apply this modification yet + } } diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java b/src/test/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicatorTest.java similarity index 76% rename from src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java rename to src/test/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicatorTest.java index 842d2b186..f82959c3b 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicatorTest.java @@ -1,38 +1,40 @@ -/** - * Copyright (c) 2023, RTE (http://www.rte-france.com) +/* + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.service; +package org.gridsuite.modification.server.modifications; import com.powsybl.commons.report.ReportConstants; import com.powsybl.commons.report.ReportNode; import com.powsybl.commons.report.ReportNodeAdder; import com.powsybl.commons.report.TypedValue; -import com.powsybl.network.store.client.NetworkStoreService; -import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl; +import com.powsybl.iidm.network.Network; import org.gridsuite.modification.dto.VoltageInitModificationInfos; import org.gridsuite.modification.dto.VoltageLevelModificationInfos; import org.gridsuite.modification.server.dto.ModificationApplicationGroup; -import org.gridsuite.modification.server.dto.NetworkInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus; import org.gridsuite.modification.server.dto.ReportInfos; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.VoltageInitModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.VoltageLevelModificationEntity; -import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; +import org.gridsuite.modification.server.network.ModificationNetwork; +import org.gridsuite.modification.server.network.ModificationNetworkService; +import org.gridsuite.modification.server.network.NetworkUtils; +import org.gridsuite.modification.server.service.FilterService; +import org.gridsuite.modification.server.service.NetworkModificationObserver; +import org.gridsuite.modification.server.service.ReportService; import org.gridsuite.modification.server.utils.TestUtils; import org.gridsuite.modification.server.utils.elasticsearch.DisableElasticsearch; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -52,7 +54,9 @@ class NetworkModificationApplicatorTest { @MockitoBean - private NetworkStoreService networkStoreService; + private ModificationNetworkService modificationNetworkService; + + private MockedStatic networkUtils; @MockitoBean private ReportService reportService; @@ -69,50 +73,44 @@ class NetworkModificationApplicatorTest { @Autowired private NetworkModificationApplicator networkModificationApplicator; - @Mock - private NetworkInfos networkInfos; - @Mock private ReportInfos reportInfos; + private final UUID networkUuid = UUID.randomUUID(); + + private final String variantId = UUID.randomUUID().toString(); + @BeforeEach void setUp() { - when(networkInfos.getNetwork()).thenReturn(new NetworkFactoryImpl().createNetwork("test", "test")); + Network network = mock(Network.class); + ModificationNetwork modificationNetwork = mock(ModificationNetwork.class); + when(modificationNetwork.network()).thenReturn(network); + networkUtils = mockStatic(NetworkUtils.class); + networkUtils.when(() -> NetworkUtils.switchOnExistingVariant(eq(network), eq(variantId))).thenReturn(true); + when(modificationNetworkService.getNetwork(eq(networkUuid), any())).thenReturn(modificationNetwork); + } + + @AfterEach + void tearDown() { + networkUtils.close(); } @Test void testApplyModificationsWithAllCollectionsNeededForBusView() { - var modificationInfos = VoltageInitModificationInfos.builder() - .stashed(false) - .activated(true) + var modificationInfosPreloadingAllCollections = VoltageInitModificationInfos.builder().build(); + var modificationInfosPreloadingNone = VoltageLevelModificationInfos.builder() + .equipmentId(UUID.randomUUID().toString()) .build(); - List modificationInfosList = List.of(new VoltageInitModificationEntity(modificationInfos)); + List modificationInfosList = List.of( + new VoltageInitModificationEntity(modificationInfosPreloadingAllCollections), + new VoltageLevelModificationEntity(modificationInfosPreloadingNone) + ); NetworkModificationResult result = TestUtils.applyModificationsBlocking( networkModificationApplicator, new ModificationApplicationGroup(UUID.randomUUID(), modificationInfosList, reportInfos), - networkInfos - ); - - assertNotNull(result); - verify(largeNetworkModificationExecutionService).supplyAsync(any()); - } - - @Test - void testApplyModificationsWithGroupsAndAllCollectionsNeededForBusView() { - var modificationInfos = VoltageInitModificationInfos.builder() - .stashed(false) - .activated(true) - .build(); - List modificationInfosList = List.of(new VoltageInitModificationEntity(modificationInfos)); - List modificationInfosGroups = List.of( - new ModificationApplicationGroup( - UUID.randomUUID(), - modificationInfosList, - mock(ReportInfos.class) - )); - - NetworkModificationResult result = networkModificationApplicator.applyModifications(modificationInfosGroups, networkInfos); + networkUuid, + variantId); assertNotNull(result); verify(largeNetworkModificationExecutionService).supplyAsync(any()); @@ -120,59 +118,23 @@ void testApplyModificationsWithGroupsAndAllCollectionsNeededForBusView() { @Test void testApplyModificationsWithAllCollectionsNeededForBusViewStashedAndNotActivated() { - var modificationInfosList = createModificationsWithUnactiveAllCollectionAndActiveNone(); + var modificationInfosPreloadingNone = VoltageLevelModificationInfos.builder() + .equipmentId(UUID.randomUUID().toString()) + .build(); + List modificationInfosList = List.of( + new VoltageLevelModificationEntity(modificationInfosPreloadingNone) + ); NetworkModificationResult result = TestUtils.applyModificationsBlocking( networkModificationApplicator, new ModificationApplicationGroup(UUID.randomUUID(), modificationInfosList, reportInfos), - networkInfos - ); + networkUuid, + variantId); assertNotNull(result); verifyNoInteractions(largeNetworkModificationExecutionService); } - @Test - void testApplyModificationsWithGroupsAndAllCollectionsNeededForBusViewStashedAndNotActivated() { - var modificationInfosList = createModificationsWithUnactiveAllCollectionAndActiveNone(); - List modificationInfosGroups = List.of( - new ModificationApplicationGroup( - UUID.randomUUID(), - modificationInfosList, - mock(ReportInfos.class) - )); - - NetworkModificationResult result = networkModificationApplicator.applyModifications(modificationInfosGroups, networkInfos); - - assertNotNull(result); - verifyNoInteractions(largeNetworkModificationExecutionService); - } - - private List createModificationsWithUnactiveAllCollectionAndActiveNone() { - // All collections but stashed - var modificationInfosStashed = VoltageInitModificationInfos.builder() - .stashed(true) - .activated(true) - .build(); - // All collections but not activated - var modificationInfosNotActivated = VoltageInitModificationInfos.builder() - .stashed(true) - .activated(false) - .build(); - // None and active - var modificationInfosPreloadingNone = VoltageLevelModificationInfos.builder() - .stashed(false) - .activated(true) - .equipmentId(UUID.randomUUID().toString()) - .build(); - // So in the end strategy should be none - return List.of( - new VoltageInitModificationEntity(modificationInfosStashed), - new VoltageInitModificationEntity(modificationInfosNotActivated), - new VoltageLevelModificationEntity(modificationInfosPreloadingNone) - ); - } - @ParameterizedTest @MethodSource("provideArgumentsForComputeHigherSeverity") void computeHigherSeverity(List reports, ApplicationStatus expectedSeverity) { diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkVariantsListenerTests.java b/src/test/java/org/gridsuite/modification/server/network/NetworkVariantsListenerTests.java similarity index 93% rename from src/test/java/org/gridsuite/modification/server/service/NetworkVariantsListenerTests.java rename to src/test/java/org/gridsuite/modification/server/network/NetworkVariantsListenerTests.java index 2e28a0113..659dbb217 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkVariantsListenerTests.java +++ b/src/test/java/org/gridsuite/modification/server/network/NetworkVariantsListenerTests.java @@ -1,10 +1,10 @@ /* - * Copyright (c) 2024, RTE (http://www.rte-france.com) + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.modification.server.service; +package org.gridsuite.modification.server.network; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosRepository; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; @@ -45,7 +45,7 @@ void tearDown() { @Test void testVariantNotifications() { - NetworkVariantsListener listener = new NetworkVariantsListener(null, NETWORK_UUID, equipmentInfosService); + NetworkVariantsListener listener = new NetworkVariantsListener(NETWORK_UUID, equipmentInfosService); listener.onVariantRemoved(VARIANT_ID); listener.onVariantCreated("variant_1", "variant_2"); 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 223a21f2b..d03d225f6 100644 --- a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java @@ -66,6 +66,7 @@ import java.util.concurrent.*; import static com.powsybl.iidm.network.ReactiveLimitsKind.MIN_MAX; +import static com.powsybl.iidm.network.VariantManagerConstants.INITIAL_VARIANT_ID; import static org.gridsuite.modification.dto.OperationalLimitsGroupInfos.Applicability.*; import static org.gridsuite.modification.server.impacts.TestImpactUtils.*; import static org.gridsuite.modification.server.service.BuildWorkerService.CANCEL_MESSAGE; @@ -187,7 +188,7 @@ public void setUp(final MockWebServer mockWebServer) { @AfterEach void cleanDB() { modificationRepository.deleteAll(); - equipmentInfosService.deleteVariants(TEST_NETWORK_ID, List.of(VariantManagerConstants.INITIAL_VARIANT_ID, NetworkCreation.VARIANT_ID, VARIANT_ID_2)); + equipmentInfosService.deleteVariants(TEST_NETWORK_ID, List.of(INITIAL_VARIANT_ID, NetworkCreation.VARIANT_ID, VARIANT_ID_2)); } private void initMockWebServer(final MockWebServer server) { @@ -270,7 +271,7 @@ void runBuildForLineSplits(final MockWebServer server) throws Exception { String uriString = "/v1/networks/{networkUuid}/build?receiver=me"; BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID, TEST_GROUP_ID_2)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2))) @@ -313,7 +314,7 @@ void runBuildForLineSplits(final MockWebServer server) throws Exception { @Test void runBuildWithEmptyGroupTest(final MockWebServer server) throws Exception { BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) @@ -424,7 +425,7 @@ void testIndexationAfterBuild(final MockWebServer server) { // Create build infos BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) @@ -712,7 +713,7 @@ void runBuildTest(final MockWebServer server) throws Exception { // build VARIANT_ID by cloning network initial variant and applying all modifications in all groups String uriString = "/v1/networks/{networkUuid}/build?receiver=me"; BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID, TEST_GROUP_ID_2)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2))) @@ -789,7 +790,7 @@ void runBuildTest(final MockWebServer server) throws Exception { assertNotNull(network.getShuntCompensator("shunt9")); // Test that no modifications have been made on initial variant - network.getVariantManager().setWorkingVariant(VariantManagerConstants.INITIAL_VARIANT_ID); + network.getVariantManager().setWorkingVariant(INITIAL_VARIANT_ID); assertFalse(network.getSwitch("v1d1").isOpen()); assertNull(network.getLine("line1").getExtension(OperatingStatus.class)); assertNull(network.getLine("line2").getExtension(OperatingStatus.class)); @@ -855,7 +856,7 @@ void runBuildWithStashedModificationsTest(final MockWebServer server) { testNetworkModificationsCount(TEST_GROUP_ID, entities1.size()); BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) @@ -882,7 +883,7 @@ void runBuildWithExcludedModificationsTest(final MockWebServer server) { // build node with excluded modification BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) @@ -910,7 +911,7 @@ void stopBuildTest() throws Exception { // Build VARIANT_ID by cloning network initial variant and applying all modifications in group uuid TEST_GROUP_ID // Because TestChannelBinder implementation is synchronous the build is made in a different thread BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) @@ -952,7 +953,7 @@ void runBuildWithReportErrorTest(final MockWebServer server) throws Exception { // build VARIANT_ID by cloning network initial variant and applying all modifications in all groups String uriString = "/v1/networks/{networkUuid}/build?receiver=me"; BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID)) .reportsInfos(List.of(new ReportInfos(TEST_ERROR_REPORT_ID, TEST_SUB_REPORTER_ID_1))) @@ -984,7 +985,8 @@ void testApplyModificationWithErrors(final MockWebServer server) { // Building mode : No error send with exception NetworkModificationResult networkModificationResult = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, new ReportInfos(reportUuid, reporterId)), - new NetworkInfos(network, TEST_NETWORK_ID, true)); + TEST_NETWORK_ID, + INITIAL_VARIANT_ID); assertNotNull(networkModificationResult); testEmptyImpactsWithErrors(networkModificationResult); assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches(String.format("/v1/reports/%s", reportUuid)))); @@ -1023,7 +1025,7 @@ void testLastGroupModificationStatus(final MockWebServer server) { ); //Global application status should be in error and last application status should be OK - NetworkModificationResult networkModificationResult = networkModificationApplicator.applyModifications(modificationInfosGroups, new NetworkInfos(network, TEST_NETWORK_ID, true)); + NetworkModificationResult networkModificationResult = networkModificationApplicator.applyModificationGroups(modificationInfosGroups, TEST_NETWORK_ID, null, VARIANT_ID_2); assertNotNull(networkModificationResult); testEmptyImpactsWithErrorsLastOK(networkModificationResult); assertTrue(TestUtils.getRequestsDone(2, server).stream().anyMatch(r -> r.matches(String.format("/v1/reports/%s", reportUuid)))); @@ -1037,7 +1039,7 @@ void testBuildWithWorkflowInfos() throws Exception { String receiver = "me"; String uriString = "/v1/networks/{networkUuid}/build?receiver=" + receiver; BuildInfos buildInfos = BuildInfos.builder() - .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) + .originVariantId(INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) .modificationGroupUuids(List.of(TEST_GROUP_ID, TEST_GROUP_ID_2)) .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2))) 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 6d62fe7bd..3e33f8aa5 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java @@ -44,9 +44,8 @@ import static com.powsybl.iidm.network.VariantManagerConstants.INITIAL_VARIANT_ID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @Tag("UnitTest") @@ -62,9 +61,6 @@ class ModificationIndexationTest { @Autowired private NetworkModificationApplicator networkModificationApplicator; - @Mock - private NetworkInfos networkInfos; - @MockitoBean private NetworkStoreService networkStoreService; @@ -82,17 +78,16 @@ class ModificationIndexationTest { @Autowired private SupervisionService supervisionService; + private Network network; UUID networkUuid = UUID.randomUUID(); String variant2 = "variant_2"; @BeforeEach void setUp() { cleanDB(); - Network network = NetworkCreation.createLoadNetwork(networkUuid, new NetworkFactoryImpl()); + network = NetworkCreation.createLoadNetwork(networkUuid, new NetworkFactoryImpl()); network.getVariantManager().cloneVariant(INITIAL_VARIANT_ID, variant2); - when(networkInfos.getNetwork()).thenReturn(network); - when(networkInfos.getNetworkUuuid()).thenReturn(networkUuid); - when(networkStoreService.getNetwork(eq(networkInfos.getNetworkUuuid()), any(PreloadingStrategy.class))).thenReturn(network); + when(networkStoreService.getNetwork(eq(networkUuid), any(PreloadingStrategy.class))).thenReturn(network); } @AfterEach @@ -113,7 +108,7 @@ void testApplyCreatingModifications() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); List modificationApplicationEntities = modificationApplicationRepository.findAll(); @@ -138,7 +133,7 @@ void testApplyModifyingModifications() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(loadModificationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); List modificationApplicationEntities = modificationApplicationRepository.findAll(); @@ -163,7 +158,7 @@ void testApplyDeletingModifications() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(equipmentDeletionInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); List modificationApplicationEntities = modificationApplicationRepository.findAll(); @@ -193,11 +188,11 @@ void testDuplicateModifications() { UUID groupUuid1 = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid1, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); // Need to remove the listener created in the last modifications application - ((NetworkImpl) networkInfos.getNetwork()).getListeners().clear(); + ((NetworkImpl) network).getListeners().clear(); /* Duplicate this modification to group 2, variant 2 @@ -207,7 +202,7 @@ void testDuplicateModifications() { groupUuid2, null, entities.stream().map(ModificationEntity::getId).toList(), - List.of(new ModificationApplicationContext(networkInfos.getNetworkUuuid(), variant2, UUID.randomUUID(), UUID.randomUUID())) + List.of(new ModificationApplicationContext(networkUuid, variant2, UUID.randomUUID(), UUID.randomUUID())) ).join(); /* @@ -242,11 +237,11 @@ void testMoveModifications() { LoadCreationInfos loadCreationInfos = createLoadCreationInfos(newEquipmentId); UUID groupUuid1 = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid1, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); // Need to remove the listener created in the last modifications application - ((NetworkImpl) networkInfos.getNetwork()).getListeners().clear(); + ((NetworkImpl) network).getListeners().clear(); /* Move this modification to group 2, variant 2 @@ -257,7 +252,7 @@ void testMoveModifications() { groupUuid1, null, entities.stream().map(ModificationEntity::getId).toList(), - List.of(new ModificationApplicationContext(networkInfos.getNetworkUuuid(), variant2, UUID.randomUUID(), UUID.randomUUID())), + List.of(new ModificationApplicationContext(networkUuid, variant2, UUID.randomUUID(), UUID.randomUUID())), true ).join(); @@ -292,7 +287,7 @@ void testInsertCompositeModifications() { UUID groupUuid1 = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid1, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); // Create the composite modification to pass later to ?action=insert @@ -301,7 +296,7 @@ void testInsertCompositeModifications() { ); // Need to remove the listener created in the last modifications application - ((NetworkImpl) networkInfos.getNetwork()).getListeners().clear(); + ((NetworkImpl) network).getListeners().clear(); /* Insert as composite this modification to group 2, variant 2 @@ -310,7 +305,7 @@ void testInsertCompositeModifications() { NetworkModificationsResult modificationsResult = networkModificationService.insertCompositeModifications( groupUuid2, List.of(compositeUuid), - List.of(new ModificationApplicationContext(networkInfos.getNetworkUuuid(), variant2, UUID.randomUUID(), UUID.randomUUID())) + List.of(new ModificationApplicationContext(networkUuid, variant2, UUID.randomUUID(), UUID.randomUUID())) ).join(); /* @@ -338,7 +333,7 @@ void testDeleteModifications() { UUID groupUuid1 = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid1, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); /* @@ -366,7 +361,7 @@ void testDeleteModificationGroup() { UUID groupUuid1 = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid1, List.of(ModificationEntity.fromDTO(loadCreationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); /* @@ -396,7 +391,7 @@ void testReindexAll() { List entities = modificationRepository.saveModifications(groupUuid1, loadCreationInfosList.stream().map(ModificationEntity::fromDTO).toList()); // apply modifications to index them - TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkInfos); + TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid1, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); // assert they are both stored in ES and in postgres assertEquals(3, modificationApplicationRepository.findAll().size()); @@ -408,7 +403,7 @@ void testReindexAll() { assertEquals(0, IterableUtils.toList(modificationApplicationInfosRepository.findAll()).size()); // reindex all modification to check they are all reindexed with the same values - supervisionService.reindexByNetworkUuid(networkInfos.getNetworkUuuid()); + supervisionService.reindexByNetworkUuid(networkUuid); assertThat(applicationBeforeReindexing).usingRecursiveComparison().isEqualTo(IterableUtils.toList(modificationApplicationInfosRepository.findAll())); assertEquals(3, IterableUtils.toList(modificationApplicationInfosRepository.findAll()).size()); @@ -424,7 +419,7 @@ void testMultiplePropertiesModificationOnSingleEquipment() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(loadModificationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); ModificationApplicationEntity modificationApplicationEntity = modificationApplicationRepository.findAll().getFirst(); @@ -449,7 +444,7 @@ void testSwitchModification() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(openSwitchModification))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); assertEquals(1, modificationRepository.getModifications(groupUuid, true, true).size()); @@ -466,7 +461,7 @@ void testUpdateSubstationName() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(substationModificationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); ModificationApplicationEntity modificationApplicationEntity = modificationApplicationRepository.findAll().getFirst(); @@ -506,7 +501,7 @@ void testUpdateModificationProperties() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(loadModificationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); ModificationApplicationEntity modificationApplicationEntity = modificationApplicationRepository.findAll().getFirst(); @@ -541,7 +536,7 @@ void testUpdateModificationPropertiesWithNotIndexedEquipment() { UUID groupUuid = UUID.randomUUID(); List entities = modificationRepository.saveModifications(groupUuid, List.of(ModificationEntity.fromDTO(substationModificationInfos))); - NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkInfos); + NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), networkUuid, INITIAL_VARIANT_ID); assertNotNull(result); assertEquals(1, modificationRepository.getModifications(groupUuid, true, true).size()); diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationSearchTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationSearchTest.java index fa0c65539..2a07cc362 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationSearchTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationSearchTest.java @@ -41,9 +41,8 @@ import static com.powsybl.iidm.network.VariantManagerConstants.INITIAL_VARIANT_ID; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @Tag("UnitTest") @@ -55,9 +54,6 @@ class ModificationSearchTest { @Autowired private NetworkModificationApplicator networkModificationApplicator; - @Mock - private NetworkInfos networkInfos; - @MockitoBean private NetworkStoreService networkStoreService; @@ -84,9 +80,7 @@ void setUp() { cleanDB(); Network network = NetworkCreation.createLoadNetwork(networkUuid, new NetworkFactoryImpl()); network.getVariantManager().cloneVariant(INITIAL_VARIANT_ID, variant2); - when(networkInfos.getNetwork()).thenReturn(network); - when(networkInfos.getNetworkUuuid()).thenReturn(networkUuid); - when(networkStoreService.getNetwork(eq(networkInfos.getNetworkUuuid()), any(PreloadingStrategy.class))).thenReturn(network); + when(networkStoreService.getNetwork(eq(networkUuid), any(PreloadingStrategy.class))).thenReturn(network); } @AfterEach @@ -129,7 +123,8 @@ void testSearchModificationsWithAccentsAndSpecialChars() { NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), - networkInfos + networkUuid, + variant2 ); assertThat(result).isNotNull(); @@ -137,12 +132,12 @@ void testSearchModificationsWithAccentsAndSpecialChars() { assertThat(allModifications).hasSize(2); // search by userInput containing accent - List hitsAccent2 = networkModificationService.searchNetworkModificationInfos(networkInfos.getNetworkUuuid(), "test"); + List hitsAccent2 = networkModificationService.searchNetworkModificationInfos(networkUuid, "test"); assertThat(hitsAccent2).hasSize(1); assertThat(hitsAccent2.getFirst().getCreatedEquipmentIds()).contains(equipmentIdAccent); // search by term containing special chars - List hitsSpecial = networkModificationService.searchNetworkModificationInfos(networkInfos.getNetworkUuuid(), "SpecialChars@"); + List hitsSpecial = networkModificationService.searchNetworkModificationInfos(networkUuid, "SpecialChars@"); assertThat(hitsSpecial).hasSize(1); assertThat(hitsSpecial.getFirst().getCreatedEquipmentIds()).contains(equipmentIdSpecial); } @@ -169,7 +164,8 @@ void testSearchModificationsByGroup() { NetworkModificationResult result = TestUtils.applyModificationsBlocking(networkModificationApplicator, new ModificationApplicationGroup(groupUuid, entities, reportInfos), - networkInfos + networkUuid, + variant2 ); assertThat(result).isNotNull(); @@ -178,7 +174,7 @@ void testSearchModificationsByGroup() { // Search with network UUID and userInput 'Id' to search all equipmentIds containing 'Id' List hits = networkModificationService - .searchNetworkModificationInfos(networkInfos.getNetworkUuuid(), "Id"); + .searchNetworkModificationInfos(networkUuid, "Id"); assertThat(hits) .hasSize(3) @@ -188,7 +184,7 @@ void testSearchModificationsByGroup() { .collect(Collectors.toSet())::contains); // search with userInput 'load' - hits = networkModificationService.searchNetworkModificationInfos(networkInfos.getNetworkUuuid(), "load"); + hits = networkModificationService.searchNetworkModificationInfos(networkUuid, "load"); assertThat(hits).hasSize(1); ModificationApplicationInfos hit = hits.getFirst(); @@ -202,7 +198,7 @@ void testSearchModificationsByGroup() { assertThat(hit.getModificationUuid()).isEqualTo(loadModificationApplicationInfos.getModificationUuid()); // search using an equipment identifier that doesn't exist ("notFound") - hits = networkModificationService.searchNetworkModificationInfos(networkInfos.getNetworkUuuid(), "notFound"); + hits = networkModificationService.searchNetworkModificationInfos(networkUuid, "notFound"); Assertions.assertThat(hits).isEmpty(); // search using an equipment identifier on non-existing network diff --git a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java index a91593846..b303f87da 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java @@ -23,7 +23,6 @@ import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.dto.ModificationApplicationContext; import org.gridsuite.modification.server.dto.ModificationApplicationGroup; -import org.gridsuite.modification.server.dto.NetworkInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; import org.gridsuite.modification.server.service.ReportService; @@ -233,7 +232,10 @@ private static ObjectMapper getObjectMapper() { return new ObjectMapper().registerModule(new JavaTimeModule()); } - public static NetworkModificationResult applyModificationsBlocking(NetworkModificationApplicator applicator, ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) { - return applicator.applyModifications(modificationInfosGroup, networkInfos).join(); + public static NetworkModificationResult applyModificationsBlocking(NetworkModificationApplicator applicator, + ModificationApplicationGroup modificationInfosGroup, + UUID networkUuid, + String variantId) { + return applicator.applyModificationGroupIncremental(modificationInfosGroup, networkUuid, variantId).join(); } }