Skip to content

Commit d73b276

Browse files
authored
Feature: make getDefaultLoadFlowProvider return provider from profile when available (#564)
1 parent db9b2cf commit d73b276

File tree

4 files changed

+80
-3
lines changed

4 files changed

+80
-3
lines changed

src/main/java/org/gridsuite/study/server/StudyController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,8 +1341,10 @@ public ResponseEntity<Void> changeModificationActiveState(@PathVariable("studyUu
13411341
@GetMapping(value = "/loadflow-default-provider")
13421342
@Operation(summary = "get load flow default provider")
13431343
@ApiResponses(@ApiResponse(responseCode = "200", description = "the load flow default provider has been found"))
1344-
public ResponseEntity<String> getDefaultLoadflowProvider() {
1345-
return ResponseEntity.ok().body(studyService.getDefaultLoadflowProvider());
1344+
public ResponseEntity<String> getDefaultLoadflowProvider(
1345+
@RequestHeader(name = HEADER_USER_ID, required = false) String userId // not required to allow to query the system default provider without a user
1346+
) {
1347+
return ResponseEntity.ok().body(studyService.getDefaultLoadflowProvider(userId));
13461348
}
13471349

13481350
@GetMapping(value = "/security-analysis-default-provider")

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,19 @@ public boolean setLoadFlowParameters(UUID studyUuid, String parameters, String u
802802
return userProfileIssue;
803803
}
804804

805-
public String getDefaultLoadflowProvider() {
805+
public String getDefaultLoadflowProvider(String userId) {
806+
if (userId != null) {
807+
UserProfileInfos userProfileInfos = userAdminService.getUserProfile(userId).orElse(null);
808+
if (userProfileInfos != null && userProfileInfos.getLoadFlowParameterId() != null) {
809+
try {
810+
return loadflowService.getLoadFlowParameters(userProfileInfos.getLoadFlowParameterId()).getProvider();
811+
} catch (Exception e) {
812+
LOGGER.error(String.format("Could not get loadflow parameters with id '%s' from user/profile '%s/%s'. Using default provider",
813+
userProfileInfos.getLoadFlowParameterId(), userId, userProfileInfos.getName()), e);
814+
// in case of read error (ex: wrong/dangling uuid in the profile), move on with default provider below
815+
}
816+
}
817+
}
806818
return loadflowService.getLoadFlowDefaultProvider();
807819
}
808820

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,17 @@ public class LoadFlowTest {
126126

127127
private static final long TIMEOUT = 1000;
128128

129+
private static final String USER_ID_HEADER = "userId";
130+
131+
private static final String DEFAULT_PROVIDER = "defaultProvider";
132+
private static final String OTHER_PROVIDER = "otherProvider";
133+
129134
private static String LIMIT_VIOLATIONS_JSON;
130135

131136
private static String COMPUTING_STATUS_JSON;
132137

133138
private static String LOADFLOW_DEFAULT_PARAMETERS_JSON;
139+
private static String LOADFLOW_PROFILE_PARAMETERS_JSON;
134140

135141
//output destinations
136142
private final String studyUpdateDestination = "study.update";
@@ -224,6 +230,12 @@ public void setup() throws IOException {
224230
.specificParametersPerProvider(Map.of())
225231
.build();
226232
LOADFLOW_DEFAULT_PARAMETERS_JSON = objectMapper.writeValueAsString(loadFlowParametersInfos);
233+
LoadFlowParametersInfos profileLoadFlowParametersInfos = LoadFlowParametersInfos.builder()
234+
.provider(OTHER_PROVIDER)
235+
.commonParameters(LoadFlowParameters.load())
236+
.specificParametersPerProvider(Map.of())
237+
.build();
238+
LOADFLOW_PROFILE_PARAMETERS_JSON = objectMapper.writeValueAsString(profileLoadFlowParametersInfos);
227239

228240
final Dispatcher dispatcher = new Dispatcher() {
229241
@SneakyThrows
@@ -314,13 +326,21 @@ public MockResponse dispatch(RecordedRequest request) {
314326
} else if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
315327
// params duplication request KO
316328
return new MockResponse().setResponseCode(404);
329+
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING) && method.equals("GET")) {
330+
return new MockResponse().setResponseCode(404);
317331
} else if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
318332
// params duplication request OK
319333
return new MockResponse().setResponseCode(200).setBody(DUPLICATED_PARAMS_JSON)
320334
.addHeader("Content-Type", "application/json; charset=utf-8");
335+
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING) && method.equals("GET")) {
336+
// profile params get request OK
337+
return new MockResponse().setResponseCode(200).setBody(LOADFLOW_PROFILE_PARAMETERS_JSON)
338+
.addHeader("Content-Type", "application/json; charset=utf-8");
321339
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_DUPLICATED_PARAMETERS_UUID_STRING + "/provider") && method.equals("PATCH")) {
322340
// provider update in duplicated params OK
323341
return new MockResponse().setResponseCode(200);
342+
} else if (path.matches("/v1/default-provider")) {
343+
return new MockResponse().setResponseCode(200).setBody(DEFAULT_PROVIDER);
324344
} else {
325345
LOGGER.error("Unhandled method+path: " + request.getMethod() + " " + request.getPath());
326346
return new MockResponse().setResponseCode(418).setBody("Unhandled method+path: " + request.getMethod() + " " + request.getPath());
@@ -686,6 +706,48 @@ public void testResetLoadFlowParametersUserHasValidParamsInProfileButNoExistingL
686706
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters?duplicateFrom=" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING))); // post duplicate ok
687707
}
688708

709+
// the following testGetDefaultProviders tests are related to StudyTest::testGetDefaultProviders but with a user and different profile cases
710+
@Test
711+
public void testGetDefaultProvidersFromProfile() throws Exception {
712+
mockMvc.perform(get("/v1/loadflow-default-provider").header(USER_ID_HEADER, VALID_PARAMS_IN_PROFILE_USER_ID)).andExpectAll(
713+
status().isOk(),
714+
content().string(OTHER_PROVIDER));
715+
var requests = TestUtils.getRequestsDone(2, server);
716+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + VALID_PARAMS_IN_PROFILE_USER_ID + "/profile")));
717+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING))); // GET provider
718+
}
719+
720+
@Test
721+
public void testGetDefaultProvidersFromProfileInvalid() throws Exception {
722+
mockMvc.perform(get("/v1/loadflow-default-provider").header(USER_ID_HEADER, INVALID_PARAMS_IN_PROFILE_USER_ID)).andExpectAll(
723+
status().isOk(),
724+
content().string(DEFAULT_PROVIDER));
725+
var requests = TestUtils.getRequestsDone(3, server);
726+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + INVALID_PARAMS_IN_PROFILE_USER_ID + "/profile")));
727+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING))); // GET provider
728+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/default-provider"))); // GET fallback default provider
729+
}
730+
731+
@Test
732+
public void testGetDefaultProvidersWithoutProfile() throws Exception {
733+
mockMvc.perform(get("/v1/loadflow-default-provider").header(USER_ID_HEADER, NO_PROFILE_USER_ID)).andExpectAll(
734+
status().isOk(),
735+
content().string(DEFAULT_PROVIDER));
736+
var requests = TestUtils.getRequestsDone(2, server);
737+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + NO_PROFILE_USER_ID + "/profile")));
738+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/default-provider"))); // GET fallback default provider
739+
}
740+
741+
@Test
742+
public void testGetDefaultProvidersWithoutParamInProfile() throws Exception {
743+
mockMvc.perform(get("/v1/loadflow-default-provider").header(USER_ID_HEADER, NO_PARAMS_IN_PROFILE_USER_ID)).andExpectAll(
744+
status().isOk(),
745+
content().string(DEFAULT_PROVIDER));
746+
var requests = TestUtils.getRequestsDone(2, server);
747+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + NO_PARAMS_IN_PROFILE_USER_ID + "/profile")));
748+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/default-provider"))); // GET fallback default provider
749+
}
750+
689751
@Test
690752
public void testLoadFlowParameters() throws Exception {
691753
//insert a study

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,6 +2387,7 @@ private UUID duplicateNode(UUID sourceStudyUuid, UUID targetStudyUuid, NetworkMo
23872387

23882388
@Test
23892389
public void testGetDefaultProviders() throws Exception {
2390+
// related to LoadFlowTest::testGetDefaultProvidersFromProfile but without a user, so it doesn't use profiles
23902391
mockMvc.perform(get("/v1/loadflow-default-provider")).andExpectAll(
23912392
status().isOk(),
23922393
content().string(DEFAULT_PROVIDER));

0 commit comments

Comments
 (0)