Skip to content

Commit d5cd516

Browse files
SlimaneAmarSlimane AMAR
andauthored
Fix invalidate all computation results when run lf (#807)
* Invalidate all computation results when run a lf * Fix Sonar issues --------- Co-authored-by: Slimane AMAR <[email protected]>
1 parent c9cf5a0 commit d5cd516

File tree

5 files changed

+49
-30
lines changed

5 files changed

+49
-30
lines changed

src/main/java/org/gridsuite/study/server/dto/InvalidateNodeTreeParameters.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public record InvalidateNodeTreeParameters(
2323
public static InvalidateNodeTreeParameters ALL_WITH_BLOCK_NODES = new InvalidateNodeTreeParameters(InvalidationMode.ALL, true, ComputationsInvalidationMode.ALL);
2424
public static InvalidateNodeTreeParameters ONLY_CHILDREN = new InvalidateNodeTreeParameters(InvalidationMode.ONLY_CHILDREN, false, ComputationsInvalidationMode.ALL);
2525
public static InvalidateNodeTreeParameters ONLY_CHILDREN_BUILD_STATUS = new InvalidateNodeTreeParameters(InvalidationMode.ONLY_CHILDREN_BUILD_STATUS, false, ComputationsInvalidationMode.ALL);
26-
public static InvalidateNodeTreeParameters DEFAULT = ALL;
2726

2827
public enum InvalidationMode {
2928
ALL, ONLY_CHILDREN, ONLY_CHILDREN_BUILD_STATUS

src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,9 @@ public InvalidateNodeInfos invalidateRootNetworkNode(UUID nodeUuid, UUID rootNet
240240

241241
public InvalidateNodeInfos invalidateRootNetworkNode(RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity, InvalidateNodeTreeParameters invalidateTreeParameters) {
242242
boolean notOnlyChildrenBuildStatus = !invalidateTreeParameters.isOnlyChildrenBuildStatus();
243+
243244
// Always update blocked build info
244-
if (notOnlyChildrenBuildStatus && invalidateTreeParameters.withBlockedNodeBuild()) {
245+
if (invalidateTreeParameters.withBlockedNodeBuild()) {
245246
rootNetworkNodeInfoEntity.setBlockedBuild(true);
246247
}
247248

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ public void deleteLoadflowResult(UUID studyUuid, UUID nodeUuid, UUID rootNetwork
921921
public UUID sendLoadflowRequest(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID loadflowResultUuid, boolean withRatioTapChangers, boolean invalidateNodeTree, String userId) {
922922
if (invalidateNodeTree) {
923923
invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.builder()
924-
.invalidationMode(InvalidationMode.ONLY_CHILDREN)
924+
.invalidationMode(InvalidationMode.ONLY_CHILDREN_BUILD_STATUS)
925925
.withBlockedNodeBuild(true)
926926
.computationsInvalidationMode(ComputationsInvalidationMode.ALL)
927927
.build());
@@ -1882,7 +1882,7 @@ private void invalidateNode(UUID studyUuid, UUID nodeUuid) {
18821882
}
18831883

18841884
private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid) {
1885-
invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.DEFAULT);
1885+
invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ALL);
18861886
}
18871887

18881888
private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters invalidateTreeParameters) {
@@ -1907,7 +1907,7 @@ private void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNe
19071907
}
19081908

19091909
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
1910-
invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.DEFAULT);
1910+
invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL);
19111911
}
19121912

19131913
private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) {

src/test/java/org/gridsuite/study/server/LoadFLowIntegrationTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,14 @@ private void runLoadFlow(boolean withRatioTapChangers) throws Exception {
193193
.andExpect(status().isOk());
194194
wireMockUtils.verifyRunLoadflow(runLoadflowStubUuid, networkUuid, withRatioTapChangers, null);
195195
wireMockUtils.verifyLoadFlowProviderGet(loadFlowProviderStubUuid, parametersUuid);
196+
assertNodeBlocked(nodeUuid, rootNetworkUuid, true);
197+
198+
// consume loadflow result
199+
String resultUuidJson = objectMapper.writeValueAsString(new NodeReceiver(nodeUuid, rootNetworkUuid));
200+
MessageHeaders messageHeaders = new MessageHeaders(Map.of("resultUuid", loadflowResultUuid.toString(), "withRatioTapChangers", withRatioTapChangers, HEADER_RECEIVER, resultUuidJson));
201+
consumerService.consumeLoadFlowResult().accept(MessageBuilder.createMessage("", messageHeaders));
202+
203+
assertNodeBlocked(nodeUuid, rootNetworkUuid, false);
196204
}
197205

198206
private void rerunLoadFlow(boolean withRatioTapChangers) throws Exception {

src/test/java/org/gridsuite/study/server/LoadFlowTest.java

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,18 @@
2323
import okhttp3.Headers;
2424
import okhttp3.HttpUrl;
2525
import org.gridsuite.study.server.dto.*;
26-
import org.gridsuite.study.server.networkmodificationtree.dto.*;
26+
import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus;
27+
import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode;
28+
import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode;
29+
import org.gridsuite.study.server.networkmodificationtree.dto.RootNode;
2730
import org.gridsuite.study.server.networkmodificationtree.entities.NodeBuildStatusEmbeddable;
2831
import org.gridsuite.study.server.networkmodificationtree.entities.RootNetworkNodeInfoEntity;
2932
import org.gridsuite.study.server.notification.NotificationService;
3033
import org.gridsuite.study.server.repository.StudyEntity;
3134
import org.gridsuite.study.server.repository.StudyRepository;
32-
import org.gridsuite.study.server.repository.networkmodificationtree.NetworkModificationNodeInfoRepository;
3335
import org.gridsuite.study.server.repository.nonevacuatedenergy.NonEvacuatedEnergyParametersEntity;
3436
import org.gridsuite.study.server.repository.rootnetwork.RootNetworkNodeInfoRepository;
3537
import org.gridsuite.study.server.service.*;
36-
import org.gridsuite.study.server.service.LoadFlowService;
3738
import org.gridsuite.study.server.utils.TestUtils;
3839
import org.gridsuite.study.server.utils.elasticsearch.DisableElasticsearch;
3940
import org.jetbrains.annotations.NotNull;
@@ -42,7 +43,6 @@
4243
import org.junit.jupiter.api.BeforeEach;
4344
import org.junit.jupiter.api.Test;
4445
import org.junit.jupiter.api.extension.ExtendWith;
45-
import org.mockito.Mockito;
4646
import org.skyscreamer.jsonassert.JSONAssert;
4747
import org.skyscreamer.jsonassert.JSONCompareMode;
4848
import org.slf4j.Logger;
@@ -51,6 +51,7 @@
5151
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
5252
import org.springframework.boot.test.context.SpringBootTest;
5353
import org.springframework.boot.test.mock.mockito.MockBean;
54+
import org.springframework.boot.test.mock.mockito.SpyBean;
5455
import org.springframework.cloud.stream.binder.test.InputDestination;
5556
import org.springframework.cloud.stream.binder.test.OutputDestination;
5657
import org.springframework.http.HttpHeaders;
@@ -71,7 +72,7 @@
7172
import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW;
7273
import static org.gridsuite.study.server.notification.NotificationService.*;
7374
import static org.junit.jupiter.api.Assertions.*;
74-
import static org.mockito.ArgumentMatchers.*;
75+
import static org.mockito.ArgumentMatchers.any;
7576
import static org.mockito.Mockito.doAnswer;
7677
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
7778
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@@ -167,7 +168,7 @@ class LoadFlowTest {
167168
private RootNetworkNodeInfoRepository rootNetworkNodeInfoRepository;
168169
@Autowired
169170
private RootNetworkNodeInfoService rootNetworkNodeInfoService;
170-
@Autowired
171+
@SpyBean
171172
private StudyService studyService;
172173
@MockBean
173174
private NetworkModificationService networkModificationService;
@@ -176,7 +177,7 @@ class LoadFlowTest {
176177
@Autowired
177178
private TestUtils studyTestUtils;
178179
@Autowired
179-
private NetworkModificationNodeInfoRepository networkModificationNodeInfoRepository;
180+
private ConsumerService consumerService;
180181

181182
@BeforeEach
182183
void setup(final MockWebServer server) throws Exception {
@@ -250,10 +251,6 @@ public MockResponse dispatch(RecordedRequest request) {
250251
String path = Objects.requireNonNull(request.getPath());
251252
String method = Objects.requireNonNull(request.getMethod());
252253
if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2 + ".*")) {
253-
input.send(MessageBuilder.withPayload("")
254-
.setHeader("resultUuid", LOADFLOW_RESULT_UUID)
255-
.setHeader("receiver", "%7B%22nodeUuid%22%3A%22" + request.getPath().split("%")[5].substring(4) + "%22%2C%20%22rootNetworkUuid%22%3A%20%22" + request.getPath().split("%")[11].substring(4) + "%22%2C%20%22userId%22%3A%22userId%22%7D")
256-
.build(), LOADFLOW_RESULT_DESTINATION);
257254
return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), loadFlowResultUuidStr);
258255
} else if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID)) {
259256
input.send(MessageBuilder.withPayload("")
@@ -340,6 +337,25 @@ public MockResponse dispatch(RecordedRequest request) {
340337
server.setDispatcher(dispatcher);
341338
}
342339

340+
private void assertNodeBlocked(UUID nodeUuid, UUID rootNetworkUuid, boolean isNodeBlocked) {
341+
Optional<RootNetworkNodeInfoEntity> networkNodeInfoEntity = rootNetworkNodeInfoService.getRootNetworkNodeInfo(nodeUuid, rootNetworkUuid);
342+
assertTrue(networkNodeInfoEntity.isPresent());
343+
assertEquals(isNodeBlocked, networkNodeInfoEntity.get().getBlockedBuild());
344+
}
345+
346+
private void consumeLoadFlowResult(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) throws JsonProcessingException {
347+
assertNodeBlocked(nodeUuid, rootNetworkUuid, true);
348+
349+
// consume loadflow result
350+
String resultUuidJson = objectMapper.writeValueAsString(new NodeReceiver(nodeUuid, rootNetworkUuid));
351+
MessageHeaders messageHeaders = new MessageHeaders(Map.of("resultUuid", LOADFLOW_RESULT_UUID, "withRatioTapChangers", false, HEADER_RECEIVER, resultUuidJson));
352+
consumerService.consumeLoadFlowResult().accept(MessageBuilder.createMessage("", messageHeaders));
353+
checkUpdateModelStatusMessagesReceived(studyUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
354+
checkUpdateModelStatusMessagesReceived(studyUuid, NotificationService.UPDATE_TYPE_LOADFLOW_RESULT);
355+
356+
assertNodeBlocked(nodeUuid, rootNetworkUuid, false);
357+
}
358+
343359
@Test
344360
void testLoadFlow(final MockWebServer server) throws Exception {
345361
MvcResult mvcResult;
@@ -370,17 +386,15 @@ void testLoadFlow(final MockWebServer server) throws Exception {
370386
.header("userId", "userId"))
371387
.andExpect(status().isOk());
372388

373-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
374-
375-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_RESULT);
376-
377389
// running loadflow now invalidate node children and their computations
378390
checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNode3Uuid);
379391

380392
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
381393

382394
assertRequestsDone(server, List.of("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2, "/v1/parameters/" + LOADFLOW_PARAMETERS_UUID + "/provider"));
383395

396+
consumeLoadFlowResult(studyNameUserIdUuid, modificationNode3Uuid, firstRootNetworkUuid);
397+
384398
// get loadflow result
385399
mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/result", studyNameUserIdUuid, firstRootNetworkUuid, modificationNode3Uuid)).andExpectAll(
386400
status().isOk()).andReturn();
@@ -443,15 +457,14 @@ void testGetLimitViolations(final MockWebServer server) throws Exception {
443457
.andExpect(status().isOk())
444458
.andReturn();
445459

446-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
447-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_RESULT);
448-
449460
// running loadflow now invalidate node children and their computations
450461
checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNode1Uuid);
451462

452463
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
453464
assertRequestsDone(server, List.of("/v1/parameters/" + LOADFLOW_PARAMETERS_UUID + "/provider", "/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2));
454465

466+
consumeLoadFlowResult(studyNameUserIdUuid, modificationNode1Uuid, firstRootNetworkUuid);
467+
455468
// get computing status
456469
mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}",
457470
studyNameUserIdUuid, firstRootNetworkUuid, modificationNode1Uuid, LOAD_FLOW, "computation-status"))
@@ -500,15 +513,14 @@ void testInvalidateStatus(final MockWebServer server) throws Exception {
500513
.andExpect(status().isOk())
501514
.andReturn();
502515

503-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
504-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_RESULT);
505-
506516
// running loadflow now invalidate children and their computations
507517
checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNode1Uuid);
508518

