Skip to content

Commit 87c6767

Browse files
MekloSlimaneAmar
andauthored
Each modifications group now have a dedicated application status (#274)
Signed-off-by: Hugo Marcellin <[email protected]> Co-authored-by: Slimane AMAR <[email protected]>
1 parent 304899c commit 87c6767

File tree

10 files changed

+84
-42
lines changed

10 files changed

+84
-42
lines changed

src/main/java/org/gridsuite/modification/server/dto/NetworkModificationResult.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,12 @@ public ApplicationStatus max(ApplicationStatus other) {
3939
}
4040
}
4141

42-
@Schema(description = "Application status")
42+
@Schema(description = "Global application status")
4343
ApplicationStatus applicationStatus;
4444

45+
@Schema(description = "Last group application status")
46+
ApplicationStatus lastGroupApplicationStatus;
47+
4548
@Schema(description = "Network modification impacts")
4649
@Builder.Default
4750
private List<SimpleElementImpact> networkImpacts = List.of();

src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.gridsuite.modification.server.modifications;
88

9+
import com.google.common.collect.Streams;
910
import com.powsybl.commons.PowsyblException;
1011
import com.powsybl.commons.reporter.Report;
1112
import com.powsybl.commons.reporter.Reporter;
@@ -38,7 +39,7 @@
3839
public class NetworkModificationApplicator {
3940
private static final Logger LOGGER = LoggerFactory.getLogger(NetworkModificationApplicator.class);
4041

41-
private static final String NETWORK_MODIFICATION_TYPE_REPORT = "NetworkModification";
42+
public static final String NETWORK_MODIFICATION_TYPE_REPORT = "NetworkModification";
4243

4344
private final NetworkStoreService networkStoreService;
4445

@@ -56,36 +57,44 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
5657
this.context = context;
5758
}
5859

59-
public NetworkModificationResult applyModification(ModificationInfos modificationInfos, NetworkInfos networkInfos, ReportInfos reportInfos) {
60-
NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService);
61-
apply(modificationInfos, listener, reportInfos);
62-
return listener.flushNetworkModifications();
63-
}
64-
6560
public NetworkModificationResult applyModifications(List<ModificationInfos> modificationInfosList, NetworkInfos networkInfos, ReportInfos reportInfos) {
6661
NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService);
67-
modificationInfosList.forEach(m -> apply(m, listener, reportInfos));
62+
ApplicationStatus applicationStatus = apply(modificationInfosList, listener.getNetwork(), reportInfos);
63+
listener.setApplicationStatus(applicationStatus);
64+
listener.setLastGroupApplicationStatus(applicationStatus);
6865
return listener.flushNetworkModifications();
6966
}
7067

7168
public NetworkModificationResult applyModifications(List<Pair<String, List<ModificationInfos>>> modificationInfosGroups, NetworkInfos networkInfos, UUID reportUuid) {
7269
NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService);
73-
modificationInfosGroups.forEach(g -> g.getRight().forEach(m -> apply(m, listener, new ReportInfos(reportUuid, g.getLeft()))));
70+
List<ApplicationStatus> groupsStatuses =
71+
modificationInfosGroups.stream()
72+
.map(g -> apply(g.getRight(), listener.getNetwork(), new ReportInfos(reportUuid, g.getLeft())))
73+
.toList();
74+
listener.setApplicationStatus(groupsStatuses.stream().reduce(ApplicationStatus::max).orElse(ApplicationStatus.ALL_OK));
75+
listener.setLastGroupApplicationStatus(Streams.findLast(groupsStatuses.stream()).orElse(ApplicationStatus.ALL_OK));
7476
return listener.flushNetworkModifications();
7577
}
7678

