Skip to content

Commit 16ddbc1

Browse files
authored
Fix icc limits update (#58)
Signed-off-by: Etienne Homer <[email protected]>
1 parent 3c4a16c commit 16ddbc1

File tree

3 files changed

+88
-26
lines changed

3 files changed

+88
-26
lines changed

src/main/java/org/gridsuite/shortcircuit/server/service/ShortCircuitRunContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88

99
import com.powsybl.shortcircuit.ShortCircuitParameters;
1010
import lombok.Getter;
11+
import org.gridsuite.shortcircuit.server.dto.ShortCircuitLimits;
1112

13+
import java.util.HashMap;
14+
import java.util.Map;
1215
import java.util.Objects;
1316
import java.util.UUID;
1417

@@ -34,6 +37,8 @@ public class ShortCircuitRunContext {
3437

3538
private final String busId;
3639

40+
private Map<String, ShortCircuitLimits> shortCircuitLimits = new HashMap<>();
41+
3742
public ShortCircuitRunContext(UUID networkUuid, String variantId, String receiver, ShortCircuitParameters parameters, UUID reportUuid, String reporterId, String userId, String busId) {
3843
this.networkUuid = Objects.requireNonNull(networkUuid);
3944
this.variantId = variantId;
@@ -44,4 +49,8 @@ public ShortCircuitRunContext(UUID networkUuid, String variantId, String receive
4449
this.userId = userId;
4550
this.busId = busId;
4651
}
52+
53+
public void setShortCircuitLimits(Map<String, ShortCircuitLimits> shortCircuitLimits) {
54+
this.shortCircuitLimits = shortCircuitLimits;
55+
}
4756
}

src/main/java/org/gridsuite/shortcircuit/server/service/ShortCircuitWorkerService.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ public class ShortCircuitWorkerService {
6464

6565
private Set<UUID> runRequests = Sets.newConcurrentHashSet();
6666

67-
private Map<String, ShortCircuitLimits> shortCircuitLimits = new HashMap<>();
68-
6967
private final Lock lockRunAndCancelShortCircuitAnalysis = new ReentrantLock();
7068

7169
@Autowired
@@ -118,8 +116,9 @@ private ShortCircuitAnalysisResult run(ShortCircuitRunContext context, UUID resu
118116
return result;
119117
}
120118

121-
private List<Fault> getAllBusfaultFromNetwork(Network network) {
122-
return network.getBusView().getBusStream()
119+
private List<Fault> getAllBusfaultFromNetwork(Network network, ShortCircuitRunContext context) {
120+
Map<String, ShortCircuitLimits> shortCircuitLimits = new HashMap<>();
121+
List<Fault> faults = network.getBusView().getBusStream()
123122
.map(bus -> {
124123
IdentifiableShortCircuit<VoltageLevel> shortCircuitExtension = bus.getVoltageLevel().getExtension(IdentifiableShortCircuit.class);
125124
if (shortCircuitExtension != null) {
@@ -128,10 +127,14 @@ private List<Fault> getAllBusfaultFromNetwork(Network network) {
128127
return new BusFault(bus.getId(), bus.getId());
129128
})
130129
.collect(Collectors.toList());
130+
context.setShortCircuitLimits(shortCircuitLimits);
131+
return faults;
131132
}
132133

133-
private List<Fault> getBusFaultFromBusId(String busId, Network network) {
134+
private List<Fault> getBusFaultFromBusId(Network network, ShortCircuitRunContext context) {
135+
String busId = context.getBusId();
134136
Identifiable<?> identifiable = network.getIdentifiable(busId);
137+
Map<String, ShortCircuitLimits> shortCircuitLimits = new HashMap<>();
135138

136139
if (identifiable instanceof BusbarSection) {
137140
String busIdFromBusView = ((BusbarSection) identifiable).getTerminal().getBusView().getBus().getId();
@@ -150,7 +153,7 @@ private List<Fault> getBusFaultFromBusId(String busId, Network network) {
150153
}
151154
return List.of(new BusFault(busIdFromBusView, busIdFromBusView));
152155
}
153-
156+
context.setShortCircuitLimits(shortCircuitLimits);
154157
throw new NoSuchElementException("No bus found for bus id " + busId);
155158
}
156159

@@ -165,8 +168,8 @@ private CompletableFuture<ShortCircuitAnalysisResult> runShortCircuitAnalysisAsy
165168
}
166169

167170
List<Fault> faults = context.getBusId() == null
168-
? getAllBusfaultFromNetwork(network)
169-
: getBusFaultFromBusId(context.getBusId(), network);
171+
? getAllBusfaultFromNetwork(network, context)
172+
: getBusFaultFromBusId(network, context);
170173

171174
CompletableFuture<ShortCircuitAnalysisResult> future = ShortCircuitAnalysis.runAsync(
172175
network,
@@ -218,7 +221,7 @@ public Consumer<Message<String>> consumeRun() {
218221
long nanoTime = System.nanoTime();
219222
LOGGER.info("Just run in {}s", TimeUnit.NANOSECONDS.toSeconds(nanoTime - startTime.getAndSet(nanoTime)));
220223

221-
resultRepository.insert(resultContext.getResultUuid(), result, shortCircuitLimits, ShortCircuitAnalysisStatus.COMPLETED.name());
224+
resultRepository.insert(resultContext.getResultUuid(), result, resultContext.getRunContext().getShortCircuitLimits(), ShortCircuitAnalysisStatus.COMPLETED.name());
222225
long finalNanoTime = System.nanoTime();
223226
LOGGER.info("Stored in {}s", TimeUnit.NANOSECONDS.toSeconds(finalNanoTime - startTime.getAndSet(finalNanoTime)));
224227

src/test/java/org/gridsuite/shortcircuit/server/ShortCircuitAnalysisControllerTest.java

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.powsybl.computation.ComputationManager;
1515
import com.powsybl.iidm.network.Network;
1616
import com.powsybl.iidm.network.VariantManagerConstants;
17-
import com.powsybl.iidm.network.VoltageLevel;
1817
import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder;
1918
import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory;
2019
import com.powsybl.iidm.network.test.FourSubstationsNodeBreakerFactory;
@@ -60,8 +59,7 @@
6059

6160
import static com.powsybl.network.store.model.NetworkStoreApi.VERSION;
6261
import static org.gridsuite.shortcircuit.server.service.NotificationService.*;
63-
import static org.junit.Assert.assertEquals;
64-
import static org.junit.Assert.assertNotNull;
62+
import static org.junit.Assert.*;
6563
import static org.mockito.ArgumentMatchers.*;
6664
import static org.mockito.BDDMockito.given;
6765
import static org.mockito.Mockito.doAnswer;
@@ -79,6 +77,7 @@
7977
public class ShortCircuitAnalysisControllerTest {
8078

8179
private static final UUID NETWORK_UUID = UUID.fromString("7928181c-7977-4592-ba19-88027e4254e4");
80+
private static final UUID NETWORK1_UUID = UUID.fromString("faa0f351-f664-4771-951b-fa3b565c4d37");
8281
private static final UUID NODE_BREAKER_NETWORK_UUID = UUID.fromString("060d9225-1b88-4e52-885f-0f6297f5fa35");
8382
private static final UUID RESULT_UUID = UUID.fromString("0c8de370-3e6c-4d72-b292-d355a97e0d5d");
8483
private static final UUID OTHER_RESULT_UUID = UUID.fromString("0c8de370-3e6c-4d72-b292-d355a97e0d5a");
@@ -90,7 +89,7 @@ public class ShortCircuitAnalysisControllerTest {
9089
private static final String VARIANT_1_ID = "variant_1";
9190
private static final String VARIANT_2_ID = "variant_2";
9291
private static final String VARIANT_3_ID = "variant_3";
93-
92+
private static final String VARIANT_4_ID = "variant_4";
9493
private static final String NODE_BREAKER_NETWORK_VARIANT_ID = "node_breaker_network_variant_id";
9594

9695
private static final int TIMEOUT = 1000;
@@ -237,29 +236,21 @@ public void setUp() throws Exception {
237236

238237
// network store service mocking
239238
network = EurostagTutorialExample1Factory.createWithMoreGenerators(new NetworkFactoryImpl());
240-
network.getVoltageLevels().forEach(voltageLevel -> {
241-
IdentifiableShortCircuitAdder<VoltageLevel> identifiableShortCircuitAdder = voltageLevel.newExtension(IdentifiableShortCircuitAdder.class);
242-
identifiableShortCircuitAdder.withIpMin(10.5);
243-
identifiableShortCircuitAdder.withIpMax(200.0);
244-
identifiableShortCircuitAdder.add();
245-
});
239+
network.getVoltageLevels().forEach(voltageLevel -> voltageLevel.newExtension(IdentifiableShortCircuitAdder.class).withIpMin(10.5).withIpMax(200.0).add());
246240
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_1_ID);
247241
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_2_ID);
248242
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_3_ID);
249243

250244
given(networkStoreService.getNetwork(NETWORK_UUID, PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW)).willReturn(network);
251245

252246
network1 = EurostagTutorialExample1Factory.createWithMoreGenerators(new NetworkFactoryImpl());
253-
network1.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_2_ID);
247+
network1.getVoltageLevelStream().findFirst().get().newExtension(IdentifiableShortCircuitAdder.class).withIpMin(5.0).withIpMax(100.5).add();
248+
network1.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_4_ID);
249+
given(networkStoreService.getNetwork(NETWORK1_UUID, PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW)).willReturn(network1);
254250

255251
// Network for nodeBreakerView tests
256252
nodeBreakerNetwork = FourSubstationsNodeBreakerFactory.create(new NetworkFactoryImpl());
257-
nodeBreakerNetwork.getVoltageLevels().forEach(voltageLevel -> {
258-
IdentifiableShortCircuitAdder<VoltageLevel> identifiableShortCircuitAdder = voltageLevel.newExtension(IdentifiableShortCircuitAdder.class);
259-
identifiableShortCircuitAdder.withIpMin(25.5);
260-
identifiableShortCircuitAdder.withIpMax(100.0);
261-
identifiableShortCircuitAdder.add();
262-
});
253+
nodeBreakerNetwork.getVoltageLevels().forEach(voltageLevel -> voltageLevel.newExtension(IdentifiableShortCircuitAdder.class).withIpMin(10.5).withIpMax(200.0).add());
263254
nodeBreakerNetwork.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, NODE_BREAKER_NETWORK_VARIANT_ID);
264255

265256
given(networkStoreService.getNetwork(NODE_BREAKER_NETWORK_UUID, PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW)).willReturn(nodeBreakerNetwork);
@@ -632,4 +623,63 @@ public void runWithNoShortcircuitDataTest() {
632623
assertEquals("me", resultMessage.getHeaders().get("receiver"));
633624
}
634625
}
626+
627+
@Test
628+
public void checkShortCircuitLimitsTest() throws Exception {
629+
try (MockedStatic<ShortCircuitAnalysis> shortCircuitAnalysisMockedStatic = Mockito.mockStatic(ShortCircuitAnalysis.class)) {
630+
shortCircuitAnalysisMockedStatic.when(() -> ShortCircuitAnalysis.runAsync(eq(network), anyList(), any(ShortCircuitParameters.class), any(ComputationManager.class), anyList(), any(Reporter.class)))
631+
.thenReturn(CompletableFuture.completedFuture(ShortCircuitAnalysisResultMock.RESULT_MAGNITUDE_FULL));
632+
shortCircuitAnalysisMockedStatic.when(() -> ShortCircuitAnalysis.runAsync(eq(network1), anyList(), any(ShortCircuitParameters.class), any(ComputationManager.class), anyList(), any(Reporter.class)))
633+
.thenReturn(CompletableFuture.completedFuture(ShortCircuitAnalysisResultMock.RESULT_MAGNITUDE_FULL));
634+
635+
ShortCircuitParameters shortCircuitParameters = new ShortCircuitParameters().setWithFortescueResult(false);
636+
String parametersJson = mapper.writeValueAsString(shortCircuitParameters);
637+
mockMvc.perform(post(
638+
"/" + VERSION + "/networks/{networkUuid}/run-and-save?receiver=me&variantId=" + VARIANT_2_ID, NETWORK_UUID)
639+
.header(HEADER_USER_ID, "userId")
640+
.contentType(MediaType.APPLICATION_JSON)
641+
.content(parametersJson))
642+
.andExpect(status().isOk())
643+
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
644+
.andReturn();
645+
output.receive(TIMEOUT, shortCircuitAnalysisResultDestination);
646+
output.receive(TIMEOUT, shortCircuitAnalysisRunDestination);
647+
648+
MvcResult result = mockMvc.perform(get(
649+
"/" + VERSION + "/results/{resultUuid}", RESULT_UUID))
650+
.andExpect(status().isOk())
651+
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
652+
.andReturn();
653+
org.gridsuite.shortcircuit.server.dto.ShortCircuitAnalysisResult resultDto = mapper.readValue(result.getResponse().getContentAsString(), org.gridsuite.shortcircuit.server.dto.ShortCircuitAnalysisResult.class);
654+
assertEquals(10.5, resultDto.getFaults().get(0).getShortCircuitLimits().getIpMin(), 0.1);
655+
assertEquals(200.0, resultDto.getFaults().get(0).getShortCircuitLimits().getIpMax(), 0.1);
656+
assertEquals(10.5, resultDto.getFaults().get(1).getShortCircuitLimits().getIpMin(), 0.1);
657+
assertEquals(200.0, resultDto.getFaults().get(1).getShortCircuitLimits().getIpMax(), 0.1);
658+
mockMvc.perform(delete("/" + VERSION + "/results/{resultUuid}", RESULT_UUID))
659+
.andExpect(status().isOk());
660+
661+
mockMvc.perform(post(
662+
"/" + VERSION + "/networks/{networkUuid}/run-and-save?receiver=me&variantId=" + VARIANT_4_ID, NETWORK1_UUID)
663+
.header(HEADER_USER_ID, "userId")
664+
.contentType(MediaType.APPLICATION_JSON)
665+
.content(parametersJson))
666+
.andExpect(status().isOk())
667+
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
668+
.andReturn();
669+
670+
output.receive(TIMEOUT, shortCircuitAnalysisResultDestination);
671+
output.receive(TIMEOUT, shortCircuitAnalysisRunDestination);
672+
673+
result = mockMvc.perform(get(
674+
"/" + VERSION + "/results/{resultUuid}", RESULT_UUID))
675+
.andExpect(status().isOk())
676+
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
677+
.andReturn();
678+
resultDto = mapper.readValue(result.getResponse().getContentAsString(), org.gridsuite.shortcircuit.server.dto.ShortCircuitAnalysisResult.class);
679+
assertEquals(Double.NaN, resultDto.getFaults().get(0).getShortCircuitLimits().getIpMin(), 0.1);
680+
assertEquals(Double.NaN, resultDto.getFaults().get(0).getShortCircuitLimits().getIpMax(), 0.1);
681+
assertEquals(5.0, resultDto.getFaults().get(1).getShortCircuitLimits().getIpMin(), 0.1);
682+
assertEquals(100.5, resultDto.getFaults().get(1).getShortCircuitLimits().getIpMax(), 0.1);
683+
}
684+
}
635685
}

0 commit comments

Comments
 (0)