From b0866acab8ce7b1e7e8096be5b79f24bd3c68396 Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Fri, 20 Feb 2026 10:03:49 +0100 Subject: [PATCH 1/2] POC : using existing servers Signed-off-by: Franck LECUYER --- .../monitor/commons/CaseResultInfos.java | 38 ++++ .../server/controllers/MonitorController.java | 11 ++ .../services/ConsumerServiceUsingServers.java | 165 ++++++++++++++++++ .../server/services/MonitorService.java | 29 ++- .../NetworkModificationRestService.java | 54 ++++++ .../server/services/NotificationService.java | 4 + .../services/SecurityAnalysisRestService.java | 55 ++++++ .../src/main/resources/application-local.yaml | 4 +- .../main/resources/config/application.yaml | 11 ++ 9 files changed, 368 insertions(+), 3 deletions(-) create mode 100644 monitor-commons/src/main/java/org/gridsuite/monitor/commons/CaseResultInfos.java create mode 100644 monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java create mode 100644 monitor-server/src/main/java/org/gridsuite/monitor/server/services/NetworkModificationRestService.java create mode 100644 monitor-server/src/main/java/org/gridsuite/monitor/server/services/SecurityAnalysisRestService.java diff --git a/monitor-commons/src/main/java/org/gridsuite/monitor/commons/CaseResultInfos.java b/monitor-commons/src/main/java/org/gridsuite/monitor/commons/CaseResultInfos.java new file mode 100644 index 00000000..785de07d --- /dev/null +++ b/monitor-commons/src/main/java/org/gridsuite/monitor/commons/CaseResultInfos.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2026, 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.monitor.commons; + +import lombok.Getter; + +import java.util.UUID; + +/** + * @author Franck Lecuyer + */ +@Getter +public class CaseResultInfos { + private final UUID caseResultUuid; + + private final UUID executionUuid; + + private final UUID reportUuid; + + private final UUID resultUuid; + + private final String stepType; + + private final String status; + + public CaseResultInfos(UUID caseResultUuid, UUID executionUuid, UUID reportUuid, UUID resultUuid, String stepType, String status) { + this.caseResultUuid = caseResultUuid; + this.executionUuid = executionUuid; + this.reportUuid = reportUuid; + this.resultUuid = resultUuid; + this.stepType = stepType; + this.status = status; + } +} diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/controllers/MonitorController.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/controllers/MonitorController.java index 65ec8bc0..89ce9a46 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/controllers/MonitorController.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/controllers/MonitorController.java @@ -92,5 +92,16 @@ public ResponseEntity deleteExecution(@PathVariable UUID executionId) { ResponseEntity.ok().build() : ResponseEntity.notFound().build(); } + + @PostMapping("/execute/security-analysis-using-servers") + @Operation(summary = "Execute a security analysis process using existing servers (network-modification-server and security-analysis-server)") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis execution has been started")}) + public ResponseEntity executeSecurityAnalysisUsingServers( + @RequestParam UUID caseUuid, + @RequestBody SecurityAnalysisConfig securityAnalysisConfig, + @RequestHeader(HEADER_USER_ID) String userId) { + UUID executionId = monitorService.executeProcessUsingServers(caseUuid, userId, securityAnalysisConfig); + return ResponseEntity.ok(executionId); + } } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java new file mode 100644 index 00000000..9c4c23bf --- /dev/null +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java @@ -0,0 +1,165 @@ +/** + * Copyright (c) 2026, 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.monitor.server.services; + +import org.gridsuite.monitor.commons.CaseResultInfos; +import org.gridsuite.monitor.commons.ProcessConfig; +import org.gridsuite.monitor.commons.ProcessExecutionStep; +import org.gridsuite.monitor.commons.ProcessRunMessage; +import org.gridsuite.monitor.commons.ProcessStatus; +import org.gridsuite.monitor.commons.ResultType; +import org.gridsuite.monitor.commons.SecurityAnalysisConfig; +import org.gridsuite.monitor.commons.StepStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; + +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +/** + * @author Franck Lecuyer + */ +@Configuration +public class ConsumerServiceUsingServers { + private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerServiceUsingServers.class); + + private final NetworkModificationRestService networkModificationRestService; + private final SecurityAnalysisRestService securityAnalysisRestService; + private final MonitorService monitorService; + + private record ProcessExecutionContext( + UUID applyModificationsStepId, + UUID securityAnalysisStepId, + UUID caseUuid, + List contingencies, + UUID parametersUuid + ) { } + + private final Map processExecutionContexts = new ConcurrentHashMap<>(); + + @Autowired + ConsumerServiceUsingServers(NetworkModificationRestService networkModificationRestService, + SecurityAnalysisRestService securityAnalysisRestService, + MonitorService monitorService) { + this.networkModificationRestService = networkModificationRestService; + this.securityAnalysisRestService = securityAnalysisRestService; + this.monitorService = monitorService; + } + + @Bean + public Consumer>> consumeRunUsingServers() { + // consume message to launch process + // + return message -> { + ProcessRunMessage processRunMessage = message.getPayload(); + UUID caseUuid = processRunMessage.caseUuid(); + UUID executionId = processRunMessage.executionId(); + + ProcessConfig processConfig = processRunMessage.config(); + List modificationUuids = processConfig.modificationUuids(); + + UUID applyModificationsStepId = UUID.randomUUID(); + UUID securityAnalysisStepId = UUID.randomUUID(); + + List contingencies = null; + UUID parametersUuid = null; + switch (processConfig.processType()) { + case SECURITY_ANALYSIS -> { + contingencies = ((SecurityAnalysisConfig) processConfig).contingencies(); + parametersUuid = ((SecurityAnalysisConfig) processConfig).parametersUuid(); + } + } + + processExecutionContexts.put(executionId, new ProcessExecutionContext( + applyModificationsStepId, + securityAnalysisStepId, + caseUuid, + contingencies, + parametersUuid + )); + + monitorService.updateExecutionStatus(executionId, ProcessStatus.RUNNING, null, Instant.now(), null); + monitorService.updateStepStatus(executionId, + new ProcessExecutionStep(applyModificationsStepId, "APPLY_MODIFICATIONS", 0, StepStatus.RUNNING, null, null, null, Instant.now(), null)); + monitorService.updateStepStatus(executionId, + new ProcessExecutionStep(securityAnalysisStepId, "SECURITY_ANALYSIS", 1, StepStatus.SCHEDULED, null, null, null, null, null)); + + // call network-modification-server to apply modifications + networkModificationRestService.applyModifications(caseUuid, executionId, modificationUuids); + }; + } + + @Bean + public Consumer> consumeNetworkModifications() { + // consume message received from network-modification-server + // + return message -> { + CaseResultInfos caseResultInfos = message.getPayload(); + UUID caseResultUuid = caseResultInfos.getCaseResultUuid(); + UUID executionId = caseResultInfos.getExecutionUuid(); + String stepType = caseResultInfos.getStepType(); + UUID reportUuid = caseResultInfos.getReportUuid(); + StepStatus stepStatus = StepStatus.valueOf(caseResultInfos.getStatus()); + + ProcessExecutionContext processExecutionContext = processExecutionContexts.get(executionId); + if (processExecutionContext == null) { + LOGGER.error("Process execution context not found for executionId: {}", executionId); + return; + } + + monitorService.updateStepStatus(executionId, + new ProcessExecutionStep(processExecutionContext.applyModificationsStepId(), stepType, 0, stepStatus, null, null, reportUuid, null, Instant.now())); + monitorService.updateStepStatus(executionId, + new ProcessExecutionStep(processExecutionContext.securityAnalysisStepId(), "SECURITY_ANALYSIS", 1, + stepStatus == StepStatus.COMPLETED ? StepStatus.RUNNING : StepStatus.SKIPPED, + null, null, null, Instant.now(), null)); + + if (stepStatus == StepStatus.COMPLETED) { + // call security-analysis-server to run security analysis + securityAnalysisRestService.runSecurityAnalysis(caseResultUuid, executionId, processExecutionContext.contingencies(), processExecutionContext.parametersUuid()); + } else { + processExecutionContexts.remove(executionId); + } + }; + } + + @Bean + public Consumer> consumeSecurityAnalysis() { + // consume message received from security-analysis-server + // + return message -> { + CaseResultInfos caseResultInfos = message.getPayload(); + UUID executionId = caseResultInfos.getExecutionUuid(); + String stepType = caseResultInfos.getStepType(); + UUID reportUuid = caseResultInfos.getReportUuid(); + UUID resultUuid = caseResultInfos.getResultUuid(); + StepStatus stepStatus = StepStatus.valueOf(caseResultInfos.getStatus()); + + ProcessExecutionContext processExecutionContext = processExecutionContexts.get(executionId); + if (processExecutionContext == null) { + LOGGER.error("Process execution context not found for executionId: {}", executionId); + return; + } + + monitorService.updateStepStatus(executionId, + new ProcessExecutionStep(processExecutionContext.securityAnalysisStepId(), stepType, 1, stepStatus, resultUuid, ResultType.SECURITY_ANALYSIS, reportUuid, null, Instant.now())); + monitorService.updateExecutionStatus(executionId, + stepStatus == StepStatus.COMPLETED ? ProcessStatus.COMPLETED : ProcessStatus.FAILED, + null, null, Instant.now()); + + processExecutionContexts.remove(executionId); + }; + } +} diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java index d0722e50..dc54d2a3 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java @@ -95,8 +95,12 @@ private void updateStep(ProcessExecutionEntity execution, ProcessExecutionStepEn existingStep.setStatus(stepEntity.getStatus()); existingStep.setStepType(stepEntity.getStepType()); existingStep.setStepOrder(stepEntity.getStepOrder()); - existingStep.setStartedAt(stepEntity.getStartedAt()); - existingStep.setCompletedAt(stepEntity.getCompletedAt()); + if (stepEntity.getStartedAt() != null) { + existingStep.setStartedAt(stepEntity.getStartedAt()); + } + if (stepEntity.getCompletedAt() != null) { + existingStep.setCompletedAt(stepEntity.getCompletedAt()); + } existingStep.setResultId(stepEntity.getResultId()); existingStep.setResultType(stepEntity.getResultType()); existingStep.setReportId(stepEntity.getReportId()); @@ -214,4 +218,25 @@ public boolean deleteExecution(UUID executionId) { } return false; } + + @Transactional + public UUID executeProcessUsingServers(UUID caseUuid, String userId, ProcessConfig processConfig) { + ProcessExecutionEntity execution = ProcessExecutionEntity.builder() + .type(processConfig.processType().name()) + .caseUuid(caseUuid) + .status(ProcessStatus.SCHEDULED) + .scheduledAt(Instant.now()) + .userId(userId) + .executionEnvName("using-servers-env") + .build(); + executionRepository.save(execution); + + String bindingName = switch (processConfig.processType()) { + case SECURITY_ANALYSIS -> "publishRunSecurityAnalysisUsingServers-out-0"; + }; + notificationService.sendProcessRunMessage(caseUuid, processConfig, execution.getId(), bindingName); + + return execution.getId(); + } + } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NetworkModificationRestService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NetworkModificationRestService.java new file mode 100644 index 00000000..ef17ad83 --- /dev/null +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NetworkModificationRestService.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2026, 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.monitor.server.services; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; +import java.util.UUID; + +/** + * @author Franck Lecuyer + */ +@Service +public class NetworkModificationRestService { + private static final String NETWORK_MODIFICATION_SERVER_API_VERSION = "v1"; + private static final String DELIMITER = "/"; + + private final RestTemplate networkModificationServerRest; + private final String networkModificationServerBaseUri; + + public NetworkModificationRestService(@Value("${gridsuite.services.network-modification-server.base-uri:http://network-modification-server/}") String networkModificationServerBaseUri, + RestTemplateBuilder restTemplateBuilder) { + this.networkModificationServerRest = restTemplateBuilder.build(); + this.networkModificationServerBaseUri = networkModificationServerBaseUri; + } + + public void applyModifications(UUID caseUuid, UUID executionId, List modificationUuids) { + var uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + NETWORK_MODIFICATION_SERVER_API_VERSION + DELIMITER + "cases/{caseUuid}/network-composite-modifications"); + var path = uriComponentsBuilder + .queryParam("executionUuid", executionId) + .queryParam("uuids", modificationUuids) + .buildAndExpand(caseUuid) + .toUriString(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity httpEntity = new HttpEntity<>(null, headers); + + networkModificationServerRest.exchange(networkModificationServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); + } +} diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NotificationService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NotificationService.java index a6ca9558..da4bf77b 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NotificationService.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/NotificationService.java @@ -27,6 +27,10 @@ public void sendProcessRunMessage(UUID caseUuid, ProcessConfig processConfig, UU String bindingName = switch (processConfig.processType()) { case SECURITY_ANALYSIS -> "publishRunSecurityAnalysis-out-0"; }; + sendProcessRunMessage(caseUuid, processConfig, executionId, bindingName); + } + + public void sendProcessRunMessage(UUID caseUuid, ProcessConfig processConfig, UUID executionId, String bindingName) { ProcessRunMessage message = new ProcessRunMessage<>(executionId, caseUuid, processConfig); publisher.send(bindingName, message); } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/SecurityAnalysisRestService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/SecurityAnalysisRestService.java new file mode 100644 index 00000000..840a6fb8 --- /dev/null +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/SecurityAnalysisRestService.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2026, 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.monitor.server.services; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; +import java.util.UUID; + +/** + * @author Franck Lecuyer + */ +@Service +public class SecurityAnalysisRestService { + private static final String SECURITY_ANALYSIS_SERVER_API_VERSION = "v1"; + private static final String DELIMITER = "/"; + + private final RestTemplate securityAnalysisServerRest; + private final String securityAnalysisServerBaseUri; + + public SecurityAnalysisRestService(@Value("${gridsuite.services.security-analysis-server.base-uri:http://security-analysis-server/}") String securityAnalysisServerBaseUri, + RestTemplateBuilder restTemplateBuilder) { + this.securityAnalysisServerRest = restTemplateBuilder.build(); + this.securityAnalysisServerBaseUri = securityAnalysisServerBaseUri; + } + + public void runSecurityAnalysis(UUID caseUuid, UUID executionId, List contingencies, UUID parametersUuid) { + var uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_SERVER_API_VERSION + DELIMITER + "/cases/{caseUuid}/run-and-save"); + var path = uriComponentsBuilder + .queryParam("executionUuid", executionId) + .queryParam("contingencyListName", contingencies) + .queryParam("parametersUuid", parametersUuid) + .buildAndExpand(caseUuid) + .toUriString(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity httpEntity = new HttpEntity<>(null, headers); + + securityAnalysisServerRest.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); + } +} diff --git a/monitor-server/src/main/resources/application-local.yaml b/monitor-server/src/main/resources/application-local.yaml index a72bc10d..a055752e 100644 --- a/monitor-server/src/main/resources/application-local.yaml +++ b/monitor-server/src/main/resources/application-local.yaml @@ -14,4 +14,6 @@ gridsuite: report-server: base-uri: http://localhost:5028 security-analysis-server: - base-uri: http://localhost:5023 \ No newline at end of file + base-uri: http://localhost:5023 + network-modification-server: + base-uri: http://localhost:5007 diff --git a/monitor-server/src/main/resources/config/application.yaml b/monitor-server/src/main/resources/config/application.yaml index 1b47c9b7..102673e1 100644 --- a/monitor-server/src/main/resources/config/application.yaml +++ b/monitor-server/src/main/resources/config/application.yaml @@ -2,6 +2,8 @@ spring: application: name: monitor-server cloud: + function: + definition: consumeMonitorUpdate;consumeRunUsingServers;consumeNetworkModifications;consumeSecurityAnalysis stream: bindings: publishRunSecurityAnalysis-out-0: @@ -9,6 +11,15 @@ spring: consumeMonitorUpdate-in-0: destination: ${powsybl-ws.rabbitmq.destination.prefix:}monitor.update group: monitorUpdateGroup + publishRunSecurityAnalysisUsingServers-out-0: + destination: ${powsybl-ws.rabbitmq.destination.prefix:}monitor.process.securityanalysis.using.servers.run + consumeRunUsingServers-in-0: + destination: ${powsybl-ws.rabbitmq.destination.prefix:}monitor.process.securityanalysis.using.servers.run + consumeNetworkModifications-in-0: + destination: ${powsybl-ws.rabbitmq.destination.prefix:}modifications.case.result + consumeSecurityAnalysis-in-0: + destination: ${powsybl-ws.rabbitmq.destination.prefix:}sa.case.result + output-bindings: publishRunSecurityAnalysis-out-0;publishRunSecurityAnalysisUsingServers-out-0; powsybl-ws: database: From 24999ae564272b8d71aeb6be61828fb2aabd4159 Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Wed, 25 Feb 2026 08:38:23 +0100 Subject: [PATCH 2/2] save step resulting case uuid in database Signed-off-by: Franck LECUYER --- .../monitor/commons/ProcessExecutionStep.java | 1 + .../server/entities/ProcessExecutionStepEntity.java | 3 +++ .../server/mapper/ProcessExecutionStepMapper.java | 3 ++- .../server/services/ConsumerServiceUsingServers.java | 12 +++++++----- .../monitor/server/services/MonitorService.java | 2 ++ .../changesets/changelog_20260225T073450Z.xml | 8 ++++++++ .../resources/db/changelog/db.changelog-master.yaml | 4 +++- .../server/controllers/MonitorControllerTest.java | 6 +++--- .../monitor/server/services/MonitorServiceTest.java | 4 ++-- .../server/services/ProcessExecutionService.java | 2 +- .../worker/server/services/StepExecutionService.java | 7 +++++-- 11 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 monitor-server/src/main/resources/db/changelog/changesets/changelog_20260225T073450Z.xml diff --git a/monitor-commons/src/main/java/org/gridsuite/monitor/commons/ProcessExecutionStep.java b/monitor-commons/src/main/java/org/gridsuite/monitor/commons/ProcessExecutionStep.java index 4d91d433..7b082b2c 100644 --- a/monitor-commons/src/main/java/org/gridsuite/monitor/commons/ProcessExecutionStep.java +++ b/monitor-commons/src/main/java/org/gridsuite/monitor/commons/ProcessExecutionStep.java @@ -31,4 +31,5 @@ public class ProcessExecutionStep { private UUID reportId; private Instant startedAt; private Instant completedAt; + private UUID resultCaseId; } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/entities/ProcessExecutionStepEntity.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/entities/ProcessExecutionStepEntity.java index a2b0a955..6bb88e15 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/entities/ProcessExecutionStepEntity.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/entities/ProcessExecutionStepEntity.java @@ -54,4 +54,7 @@ public class ProcessExecutionStepEntity { @Column private Instant completedAt; + + @Column + private UUID resultCaseId; } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/mapper/ProcessExecutionStepMapper.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/mapper/ProcessExecutionStepMapper.java index b58db313..eb1fdf1a 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/mapper/ProcessExecutionStepMapper.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/mapper/ProcessExecutionStepMapper.java @@ -24,6 +24,7 @@ public static ProcessExecutionStep toDto(ProcessExecutionStepEntity entity) { entity.getResultType(), entity.getReportId(), entity.getStartedAt(), - entity.getCompletedAt()); + entity.getCompletedAt(), + entity.getResultCaseId()); } } diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java index 9c4c23bf..e299f6af 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerServiceUsingServers.java @@ -92,9 +92,9 @@ public Consumer>> consume monitorService.updateExecutionStatus(executionId, ProcessStatus.RUNNING, null, Instant.now(), null); monitorService.updateStepStatus(executionId, - new ProcessExecutionStep(applyModificationsStepId, "APPLY_MODIFICATIONS", 0, StepStatus.RUNNING, null, null, null, Instant.now(), null)); + new ProcessExecutionStep(applyModificationsStepId, "APPLY_MODIFICATIONS", 0, StepStatus.RUNNING, null, null, null, Instant.now(), null, null)); monitorService.updateStepStatus(executionId, - new ProcessExecutionStep(securityAnalysisStepId, "SECURITY_ANALYSIS", 1, StepStatus.SCHEDULED, null, null, null, null, null)); + new ProcessExecutionStep(securityAnalysisStepId, "SECURITY_ANALYSIS", 1, StepStatus.SCHEDULED, null, null, null, null, null, null)); // call network-modification-server to apply modifications networkModificationRestService.applyModifications(caseUuid, executionId, modificationUuids); @@ -111,6 +111,7 @@ public Consumer> consumeNetworkModifications() { UUID executionId = caseResultInfos.getExecutionUuid(); String stepType = caseResultInfos.getStepType(); UUID reportUuid = caseResultInfos.getReportUuid(); + StepStatus stepStatus = StepStatus.valueOf(caseResultInfos.getStatus()); ProcessExecutionContext processExecutionContext = processExecutionContexts.get(executionId); @@ -120,11 +121,11 @@ public Consumer> consumeNetworkModifications() { } monitorService.updateStepStatus(executionId, - new ProcessExecutionStep(processExecutionContext.applyModificationsStepId(), stepType, 0, stepStatus, null, null, reportUuid, null, Instant.now())); + new ProcessExecutionStep(processExecutionContext.applyModificationsStepId(), stepType, 0, stepStatus, null, null, reportUuid, null, Instant.now(), caseResultUuid)); monitorService.updateStepStatus(executionId, new ProcessExecutionStep(processExecutionContext.securityAnalysisStepId(), "SECURITY_ANALYSIS", 1, stepStatus == StepStatus.COMPLETED ? StepStatus.RUNNING : StepStatus.SKIPPED, - null, null, null, Instant.now(), null)); + null, null, null, Instant.now(), null, null)); if (stepStatus == StepStatus.COMPLETED) { // call security-analysis-server to run security analysis @@ -146,6 +147,7 @@ public Consumer> consumeSecurityAnalysis() { UUID reportUuid = caseResultInfos.getReportUuid(); UUID resultUuid = caseResultInfos.getResultUuid(); StepStatus stepStatus = StepStatus.valueOf(caseResultInfos.getStatus()); + UUID caseResultUuid = caseResultInfos.getCaseResultUuid(); ProcessExecutionContext processExecutionContext = processExecutionContexts.get(executionId); if (processExecutionContext == null) { @@ -154,7 +156,7 @@ public Consumer> consumeSecurityAnalysis() { } monitorService.updateStepStatus(executionId, - new ProcessExecutionStep(processExecutionContext.securityAnalysisStepId(), stepType, 1, stepStatus, resultUuid, ResultType.SECURITY_ANALYSIS, reportUuid, null, Instant.now())); + new ProcessExecutionStep(processExecutionContext.securityAnalysisStepId(), stepType, 1, stepStatus, resultUuid, ResultType.SECURITY_ANALYSIS, reportUuid, null, Instant.now(), caseResultUuid)); monitorService.updateExecutionStatus(executionId, stepStatus == StepStatus.COMPLETED ? ProcessStatus.COMPLETED : ProcessStatus.FAILED, null, null, Instant.now()); diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java index dc54d2a3..bae75eea 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/MonitorService.java @@ -104,6 +104,7 @@ private void updateStep(ProcessExecutionEntity execution, ProcessExecutionStepEn existingStep.setResultId(stepEntity.getResultId()); existingStep.setResultType(stepEntity.getResultType()); existingStep.setReportId(stepEntity.getReportId()); + existingStep.setResultCaseId(stepEntity.getResultCaseId()); }, () -> steps.add(stepEntity)); } @@ -139,6 +140,7 @@ private ProcessExecutionStepEntity toStepEntity(ProcessExecutionStep processExec .reportId(processExecutionStep.getReportId()) .startedAt(processExecutionStep.getStartedAt()) .completedAt(processExecutionStep.getCompletedAt()) + .resultCaseId(processExecutionStep.getResultCaseId()) .build(); } diff --git a/monitor-server/src/main/resources/db/changelog/changesets/changelog_20260225T073450Z.xml b/monitor-server/src/main/resources/db/changelog/changesets/changelog_20260225T073450Z.xml new file mode 100644 index 00000000..f58dfb1c --- /dev/null +++ b/monitor-server/src/main/resources/db/changelog/changesets/changelog_20260225T073450Z.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/monitor-server/src/main/resources/db/changelog/db.changelog-master.yaml b/monitor-server/src/main/resources/db/changelog/db.changelog-master.yaml index 44dd6086..a9978c46 100644 --- a/monitor-server/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/monitor-server/src/main/resources/db/changelog/db.changelog-master.yaml @@ -8,4 +8,6 @@ databaseChangeLog: - include: file: changesets/changelog_20260130T160426Z.xml relativeToChangelogFile: true - + - include: + file: changesets/changelog_20260225T073450Z.xml + relativeToChangelogFile: true diff --git a/monitor-server/src/test/java/org/gridsuite/monitor/server/controllers/MonitorControllerTest.java b/monitor-server/src/test/java/org/gridsuite/monitor/server/controllers/MonitorControllerTest.java index 18c6a10d..d65e570f 100644 --- a/monitor-server/src/test/java/org/gridsuite/monitor/server/controllers/MonitorControllerTest.java +++ b/monitor-server/src/test/java/org/gridsuite/monitor/server/controllers/MonitorControllerTest.java @@ -158,9 +158,9 @@ void getLaunchedProcesses() throws Exception { @Test void getStepsInfos() throws Exception { UUID executionId = UUID.randomUUID(); - ProcessExecutionStep processExecutionStep1 = new ProcessExecutionStep(UUID.randomUUID(), "loadNetwork", 0, StepStatus.RUNNING, null, null, UUID.randomUUID(), Instant.now(), null); - ProcessExecutionStep processExecutionStep2 = new ProcessExecutionStep(UUID.randomUUID(), "applyModifs", 1, StepStatus.SCHEDULED, null, null, UUID.randomUUID(), null, null); - ProcessExecutionStep processExecutionStep3 = new ProcessExecutionStep(UUID.randomUUID(), "runSA", 2, StepStatus.SCHEDULED, null, null, UUID.randomUUID(), null, null); + ProcessExecutionStep processExecutionStep1 = new ProcessExecutionStep(UUID.randomUUID(), "loadNetwork", 0, StepStatus.RUNNING, null, null, UUID.randomUUID(), Instant.now(), null, null); + ProcessExecutionStep processExecutionStep2 = new ProcessExecutionStep(UUID.randomUUID(), "applyModifs", 1, StepStatus.SCHEDULED, null, null, UUID.randomUUID(), null, null, null); + ProcessExecutionStep processExecutionStep3 = new ProcessExecutionStep(UUID.randomUUID(), "runSA", 2, StepStatus.SCHEDULED, null, null, UUID.randomUUID(), null, null, null); List processExecutionStepList = List.of(processExecutionStep1, processExecutionStep2, processExecutionStep3); when(monitorService.getStepsInfos(executionId)).thenReturn(Optional.of(processExecutionStepList)); diff --git a/monitor-server/src/test/java/org/gridsuite/monitor/server/services/MonitorServiceTest.java b/monitor-server/src/test/java/org/gridsuite/monitor/server/services/MonitorServiceTest.java index fd1c7129..255071d7 100644 --- a/monitor-server/src/test/java/org/gridsuite/monitor/server/services/MonitorServiceTest.java +++ b/monitor-server/src/test/java/org/gridsuite/monitor/server/services/MonitorServiceTest.java @@ -463,8 +463,8 @@ void getStepsInfos() { Optional> result = monitorService.getStepsInfos(executionUuid); - ProcessExecutionStep processExecutionStep1 = new ProcessExecutionStep(stepId1, "loadNetwork", 0, StepStatus.RUNNING, null, null, null, startedAt1, null); - ProcessExecutionStep processExecutionStep2 = new ProcessExecutionStep(stepId2, "applyModifs", 1, StepStatus.SCHEDULED, null, null, null, null, null); + ProcessExecutionStep processExecutionStep1 = new ProcessExecutionStep(stepId1, "loadNetwork", 0, StepStatus.RUNNING, null, null, null, startedAt1, null, null); + ProcessExecutionStep processExecutionStep2 = new ProcessExecutionStep(stepId2, "applyModifs", 1, StepStatus.SCHEDULED, null, null, null, null, null, null); assertThat(result).isPresent(); assertThat(result.get()).hasSize(2).containsExactly(processExecutionStep1, processExecutionStep2); diff --git a/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/ProcessExecutionService.java b/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/ProcessExecutionService.java index 38b8c788..4cbe1a04 100644 --- a/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/ProcessExecutionService.java +++ b/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/ProcessExecutionService.java @@ -63,7 +63,7 @@ public void executeProcess(ProcessRunMessage runMes List> steps = process.defineSteps(); notificationService.updateStepsStatuses(context.getExecutionId(), IntStream.range(0, steps.size()) - .mapToObj(i -> new ProcessExecutionStep(steps.get(i).getId(), steps.get(i).getType().getName(), i, StepStatus.SCHEDULED, null, null, null, null, null)) + .mapToObj(i -> new ProcessExecutionStep(steps.get(i).getId(), steps.get(i).getType().getName(), i, StepStatus.SCHEDULED, null, null, null, null, null, null)) .toList()); } catch (Exception e) { updateExecutionStatus(context.getExecutionId(), context.getExecutionEnvName(), ProcessStatus.FAILED); diff --git a/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/StepExecutionService.java b/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/StepExecutionService.java index 0d57ffe8..36d0d489 100644 --- a/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/StepExecutionService.java +++ b/monitor-worker-server/src/main/java/org/gridsuite/monitor/worker/server/services/StepExecutionService.java @@ -36,7 +36,8 @@ public void skipStep(ProcessStepExecutionContext context, ProcessStep step null, null, context.getStartedAt(), - Instant.now() + Instant.now(), + null ); notificationService.updateStepStatus(context.getProcessExecutionId(), executionStep); } @@ -51,6 +52,7 @@ public void executeStep(ProcessStepExecutionContext context, ProcessStep s null, context.getReportInfos().reportUuid(), context.getStartedAt(), + null, null ); notificationService.updateStepStatus(context.getProcessExecutionId(), executionStep); @@ -75,7 +77,8 @@ private void updateStepStatus(ProcessStepExecutionContext context, StepStatus context.getResultInfos() != null ? context.getResultInfos().resultType() : null, context.getReportInfos().reportUuid(), context.getStartedAt(), - Instant.now() + Instant.now(), + null ); notificationService.updateStepStatus(context.getProcessExecutionId(), updated); }