77-
private void apply(ModificationInfos modificationInfos, NetworkStoreListener listener, ReportInfos reportInfos) {
79+
private ApplicationStatus apply(List<ModificationInfos> modificationInfosList, Network network, ReportInfos reportInfos) {
7880
String rootReporterId = reportInfos.getReporterId() + "@" + NETWORK_MODIFICATION_TYPE_REPORT;
7981
ReporterModel reporter = new ReporterModel(rootReporterId, rootReporterId);
82+
ApplicationStatus applicationStatus = modificationInfosList.stream()
83+
.map(m -> apply(m, network, reporter))
84+
.reduce(ApplicationStatus::max)
85+
.orElse(ApplicationStatus.ALL_OK);
86+
reportService.sendReport(reportInfos.getReportUuid(), reporter);
87+
return applicationStatus;
88+
}
89+
90+
private ApplicationStatus apply(ModificationInfos modificationInfos, Network network, ReporterModel reporter) {
8091
Reporter subReporter = modificationInfos.createSubReporter(reporter);
8192
try {
82-
apply(modificationInfos.toModification(), listener.getNetwork(), subReporter);
93+
apply(modificationInfos.toModification(), network, subReporter);
8394
} catch (Exception e) {
8495
handleException(modificationInfos.getErrorType(), subReporter, e);
85-
} finally {
86-
listener.setApplicationStatus(getApplicationStatus(reporter));
87-
reportService.sendReport(reportInfos.getReportUuid(), reporter); // TODO : Group report sends ?
8896
}
97+
return getApplicationStatus(reporter);
8998
}
9099

91100
@SuppressWarnings("squid:S1181")

src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java

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

99
import com.powsybl.iidm.network.*;
1010
import com.powsybl.network.store.client.NetworkStoreService;
11+
import lombok.Setter;
1112
import org.gridsuite.modification.server.NetworkModificationException;
1213
import org.gridsuite.modification.server.dto.NetworkModificationResult;
14+
import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus;
1315
import org.gridsuite.modification.server.dto.elasticsearch.EquipmentInfos;
1416
import org.gridsuite.modification.server.dto.elasticsearch.TombstonedEquipmentInfos;
1517
import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
@@ -41,7 +43,10 @@ public class NetworkStoreListener implements NetworkListener {
4143
private final Set<SimpleElementImpact> networkImpacts = new LinkedHashSet<>();
4244

4345
// TODO : Move to the NetworkModificationApplicator class
44-
private NetworkModificationResult.ApplicationStatus applicationStatus = NetworkModificationResult.ApplicationStatus.ALL_OK;
46+
@Setter
47+
private ApplicationStatus applicationStatus;
48+
@Setter
49+
private ApplicationStatus lastGroupApplicationStatus;
4550

4651
protected NetworkStoreListener(Network network, UUID networkUuid,
4752
NetworkStoreService networkStoreService, EquipmentInfosService equipmentInfosService) {
@@ -181,14 +186,11 @@ public NetworkModificationResult flushNetworkModifications() {
181186
return
182187
NetworkModificationResult.builder()
183188
.applicationStatus(applicationStatus)
189+
.lastGroupApplicationStatus(lastGroupApplicationStatus)
184190
.networkImpacts(new ArrayList<>(networkImpacts))
185191
.build();
186192
}
187193

188-
public void setApplicationStatus(NetworkModificationResult.ApplicationStatus applicationStatus) {
189-
this.applicationStatus = this.applicationStatus.max(applicationStatus);
190-
}
191-
192194
private void flushEquipmentInfos() {
193195
String variantId = network.getVariantManager().getWorkingVariantId();
194196
Set<String> presentEquipmentDeletionsIds = equipmentInfosService.findEquipmentInfosList(deletedEquipmentsIds, networkUuid, variantId).stream().map(EquipmentInfos::getId).collect(Collectors.toSet());

src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.fasterxml.jackson.databind.ObjectMapper;
1010
import com.google.common.collect.Streams;
1111
import com.powsybl.commons.PowsyblException;
12-
import com.powsybl.commons.reporter.ReporterModel;
1312
import com.powsybl.iidm.network.Network;
1413
import com.powsybl.iidm.network.VariantManagerConstants;
1514
import com.powsybl.network.store.client.NetworkStoreService;
@@ -46,19 +45,16 @@ public class NetworkModificationService {
4645

4746
private final NotificationService notificationService;
4847

49-
private final ReportService reportService;
50-
5148
private final ObjectMapper objectMapper;
5249

5350
public NetworkModificationService(NetworkStoreService networkStoreService, NetworkModificationRepository networkModificationRepository,
54-
EquipmentInfosService equipmentInfosService, NotificationService notificationService, ReportService reportService,
51+
EquipmentInfosService equipmentInfosService, NotificationService notificationService,
5552
NetworkModificationApplicator applicationService, ObjectMapper objectMapper) {
5653
this.networkStoreService = networkStoreService;
5754
this.networkModificationRepository = networkModificationRepository;
5855
this.equipmentInfosService = equipmentInfosService;
5956
this.notificationService = notificationService;
6057
this.modificationApplicator = applicationService;
61-
this.reportService = reportService;
6258
this.objectMapper = objectMapper;
6359
}
6460

@@ -113,7 +109,7 @@ public Optional<NetworkModificationResult> createNetworkModification(@NonNull Ne
113109
networkModificationRepository.saveModifications(groupUuid, List.of(modificationInfos.toEntity()));
114110

115111
return networkInfos.isVariantPresent() ?
116-
Optional.of(modificationApplicator.applyModification(modificationInfos, networkInfos, reportInfos)) :
112+
Optional.of(modificationApplicator.applyModifications(List.of(modificationInfos), networkInfos, reportInfos)) :
117113
Optional.empty();
118114
}
119115

@@ -150,17 +146,13 @@ public NetworkModificationResult buildVariant(@NonNull NetworkInfos networkInfos
150146
throw e;
151147
}
152148
}
149+
modificationInfos.add(
150+
Pair.of(reporterId,
151+
modificationsByGroup.stream()
152+
.filter(e -> !buildInfos.getModificationsToExclude().contains(e.getUuid()))
153+
.collect(Collectors.toList()))
154+
);
153155

154-
if (modificationsByGroup.isEmpty()) {
155-
reportService.sendReport(buildInfos.getReportUuid(), new ReporterModel(reporterId, reporterId));
156-
} else {
157-
modificationInfos.add(
158-
Pair.of(reporterId,
159-
modificationsByGroup.stream()
160-
.filter(e -> !buildInfos.getModificationsToExclude().contains(e.getUuid()))
161-
.collect(Collectors.toList()))
162-
);
163-
}
164156
}
165157
);
166158

src/test/java/org/gridsuite/modification/server/Impacts/ElementImpactTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.HashSet;
2222
import java.util.List;
2323
import java.util.TreeSet;
24-
2524
import static org.gridsuite.modification.server.Impacts.TestImpactUtils.*;
2625
import static org.junit.Assert.assertEquals;
2726

@@ -49,14 +48,17 @@ public void testElementImpact() throws IOException {
4948

5049
NetworkModificationResult result = NetworkModificationResult.builder()
5150
.applicationStatus(ApplicationStatus.ALL_OK)
51+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
5252
.networkImpacts((List<SimpleElementImpact>) impacts)
5353
.build();
5454
assertEquals(TestUtils.resourceToString("/network-modification-result-with-all-ok.json"), mapper.writeValueAsString(result));
5555

5656
result.setApplicationStatus(ApplicationStatus.WITH_WARNINGS);
57+
result.setLastGroupApplicationStatus(ApplicationStatus.WITH_WARNINGS);
5758
assertEquals(TestUtils.resourceToString("/network-modification-result-with-with-warnings.json"), mapper.writeValueAsString(result));
5859

5960
result.setApplicationStatus(ApplicationStatus.WITH_ERRORS);
61+
result.setLastGroupApplicationStatus(ApplicationStatus.WITH_ERRORS);
6062
assertEquals(TestUtils.resourceToString("/network-modification-result-with-with-errors.json"), mapper.writeValueAsString(result));
6163

6264
assertEquals("[s1, s2, s3, s4]", result.getImpactedSubstationsIds().toString());

src/test/java/org/gridsuite/modification/server/Impacts/TestImpactUtils.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,21 @@ public static void testEmptyImpacts(ObjectMapper mapper, String resultAsString)
3737
}
3838

3939
public static void testEmptyImpacts(ObjectMapper mapper, NetworkModificationResult networkModificationResult) {
40-
testEmptyImpacts(mapper, ApplicationStatus.ALL_OK, networkModificationResult);
40+
testEmptyImpacts(mapper, ApplicationStatus.ALL_OK, ApplicationStatus.ALL_OK, networkModificationResult);
4141
}
4242

4343
public static void testEmptyImpactsWithErrors(ObjectMapper mapper, NetworkModificationResult networkModificationResult) {
44-
testEmptyImpacts(mapper, ApplicationStatus.WITH_ERRORS, networkModificationResult);
44+
testEmptyImpacts(mapper, ApplicationStatus.WITH_ERRORS, ApplicationStatus.WITH_ERRORS, networkModificationResult);
4545
}
4646

47-
private static void testEmptyImpacts(ObjectMapper mapper, ApplicationStatus applicationStatusExpected, NetworkModificationResult networkModificationResult) {
47+
public static void testEmptyImpactsWithErrorsLastOK(ObjectMapper mapper, NetworkModificationResult networkModificationResult) {
48+
testEmptyImpacts(mapper, ApplicationStatus.WITH_ERRORS, ApplicationStatus.ALL_OK, networkModificationResult);
49+
}
50+
51+
private static void testEmptyImpacts(ObjectMapper mapper, ApplicationStatus globalApplicationStatusExpected, ApplicationStatus localApplicationStatusExpected, NetworkModificationResult networkModificationResult) {
4852
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
49-
.applicationStatus(applicationStatusExpected)
53+
.applicationStatus(globalApplicationStatusExpected)
54+
.lastGroupApplicationStatus(localApplicationStatusExpected)
5055
.networkImpacts(List.of())
5156
.build();
5257
assertThat(networkModificationResult).recursivelyEquals(resultExpected);
@@ -66,6 +71,7 @@ public static void testElementImpacts(ObjectMapper mapper, String resultAsString
6671
assertTrue(networkModificationResult.isPresent());
6772
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
6873
.applicationStatus(ApplicationStatus.ALL_OK)
74+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
6975
.networkImpacts(elementImpactsExpected)
7076
.build();
7177
assertThat(networkModificationResult.get()).recursivelyEquals(resultExpected);
@@ -88,6 +94,7 @@ public static void testElementImpact(SimpleImpactType impactType, ObjectMapper m
8894
assertTrue(networkModificationResult.isPresent());
8995
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
9096
.applicationStatus(ApplicationStatus.ALL_OK)
97+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
9198
.networkImpacts(List.of(createElementImpact(impactType, elementType, elementId, new HashSet<>(substationIds))))
9299
.build();
93100
assertThat(networkModificationResult.get()).recursivelyEquals(resultExpected);
@@ -100,6 +107,7 @@ public static void testConnectableDeletionImpacts(ObjectMapper mapper, String re
100107
assertTrue(networkModificationResult.isPresent());
101108
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
102109
.applicationStatus(ApplicationStatus.ALL_OK)
110+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
103111
.networkImpacts(createConnectableDeletionImpacts(connectableType, connectableId, breakerId, disconnectorId, substationId))
104112
.build();
105113
assertThat(networkModificationResult.get()).recursivelyEquals(resultExpected);
@@ -144,6 +152,7 @@ public static void testBranchImpacts(ObjectMapper mapper, SimpleImpactType impac
144152
assertTrue(networkModificationResult.isPresent());
145153
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
146154
.applicationStatus(ApplicationStatus.ALL_OK)
155+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
147156
.networkImpacts(createBranchImpacts(impactType, branchType, branchId, breakerId1, disconnectorId1, substationId1, breakerId2, disconnectorId2, substationId2))
148157
.build();
149158
assertThat(networkModificationResult.get()).recursivelyEquals(resultExpected);
@@ -177,6 +186,7 @@ public static void test3WTDeletionImpacts(ObjectMapper mapper, String resultAsSt
177186
assertTrue(networkModificationResult.isPresent());
178187
NetworkModificationResult resultExpected = NetworkModificationResult.builder()
179188
.applicationStatus(ApplicationStatus.ALL_OK)
189+
.lastGroupApplicationStatus(ApplicationStatus.ALL_OK)
180190
.networkImpacts(create3wtDeletionImpacts(w3tId, breakerId1, disconnectorId1, breakerId2, disconnectorId2, breakerId3, disconnectorId3, substationId))
181191
.build();
182192
assertThat(networkModificationResult.get()).recursivelyEquals(resultExpected);

src/test/java/org/gridsuite/modification/server/service/BuildTest.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import okhttp3.mockwebserver.MockResponse;
1919
import okhttp3.mockwebserver.MockWebServer;
2020
import okhttp3.mockwebserver.RecordedRequest;
21+
import org.apache.commons.lang3.tuple.Pair;
2122
import org.gridsuite.modification.server.ContextConfigurationWithTestChannel;
2223
import org.gridsuite.modification.server.TapChangerType;
2324
import org.gridsuite.modification.server.dto.*;
@@ -63,6 +64,7 @@
6364

6465
import static com.powsybl.iidm.network.ReactiveLimitsKind.MIN_MAX;
6566
import static org.gridsuite.modification.server.Impacts.TestImpactUtils.*;
67+
import static org.gridsuite.modification.server.modifications.NetworkModificationApplicator.NETWORK_MODIFICATION_TYPE_REPORT;
6668
import static org.gridsuite.modification.server.service.BuildWorkerService.CANCEL_MESSAGE;
6769
import static org.gridsuite.modification.server.service.BuildWorkerService.FAIL_MESSAGE;
6870
import static org.hamcrest.MatcherAssert.assertThat;
@@ -319,7 +321,7 @@ public void runBuildWithEmptyGroupTest() throws Exception {
319321
List.of(TEST_GROUP_ID),
320322
List.of(TEST_SUB_REPORTER_ID_1),
321323
new HashSet<>());
322-
String expectedBody = mapper.writeValueAsString(new ReporterModel(TEST_SUB_REPORTER_ID_1, TEST_SUB_REPORTER_ID_1));
324+
String expectedBody = mapper.writeValueAsString(new ReporterModel(TEST_SUB_REPORTER_ID_1 + "@" + NETWORK_MODIFICATION_TYPE_REPORT, TEST_SUB_REPORTER_ID_1 + "@" + NETWORK_MODIFICATION_TYPE_REPORT));
323325

324326
// Group does not exist
325327
String uriString = "/v1/networks/{networkUuid}/build?receiver=me";
@@ -825,6 +827,25 @@ public void testApplyModificationWithErrors() {
825827
testNetworkModificationsCount(groupUuid, 2);
826828
}
827829

830+
@Test
831+
public void testLastGroupModificationStatus() {
832+
Network network = NetworkCreation.create(TEST_NETWORK_ID, true);
833+
LoadCreationInfos loadCreationInfos = LoadCreationInfos.builder().voltageLevelId("unknownVoltageLevelId").equipmentId("loadId").build();
834+
UUID reportUuid = UUID.randomUUID();
835+
String reporterId = UUID.randomUUID().toString();
836+
String reporterId2 = UUID.randomUUID().toString();
837+
838+
List<Pair<String, List<ModificationInfos>>> modificationInfosGroups = new ArrayList<>();
839+
modificationInfosGroups.add(Pair.of(reporterId, List.of(loadCreationInfos)));
840+
modificationInfosGroups.add(Pair.of(reporterId2, List.of()));
841+
842+
//Global application status should be in error and last application status should be OK
843+
NetworkModificationResult networkModificationResult = networkModificationApplicator.applyModifications(modificationInfosGroups, new NetworkInfos(network, TEST_NETWORK_ID, true), reportUuid);
844+
assertNotNull(networkModificationResult);
845+
testEmptyImpactsWithErrorsLastOK(mapper, networkModificationResult);
846+
assertTrue(TestUtils.getRequestsDone(2, server).stream().anyMatch(r -> r.matches(String.format("/v1/reports/%s", reportUuid))));
847+
}
848+
828849
private void testNetworkModificationsCount(UUID groupUuid, int actualSize) {
829850
assertEquals(actualSize, modificationRepository.getModifications(groupUuid, true, true).size());
830851
}

src/test/resources/network-modification-result-with-all-ok.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"applicationStatus": "ALL_OK",
3+
"lastGroupApplicationStatus": "ALL_OK",
34
"networkImpacts": [
45
{
56
"impactType": "CREATION",

src/test/resources/network-modification-result-with-with-errors.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"applicationStatus": "WITH_ERRORS",
3+
"lastGroupApplicationStatus": "WITH_ERRORS",
34
"networkImpacts": [
45
{
56
"impactType": "CREATION",

0 commit comments

Comments
 (0)