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 73b2ecaf6..9ac9eecf0 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -1016,11 +1016,9 @@ public ResponseEntity downloadExportedNetworkFile( public ResponseEntity runSecurityAnalysis(@Parameter(description = "studyUuid") @PathVariable("studyUuid") UUID studyUuid, @Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid, - @Parameter(description = "Contingency list names") @RequestParam(name = "contingencyListName", required = false) List contingencyListNames, @RequestHeader(HEADER_USER_ID) String userId) { - List nonNullcontingencyListNames = contingencyListNames != null ? contingencyListNames : Collections.emptyList(); studyService.assertIsNodeNotReadOnly(nodeUuid); - studyService.runSecurityAnalysis(studyUuid, nonNullcontingencyListNames, nodeUuid, rootNetworkUuid, userId); + studyService.runSecurityAnalysis(studyUuid, nodeUuid, rootNetworkUuid, userId); return ResponseEntity.ok().build(); } @@ -1063,8 +1061,8 @@ public byte[] getSecurityAnalysisResult(@Parameter(description = "study UUID") @ public ResponseEntity getContingencyCount(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, @Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid, - @Parameter(description = "Contingency list names") @RequestParam(name = "contingencyListName", required = false) List contingencyListNames) { - return ResponseEntity.ok().body(CollectionUtils.isEmpty(contingencyListNames) ? 0 : studyService.getContingencyCount(studyUuid, contingencyListNames, nodeUuid, rootNetworkUuid)); + @Parameter(description = "Contingency list names") @RequestParam(name = "contingencyListIds", required = false) List contingencyListIds) { + return ResponseEntity.ok().body(CollectionUtils.isEmpty(contingencyListIds) ? 0 : studyService.getContingencyCount(studyUuid, contingencyListIds, nodeUuid, rootNetworkUuid)); } @GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/limit-violations") @@ -2086,8 +2084,9 @@ public ResponseEntity getDynamicSecurityAnalysisStatus(@Parameter(descri @Operation(summary = "Get security analysis parameters on study") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis parameters")}) public ResponseEntity getSecurityAnalysisParametersValues( - @PathVariable("studyUuid") UUID studyUuid) { - return ResponseEntity.ok().body(studyService.getSecurityAnalysisParametersValues(studyUuid)); + @PathVariable("studyUuid") UUID studyUuid, + @RequestHeader(HEADER_USER_ID) String userId) { + return ResponseEntity.ok().body(studyService.getSecurityAnalysisParametersValues(studyUuid, userId)); } @PostMapping(value = "/studies/{studyUuid}/security-analysis/parameters") diff --git a/src/main/java/org/gridsuite/study/server/dto/RunSecurityAnalysisParametersInfos.java b/src/main/java/org/gridsuite/study/server/dto/RunSecurityAnalysisParametersInfos.java index 875afa230..6cb5e0d69 100644 --- a/src/main/java/org/gridsuite/study/server/dto/RunSecurityAnalysisParametersInfos.java +++ b/src/main/java/org/gridsuite/study/server/dto/RunSecurityAnalysisParametersInfos.java @@ -9,7 +9,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; import java.util.UUID; /** @@ -22,7 +21,4 @@ public class RunSecurityAnalysisParametersInfos { private UUID securityAnalysisParametersUuid; private UUID loadFlowParametersUuid; - - private List contingencyListNames; - } diff --git a/src/main/java/org/gridsuite/study/server/service/ActionsService.java b/src/main/java/org/gridsuite/study/server/service/ActionsService.java index 9d42e9bff..71b2591a3 100644 --- a/src/main/java/org/gridsuite/study/server/service/ActionsService.java +++ b/src/main/java/org/gridsuite/study/server/service/ActionsService.java @@ -38,10 +38,10 @@ public ActionsService(RemoteServicesProperties remoteServicesProperties, RestTem this.restTemplate = restTemplate; } - public Integer getContingencyCount(UUID networkUuid, String variantId, List contingencyListNames) { + public Integer getContingencyCount(UUID networkUuid, String variantId, List contingencyListIds) { var uriComponentsBuilder = UriComponentsBuilder .fromPath(DELIMITER + ACTIONS_API_VERSION + "/contingency-lists/count") - .queryParam(CONTINGENCY_LIST_IDS, contingencyListNames) + .queryParam(CONTINGENCY_LIST_IDS, contingencyListIds) .queryParam(NETWORK_UUID, networkUuid); if (!StringUtils.isBlank(variantId)) { uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId); 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 197b1ec85..a9536e77a 100644 --- a/src/main/java/org/gridsuite/study/server/service/ConsumerService.java +++ b/src/main/java/org/gridsuite/study/server/service/ConsumerService.java @@ -372,7 +372,7 @@ private UUID createDefaultSecurityAnalysisParameters(String userId, UserProfileI if (userProfileInfos != null && userProfileInfos.getSecurityAnalysisParameterId() != null) { // try to access/duplicate the user profile security analysis parameters try { - return securityAnalysisService.duplicateSecurityAnalysisParameters(userProfileInfos.getSecurityAnalysisParameterId()); + return securityAnalysisService.duplicateSecurityAnalysisParameters(userProfileInfos.getSecurityAnalysisParameterId(), userId); } catch (Exception e) { // TODO try to report a log in Root subreporter ? LOGGER.error(String.format("Could not duplicate security analysis parameters with id '%s' from user/profile '%s/%s'. Using default parameters", diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index af8841b98..ac30831ef 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -141,8 +141,7 @@ public UUID runSecurityAnalysis(UUID networkUuid, String variantId, RunSecurityA if (parametersInfos.getLoadFlowParametersUuid() != null) { uriComponentsBuilder.queryParam("loadFlowParametersUuid", parametersInfos.getLoadFlowParametersUuid()); } - var path = uriComponentsBuilder.queryParam("contingencyListName", parametersInfos.getContingencyListNames()) - .queryParam(QUERY_PARAM_RECEIVER, receiver).buildAndExpand(networkUuid).toUriString(); + var path = uriComponentsBuilder.queryParam(QUERY_PARAM_RECEIVER, receiver).buildAndExpand(networkUuid).toUriString(); HttpHeaders headers = new HttpHeaders(); headers.set(HEADER_USER_ID, userId); @@ -237,7 +236,7 @@ public void updateSecurityAnalysisParameters(UUID parametersUuid, @Nullable Stri restTemplate.put(securityAnalysisServerBaseUri + path, httpEntity); } - public UUID duplicateSecurityAnalysisParameters(UUID sourceParametersUuid) { + public UUID duplicateSecurityAnalysisParameters(UUID sourceParametersUuid, String userId) { Objects.requireNonNull(sourceParametersUuid); var path = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + DELIMITER + PATH_PARAM_PARAMETERS) @@ -245,19 +244,23 @@ public UUID duplicateSecurityAnalysisParameters(UUID sourceParametersUuid) { .buildAndExpand().toUriString(); HttpHeaders headers = new HttpHeaders(); + headers.set(HEADER_USER_ID, userId); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity httpEntity = new HttpEntity<>(null, headers); - return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, UUID.class).getBody(); + return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(null, headers), UUID.class).getBody(); } - public String getSecurityAnalysisParameters(UUID parametersUuid) { + public String getSecurityAnalysisParameters(UUID parametersUuid, String userId) { Objects.requireNonNull(parametersUuid); String path = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + PARAMETERS_URI) .buildAndExpand(parametersUuid).toUriString(); - return restTemplate.getForObject(securityAnalysisServerBaseUri + path, String.class); + HttpHeaders headers = new HttpHeaders(); + headers.set(HEADER_USER_ID, userId); + headers.setContentType(MediaType.APPLICATION_JSON); + + return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.GET, new HttpEntity<>(null, headers), String.class).getBody(); } public UUID getSecurityAnalysisParametersUuidOrElseCreateDefaults(StudyEntity studyEntity) { 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 23ab3ed24..2496d1684 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -690,7 +690,7 @@ private StudyEntity duplicateStudy(BasicStudyInfos studyInfos, UUID sourceStudyU StudyEntity sourceStudy = getStudy(sourceStudyUuid); - StudyEntity newStudyEntity = duplicateStudyEntity(sourceStudy, studyInfos.getId()); + StudyEntity newStudyEntity = duplicateStudyEntity(sourceStudy, studyInfos.getId(), userId); rootNetworkService.duplicateStudyRootNetworks(newStudyEntity, sourceStudy); networkModificationTreeService.duplicateStudyNodes(newStudyEntity, sourceStudy); duplicateStudyNodeAliases(newStudyEntity, sourceStudy); @@ -702,7 +702,7 @@ private StudyEntity duplicateStudy(BasicStudyInfos studyInfos, UUID sourceStudyU return newStudyEntity; } - private StudyEntity duplicateStudyEntity(StudyEntity sourceStudyEntity, UUID newStudyId) { + private StudyEntity duplicateStudyEntity(StudyEntity sourceStudyEntity, UUID newStudyId, String userId) { UUID copiedLoadFlowParametersUuid = null; if (sourceStudyEntity.getLoadFlowParametersUuid() != null) { copiedLoadFlowParametersUuid = loadflowService.duplicateLoadFlowParameters(sourceStudyEntity.getLoadFlowParametersUuid()); @@ -715,7 +715,7 @@ private StudyEntity duplicateStudyEntity(StudyEntity sourceStudyEntity, UUID new UUID copiedSecurityAnalysisParametersUuid = null; if (sourceStudyEntity.getSecurityAnalysisParametersUuid() != null) { - copiedSecurityAnalysisParametersUuid = securityAnalysisService.duplicateSecurityAnalysisParameters(sourceStudyEntity.getSecurityAnalysisParametersUuid()); + copiedSecurityAnalysisParametersUuid = securityAnalysisService.duplicateSecurityAnalysisParameters(sourceStudyEntity.getSecurityAnalysisParametersUuid(), userId); } UUID copiedSensitivityAnalysisParametersUuid = null; @@ -1178,9 +1178,9 @@ public LoadFlowParametersInfos getLoadFlowParametersInfos(StudyEntity studyEntit } @Transactional - public String getSecurityAnalysisParametersValues(UUID studyUuid) { + public String getSecurityAnalysisParametersValues(UUID studyUuid, String userId) { StudyEntity studyEntity = getStudy(studyUuid); - return securityAnalysisService.getSecurityAnalysisParameters(securityAnalysisService.getSecurityAnalysisParametersUuidOrElseCreateDefaults(studyEntity)); + return securityAnalysisService.getSecurityAnalysisParameters(securityAnalysisService.getSecurityAnalysisParametersUuidOrElseCreateDefaults(studyEntity), userId); } @Transactional @@ -1407,14 +1407,14 @@ private void removeShortcircuitParameters(@Nullable UUID shortcircuitParametersU } @Transactional - public UUID runSecurityAnalysis(@NonNull UUID studyUuid, @NonNull List contingencyListNames, @NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid, String userId) { + public UUID runSecurityAnalysis(@NonNull UUID studyUuid, @NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid, String userId) { StudyEntity study = getStudy(studyUuid); networkModificationTreeService.blockNode(rootNetworkUuid, nodeUuid); - return handleSecurityAnalysisRequest(study, nodeUuid, rootNetworkUuid, contingencyListNames, userId); + return handleSecurityAnalysisRequest(study, nodeUuid, rootNetworkUuid, userId); } - private UUID handleSecurityAnalysisRequest(StudyEntity study, UUID nodeUuid, UUID rootNetworkUuid, List contingencyListNames, String userId) { + private UUID handleSecurityAnalysisRequest(StudyEntity study, UUID nodeUuid, UUID rootNetworkUuid, String userId) { UUID networkUuid = rootNetworkService.getNetworkUuid(rootNetworkUuid); String variantId = networkModificationTreeService.getVariantId(nodeUuid, rootNetworkUuid); UUID saReportUuid = networkModificationTreeService.getComputationReports(nodeUuid, rootNetworkUuid).getOrDefault(SECURITY_ANALYSIS.name(), UUID.randomUUID()); @@ -1432,7 +1432,7 @@ private UUID handleSecurityAnalysisRequest(StudyEntity study, UUID nodeUuid, UUI securityAnalysisService.deleteSecurityAnalysisResults(List.of(prevResultUuid)); } - var runSecurityAnalysisParametersInfos = new RunSecurityAnalysisParametersInfos(study.getSecurityAnalysisParametersUuid(), study.getLoadFlowParametersUuid(), contingencyListNames); + var runSecurityAnalysisParametersInfos = new RunSecurityAnalysisParametersInfos(study.getSecurityAnalysisParametersUuid(), study.getLoadFlowParametersUuid()); UUID result = securityAnalysisService.runSecurityAnalysis(networkUuid, variantId, runSecurityAnalysisParametersInfos, new ReportInfos(saReportUuid, nodeUuid), receiver, userId); updateComputationResultUuid(nodeUuid, rootNetworkUuid, result, SECURITY_ANALYSIS); @@ -1440,15 +1440,15 @@ private UUID handleSecurityAnalysisRequest(StudyEntity study, UUID nodeUuid, UUI return result; } - public Integer getContingencyCount(UUID studyUuid, List contingencyListNames, UUID nodeUuid, UUID rootNetworkUuid) { + public Integer getContingencyCount(UUID studyUuid, List contingencyListIds, UUID nodeUuid, UUID rootNetworkUuid) { Objects.requireNonNull(studyUuid); - Objects.requireNonNull(contingencyListNames); + Objects.requireNonNull(contingencyListIds); Objects.requireNonNull(nodeUuid); UUID networkuuid = rootNetworkService.getNetworkUuid(rootNetworkUuid); String variantId = networkModificationTreeService.getVariantId(nodeUuid, rootNetworkUuid); - return actionsService.getContingencyCount(networkuuid, variantId, contingencyListNames); + return actionsService.getContingencyCount(networkuuid, variantId, contingencyListIds); } public List getLimitViolations(@NonNull UUID nodeUuid, UUID rootNetworkUuid, String filters, String globalFilters, Sort sort) { @@ -1750,7 +1750,7 @@ public boolean createOrUpdateSecurityAnalysisParameters(StudyEntity studyEntity, if (parameters == null && userProfileInfos.getSecurityAnalysisParameterId() != null) { // reset case, with existing profile, having default security analysis params try { - UUID securityAnalysisParametersFromProfileUuid = securityAnalysisService.duplicateSecurityAnalysisParameters(userProfileInfos.getSecurityAnalysisParameterId()); + UUID securityAnalysisParametersFromProfileUuid = securityAnalysisService.duplicateSecurityAnalysisParameters(userProfileInfos.getSecurityAnalysisParameterId(), userId); studyEntity.setSecurityAnalysisParametersUuid(securityAnalysisParametersFromProfileUuid); removeSecurityAnalysisParameters(existingSecurityAnalysisParametersUuid); return userProfileIssue; diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java index c8fc7d0ff..353a8eced 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java @@ -83,7 +83,7 @@ class SecurityAnalysisTest { private static final String SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID = "11111111-9594-4e55-8ec7-07ea965d24eb"; private static final String SECURITY_ANALYSIS_ERROR_NODE_RESULT_UUID = "22222222-9594-4e55-8ec7-07ea965d24eb"; private static final String NOT_FOUND_NODE_UUID = "e3a85c9b-9594-4e55-8ec7-07ea965d24eb"; - private static final String CONTINGENCY_LIST_NAME = "ls"; + private static final String CONTINGENCY_LIST_ID = "7f611fba-1abf-4988-9303-48524a37836b"; private String limitTypeJson; private static final String SECURITY_ANALYSIS_N_RESULT_JSON = "{\"status\":\"CONVERGED\",\"limitViolationsResult\":{\"limitViolations\":[{\"subjectId\":\"l3\",\"limitType\":\"CURRENT\",\"acceptableDuration\":1200,\"limit\":10.0,\"limitReduction\":1.0,\"value\":11.0,\"side\":\"ONE\"}],\"actionsTaken\":[]},\"networkResult\":{\"branchResults\":[],\"busResults\":[],\"threeWindingsTransformerResults\":[]}}"; private static final String SECURITY_ANALYSIS_NMK_CONTINGENCIES_RESULT_JSON = "[{\"id\":\"l1\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l1\",\"elementType\":\"BRANCH\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l2\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l2\",\"elementType\":\"GENERATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l3\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l3\",\"elementType\":\"BUSBAR_SECTION\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l4\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l4\",\"elementType\":\"LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l6\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l6\",\"elementType\":\"HVDC_LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l7\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l7\",\"elementType\":\"DANGLING_LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l8\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l8\",\"elementType\":\"SHUNT_COMPENSATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l9\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l9\",\"elementType\":\"TWO_WINDINGS_TRANSFORMER\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"la\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l0\",\"elementType\":\"THREE_WINDINGS_TRANSFORMER\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"lb\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"la\",\"elementType\":\"STATIC_VAR_COMPENSATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]}]"; @@ -286,8 +286,8 @@ void getResultZippedCsv() throws Exception { * RUN SECURITY ANALYSIS START */ computationServerStubs.stubComputationRun(NETWORK_UUID_STRING, null, SECURITY_ANALYSIS_RESULT_UUID); - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid, firstRootNetworkUuid, nodeUuid, CONTINGENCY_LIST_NAME).header(HEADER_USER_ID, "testUserId")).andExpect(status().isOk()); + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid, firstRootNetworkUuid, nodeUuid).header(HEADER_USER_ID, "testUserId")).andExpect(status().isOk()); consumeSAResult(studyUuid, firstRootNetworkUuid, nodeUuid, SECURITY_ANALYSIS_RESULT_UUID); @@ -391,8 +391,8 @@ void getResultZippedCsvNotFound() throws Exception { * RUN SECURITY ANALYSIS START */ computationServerStubs.stubComputationRun(NETWORK_UUID_STRING, null, SECURITY_ANALYSIS_RESULT_UUID); - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid, firstRootNetworkUuid, nodeUuid, CONTINGENCY_LIST_NAME).header(HEADER_USER_ID, "testUserId")).andExpect(status().isOk()); + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid, firstRootNetworkUuid, nodeUuid).header(HEADER_USER_ID, "testUserId")).andExpect(status().isOk()); consumeSAResult(studyUuid, firstRootNetworkUuid, nodeUuid, SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID); @@ -439,9 +439,9 @@ void testResetUuidResultWhenSAFailed() throws Exception { doAnswer(invocation -> { input.send(MessageBuilder.withPayload("").setHeader(HEADER_RECEIVER, resultUuidJson).build(), saFailedDestination); return resultUuid; - }).when(studyService).runSecurityAnalysis(any(), any(), any(), any(), any()); + }).when(studyService).runSecurityAnalysis(any(), any(), any(), any()); assertNotNull(studyEntity.getId()); - studyService.runSecurityAnalysis(studyEntity.getId(), List.of(), modificationNode.getId(), rootNetworkUuid, ""); + studyService.runSecurityAnalysis(studyEntity.getId(), modificationNode.getId(), rootNetworkUuid, ""); // Test reset uuid result in the database assertNull(rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), rootNetworkUuid, SECURITY_ANALYSIS)); @@ -467,8 +467,8 @@ void testSecurityAnalysis() throws Exception { UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid); // attempt run security analysis on root node → forbidden (not allowed) - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={name}", - studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, CONTINGENCY_LIST_NAME) + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid) .header(HEADER_USER_ID, "testUserId")) .andExpect(status().isForbidden()); @@ -479,8 +479,8 @@ void testSecurityAnalysis() throws Exception { // run additional security analysis for deletion test MockHttpServletRequestBuilder requestBuilder = post( - "/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyNameUserIdUuid, firstRootNetworkUuid, modificationNode1Uuid, CONTINGENCY_LIST_NAME + "/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyNameUserIdUuid, firstRootNetworkUuid, modificationNode1Uuid ); requestBuilder .contentType(MediaType.APPLICATION_JSON) @@ -518,7 +518,7 @@ void testSecurityAnalysis() throws Exception { private void consumeSAResult(UUID studyUuid, UUID rootNetworkUuid, UUID nodeUuid, String resultUuid) throws JsonProcessingException { // Verify that WireMock received exactly 1 POST request to run security analysis - computationServerStubs.verifyComputationRun(NETWORK_UUID_STRING, Map.of("contingencyListName", WireMock.equalTo(CONTINGENCY_LIST_NAME), "receiver", WireMock.matching(".*" + nodeUuid + ".*"))); + computationServerStubs.verifyComputationRun(NETWORK_UUID_STRING, Map.of("receiver", WireMock.matching(".*" + nodeUuid + ".*"))); // consume SA result String resultUuidJson = objectMapper.writeValueAsString(new NodeReceiver(nodeUuid, rootNetworkUuid)); MessageHeaders messageHeaders = new MessageHeaders(Map.of("resultUuid", resultUuid, HEADER_RECEIVER, resultUuidJson)); @@ -555,8 +555,8 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUuid, // --- 2. Run security analysis --- computationServerStubs.stubComputationRun(NETWORK_UUID_STRING, null, resultUuid); - MockHttpServletRequestBuilder requestBuilder = post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid, rootNetworkUuid, nodeUuid, CONTINGENCY_LIST_NAME); + MockHttpServletRequestBuilder requestBuilder = post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid, rootNetworkUuid, nodeUuid); if (securityAnalysisParameters != null) { requestBuilder.contentType(MediaType.APPLICATION_JSON) .content(objectWriter.writeValueAsString(securityAnalysisParameters)); @@ -657,13 +657,13 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUuid, // get contingency count wireMockServer.stubFor(get(urlPathEqualTo("/v1/contingency-lists/count")) - .withQueryParam("ids", equalTo(CONTINGENCY_LIST_NAME)) + .withQueryParam("ids", equalTo(CONTINGENCY_LIST_ID)) .withQueryParam("networkUuid", equalTo(NETWORK_UUID_STRING)) .willReturn(okJson(CONTINGENCIES_COUNT)) ); - mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/contingency-count?contingencyListName={contingencyListName}", - studyUuid, rootNetworkUuid, nodeUuid, CONTINGENCY_LIST_NAME)) + mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/contingency-count?contingencyListIds={contingencyListId}", + studyUuid, rootNetworkUuid, nodeUuid, CONTINGENCY_LIST_ID)) .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); Integer integerResponse = Integer.parseInt(resultAsString); @@ -801,8 +801,8 @@ void testSecurityAnalysisFailedForNotification() throws Exception { //run failing security analysis (because in network 2) computationServerStubs.stubComputationRun(NETWORK_UUID_2_STRING, null, SECURITY_ANALYSIS_ERROR_NODE_RESULT_UUID); - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid, firstRootNetworkUuid, nodeUuid, CONTINGENCY_LIST_NAME) + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid, firstRootNetworkUuid, nodeUuid) .header(HEADER_USER_ID, "testUserId")) .andExpect(status().isOk()); @@ -836,8 +836,8 @@ void testSecurityAnalysisFailedForNotification() throws Exception { UUID firstRootNetworkUuid2 = studyTestUtils.getOneRootNetworkUuid(studyUuid2); computationServerStubs.stubComputationRun(NETWORK_UUID_3_STRING, null, SECURITY_ANALYSIS_ERROR_NODE_RESULT_UUID); - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid2, firstRootNetworkUuid2, modificationNode1Uuid2, CONTINGENCY_LIST_NAME) + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid2, firstRootNetworkUuid2, modificationNode1Uuid2) .header(HEADER_USER_ID, "testUserId")) .andExpect(status().isOk()); // failed security analysis without receiver -> no failure message sent to frontend @@ -849,7 +849,8 @@ void testSecurityAnalysisFailedForNotification() throws Exception { consumerService.consumeSaFailed().accept(failedMessage); // message sent by run and save controller to notify frontend security analysis is running and should update SA status checkMessagesReceived(studyUuid2, UPDATE_TYPE_SECURITY_ANALYSIS_STATUS); - computationServerStubs.verifyComputationRun(NETWORK_UUID_3_STRING, Map.of("contingencyListName", WireMock.equalTo(CONTINGENCY_LIST_NAME))); + wireMockServer.verify(postRequestedFor(urlPathMatching("/v1/networks/" + NETWORK_UUID_3_STRING + "/run-and-save.*"))); + } @Test @@ -898,8 +899,8 @@ void testResetSecurityAnalysisParametersUserHasValidParamsInProfile() throws Exc .willReturn(ok())); // --- Run security analysis --- - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", - studyUuid, firstRootNetworkUuid, modificationNode1.getId(), CONTINGENCY_LIST_NAME) + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run", + studyUuid, firstRootNetworkUuid, modificationNode1.getId()) .content(objectWriter.writeValueAsString(SECURITY_ANALYSIS_PARAMETERS)) .contentType(MediaType.APPLICATION_JSON) .header(HEADER_USER_ID, "testUserId")) @@ -910,7 +911,6 @@ void testResetSecurityAnalysisParametersUserHasValidParamsInProfile() throws Exc createOrUpdateParametersAndDoChecks(studyUuid, "", VALID_PARAMS_IN_PROFILE_USER_ID, HttpStatus.OK); wireMockServer.verify(postRequestedFor(urlPathMatching("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save.*")) - .withQueryParam("contingencyListName", equalTo(CONTINGENCY_LIST_NAME)) .withQueryParam("receiver", matching(".*"))); userAdminServerStubs.verifyGetUserProfile(VALID_PARAMS_IN_PROFILE_USER_ID);