Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e97ea5e

Browse files
committedFeb 8, 2024
fix destroy services with scripts from gitRepo always failed
1 parent 531b6ee commit e97ea5e

File tree

4 files changed

+87
-23
lines changed

4 files changed

+87
-23
lines changed
 

‎src/main/java/org/eclipse/xpanse/tofu/maker/models/request/git/OpenTofuDeployFromGitRepoRequest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.eclipse.xpanse.tofu.maker.models.request.git;
77

88
import io.swagger.v3.oas.annotations.media.Schema;
9+
import jakarta.validation.constraints.NotNull;
910
import lombok.Data;
1011
import lombok.EqualsAndHashCode;
1112
import org.eclipse.xpanse.tofu.maker.models.request.directory.OpenTofuDeployFromDirectoryRequest;
@@ -16,7 +17,8 @@
1617
@EqualsAndHashCode(callSuper = true)
1718
@Data
1819
public class OpenTofuDeployFromGitRepoRequest extends OpenTofuDeployFromDirectoryRequest {
19-
20+
21+
@NotNull
2022
@Schema(description = "GIT Repo details from where the scripts can be fetched.")
2123
OpenTofuScriptGitRepoDetails gitRepoDetails;
2224
}

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Map;
2121
import java.util.Objects;
2222
import java.util.UUID;
23+
import java.util.stream.Stream;
2324
import lombok.extern.slf4j.Slf4j;
2425
import org.eclipse.xpanse.tofu.maker.async.TaskConfiguration;
2526
import org.eclipse.xpanse.tofu.maker.models.OpenTofuMakerSystemStatus;
@@ -217,6 +218,7 @@ public void asyncDestroyWithScripts(OpenTofuAsyncDestroyFromDirectoryRequest req
217218
result = destroyFromDirectory(request, moduleDirectory);
218219
} catch (RuntimeException e) {
219220
result = OpenTofuResult.builder()
221+
.destroyScenario(request.getDestroyScenario())
220222
.commandStdOutput(null)
221223
.commandStdError(e.getMessage())
222224
.isCommandSuccessful(false)
@@ -284,9 +286,8 @@ private Map<String, String> getImportantFilesContent(String workspace) {
284286

285287
private void deleteWorkspace(String workspace) {
286288
Path path = Paths.get(workspace);
287-
try {
288-
Files.walk(path).sorted(Comparator.reverseOrder()).map(Path::toFile)
289-
.forEach(File::delete);
289+
try (Stream<Path> pathStream = Files.walk(path)) {
290+
pathStream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
290291
} catch (Exception e) {
291292
log.error(e.getMessage());
292293
}

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

+79-19
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@
66
package org.eclipse.xpanse.tofu.maker.opentofu.service;
77

88
import java.io.File;
9+
import java.io.IOException;
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.nio.file.Paths;
13+
import java.util.Comparator;
914
import java.util.HashMap;
15+
import java.util.List;
1016
import java.util.Objects;
1117
import java.util.UUID;
1218
import lombok.extern.slf4j.Slf4j;
19+
import org.apache.commons.lang3.StringUtils;
1320
import org.eclipse.jgit.api.CloneCommand;
1421
import org.eclipse.jgit.api.errors.GitAPIException;
22+
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
1523
import org.eclipse.xpanse.tofu.maker.async.TaskConfiguration;
1624
import org.eclipse.xpanse.tofu.maker.models.exceptions.GitRepoCloneException;
1725
import org.eclipse.xpanse.tofu.maker.models.exceptions.OpenTofuExecutorException;
@@ -36,6 +44,7 @@
3644
@Component
3745
public class OpenTofuGitRepoService extends OpenTofuDirectoryService {
3846

47+
private static final int MAX_RETRY_COUNT = 5;
3948
private final RestTemplate restTemplate;
4049
private final OpenTofuExecutor executor;
4150
private final OpenTofuScriptsHelper openTofuScriptsHelper;
@@ -66,7 +75,8 @@ public OpenTofuValidationResult validateWithScripts(
6675
* Method to get openTofu plan.
6776
*/
6877
public OpenTofuPlan getOpenTofuPlanFromGitRepo(OpenTofuPlanFromGitRepoRequest request,
69-
UUID uuid) {
78+
UUID uuid) {
79+
uuid = getUuidToCreateEmptyWorkspace(uuid);
7080
buildDeployEnv(request.getGitRepoDetails(), uuid);
7181
return getOpenTofuPlanFromDirectory(request,
7282
getScriptsLocationInRepo(request.getGitRepoDetails(), uuid));
@@ -76,6 +86,7 @@ public OpenTofuPlan getOpenTofuPlanFromGitRepo(OpenTofuPlanFromGitRepoRequest re
7686
* Method of deployment a service using a script.
7787
*/
7888
public OpenTofuResult deployFromGitRepo(OpenTofuDeployFromGitRepoRequest request, UUID uuid) {
89+
uuid = getUuidToCreateEmptyWorkspace(uuid);
7990
buildDeployEnv(request.getGitRepoDetails(), uuid);
8091
return deployFromDirectory(request, getScriptsLocationInRepo(
8192
request.getGitRepoDetails(), uuid));
@@ -86,6 +97,7 @@ public OpenTofuResult deployFromGitRepo(OpenTofuDeployFromGitRepoRequest request
8697
*/
8798
public OpenTofuResult destroyFromGitRepo(OpenTofuDestroyFromGitRepoRequest request,
8899
UUID uuid) {
100+
uuid = getUuidToCreateEmptyWorkspace(uuid);
89101
buildDestroyEnv(request.getGitRepoDetails(), request.getTfState(), uuid);
90102
return destroyFromDirectory(request, getScriptsLocationInRepo(
91103
request.getGitRepoDetails(), uuid));
@@ -125,6 +137,7 @@ public void asyncDestroyFromGitRepo(OpenTofuAsyncDestroyFromGitRepoRequest reque
125137
result = destroyFromGitRepo(request, uuid);
126138
} catch (RuntimeException e) {
127139
result = OpenTofuResult.builder()
140+
.destroyScenario(request.getDestroyScenario())
128141
.commandStdOutput(null)
129142
.commandStdError(e.getMessage())
130143
.isCommandSuccessful(false)
@@ -145,6 +158,25 @@ private void buildDeployEnv(OpenTofuScriptGitRepoDetails openTofuScriptGitRepoDe
145158
extractScripts(workspace, openTofuScriptGitRepoDetails);
146159
}
147160

161+
private void buildDestroyEnv(OpenTofuScriptGitRepoDetails openTofuScriptGitRepoDetails,
162+
String tfState, UUID uuid) {
163+
buildDeployEnv(openTofuScriptGitRepoDetails, uuid);
164+
openTofuScriptsHelper.createTfStateFile(tfState,
165+
uuid + File.separator + openTofuScriptGitRepoDetails.getScriptPath());
166+
}
167+
168+
private UUID getUuidToCreateEmptyWorkspace(UUID uuid) {
169+
File ws = new File(executor.getModuleFullPath(uuid.toString()));
170+
if (ws.exists()) {
171+
if (!cleanWorkspace(uuid)) {
172+
uuid = UUID.randomUUID();
173+
log.info("Clean existed workspace failed. Create empty workspace with id:{}", uuid);
174+
return UUID.randomUUID();
175+
}
176+
}
177+
return uuid;
178+
}
179+
148180
private void buildWorkspace(String workspace) {
149181
log.info("start create workspace");
150182
File ws = new File(workspace);
@@ -156,36 +188,64 @@ private void buildWorkspace(String workspace) {
156188
}
157189

158190
private void extractScripts(String workspace,
159-
OpenTofuScriptGitRepoDetails openTofuScriptGitRepoDetails) {
160-
log.info("Cloning GIT repo");
161-
try {
191+
OpenTofuScriptGitRepoDetails scriptsRepo) {
192+
log.info("Cloning scripts from GIT repo:{} to workspace:{}", scriptsRepo.getRepoUrl(),
193+
workspace);
194+
File workspaceDirectory = new File(workspace);
195+
FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
196+
repositoryBuilder.findGitDir(workspaceDirectory);
197+
if (Objects.isNull(repositoryBuilder.getGitDir())) {
162198
CloneCommand cloneCommand = new CloneCommand();
163-
cloneCommand.setURI(openTofuScriptGitRepoDetails.getRepoUrl());
199+
cloneCommand.setURI(scriptsRepo.getRepoUrl());
164200
cloneCommand.setProgressMonitor(null);
165-
cloneCommand.setDirectory(new File(workspace));
166-
cloneCommand.setBranch(openTofuScriptGitRepoDetails.getBranch());
167-
cloneCommand.call();
168-
} catch (GitAPIException e) {
169-
log.error(e.getMessage(), e);
170-
throw new GitRepoCloneException(e.getMessage());
201+
cloneCommand.setDirectory(workspaceDirectory);
202+
cloneCommand.setBranch(scriptsRepo.getBranch());
203+
boolean cloneSuccess = false;
204+
int retryCount = 0;
205+
String errMsg = "";
206+
while (!cloneSuccess && retryCount < MAX_RETRY_COUNT) {
207+
try {
208+
cloneCommand.call();
209+
cloneSuccess = true;
210+
} catch (GitAPIException e) {
211+
retryCount++;
212+
errMsg =
213+
String.format("Cloning scripts form GIT repo error:%s", e.getMessage());
214+
log.error(errMsg);
215+
}
216+
}
217+
if (!cloneSuccess) {
218+
throw new GitRepoCloneException(errMsg);
219+
}
171220
}
172221
}
173222

174-
private void buildDestroyEnv(OpenTofuScriptGitRepoDetails openTofuScriptGitRepoDetails,
175-
String tfState, UUID uuid) {
176-
buildDeployEnv(openTofuScriptGitRepoDetails, uuid);
177-
openTofuScriptsHelper.createTfStateFile(tfState,
178-
uuid + File.separator + openTofuScriptGitRepoDetails.getScriptPath());
179-
}
180-
181223
private String getScriptsLocationInRepo(
182224
OpenTofuScriptGitRepoDetails openTofuScriptGitRepoDetails,
183225
UUID uuid) {
184-
if (Objects.nonNull(openTofuScriptGitRepoDetails.getScriptPath())) {
226+
if (StringUtils.isNotBlank(openTofuScriptGitRepoDetails.getScriptPath())) {
185227
return uuid + File.separator + openTofuScriptGitRepoDetails.getScriptPath();
186228
}
187229
return uuid.toString();
188230
}
189231

232+
private boolean cleanWorkspace(UUID uuid) {
233+
boolean cleanSuccess = true;
234+
try {
235+
String workspace = executor.getModuleFullPath(uuid.toString());
236+
Path path = Paths.get(workspace).toAbsolutePath().normalize();
237+
List<File> files =
238+
Files.walk(path).sorted(Comparator.reverseOrder()).map(Path::toFile).toList();
239+
for (File file : files) {
240+
if (!file.delete()) {
241+
cleanSuccess = false;
242+
log.info("Failed to delete file: {}", file.getAbsolutePath());
243+
}
244+
}
245+
} catch (IOException e) {
246+
return false;
247+
}
248+
return cleanSuccess;
249+
}
190250

191251
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public void asyncDestroyWithScripts(OpenTofuAsyncDestroyFromScriptsRequest reque
124124
result = destroyWithScripts(request, uuid);
125125
} catch (RuntimeException e) {
126126
result = OpenTofuResult.builder()
127+
.destroyScenario(request.getDestroyScenario())
127128
.commandStdOutput(null)
128129
.commandStdError(e.getMessage())
129130
.isCommandSuccessful(false)

0 commit comments

Comments
 (0)
Please sign in to comment.