Skip to content

Commit 8a4b1c8

Browse files
committed
Add API to batch query service order results
1 parent 27194a2 commit 8a4b1c8

File tree

5 files changed

+130
-24
lines changed

5 files changed

+130
-24
lines changed

Diff for: src/main/java/org/eclipse/xpanse/terra/boot/api/controllers/TerraBootTaskResultApi.java

+46-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
import io.swagger.v3.oas.annotations.Parameter;
1010
import io.swagger.v3.oas.annotations.tags.Tag;
1111
import jakarta.annotation.Resource;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.UUID;
1215
import lombok.extern.slf4j.Slf4j;
16+
import org.eclipse.xpanse.terra.boot.models.response.ReFetchResult;
17+
import org.eclipse.xpanse.terra.boot.models.response.ReFetchState;
1318
import org.eclipse.xpanse.terra.boot.models.response.TerraformResult;
1419
import org.eclipse.xpanse.terra.boot.terraform.service.TerraformResultPersistenceManage;
1520
import org.springframework.http.HttpStatus;
@@ -18,6 +23,8 @@
1823
import org.springframework.web.bind.annotation.CrossOrigin;
1924
import org.springframework.web.bind.annotation.GetMapping;
2025
import org.springframework.web.bind.annotation.PathVariable;
26+
import org.springframework.web.bind.annotation.PostMapping;
27+
import org.springframework.web.bind.annotation.RequestBody;
2128
import org.springframework.web.bind.annotation.RequestMapping;
2229
import org.springframework.web.bind.annotation.ResponseStatus;
2330
import org.springframework.web.bind.annotation.RestController;
@@ -43,7 +50,45 @@ public class TerraBootTaskResultApi {
4350
public ResponseEntity<TerraformResult> getStoredTaskResultByRequestId(
4451
@Parameter(name = "requestId", description = "id of the request")
4552
@PathVariable("requestId")
46-
String requestId) {
53+
UUID requestId) {
4754
return terraformResultPersistenceManage.retrieveTerraformResultByRequestId(requestId);
4855
}
56+
57+
@Tag(name = "RetrieveOpenTofuResult", description = "APIs for manage the task form tofu-maker.")
58+
@Operation(description = "Batch retrieve stored openTofu results")
59+
@PostMapping(value = "/results/batch", consumes = MediaType.APPLICATION_JSON_VALUE)
60+
public List<ReFetchResult> getBatchTaskResults(
61+
@Parameter(description = "List of request IDs") @RequestBody List<UUID> requestIds) {
62+
List<ReFetchResult> reFetchResults = new ArrayList<>();
63+
requestIds.forEach(
64+
requestId -> {
65+
try {
66+
ResponseEntity<TerraformResult> result =
67+
terraformResultPersistenceManage.retrieveTerraformResultByRequestId(
68+
requestId);
69+
if (result.getStatusCode().is2xxSuccessful()) {
70+
reFetchResults.add(
71+
ReFetchResult.builder()
72+
.terraformResult(result.getBody())
73+
.state(ReFetchState.OK)
74+
.build());
75+
} else {
76+
reFetchResults.add(
77+
ReFetchResult.builder()
78+
.state(
79+
ReFetchState
80+
.RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID)
81+
.build());
82+
}
83+
} catch (Exception e) {
84+
reFetchResults.add(
85+
ReFetchResult.builder()
86+
.state(
87+
ReFetchState
88+
.RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID)
89+
.build());
90+
}
91+
});
92+
return reFetchResults;
93+
}
4994
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*/
5+
6+
package org.eclipse.xpanse.terra.boot.models.response;
7+
8+
import io.swagger.v3.oas.annotations.media.Schema;
9+
import jakarta.validation.constraints.NotNull;
10+
import lombok.Builder;
11+
import lombok.Data;
12+
13+
/** Data model for re-fetching order result */
14+
@Data
15+
@Builder
16+
public class ReFetchResult {
17+
18+
@NotNull
19+
@Schema(description = "State of the re-fetching request")
20+
private ReFetchState state;
21+
22+
@Schema(description = "Result of the service order executed by terraform.")
23+
private TerraformResult terraformResult;
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*/
5+
6+
package org.eclipse.xpanse.terra.boot.models.response;
7+
8+
import com.fasterxml.jackson.annotation.JsonCreator;
9+
import com.fasterxml.jackson.annotation.JsonValue;
10+
import org.apache.commons.lang3.StringUtils;
11+
12+
/** ReFetch state for the REST API. */
13+
public enum ReFetchState {
14+
OK("OK"),
15+
RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID("ResultAlreadyReturnedOrRequestIdInvalid");
16+
17+
private final String state;
18+
19+
ReFetchState(String state) {
20+
this.state = state;
21+
}
22+
23+
/** For ReFetchState deserialize. */
24+
@JsonValue
25+
public String toValue() {
26+
return this.state;
27+
}
28+
29+
/** For ReFetchState serialize. */
30+
@JsonCreator
31+
public ReFetchState getByValue(String name) {
32+
for (ReFetchState state : values()) {
33+
if (StringUtils.equalsIgnoreCase(state.state, name)) {
34+
return state;
35+
}
36+
}
37+
return null;
38+
}
39+
}

Diff for: src/main/java/org/eclipse/xpanse/terra/boot/terraform/service/TerraformResultPersistenceManage.java

+18-20
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,14 @@ public class TerraformResultPersistenceManage {
4242
* @param result TerraformResult.
4343
*/
4444
public void persistTerraformResult(TerraformResult result) {
45-
String filePath = getFilePath(result.getRequestId());
46-
File file = new File(filePath);
47-
if (!file.exists() && !file.mkdirs()) {
45+
File filePath = getFilePath(result.getRequestId());
46+
if (!filePath.exists() && !filePath.mkdirs()) {
4847
log.error("Failed to create directory {}", filePath);
4948
return;
5049
}
50+
File file = new File(filePath, getFileName(result.getRequestId()));
5151
byte[] terraformResultData = terraformResultSerializer.serialize(result);
52-
try (FileOutputStream fos =
53-
new FileOutputStream(
54-
file.getPath()
55-
+ File.separator
56-
+ result.getRequestId()
57-
+ TF_RESULT_FILE_SUFFIX)) {
52+
try (FileOutputStream fos = new FileOutputStream(file)) {
5853
fos.write(terraformResultData);
5954
log.info(
6055
"terraform result successfully stored to directoryName: {}",
@@ -74,10 +69,10 @@ public void persistTerraformResult(TerraformResult result) {
7469
* @param requestId requestId.
7570
* @return TerraformResult.
7671
*/
77-
public ResponseEntity<TerraformResult> retrieveTerraformResultByRequestId(String requestId) {
78-
String filePath = getFilePath(UUID.fromString(requestId));
79-
File resultFile = new File(filePath + File.separator + requestId + TF_RESULT_FILE_SUFFIX);
72+
public ResponseEntity<TerraformResult> retrieveTerraformResultByRequestId(UUID requestId) {
73+
File resultFile = new File(getFilePath(requestId), getFileName(requestId));
8074
if (!resultFile.exists() && !resultFile.isFile()) {
75+
log.warn("Result file does not exist: {}", resultFile.getAbsolutePath());
8176
if (isDeployingInProgress(requestId)) {
8277
return ResponseEntity.noContent().build();
8378
}
@@ -89,7 +84,7 @@ public ResponseEntity<TerraformResult> retrieveTerraformResultByRequestId(String
8984
TerraformResult terraformResult =
9085
terraformResultSerializer.deserialize(terraformResultData);
9186
fis.close();
92-
deleteResultFileAndDirectory(new File(filePath));
87+
deleteResultFileAndDirectory(resultFile);
9388
return ResponseEntity.ok(terraformResult);
9489
} catch (IOException e) {
9590
log.error("Failed to retrieve TerraformResult for requestId: {}", requestId, e);
@@ -98,8 +93,8 @@ public ResponseEntity<TerraformResult> retrieveTerraformResultByRequestId(String
9893
}
9994
}
10095

101-
private boolean isDeployingInProgress(String requestId) {
102-
String workspace = scriptsHelper.buildTaskWorkspace(requestId);
96+
private boolean isDeployingInProgress(UUID requestId) {
97+
String workspace = scriptsHelper.buildTaskWorkspace(requestId.toString());
10398
File targetFile;
10499
if (cleanWorkspaceAfterDeployment) {
105100
targetFile = new File(workspace);
@@ -113,10 +108,9 @@ private boolean isDeployingInProgress(String requestId) {
113108
private void deleteResultFileAndDirectory(File resultFile) {
114109
try {
115110
deleteRecursively(resultFile);
116-
log.info("File folder deleted successfully: " + resultFile.getAbsolutePath());
111+
log.info("File folder deleted successfully: {}", resultFile.getAbsolutePath());
117112
} catch (Exception e) {
118-
log.error("An error occurred while deleting files: " + e.getMessage());
119-
e.printStackTrace();
113+
log.error("An error occurred while deleting files: {}", e.getMessage());
120114
}
121115
}
122116

@@ -132,7 +126,11 @@ private void deleteRecursively(File file) {
132126
file.delete();
133127
}
134128

135-
private String getFilePath(UUID requestId) {
136-
return failedCallbackStoreLocation + File.separator + requestId.toString();
129+
private File getFilePath(UUID requestId) {
130+
return new File(failedCallbackStoreLocation + File.separator + requestId);
131+
}
132+
133+
private String getFileName(UUID requestId) {
134+
return requestId + TF_RESULT_FILE_SUFFIX;
137135
}
138136
}

Diff for: src/main/resources/application-dev.properties

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
terra.boot.webhook.hmac.request.signing.key=1c30e4b1fad574f88572e25d0da03f34365f4ae92eda22bfd3a8c53cb5102f27
66
authorization.server.endpoint=http://localhost:8088
77
# set authorization client id for api
8-
authorization.api.client.id=302705713103306755
8+
authorization.api.client.id=306935357671276547
99
# set authorization client secret for api
10-
authorization.api.client.secret=8cCu3PTpLPz3kBfB5aFCX32IdhIlmPZCic5aFNHCR6na8TW1ZIhFOR3v1s3GVBYx
10+
authorization.api.client.secret=AhOc8tsQv8nzk5diQx4EscdoEUKkVfTLM8R06mw7xZ5HIWViiOkfBK6VEWaRCXPR
1111
# set authorization client id for swagger-ui
12-
authorization.swagger.ui.client.id=302705713271078915
12+
authorization.swagger.ui.client.id=306935358862458883

0 commit comments

Comments
 (0)