Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ private StudyConstants() {
public static final String SECURITY_ANALYSIS_API_VERSION = "v1";
public static final String DYNAMIC_SIMULATION_API_VERSION = "v1";
public static final String DYNAMIC_SECURITY_ANALYSIS_API_VERSION = "v1";
public static final String DYNAMIC_MARGIN_CALCULATION_API_VERSION = "v1";
public static final String SENSITIVITY_ANALYSIS_API_VERSION = "v1";
public static final String ACTIONS_API_VERSION = "v1";
public static final String NETWORK_MAP_API_VERSION = "v1";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.gridsuite.study.server.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.powsybl.iidm.network.ThreeSides;
import com.powsybl.timeseries.DoubleTimeSeries;
Expand All @@ -18,30 +19,29 @@
import org.apache.commons.lang3.StringUtils;
import org.gridsuite.filter.globalfilter.GlobalFilter;
import org.gridsuite.filter.utils.EquipmentType;
import org.gridsuite.study.server.service.RebuildNodeService;
import org.gridsuite.study.server.StudyApi;
import org.gridsuite.study.server.StudyConstants.ModificationsActionType;
import org.gridsuite.study.server.dto.modification.NetworkModificationMetadata;
import org.gridsuite.study.server.error.StudyException;
import org.gridsuite.study.server.dto.networkexport.NodeExportInfos;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos;
import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos;
import org.gridsuite.study.server.dto.dynamicmapping.ModelInfos;
import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus;
import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus;
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos;
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus;
import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos;
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
import org.gridsuite.study.server.dto.modification.ModificationType;
import org.gridsuite.study.server.dto.modification.ModificationsSearchResultByNode;
import org.gridsuite.study.server.dto.modification.NetworkModificationMetadata;
import org.gridsuite.study.server.dto.networkexport.ExportNetworkStatus;
import org.gridsuite.study.server.dto.networkexport.NodeExportInfos;
import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos;
import org.gridsuite.study.server.dto.sequence.NodeSequenceType;
import org.gridsuite.study.server.dto.timeseries.TimeSeriesMetadataInfos;
import org.gridsuite.study.server.dto.timeseries.TimelineEventInfos;
import org.gridsuite.study.server.dto.voltageinit.parameters.StudyVoltageInitParameters;
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
import org.gridsuite.study.server.error.StudyException;
import org.gridsuite.study.server.exception.PartialResultException;
import org.gridsuite.study.server.networkmodificationtree.dto.*;
import org.gridsuite.study.server.service.*;
Expand All @@ -66,9 +66,9 @@
import java.beans.PropertyEditorSupport;
import java.util.*;

import static org.gridsuite.study.server.error.StudyBusinessErrorCode.MOVE_NETWORK_MODIFICATION_FORBIDDEN;
import static org.gridsuite.study.server.StudyConstants.*;
import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW;
import static org.gridsuite.study.server.error.StudyBusinessErrorCode.MOVE_NETWORK_MODIFICATION_FORBIDDEN;

/**
* @author Abdelsalem Hedhili <abdelsalem.hedhili at rte-france.com>
Expand Down Expand Up @@ -1176,6 +1176,23 @@ public ResponseEntity<String> getDynamicSecurityAnalysisProvider(@PathVariable("
return ResponseEntity.ok().body(studyService.getDynamicSecurityAnalysisProvider(studyUuid));
}

@PostMapping(value = "/studies/{studyUuid}/dynamic-margin-calculation/provider")
@Operation(summary = "Set dynamic margin calculation provider for the specified study, no body means reset to default provider")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic margin calculation provider is set")})
public ResponseEntity<Void> setDynamicMarginCalculationProvider(@PathVariable("studyUuid") UUID studyUuid,
@RequestBody(required = false) String provider,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.updateDynamicMarginCalculationProvider(studyUuid, provider, userId);
return ResponseEntity.ok().build();
}

@GetMapping(value = "/studies/{studyUuid}/dynamic-margin-calculation/provider")
@Operation(summary = "Get dynamic margin calculation provider for a specified study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic margin calculation provider is returned")})
public ResponseEntity<String> getDynamicMarginCalculationProvider(@PathVariable("studyUuid") UUID studyUuid) {
return ResponseEntity.ok().body(studyService.getDynamicMarginCalculationProvider(studyUuid));
}

@PostMapping(value = "/studies/{studyUuid}/short-circuit-analysis/parameters", consumes = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "set short-circuit analysis parameters on study, reset to default ones if empty body")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The short-circuit analysis parameters are set"),
Expand Down Expand Up @@ -1740,6 +1757,13 @@ public ResponseEntity<String> getDefaultDynamicSecurityAnalysisProvider(@Request
return ResponseEntity.ok().body(studyService.getDefaultDynamicSecurityAnalysisProvider(userId));
}

@GetMapping(value = "/dynamic-margin-calculation-default-provider")
@Operation(summary = "Get dynamic margin calculation default provider")
@ApiResponses(@ApiResponse(responseCode = "200", description = "The dynamic margin calculation default provider has been found"))
public ResponseEntity<String> getDefaultDynamicMarginCalculationProvider(@RequestHeader(HEADER_USER_ID) String userId) {
return ResponseEntity.ok().body(studyService.getDefaultDynamicMarginCalculationProvider(userId));
}

@PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/reindex-all")
@Operation(summary = "reindex root network")
@ApiResponse(responseCode = "200", description = "Root network reindexed")
Expand Down Expand Up @@ -2082,6 +2106,59 @@ public ResponseEntity<String> getDynamicSecurityAnalysisStatus(@Parameter(descri

// --- Dynamic Security Analysis Endpoints END --- //

// --- Dynamic Margin Calculation Endpoints BEGIN --- //

@PostMapping(value = "/studies/{studyUuid}/dynamic-margin-calculation/parameters")
@Operation(summary = "Set dynamic margin calculation parameters on study, reset to default one if empty body")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic margin calculation parameters are set")})
public ResponseEntity<Void> setDynamicMarginCalculationParameters(
@PathVariable("studyUuid") UUID studyUuid,
@RequestBody(required = false) String dmcParameter,
@RequestHeader(HEADER_USER_ID) String userId) {
return studyService.setDynamicMarginCalculationParameters(studyUuid, dmcParameter, userId) ?
ResponseEntity.noContent().build() :
ResponseEntity.ok().build();
}

@GetMapping(value = "/studies/{studyUuid}/dynamic-margin-calculation/parameters")
@Operation(summary = "Get dynamic margin calculation parameters on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic margin calculation parameters")})
public ResponseEntity<String> getDynamicMarginCalculationParameters(
@PathVariable("studyUuid") UUID studyUuid,
@RequestHeader(HEADER_USER_ID) String userId
) {
return ResponseEntity.ok().body(studyService.getDynamicMarginCalculationParameters(studyUuid, userId));
}

@PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/dynamic-margin-calculation/run")
@Operation(summary = "run dynamic margin calculation on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic margin calculation has started")})
public ResponseEntity<Void> runDynamicMarginCalculation(@Parameter(description = "studyUuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "root network id") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
@Parameter(description = "debug") @RequestParam(name = "debug", required = false, defaultValue = "false") boolean debug,
@RequestHeader(HEADER_USER_ID) String userId) throws JsonProcessingException {
studyService.assertIsNodeNotReadOnly(nodeUuid);
studyService.assertCanRunOnConstructionNode(studyUuid, nodeUuid, List.of(DYNAWO_PROVIDER), studyService::getDynamicMarginCalculationProvider);
studyService.runDynamicMarginCalculation(studyUuid, nodeUuid, rootNetworkUuid, userId, debug);
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).build();
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/dynamic-margin-calculation/status")
@Operation(summary = "Get the status of dynamic margin calculation result on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The status of dynamic margin calculation result"),
@ApiResponse(responseCode = "204", description = "No dynamic margin calculation status"),
@ApiResponse(responseCode = "404", description = "The dynamic margin calculation has not been found")})
public ResponseEntity<String> getDynamicMarginCalculationStatus(@Parameter(description = "study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "root network id") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) {
DynamicMarginCalculationStatus result = rootNetworkNodeInfoService.getDynamicMarginCalculationStatus(nodeUuid, rootNetworkUuid);
return result != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result.name()) :
ResponseEntity.noContent().build();
}

// --- Dynamic Margin Calculation Endpoints END --- //

@GetMapping(value = "/studies/{studyUuid}/security-analysis/parameters")
@Operation(summary = "Get security analysis parameters on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis parameters")})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public enum ComputationType {
SHORT_CIRCUIT("Short circuit analysis", "shortCircuitAnalysisResultUuid",
NotificationService.UPDATE_TYPE_SHORT_CIRCUIT_STATUS, NotificationService.UPDATE_TYPE_SHORT_CIRCUIT_RESULT,
NotificationService.UPDATE_TYPE_SHORT_CIRCUIT_FAILED),
SHORT_CIRCUIT_ONE_BUS("One bus Short circuit analysis", "oneBusShortCircuitAnalysisResultUuid",
NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_STATUS, NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_RESULT,
NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_FAILED),
VOLTAGE_INITIALIZATION("Voltage init", "voltageInitResultUuid",
NotificationService.UPDATE_TYPE_VOLTAGE_INIT_STATUS, NotificationService.UPDATE_TYPE_VOLTAGE_INIT_RESULT,
NotificationService.UPDATE_TYPE_VOLTAGE_INIT_FAILED),
Expand All @@ -26,9 +29,9 @@ public enum ComputationType {
DYNAMIC_SECURITY_ANALYSIS("Dynamic security analysis", "dynamicSecurityAnalysisResultUuid",
NotificationService.UPDATE_TYPE_DYNAMIC_SECURITY_ANALYSIS_STATUS, NotificationService.UPDATE_TYPE_DYNAMIC_SECURITY_ANALYSIS_RESULT,
NotificationService.UPDATE_TYPE_DYNAMIC_SECURITY_ANALYSIS_FAILED),
SHORT_CIRCUIT_ONE_BUS("One bus Short circuit analysis", "oneBusShortCircuitAnalysisResultUuid",
NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_STATUS, NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_RESULT,
NotificationService.UPDATE_TYPE_ONE_BUS_SHORT_CIRCUIT_FAILED),
DYNAMIC_MARGIN_CALCULATION("Dynamic margin calculation", "dynamicMarginCalculationResultUuid",
NotificationService.UPDATE_TYPE_DYNAMIC_MARGIN_CALCULATION_STATUS, NotificationService.UPDATE_TYPE_DYNAMIC_MARGIN_CALCULATION_RESULT,
NotificationService.UPDATE_TYPE_DYNAMIC_MARGIN_CALCULATION_FAILED),
STATE_ESTIMATION("State estimation", "stateEstimationResultUuid",
NotificationService.UPDATE_TYPE_STATE_ESTIMATION_STATUS, NotificationService.UPDATE_TYPE_STATE_ESTIMATION_RESULT,
NotificationService.UPDATE_TYPE_STATE_ESTIMATION_FAILED),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public class DeleteNodeInfos {

private List<UUID> dynamicSecurityAnalysisResultUuids = new ArrayList<>();

private List<UUID> dynamicMarginCalculationResultUuids = new ArrayList<>();

private List<UUID> stateEstimationResultUuids = new ArrayList<>();

private List<UUID> pccMinResultUuids = new ArrayList<>();
Expand Down Expand Up @@ -80,6 +82,10 @@ public void addDynamicSecurityAnalysisResultUuid(UUID dynamicSecurityAnalysisRes
dynamicSecurityAnalysisResultUuids.add(dynamicSecurityAnalysisResultUuid);
}

public void addDynamicMarginCalculationResultUuid(UUID dynamicMarginCalculationResultUuid) {
dynamicMarginCalculationResultUuids.add(dynamicMarginCalculationResultUuid);
}

public void addSensitivityAnalysisResultUuid(UUID sensitivityAnalysisResultUuid) {
sensitivityAnalysisResultUuids.add(sensitivityAnalysisResultUuid);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public class InvalidateNodeInfos {
private Set<UUID> pccMinResultUuids = new HashSet<>();
private Set<UUID> dynamicSimulationResultUuids = new HashSet<>();
private Set<UUID> dynamicSecurityAnalysisResultUuids = new HashSet<>();
private Set<UUID> dynamicMarginCalculationResultUuids = new HashSet<>();

public List<UUID> getNodeUuids() {
return nodeUuids.stream().toList();
Expand Down Expand Up @@ -97,6 +98,10 @@ public List<UUID> getDynamicSecurityAnalysisResultUuids() {
return dynamicSecurityAnalysisResultUuids.stream().toList();
}

public List<UUID> getDynamicMarginCalculationResultUuids() {
return dynamicMarginCalculationResultUuids.stream().toList();
}

public void addReportUuid(UUID reportUuid) {
reportUuids.add(reportUuid);
}
Expand Down Expand Up @@ -137,6 +142,10 @@ public void addDynamicSecurityAnalysisResultUuid(UUID dynamicSecurityAnalysisRes
dynamicSecurityAnalysisResultUuids.add(dynamicSecurityAnalysisResultUuid);
}

public void addDynamicMarginCalculationResultUuid(UUID dynamicMarginCalculationResultUuid) {
dynamicMarginCalculationResultUuids.add(dynamicMarginCalculationResultUuid);
}

public void addStateEstimationResultUuid(UUID stateEstimationResultUuid) {
stateEstimationResultUuids.add(stateEstimationResultUuid);
}
Expand Down Expand Up @@ -170,5 +179,6 @@ public void add(InvalidateNodeInfos invalidateNodeInfos) {
pccMinResultUuids.addAll(invalidateNodeInfos.getPccMinResultUuids());
dynamicSimulationResultUuids.addAll(invalidateNodeInfos.getDynamicSimulationResultUuids());
dynamicSecurityAnalysisResultUuids.addAll(invalidateNodeInfos.getDynamicSecurityAnalysisResultUuids());
dynamicMarginCalculationResultUuids.addAll(invalidateNodeInfos.getDynamicMarginCalculationResultUuids());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public class RootNetworkNodeInfo {

private UUID dynamicSecurityAnalysisResultUuid;

private UUID dynamicMarginCalculationResultUuid;

private UUID stateEstimationResultUuid;

private UUID pccMinResultUuid;
Expand All @@ -73,6 +75,7 @@ public RootNetworkNodeInfoEntity toEntity() {
.sensitivityAnalysisResultUuid(sensitivityAnalysisResultUuid)
.dynamicSimulationResultUuid(dynamicSimulationResultUuid)
.dynamicSecurityAnalysisResultUuid(dynamicSecurityAnalysisResultUuid)
.dynamicMarginCalculationResultUuid(dynamicMarginCalculationResultUuid)
.stateEstimationResultUuid(stateEstimationResultUuid)
.pccMinResultUuid(pccMinResultUuid)
.nodeBuildStatus(nodeBuildStatus.toEntity())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public class UserProfileInfos {
// note: this parameter is not managed by user-admin-server yet
private UUID dynamicSecurityAnalysisParameterId;

// note: this parameter is not managed by user-admin-server yet
private UUID dynamicMarginCalculationParameterId;

private UUID voltageInitParameterId;

Integer maxAllowedBuilds;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* 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.study.server.dto.dynamicmargincalculation;

/**
* @author Thang PHAM <quyet-thang.pham at rte-france.com>
*/
public enum DynamicMarginCalculationStatus {
NOT_DONE,
RUNNING,
SUCCEED,
FAILED
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public class NetworkModificationNode extends AbstractNode {

private UUID dynamicSecurityAnalysisResultUuid;

private UUID dynamicMarginCalculationResultUuid;

private UUID stateEstimationResultUuid;

private UUID pccMinResultUuid;
Expand All @@ -72,6 +74,7 @@ public void completeDtoFromRootNetworkNodeInfo(RootNetworkNodeInfoEntity rootNet
this.setSensitivityAnalysisResultUuid(rootNetworkNodeInfoEntity.getSensitivityAnalysisResultUuid());
this.setDynamicSimulationResultUuid(rootNetworkNodeInfoEntity.getDynamicSimulationResultUuid());
this.setDynamicSecurityAnalysisResultUuid(rootNetworkNodeInfoEntity.getDynamicSecurityAnalysisResultUuid());
this.setDynamicMarginCalculationResultUuid(rootNetworkNodeInfoEntity.getDynamicMarginCalculationResultUuid());
this.setStateEstimationResultUuid(rootNetworkNodeInfoEntity.getStateEstimationResultUuid());
this.setPccMinResultUuid(rootNetworkNodeInfoEntity.getPccMinResultUuid());
this.setNodeBuildStatus(rootNetworkNodeInfoEntity.getNodeBuildStatus().toDto());
Expand Down
Loading