Skip to content

Commit 96491c6

Browse files
authored
Update reFetch result of order (#129)
1 parent 32602c0 commit 96491c6

8 files changed

+77
-98
lines changed

src/main/java/org/eclipse/xpanse/tofu/maker/api/controllers/OpenTofuMakerTaskResultApi.java

+4-32
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,12 @@
1111
import jakarta.annotation.Resource;
1212
import java.util.ArrayList;
1313
import java.util.List;
14-
import java.util.Objects;
1514
import java.util.UUID;
1615
import lombok.extern.slf4j.Slf4j;
17-
import org.eclipse.xpanse.tofu.maker.models.response.OpenTofuResult;
1816
import org.eclipse.xpanse.tofu.maker.models.response.ReFetchResult;
19-
import org.eclipse.xpanse.tofu.maker.models.response.ReFetchState;
2017
import org.eclipse.xpanse.tofu.maker.opentofu.service.OpenTofuResultPersistenceManage;
2118
import org.springframework.http.HttpStatus;
2219
import org.springframework.http.MediaType;
23-
import org.springframework.http.ResponseEntity;
2420
import org.springframework.util.CollectionUtils;
2521
import org.springframework.web.bind.annotation.CrossOrigin;
2622
import org.springframework.web.bind.annotation.GetMapping;
@@ -55,7 +51,7 @@ public class OpenTofuMakerTaskResultApi {
5551
+ "receives a failure while sending the openTofu result via callback.")
5652
@GetMapping(value = "/result/{requestId}", produces = MediaType.APPLICATION_JSON_VALUE)
5753
@ResponseStatus(HttpStatus.OK)
58-
public ResponseEntity<OpenTofuResult> getStoredTaskResultByRequestId(
54+
public ReFetchResult getStoredTaskResultByRequestId(
5955
@Parameter(name = "requestId", description = "id of the request")
6056
@PathVariable("requestId")
6157
UUID requestId) {
@@ -81,33 +77,9 @@ public List<ReFetchResult> getBatchTaskResults(
8177
List<ReFetchResult> reFetchResults = new ArrayList<>();
8278
requestIds.forEach(
8379
requestId -> {
84-
try {
85-
ResponseEntity<OpenTofuResult> result =
86-
openTofuResultPersistenceManage.retrieveOpenTofuResultByRequestId(
87-
requestId);
88-
if (result.getStatusCode() == HttpStatus.OK
89-
&& Objects.nonNull(result.getBody())) {
90-
reFetchResults.add(
91-
ReFetchResult.builder()
92-
.openTofuResult(result.getBody())
93-
.state(ReFetchState.OK)
94-
.build());
95-
} else {
96-
reFetchResults.add(
97-
ReFetchResult.builder()
98-
.state(
99-
ReFetchState
100-
.RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID)
101-
.build());
102-
}
103-
} catch (Exception e) {
104-
reFetchResults.add(
105-
ReFetchResult.builder()
106-
.state(
107-
ReFetchState
108-
.RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID)
109-
.build());
110-
}
80+
reFetchResults.add(
81+
openTofuResultPersistenceManage.retrieveOpenTofuResultByRequestId(
82+
requestId));
11183
});
11284
return reFetchResults;
11385
}

src/main/java/org/eclipse/xpanse/tofu/maker/models/exceptions/OpenTofuApiExceptionHandler.java

-11
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,4 @@ public Response handleInvalidOpenTofuScriptsException(InvalidOpenTofuScriptsExce
127127
return Response.errorResponse(
128128
ResultType.INVALID_OPENTOFU_SCRIPTS, Collections.singletonList(ex.getMessage()));
129129
}
130-
131-
/** Exception handler for ResultAlreadyReturnedOrRequestIdInvalidException. */
132-
@ExceptionHandler({ResultAlreadyReturnedOrRequestIdInvalidException.class})
133-
@ResponseStatus(HttpStatus.BAD_REQUEST)
134-
@ResponseBody
135-
public Response handleResultAlreadyReturnedOrRequestIdInvalidException(
136-
ResultAlreadyReturnedOrRequestIdInvalidException ex) {
137-
return Response.errorResponse(
138-
ResultType.RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID,
139-
Collections.singletonList(ex.getMessage()));
140-
}
141130
}

src/main/java/org/eclipse/xpanse/tofu/maker/models/exceptions/ResultAlreadyReturnedOrRequestIdInvalidException.java

-13
This file was deleted.

src/main/java/org/eclipse/xpanse/tofu/maker/models/response/ReFetchResult.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.swagger.v3.oas.annotations.media.Schema;
99
import jakarta.validation.constraints.NotNull;
10+
import java.util.UUID;
1011
import lombok.Builder;
1112
import lombok.Data;
1213

@@ -16,9 +17,16 @@
1617
public class ReFetchResult {
1718

1819
@NotNull
19-
@Schema(description = "State of the re-fetching request")
20+
@Schema(description = "Id of the request order.")
21+
private UUID requestId;
22+
23+
@NotNull
24+
@Schema(description = "State of the re-fetching result of order.")
2025
private ReFetchState state;
2126

2227
@Schema(description = "Result of the service order executed by open tofu.")
2328
private OpenTofuResult openTofuResult;
29+
30+
@Schema(description = "Error message of the re-fetching result of order.")
31+
private String errorMessage;
2432
}

src/main/java/org/eclipse/xpanse/tofu/maker/models/response/ReFetchState.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
/** ReFetch state for the REST API. */
1313
public enum ReFetchState {
1414
OK("OK"),
15-
RESULT_ALREADY_RETURNED_OR_REQUEST_ID_INVALID("ResultAlreadyReturnedOrRequestIdInvalid");
16-
15+
ORDER_IN_PROGRESS("OrderInProgress"),
16+
RESULT_NOT_FOUND("ResultNotFound"),
17+
RESULT_PARSE_FAILED("ResultParseFailed");
1718
private final String state;
1819

1920
ReFetchState(String state) {

src/main/java/org/eclipse/xpanse/tofu/maker/opentofu/service/OpenTofuResultPersistenceManage.java

+39-30
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
import java.io.IOException;
1313
import java.util.UUID;
1414
import lombok.extern.slf4j.Slf4j;
15-
import org.eclipse.xpanse.tofu.maker.models.exceptions.ResultAlreadyReturnedOrRequestIdInvalidException;
1615
import org.eclipse.xpanse.tofu.maker.models.response.OpenTofuResult;
16+
import org.eclipse.xpanse.tofu.maker.models.response.ReFetchResult;
17+
import org.eclipse.xpanse.tofu.maker.models.response.ReFetchState;
1718
import org.eclipse.xpanse.tofu.maker.utils.OpenTofuResultSerializer;
1819
import org.springframework.beans.factory.annotation.Value;
19-
import org.springframework.http.ResponseEntity;
2020
import org.springframework.stereotype.Component;
2121

2222
/** OpenTofu service classes are manage task result. */
@@ -30,9 +30,6 @@ public class OpenTofuResultPersistenceManage {
3030
@Value("${failed.callback.response.store.location}")
3131
private String failedCallbackStoreLocation;
3232

33-
@Value("${clean.workspace.after.deployment.enabled:true}")
34-
private Boolean cleanWorkspaceAfterDeployment;
35-
3633
@Resource private OpenTofuScriptsHelper scriptsHelper;
3734
@Resource private OpenTofuResultSerializer openTofuResultSerializer;
3835

@@ -69,40 +66,50 @@ public void persistOpenTofuResult(OpenTofuResult result) {
6966
* @param requestId requestId.
7067
* @return OpenTofuResult.
7168
*/
72-
public ResponseEntity<OpenTofuResult> retrieveOpenTofuResultByRequestId(UUID requestId) {
69+
public ReFetchResult retrieveOpenTofuResultByRequestId(UUID requestId) {
7370
File resultFile = new File(getFilePath(requestId), getFileName(requestId));
74-
if (!resultFile.exists() && !resultFile.isFile()) {
75-
log.warn("Result file does not exist: {}", resultFile.getAbsolutePath());
71+
if (!isValidResultFile(resultFile)) {
72+
String errorMsg = String.format("Not found result file for requestId %s.", requestId);
7673
if (isDeployingInProgress(requestId)) {
77-
return ResponseEntity.noContent().build();
74+
errorMsg = errorMsg + " The order is still in progress.";
75+
return buildErrorResponse(requestId, errorMsg, ReFetchState.ORDER_IN_PROGRESS);
7876
}
79-
throw new ResultAlreadyReturnedOrRequestIdInvalidException(
80-
"Result file does not exist: " + resultFile.getAbsolutePath());
77+
return buildErrorResponse(requestId, errorMsg, ReFetchState.RESULT_NOT_FOUND);
8178
}
8279
try (FileInputStream fis = new FileInputStream(resultFile)) {
83-
byte[] openTofuResultData = fis.readAllBytes();
84-
OpenTofuResult openTofuResult =
85-
openTofuResultSerializer.deserialize(openTofuResultData);
86-
fis.close();
80+
OpenTofuResult terraformResult =
81+
openTofuResultSerializer.deserialize(fis.readAllBytes());
8782
deleteResultFileAndDirectory(resultFile);
88-
return ResponseEntity.ok(openTofuResult);
89-
} catch (IOException e) {
90-
log.error("Failed to retrieve OpenTofuResult for requestId: {}", requestId, e);
91-
throw new ResultAlreadyReturnedOrRequestIdInvalidException(
92-
"Failed to retrieve OpenTofuResult for requestId: " + requestId);
83+
return ReFetchResult.builder()
84+
.requestId(requestId)
85+
.state(ReFetchState.OK)
86+
.openTofuResult(terraformResult)
87+
.build();
88+
} catch (Exception e) {
89+
String errorMsg =
90+
String.format("Failed to parse result file for requestId %s", requestId);
91+
return buildErrorResponse(requestId, errorMsg, ReFetchState.RESULT_PARSE_FAILED);
9392
}
9493
}
9594

95+
private ReFetchResult buildErrorResponse(
96+
UUID requestId, String errorMessage, ReFetchState state) {
97+
log.error(errorMessage);
98+
return ReFetchResult.builder()
99+
.requestId(requestId)
100+
.state(state)
101+
.errorMessage(errorMessage)
102+
.build();
103+
}
104+
105+
private boolean isValidResultFile(File file) {
106+
return file.exists() && file.isFile();
107+
}
108+
96109
private boolean isDeployingInProgress(UUID requestId) {
97-
String workspace = scriptsHelper.buildTaskWorkspace(requestId.toString());
98-
File targetFile;
99-
if (cleanWorkspaceAfterDeployment) {
100-
targetFile = new File(workspace);
101-
return targetFile.exists() && targetFile.isDirectory();
102-
} else {
103-
targetFile = new File(workspace, TF_LOCK_FILE_NAME);
104-
return targetFile.exists() && targetFile.isFile();
105-
}
110+
File workspace = scriptsHelper.getTaskWorkspace(requestId.toString());
111+
File targetFile = new File(workspace, TF_LOCK_FILE_NAME);
112+
return targetFile.exists() && targetFile.isFile();
106113
}
107114

108115
private void deleteResultFileAndDirectory(File resultFile) {
@@ -123,7 +130,9 @@ private void deleteRecursively(File file) {
123130
}
124131
}
125132
}
126-
file.delete();
133+
if (file.delete()) {
134+
log.info("File deleted successfully: {}", file.getAbsolutePath());
135+
}
127136
}
128137

129138
private File getFilePath(UUID requestId) {

src/main/java/org/eclipse/xpanse/tofu/maker/opentofu/service/OpenTofuScriptsHelper.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,24 @@ public class OpenTofuScriptsHelper {
5353
* @return workspace path for the OpenTofu deployment task.
5454
*/
5555
public String buildTaskWorkspace(String taskId) {
56-
File ws = new File(getModuleParentDirectoryPath(), taskId);
56+
File ws = getTaskWorkspace(taskId);
5757
if (!ws.exists() && !ws.mkdirs()) {
5858
throw new OpenTofuExecutorException(
5959
"Create task workspace failed, File path not created: " + ws.getAbsolutePath());
6060
}
6161
return ws.getAbsolutePath();
6262
}
6363

64+
/**
65+
* Get the workspace path for the OpenTofu deployment task.
66+
*
67+
* @param taskId id of the OpenTofu deployment task.
68+
* @return workspace path for the OpenTofu deployment task.
69+
*/
70+
public File getTaskWorkspace(String taskId) {
71+
return new File(getModuleParentDirectoryPath(), taskId);
72+
}
73+
6474
/**
6575
* Create the tfstate file in the taskWorkspace for the OpenTofu deployment task.
6676
*

src/main/java/org/eclipse/xpanse/tofu/maker/utils/OpenTofuResultSerializer.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,32 @@
1414
@Component
1515
public class OpenTofuResultSerializer {
1616

17+
private final Serializer<byte[]> serializer;
18+
19+
/** Constructor to initialize the Serializer with OpenTofuResult class registered. */
20+
public OpenTofuResultSerializer() {
21+
final SerializerFoundation<?> foundation =
22+
SerializerFoundation.New().registerEntityTypes(OpenTofuResult.class);
23+
this.serializer = Serializer.Bytes(foundation);
24+
}
25+
1726
/**
18-
* serialize OpenTofuResult object.
27+
* Serialize OpenTofuResult object.
1928
*
2029
* @param result OpenTofuResult.
2130
* @return byte[].
2231
*/
2332
public byte[] serialize(OpenTofuResult result) {
24-
final SerializerFoundation<?> foundation =
25-
SerializerFoundation.New().registerEntityTypes(OpenTofuResult.class);
26-
Serializer<byte[]> serializer = Serializer.Bytes(foundation);
2733
return serializer.serialize(result);
2834
}
2935

3036
/**
31-
* deserialize OpenTofuResult object.
37+
* Deserialize OpenTofuResult object.
3238
*
3339
* @param data byte[].
3440
* @return OpenTofuResult.
3541
*/
3642
public OpenTofuResult deserialize(byte[] data) {
37-
final SerializerFoundation<?> foundation =
38-
SerializerFoundation.New().registerEntityTypes(OpenTofuResult.class);
39-
Serializer<byte[]> serializer = Serializer.Bytes(foundation);
4043
return serializer.deserialize(data);
4144
}
4245
}

0 commit comments

Comments
 (0)