diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index d2ecd61df..50235bd00 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -2403,9 +2403,10 @@ public ResponseEntity exportFilters( public ResponseEntity runStateEstimation(@Parameter(description = "studyUuid") @PathVariable("studyUuid") UUID studyUuid, @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid, + @RequestParam(name = "debug", required = false, defaultValue = "false") boolean debug, @RequestHeader(HEADER_USER_ID) String userId) { studyService.assertIsNodeNotReadOnly(nodeUuid); - studyService.runStateEstimation(studyUuid, nodeUuid, rootNetworkUuid, userId); + studyService.runStateEstimation(studyUuid, nodeUuid, rootNetworkUuid, userId, debug); return ResponseEntity.ok().build(); } diff --git a/src/main/java/org/gridsuite/study/server/service/ConsumerService.java b/src/main/java/org/gridsuite/study/server/service/ConsumerService.java index 7adde6c7e..ba3bd0ca6 100644 --- a/src/main/java/org/gridsuite/study/server/service/ConsumerService.java +++ b/src/main/java/org/gridsuite/study/server/service/ConsumerService.java @@ -906,6 +906,11 @@ public Consumer> consumeStateEstimationResult() { return message -> consumeCalculationResult(message, STATE_ESTIMATION); } + @Bean + public Consumer> consumeStateEstimationDebug() { + return message -> consumeCalculationDebug(message, STATE_ESTIMATION); + } + @Bean public Consumer> consumeStateEstimationStopped() { return message -> consumeCalculationStopped(message, STATE_ESTIMATION); diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 7fa7804e5..9fe5f5ec8 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -74,7 +74,7 @@ public String getStateEstimationResult(UUID resultUuid) { return restTemplate.getForObject(stateEstimationServerServerBaseUri + path, String.class); } - public UUID runStateEstimation(UUID networkUuid, String variantId, UUID parametersUuid, ReportInfos reportInfos, String receiver, String userId) { + public UUID runStateEstimation(UUID networkUuid, String variantId, UUID parametersUuid, ReportInfos reportInfos, String receiver, String userId, boolean debug) { var uriComponentsBuilder = UriComponentsBuilder .fromPath(DELIMITER + STATE_ESTIMATION_API_VERSION + "/networks/{networkUuid}/run-and-save") .queryParam("reportUuid", reportInfos.reportUuid().toString()) @@ -86,6 +86,9 @@ public UUID runStateEstimation(UUID networkUuid, String variantId, UUID paramete if (!StringUtils.isBlank(variantId)) { uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId); } + if (debug) { + uriComponentsBuilder.queryParam(QUERY_PARAM_DEBUG, true); + } var path = uriComponentsBuilder.queryParam(QUERY_PARAM_RECEIVER, receiver).buildAndExpand(networkUuid).toUriString(); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index a31716c63..f69456e75 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -3574,11 +3574,11 @@ public String exportFilters(UUID rootNetworkUuid, List filtersUuid, UUID n } @Transactional - public UUID runStateEstimation(@NonNull UUID studyUuid, @NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid, String userId) { + public UUID runStateEstimation(@NonNull UUID studyUuid, @NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid, String userId, boolean debug) { StudyEntity studyEntity = getStudy(studyUuid); networkModificationTreeService.blockNode(rootNetworkUuid, nodeUuid); - return handleStateEstimationRequest(studyEntity, nodeUuid, rootNetworkUuid, userId); + return handleStateEstimationRequest(studyEntity, nodeUuid, rootNetworkUuid, userId, debug); } @Transactional @@ -3589,7 +3589,7 @@ public UUID runPccMin(@NonNull UUID studyUuid, @NonNull UUID nodeUuid, @NonNull return handlePccMinRequest(studyEntity, nodeUuid, rootNetworkUuid, userId); } - private UUID handleStateEstimationRequest(StudyEntity studyEntity, UUID nodeUuid, UUID rootNetworkUuid, String userId) { + private UUID handleStateEstimationRequest(StudyEntity studyEntity, UUID nodeUuid, UUID rootNetworkUuid, String userId, boolean debug) { UUID networkUuid = rootNetworkService.getNetworkUuid(rootNetworkUuid); String variantId = networkModificationTreeService.getVariantId(nodeUuid, rootNetworkUuid); UUID reportUuid = networkModificationTreeService.getComputationReports(nodeUuid, rootNetworkUuid).getOrDefault(STATE_ESTIMATION.name(), UUID.randomUUID()); @@ -3606,7 +3606,7 @@ private UUID handleStateEstimationRequest(StudyEntity studyEntity, UUID nodeUuid stateEstimationService.deleteStateEstimationResults(List.of(prevResultUuid)); } - UUID result = stateEstimationService.runStateEstimation(networkUuid, variantId, studyEntity.getStateEstimationParametersUuid(), new ReportInfos(reportUuid, nodeUuid), receiver, userId); + UUID result = stateEstimationService.runStateEstimation(networkUuid, variantId, studyEntity.getStateEstimationParametersUuid(), new ReportInfos(reportUuid, nodeUuid), receiver, userId, debug); updateComputationResultUuid(nodeUuid, rootNetworkUuid, result, STATE_ESTIMATION); notificationService.emitStudyChanged(studyEntity.getId(), nodeUuid, rootNetworkUuid, NotificationService.UPDATE_TYPE_STATE_ESTIMATION_STATUS); return result; diff --git a/src/main/resources/config/application.yaml b/src/main/resources/config/application.yaml index 2e12cf754..c1cd9ad0a 100644 --- a/src/main/resources/config/application.yaml +++ b/src/main/resources/config/application.yaml @@ -15,7 +15,7 @@ spring: consumeShortCircuitAnalysisDebug;consumeShortCircuitAnalysisResult;consumeShortCircuitAnalysisStopped;consumeShortCircuitAnalysisFailed;consumeShortCircuitAnalysisCancelFailed;\ consumeVoltageInitDebug;consumeVoltageInitResult;consumeVoltageInitStopped;consumeVoltageInitFailed;consumeVoltageInitCancelFailed;\ consumeLoadFlowResult;consumeLoadFlowStopped;consumeLoadFlowFailed;consumeLoadFlowCancelFailed;\ - consumeStateEstimationResult;consumeStateEstimationStopped;consumeStateEstimationFailed;\ + consumeStateEstimationResult;consumeStateEstimationDebug;consumeStateEstimationStopped;consumeStateEstimationFailed;\ consumePccMinResult;consumePccMinStopped;consumePccMinFailed;\ consumeNetworkExportFinished" stream: @@ -147,6 +147,9 @@ spring: consumeStateEstimationResult-in-0: destination: ${powsybl-ws.rabbitmq.destination.prefix:}stateestimation.result group: studyStateEstimationResultGroup + consumeStateEstimationDebug-in-0: + destination: ${powsybl-ws.rabbitmq.destination.prefix:}stateestimation.debug + group: studyStateEstimationDebugGroup consumeStateEstimationStopped-in-0: destination: ${powsybl-ws.rabbitmq.destination.prefix:}stateestimation.stopped group: studyStateEstimationStoppedGroup diff --git a/src/test/java/org/gridsuite/study/server/StateEstimationTest.java b/src/test/java/org/gridsuite/study/server/StateEstimationTest.java index 31608e1af..314638454 100644 --- a/src/test/java/org/gridsuite/study/server/StateEstimationTest.java +++ b/src/test/java/org/gridsuite/study/server/StateEstimationTest.java @@ -182,6 +182,9 @@ public MockResponse dispatch(RecordedRequest request) { if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?reportUuid=.*&reporterId=.*&reportType=StateEstimation&variantId=" + VARIANT_ID + "&receiver=.*")) { // estim with success return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), estimResultUuidStr); + } else if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?reportUuid=.*&reporterId=.*&reportType=StateEstimation&variantId=" + VARIANT_ID + "&debug=true&receiver=.*")) { + // debug estim with success + return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), estimResultUuidStr); } else if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?reportUuid=.*&reporterId=.*&reportType=StateEstimation&variantId=" + VARIANT_ID_2 + "&receiver=.*")) { // estim with failure input.send(MessageBuilder.withPayload("") @@ -452,4 +455,27 @@ private void createOrUpdateParametersAndDoChecks(UUID studyNameUserIdUuid, Strin Message message = output.receive(TIMEOUT, STUDY_UPDATE_DESTINATION); assertEquals(UPDATE_TYPE_COMPUTATION_PARAMETERS, message.getHeaders().get(NotificationService.HEADER_UPDATE_TYPE)); } + + @Test + void testDebugComputation(final MockWebServer server) throws Exception { + StudyNodeIds ids = createStudyAndNode(VARIANT_ID, "node 1", null); + mockMvc.perform(post(STATE_ESTIMATION_URL_BASE + "run", ids.studyId, ids.rootNetworkUuid, ids.nodeId) + .param("debug", "true") + .header("userId", "userId")) + .andExpect(status().isOk()); + consumeEstimResult(ids, STATE_ESTIMATION_RESULT_UUID); + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?reportUuid=.*&reporterId=.*&reportType=StateEstimation&variantId=" + VARIANT_ID + "&debug=true&receiver=.*"))); + + // get estim result + MvcResult mvcResult = mockMvc.perform(get(STATE_ESTIMATION_URL_BASE + "result", ids.studyId, ids.rootNetworkUuid, ids.nodeId)).andExpectAll( + status().isOk()).andReturn(); + assertEquals(TestUtils.resourceToString("/estim-result.json"), mvcResult.getResponse().getContentAsString()); + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID))); + + // get estim status + mockMvc.perform(get(STATE_ESTIMATION_URL_BASE + "status", ids.studyId, ids.rootNetworkUuid, ids.nodeId)).andExpectAll( + status().isOk(), + content().string(ESTIM_STATUS_JSON)); + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID + "/status"))); + } }