Skip to content

Commit e559467

Browse files
authored
Computation debug mode (#737)
Signed-off-by: Thang PHAM <[email protected]>
1 parent a43d350 commit e559467

File tree

20 files changed

+196
-58
lines changed

20 files changed

+196
-58
lines changed

src/main/java/org/gridsuite/study/server/StudyConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ private StudyConstants() {
6363
public static final String QUERY_PARAM_REPORT_SEVERITY_LEVEL = "severityLevels";
6464
public static final String QUERY_PARAM_MESSAGE_FILTER = "message";
6565

66+
public static final String QUERY_PARAM_DEBUG = "debug";
6667
public static final String QUERY_PARAM_RECEIVER = "receiver";
6768
public static final String QUERY_PARAM_WORKFLOW_TYPE = "workflowType";
6869
public static final String QUERY_PARAM_WORKFLOW_INFOS = "workflowInfos";

src/main/java/org/gridsuite/study/server/StudyException.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public enum Type {
113113
CREATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED,
114114
CREATE_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PARAMETERS_FAILED,
115115
RUN_DYNAMIC_SECURITY_ANALYSIS_FAILED,
116+
RUN_DYNAMIC_SIMULATION_FAILED,
116117
INVALIDATE_DYNAMIC_SECURITY_ANALYSIS_FAILED,
117118
DUPLICATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED,
118119
UPDATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED,

src/main/java/org/gridsuite/study/server/controller/StudyController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,10 +1928,11 @@ public ResponseEntity<Void> deleteDynamicSimulationEvents(@Parameter(description
19281928
public ResponseEntity<Void> runDynamicSimulation(@Parameter(description = "studyUuid") @PathVariable("studyUuid") UUID studyUuid,
19291929
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
19301930
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
1931+
@Parameter(description = "debug") @RequestParam(name = "debug", required = false, defaultValue = "false") boolean debug,
19311932
@RequestBody(required = false) DynamicSimulationParametersInfos parameters,
19321933
@RequestHeader(HEADER_USER_ID) String userId) {
19331934
studyService.assertIsNodeNotReadOnly(nodeUuid);
1934-
studyService.runDynamicSimulation(studyUuid, nodeUuid, rootNetworkUuid, parameters, userId);
1935+
studyService.runDynamicSimulation(studyUuid, nodeUuid, rootNetworkUuid, parameters, userId, debug);
19351936
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).build();
19361937
}
19371938

@@ -2018,9 +2019,10 @@ public ResponseEntity<String> getDynamicSecurityAnalysisParameters(
20182019
public ResponseEntity<Void> runDynamicSecurityAnalysis(@Parameter(description = "studyUuid") @PathVariable("studyUuid") UUID studyUuid,
20192020
@Parameter(description = "root network id") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
20202021
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
2022+
@Parameter(description = "debug") @RequestParam(name = "debug", required = false, defaultValue = "false") boolean debug,
20212023
@RequestHeader(HEADER_USER_ID) String userId) {
20222024
studyService.assertIsNodeNotReadOnly(nodeUuid);
2023-
studyService.runDynamicSecurityAnalysis(studyUuid, nodeUuid, rootNetworkUuid, userId);
2025+
studyService.runDynamicSecurityAnalysis(studyUuid, nodeUuid, rootNetworkUuid, userId, debug);
20242026
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).build();
20252027
}
20262028

src/main/java/org/gridsuite/study/server/notification/NotificationService.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.cloud.stream.function.StreamBridge;
2020
import org.springframework.integration.support.MessageBuilder;
2121
import org.springframework.lang.NonNull;
22+
import org.springframework.lang.Nullable;
2223
import org.springframework.messaging.Message;
2324
import org.springframework.stereotype.Service;
2425

@@ -41,6 +42,7 @@ public class NotificationService {
4142
public static final String HEADER_STUDY_UUID = "studyUuid";
4243
public static final String HEADER_UPDATE_TYPE = "updateType";
4344
public static final String HEADER_COMPUTATION_TYPE = "computationType";
45+
public static final String HEADER_RESULT_UUID = "resultUuid";
4446
public static final String HEADER_UPDATE_TYPE_SUBSTATIONS_IDS = "substationsIds";
4547
public static final String HEADER_USER_ID = "userId";
4648
public static final String HEADER_MODIFIED_BY = "modifiedBy";
@@ -130,6 +132,7 @@ public class NotificationService {
130132
public static final String ROOT_NETWORKS_UPDATE_FAILED = "rootNetworksUpdateFailed";
131133

132134
public static final String STUDY_ALERT = "STUDY_ALERT";
135+
public static final String COMPUTATION_DEBUG_FILE_STATUS = "computationDebugFileStatus";
133136

134137
private static final String CATEGORY_BROKER_OUTPUT = NotificationService.class.getName() + ".output-broker-messages";
135138

@@ -412,6 +415,18 @@ public void emitStudyAlert(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid,
412415
}
413416
}
414417

418+
@PostCompletion
419+
public void emitComputationDebugFileStatus(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, ComputationType computationType, String userId, UUID resultUuid, @Nullable String error) {
420+
sendStudyUpdateMessage(studyUuid, COMPUTATION_DEBUG_FILE_STATUS, MessageBuilder.withPayload("")
421+
.setHeader(HEADER_NODE, nodeUuid)
422+
.setHeader(HEADER_ROOT_NETWORK_UUID, rootNetworkUuid)
423+
.setHeader(HEADER_COMPUTATION_TYPE, computationType.name())
424+
.setHeader(HEADER_USER_ID, userId)
425+
.setHeader(HEADER_RESULT_UUID, resultUuid)
426+
.setHeader(HEADER_ERROR, error)
427+
);
428+
}
429+
415430
private void emitRootNetworksUpdated(UUID studyUuid, List<UUID> rootNetworksUuids) {
416431
MessageBuilder<String> builder = MessageBuilder.withPayload("");
417432
if (!rootNetworksUuids.isEmpty()) {

src/main/java/org/gridsuite/study/server/service/ConsumerService.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public class ConsumerService {
5555
private static final String HEADER_CASE_FORMAT = "caseFormat";
5656
private static final String HEADER_CASE_NAME = "caseName";
5757
private static final String HEADER_WITH_RATIO_TAP_CHANGERS = "withRatioTapChangers";
58+
private static final String HEADER_ERROR_MESSAGE = "errorMessage";
5859

5960
private final ObjectMapper objectMapper;
6061

@@ -619,6 +620,18 @@ private void consumeLoadFlowResult(Message<String> msg, boolean withRatioTapChan
619620
}));
620621
}
621622

623+
public void consumeCalculationDebug(Message<String> msg, ComputationType computationType) {
624+
Optional.ofNullable(msg.getHeaders().get(RESULT_UUID, String.class))
625+
.map(UUID::fromString)
626+
.ifPresent(resultUuid -> getNodeReceiver(msg).ifPresent(receiverObj -> {
627+
UUID studyUuid = networkModificationTreeService.getStudyUuidForNodeId(receiverObj.getNodeUuid());
628+
629+
String errorMessage = (String) msg.getHeaders().get(HEADER_ERROR_MESSAGE);
630+
String userId = (String) msg.getHeaders().get(HEADER_USER_ID);
631+
notificationService.emitComputationDebugFileStatus(studyUuid, receiverObj.getNodeUuid(), receiverObj.getRootNetworkUuid(), computationType, userId, resultUuid, errorMessage);
632+
}));
633+
}
634+
622635
public void consumeCalculationResult(Message<String> msg, ComputationType computationType) {
623636
Optional.ofNullable(msg.getHeaders().get(RESULT_UUID, String.class))
624637
.map(UUID::fromString)
@@ -657,6 +670,11 @@ Optional<UUID> getStudyUuid(Message<String> msg) {
657670
return receiverObj.map(r -> networkModificationTreeService.getStudyUuidForNodeId(r.getNodeUuid()));
658671
}
659672

673+
@Bean
674+
public Consumer<Message<String>> consumeDsDebug() {
675+
return message -> consumeCalculationDebug(message, DYNAMIC_SIMULATION);
676+
}
677+
660678
@Bean
661679
public Consumer<Message<String>> consumeDsResult() {
662680
return message -> consumeCalculationResult(message, DYNAMIC_SIMULATION);
@@ -672,6 +690,11 @@ public Consumer<Message<String>> consumeDsFailed() {
672690
return message -> consumeCalculationFailed(message, DYNAMIC_SIMULATION);
673691
}
674692

693+
@Bean
694+
public Consumer<Message<String>> consumeDsaDebug() {
695+
return message -> consumeCalculationDebug(message, DYNAMIC_SECURITY_ANALYSIS);
696+
}
697+
675698
@Bean
676699
public Consumer<Message<String>> consumeDsaResult() {
677700
return message -> consumeCalculationResult(message, DYNAMIC_SECURITY_ANALYSIS);

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,7 +2784,8 @@ public void deleteDynamicSimulationEvents(UUID studyUuid, UUID nodeUuid, String
27842784
}
27852785

27862786
@Transactional
2787-
public UUID runDynamicSimulation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, DynamicSimulationParametersInfos parameters, String userId) {
2787+
public UUID runDynamicSimulation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, DynamicSimulationParametersInfos parameters,
2788+
String userId, boolean debug) {
27882789
Objects.requireNonNull(studyUuid);
27892790
Objects.requireNonNull(nodeUuid);
27902791

@@ -2824,7 +2825,8 @@ public UUID runDynamicSimulation(UUID studyUuid, UUID nodeUuid, UUID rootNetwork
28242825
// launch dynamic simulation
28252826
UUID networkUuid = rootNetworkService.getNetworkUuid(rootNetworkUuid);
28262827
String variantId = networkModificationTreeService.getVariantId(nodeUuid, rootNetworkUuid);
2827-
UUID dynamicSimulationResultUuid = dynamicSimulationService.runDynamicSimulation(getDynamicSimulationProvider(studyEntity), nodeUuid, rootNetworkUuid, networkUuid, variantId, reportUuid, mergeParameters, userId);
2828+
UUID dynamicSimulationResultUuid = dynamicSimulationService.runDynamicSimulation(getDynamicSimulationProvider(studyEntity),
2829+
nodeUuid, rootNetworkUuid, networkUuid, variantId, reportUuid, mergeParameters, userId, debug);
28282830

28292831
// update result uuid and notification
28302832
updateComputationResultUuid(nodeUuid, rootNetworkUuid, dynamicSimulationResultUuid, DYNAMIC_SIMULATION);
@@ -2901,7 +2903,7 @@ private void removeDynamicSecurityAnalysisParameters(@Nullable UUID dynamicSecur
29012903
}
29022904

29032905
@Transactional
2904-
public UUID runDynamicSecurityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, String userId) {
2906+
public UUID runDynamicSecurityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, String userId, boolean debug) {
29052907
Objects.requireNonNull(studyUuid);
29062908
Objects.requireNonNull(nodeUuid);
29072909

@@ -2934,7 +2936,7 @@ public UUID runDynamicSecurityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootN
29342936
UUID networkUuid = rootNetworkService.getNetworkUuid(rootNetworkUuid);
29352937
String variantId = networkModificationTreeService.getVariantId(nodeUuid, rootNetworkUuid);
29362938
UUID dynamicSecurityAnalysisResultUuid = dynamicSecurityAnalysisService.runDynamicSecurityAnalysis(getDynamicSimulationProvider(studyUuid),
2937-
nodeUuid, rootNetworkUuid, networkUuid, variantId, reportUuid, dynamicSimulationResultUuid, dynamicSecurityAnalysisParametersUuid, userId);
2939+
nodeUuid, rootNetworkUuid, networkUuid, variantId, reportUuid, dynamicSimulationResultUuid, dynamicSecurityAnalysisParametersUuid, userId, debug);
29382940

29392941
// update result uuid and notification
29402942
updateComputationResultUuid(nodeUuid, rootNetworkUuid, dynamicSecurityAnalysisResultUuid, DYNAMIC_SECURITY_ANALYSIS);

src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.gridsuite.study.server.service.client.dynamicsecurityanalysis;
99

1010
import org.apache.commons.collections4.CollectionUtils;
11+
import org.apache.commons.lang3.StringUtils;
1112
import org.gridsuite.study.server.RemoteServicesProperties;
1213
import org.gridsuite.study.server.StudyException;
1314
import org.gridsuite.study.server.dto.ReportInfos;
@@ -235,7 +236,7 @@ public UUID createDefaultParameters() {
235236

236237
public UUID run(String provider, @NonNull String receiver, @NonNull UUID networkUuid, String variantId,
237238
@NonNull ReportInfos reportInfos, @NonNull UUID dynamicSimulationResultUuid,
238-
@NonNull UUID parametersUuid, String userId) {
239+
@NonNull UUID parametersUuid, String userId, boolean debug) {
239240
Objects.requireNonNull(receiver);
240241
Objects.requireNonNull(networkUuid);
241242
Objects.requireNonNull(reportInfos);
@@ -245,12 +246,15 @@ public UUID run(String provider, @NonNull String receiver, @NonNull UUID network
245246
String runBaseUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SECURITY_ANALYSIS_API_VERSION, DYNAMIC_SECURITY_ANALYSIS_END_POINT_RUN);
246247

247248
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(runBaseUrl + "/{networkUuid}/run");
248-
if (variantId != null && !variantId.isBlank()) {
249+
if (StringUtils.isNotBlank(variantId)) {
249250
uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId);
250251
}
251-
if (provider != null && !provider.isBlank()) {
252+
if (StringUtils.isNotBlank(provider)) {
252253
uriComponentsBuilder.queryParam("provider", provider);
253254
}
255+
if (debug) {
256+
uriComponentsBuilder.queryParam(QUERY_PARAM_DEBUG, true);
257+
}
254258
uriComponentsBuilder
255259
.queryParam("dynamicSimulationResultUuid", dynamicSimulationResultUuid)
256260
.queryParam("parametersUuid", parametersUuid)
@@ -316,12 +320,12 @@ public void invalidateStatus(@NonNull List<UUID> resultUuids) {
316320
}
317321
}
318322

319-
public void deleteResults(List<UUID> resultsUuids) {
320-
if (resultsUuids != null && resultsUuids.isEmpty()) {
323+
public void deleteResults(List<UUID> resultUuids) {
324+
if (CollectionUtils.isEmpty(resultUuids)) {
321325
return;
322326
}
323327
String resultBaseUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SECURITY_ANALYSIS_API_VERSION, DYNAMIC_SECURITY_ANALYSIS_END_POINT_RESULT);
324-
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(resultBaseUrl).queryParam(QUERY_PARAM_RESULTS_UUIDS, resultsUuids);
328+
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(resultBaseUrl).queryParam(QUERY_PARAM_RESULTS_UUIDS, resultUuids);
325329
String path = uriComponentsBuilder.build().toUriString();
326330
// call dynamic-security-analysis REST API
327331
getRestTemplate().delete(path);

src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public interface DynamicSimulationClient extends RestClient {
2727
String DYNAMIC_SIMULATION_END_POINT_RESULT = "results";
2828
String DYNAMIC_SIMULATION_END_POINT_RESULT_COUNT = "supervision/results-count";
2929

30-
UUID run(String provider, String receiver, UUID networkUuid, String variantId, ReportInfos reportInfos, DynamicSimulationParametersInfos parameters, String userId);
30+
UUID run(String provider, String receiver, UUID networkUuid, String variantId, ReportInfos reportInfos,
31+
DynamicSimulationParametersInfos parameters, String userId, boolean debug);
3132

3233
UUID getTimeSeriesResult(UUID resultUuid);
3334

src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package org.gridsuite.study.server.service.client.dynamicsimulation.impl;
99

10+
import org.apache.commons.collections4.CollectionUtils;
11+
import org.apache.commons.lang3.StringUtils;
1012
import org.gridsuite.study.server.RemoteServicesProperties;
1113
import org.gridsuite.study.server.StudyException;
1214
import org.gridsuite.study.server.dto.ReportInfos;
@@ -29,8 +31,10 @@
2931

3032
import static org.gridsuite.study.server.StudyConstants.*;
3133
import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_SIMULATION_NOT_FOUND;
34+
import static org.gridsuite.study.server.StudyException.Type.RUN_DYNAMIC_SIMULATION_FAILED;
3235
import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID;
3336
import static org.gridsuite.study.server.service.client.util.UrlUtil.buildEndPointUrl;
37+
import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError;
3438

3539
/**
3640
* @author Thang PHAM <quyet-thang.pham at rte-france.com>
@@ -45,17 +49,20 @@ public DynamicSimulationClientImpl(RemoteServicesProperties remoteServicesProper
4549
}
4650

4751
@Override
48-
public UUID run(String provider, String receiver, UUID networkUuid, String variantId, ReportInfos reportInfos, DynamicSimulationParametersInfos parameters, String userId) {
52+
public UUID run(String provider, String receiver, UUID networkUuid, String variantId, ReportInfos reportInfos, DynamicSimulationParametersInfos parameters, String userId, boolean debug) {
4953
Objects.requireNonNull(networkUuid);
5054
String endPointUrl = buildEndPointUrl(getBaseUri(), API_VERSION, DYNAMIC_SIMULATION_END_POINT_RUN);
5155

5256
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endPointUrl + "/{networkUuid}/run");
53-
if (variantId != null && !variantId.isBlank()) {
57+
if (StringUtils.isNotBlank(variantId)) {
5458
uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId);
5559
}
56-
if (provider != null && !provider.isBlank()) {
60+
if (StringUtils.isNotBlank(provider)) {
5761
uriComponentsBuilder.queryParam("provider", provider);
5862
}
63+
if (debug) {
64+
uriComponentsBuilder.queryParam(QUERY_PARAM_DEBUG, true);
65+
}
5966
uriComponentsBuilder
6067
.queryParam("mappingName", parameters.getMapping())
6168
.queryParam(QUERY_PARAM_RECEIVER, receiver)
@@ -71,7 +78,11 @@ public UUID run(String provider, String receiver, UUID networkUuid, String varia
7178

7279
// call dynamic-simulation REST API
7380
HttpEntity<DynamicSimulationParametersInfos> httpEntity = new HttpEntity<>(parameters, headers);
74-
return getRestTemplate().postForObject(uriComponent.toUriString(), httpEntity, UUID.class);
81+
try {
82+
return getRestTemplate().postForObject(uriComponent.toUriString(), httpEntity, UUID.class);
83+
} catch (HttpStatusCodeException e) {
84+
throw handleHttpError(e, RUN_DYNAMIC_SIMULATION_FAILED);
85+
}
7586
}
7687

7788
@Override
@@ -139,7 +150,10 @@ public DynamicSimulationStatus getStatus(UUID resultUuid) {
139150

140151
@Override
141152
public void invalidateStatus(List<UUID> resultUuids) {
142-
Objects.requireNonNull(resultUuids);
153+
if (CollectionUtils.isEmpty(resultUuids)) {
154+
return;
155+
}
156+
143157
String endPointUrl = buildEndPointUrl(getBaseUri(), API_VERSION, DYNAMIC_SIMULATION_END_POINT_RESULT);
144158

145159
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endPointUrl + "/invalidate-status");
@@ -160,12 +174,13 @@ public void invalidateStatus(List<UUID> resultUuids) {
160174
}
161175

162176
@Override
163-
public void deleteResults(List<UUID> resultsUuids) {
164-
if (resultsUuids != null && resultsUuids.isEmpty()) {
177+
public void deleteResults(List<UUID> resultUuids) {
178+
if (CollectionUtils.isEmpty(resultUuids)) {
165179
return;
166180
}
181+
167182
String endPointUrl = buildEndPointUrl(getBaseUri(), API_VERSION, DYNAMIC_SIMULATION_END_POINT_RESULT);
168-
var uriComponents = UriComponentsBuilder.fromHttpUrl(endPointUrl).queryParam(QUERY_PARAM_RESULTS_UUIDS, resultsUuids);
183+
var uriComponents = UriComponentsBuilder.fromHttpUrl(endPointUrl).queryParam(QUERY_PARAM_RESULTS_UUIDS, resultUuids);
169184
// call dynamic-simulation REST API
170185
getRestTemplate().delete(uriComponents.build().toUriString());
171186
}

0 commit comments

Comments
 (0)