509519
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
510520
assertRequestsDone(server, List.of("/v1/parameters/" + LOADFLOW_PARAMETERS_UUID + "/provider", "/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2));
511521

522+
consumeLoadFlowResult(studyNameUserIdUuid, modificationNode1Uuid, firstRootNetworkUuid);
523+
512524
// invalidate status
513525
mockMvc.perform(put("/v1/studies/{studyUuid}/loadflow/invalidate-status", studyNameUserIdUuid)
514526
.header("userId", "userId")).andExpect(status().isOk());
@@ -545,14 +557,14 @@ void testDeleteLoadFlowResults(final MockWebServer server) throws Exception {
545557
.header("userId", "userId"))
546558
.andExpect(status().isOk());
547559

548-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
549-
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_RESULT);
550-
551560
// running loadflow now invalidate node children and their computations
552561
checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNode3Uuid);
553562

554563
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
555564
assertRequestsDone(server, List.of("/v1/parameters/" + LOADFLOW_PARAMETERS_UUID + "/provider", "/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?withRatioTapChangers=.*&receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2));
565+
566+
consumeLoadFlowResult(studyNameUserIdUuid, modificationNode3Uuid, firstRootNetworkUuid);
567+
556568
//Test result count
557569
testResultCount(server);
558570
//Delete Voltage init results
@@ -573,7 +585,6 @@ void testResetUuidResultWhenLFFailed() throws Exception {
573585
assertNotNull(rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), rootNetworkUuid, LOAD_FLOW));
574586
assertEquals(resultUuid, rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), rootNetworkUuid, LOAD_FLOW));
575587

576-
StudyService studyService = Mockito.mock(StudyService.class);
577588
doAnswer(invocation -> {
578589
input.send(MessageBuilder.withPayload("").setHeader(HEADER_RECEIVER, resultUuidJson).build(), LOADFLOW_FAILED_DESTINATION);
579590
return resultUuid;

0 commit comments

Comments
 (0)