Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
* @author David Braquart <david.braquart at rte-france.com>
Expand Down Expand Up @@ -93,6 +95,18 @@ public List<ServiceStatusInfos> getOptionalServices() {
return results.stream().map(CompletableFuture::join).toList();
}

public Map<String, ServiceStatusInfos> getOptionalServicesAsMap() {
List<CompletableFuture<ServiceStatusInfos>> results = remoteServicesProperties.getServices().stream()
.filter(RemoteServicesProperties.Service::isOptional)
.map(service -> asyncSelf.isOptionalServiceUp(service).thenApply(isUp -> ServiceStatusInfos.builder()
.name(service.getName())
.status(Boolean.TRUE.equals(isUp) ? ServiceStatus.UP : ServiceStatus.DOWN)
.build()))
.toList();
CompletableFuture.allOf(results.toArray(CompletableFuture[]::new)).join();
return results.stream().map(CompletableFuture::join).collect(Collectors.toMap(ServiceStatusInfos::name, Function.identity()));
}

/**
* Check if an optional service is up and running.
* This method is specifically designed for optional services and uses debug-level logging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.gridsuite.study.server.service.shortcircuit.ShortCircuitService;
import org.gridsuite.study.server.service.shortcircuit.ShortcircuitAnalysisType;
import org.gridsuite.study.server.utils.ResultParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
Expand Down
48 changes: 38 additions & 10 deletions src/main/java/org/gridsuite/study/server/service/StudyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.gridsuite.study.server.repository.rootnetwork.RootNetworkEntity;
import org.gridsuite.study.server.repository.rootnetwork.RootNetworkRequestEntity;
import org.gridsuite.study.server.repository.voltageinit.StudyVoltageInitParametersEntity;
import org.gridsuite.study.server.service.client.RemoteServiceName;
import org.gridsuite.study.server.service.common.ComputationParameters;
import org.gridsuite.study.server.service.common.ComputationParametersService;
import org.gridsuite.study.server.service.dynamicmargincalculation.DynamicMarginCalculationService;
Expand Down Expand Up @@ -89,6 +90,7 @@
import static org.gridsuite.study.server.dto.ComputationType.*;
import static org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ALL_WITH_BLOCK_NODES;
import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*;
import static org.gridsuite.study.server.service.client.RemoteServiceName.*;

/**
* @author Abdelsalem Hedhili <abdelsalem.hedhili at rte-france.com>
Expand Down Expand Up @@ -139,6 +141,7 @@ public class StudyService {
private final RootNetworkNodeInfoService rootNetworkNodeInfoService;
private final DirectoryService directoryService;
private final ComputationParametersService computationParametersService;
private RemoteServicesInspector remoteServicesInspector;

private final ObjectMapper objectMapper;

Expand Down Expand Up @@ -203,7 +206,8 @@ public StudyService(
RootNetworkService rootNetworkService,
RootNetworkNodeInfoService rootNetworkNodeInfoService,
DirectoryService directoryService,
ComputationParametersService computationParametersService) {
ComputationParametersService computationParametersService,
RemoteServicesInspector remoteServicesInspector) {
this.studyRepository = studyRepository;
this.studyCreationRequestRepository = studyCreationRequestRepository;
this.networkStoreService = networkStoreService;
Expand Down Expand Up @@ -241,6 +245,7 @@ public StudyService(
this.rootNetworkNodeInfoService = rootNetworkNodeInfoService;
this.directoryService = directoryService;
this.computationParametersService = computationParametersService;
this.remoteServicesInspector = remoteServicesInspector;
}

private CreatedStudyBasicInfos toStudyInfos(UUID studyUuid) {
Expand Down Expand Up @@ -3709,21 +3714,44 @@ private List<CurrentLimitViolationInfos> getCurrentLimitViolations(UUID nodeUuid

public Map<ComputationType, String> getAllComputationsStatus(@NonNull UUID studyUuid, @NonNull UUID rootNetworkUuid, @NonNull UUID nodeUuid) {
assertIsStudyExist(studyUuid);
Map<String, ServiceStatusInfos> serviceStatusInfos = remoteServicesInspector.getOptionalServicesAsMap();
Map<ComputationType, String> allComputationStatus = new EnumMap<>(ComputationType.class);
allComputationStatus.put(LOAD_FLOW, rootNetworkNodeInfoService.getLoadFlowStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(SECURITY_ANALYSIS, rootNetworkNodeInfoService.getSecurityAnalysisStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(PCC_MIN, rootNetworkNodeInfoService.getPccMinStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(DYNAMIC_MARGIN_CALCULATION, rootNetworkNodeInfoService.getDynamicMarginCalculationStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(DYNAMIC_SECURITY_ANALYSIS, rootNetworkNodeInfoService.getDynamicSecurityAnalysisStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(DYNAMIC_SIMULATION, rootNetworkNodeInfoService.getDynamicSimulationStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(STATE_ESTIMATION, rootNetworkNodeInfoService.getStateEstimationStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(SENSITIVITY_ANALYSIS, rootNetworkNodeInfoService.getSensitivityAnalysisStatus(nodeUuid, rootNetworkUuid));
allComputationStatus.put(SHORT_CIRCUIT_ONE_BUS, rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, ShortcircuitAnalysisType.ONE_BUS));
allComputationStatus.put(SHORT_CIRCUIT, rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, ShortcircuitAnalysisType.ALL_BUSES));
if (checkOptionalServiceIsUp(serviceStatusInfos, SECURITY_ANALYSIS_SERVER)) {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
allComputationStatus.put(SECURITY_ANALYSIS, rootNetworkNodeInfoService.getSecurityAnalysisStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, PCC_MIN_SERVER)) {
allComputationStatus.put(PCC_MIN, rootNetworkNodeInfoService.getPccMinStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, DYNAMIC_MAPPING_SERVER)) {
allComputationStatus.put(DYNAMIC_MARGIN_CALCULATION, rootNetworkNodeInfoService.getDynamicMarginCalculationStatus(nodeUuid, rootNetworkUuid));
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
if (checkOptionalServiceIsUp(serviceStatusInfos, DYNAMIC_SECURITY_ANALYSIS_SERVER)) {
allComputationStatus.put(DYNAMIC_SECURITY_ANALYSIS, rootNetworkNodeInfoService.getDynamicSecurityAnalysisStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, DYNAMIC_SIMULATION_SERVER)) {
allComputationStatus.put(DYNAMIC_SIMULATION, rootNetworkNodeInfoService.getDynamicSimulationStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, STATE_ESTIMATION_SERVER)) {
allComputationStatus.put(STATE_ESTIMATION, rootNetworkNodeInfoService.getStateEstimationStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, SENSITIVITY_ANALYSIS_SERVER)) {
allComputationStatus.put(SENSITIVITY_ANALYSIS, rootNetworkNodeInfoService.getSensitivityAnalysisStatus(nodeUuid, rootNetworkUuid));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, SHORTCIRCUIT_SERVER)) {
allComputationStatus.put(SHORT_CIRCUIT_ONE_BUS, rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, ShortcircuitAnalysisType.ONE_BUS));
allComputationStatus.put(SHORT_CIRCUIT, rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, ShortcircuitAnalysisType.ALL_BUSES));
}
if (checkOptionalServiceIsUp(serviceStatusInfos, VOLTAGE_INIT_SERVER)) {
allComputationStatus.put(VOLTAGE_INITIALIZATION, rootNetworkNodeInfoService.getVoltageInitStatus(nodeUuid, rootNetworkUuid));
}
return allComputationStatus;
}

private boolean checkOptionalServiceIsUp(Map<String, ServiceStatusInfos> serviceStatusInfos, RemoteServiceName remoteServiceName) {
return serviceStatusInfos.containsKey(remoteServiceName.serviceName()) && serviceStatusInfos.get(remoteServiceName.serviceName()).status() == ServiceStatusInfos.ServiceStatus.UP;
}

public void invalidateStudyRootNetwork(UUID studyUuid, UUID rootNetworkUuid, String userId) {
rootNetworkService.assertIsRootNetworkInStudy(studyUuid, rootNetworkUuid);
var rootNodeUuid = networkModificationTreeService.getStudyRootNodeUuid(studyUuid);
Expand Down
9 changes: 9 additions & 0 deletions src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,30 @@ gridsuite:
-
name: security-analysis-server
base-uri: http://localhost:5023
optional: true
-
name: report-server
base-uri: http://localhost:5028
-
name: sensitivity-analysis-server
base-uri: http://localhost:5030
optional: true
-
name: shortcircuit-server
base-uri: http://localhost:5031
optional: true
-
name: dynamic-simulation-server
base-uri: http://localhost:5032
optional: true
-
name: dynamic-security-analysis-server
base-uri: http://localhost:5040
optional: true
-
name: dynamic-margin-calculation-server
base-uri: http://localhost:5041
optional: true
-
name: timeseries-server
base-uri: http://localhost:5037
Expand All @@ -73,6 +79,7 @@ gridsuite:
-
name: voltage-init-server
base-uri: http://localhost:5038
optional: true
-
name: filter-server
base-uri: http://localhost:5027
Expand All @@ -82,9 +89,11 @@ gridsuite:
-
name: state-estimation-server
base-uri: http://localhost:6040
optional: true
-
name: pcc-min-server
base-uri: http://localhost:6042
optional: true
-
name: study-config-server
base-uri: http://localhost:5035/
Expand Down
Loading