Skip to content

Commit 0551b73

Browse files
authored
Merge pull request #19 from BlockCloud-dev/feat/terraform
✨ Fix: Destroy infra by project id
2 parents 19cb839 + 7df357d commit 0551b73

File tree

2 files changed

+31
-35
lines changed

2 files changed

+31
-35
lines changed

src/main/java/com/blockcloud/controller/TerraformController.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.blockcloud.controller;
22

33
import com.blockcloud.dto.RequestDto.TerraformApplyRequestDto;
4-
import com.blockcloud.dto.RequestDto.TerraformDestroyRequestDto;
4+
55
import com.blockcloud.dto.RequestDto.TerraformPlanRequestDto;
66
import com.blockcloud.dto.RequestDto.TerraformValidateRequestDto;
77
import com.blockcloud.dto.ResponseDto.DeploymentListResponseDto;
@@ -88,26 +88,28 @@ public ResponseDto<TerraformApplyResponseDto> applyTerraform(
8888
}
8989

9090
/**
91-
* Terraform 코드를 실행하여 인프라를 삭제합니다.
91+
* 특정 배포의 인프라를 삭제합니다.
9292
*
9393
* @param projectId 프로젝트 ID
94-
* @param requestDto Terraform 삭제 요청
94+
* @param deploymentId 배포 ID
9595
* @param authentication 인증 정보
96-
* @return 삭제 시작 정보가 담긴 응답 객체
96+
* @return 삭제 결과가 담긴 응답 객체
9797
*/
9898
@Operation(
99-
summary = "Terraform 인프라 삭제",
100-
description = "Terraform 코드를 실행하여 생성된 인프라를 삭제합니다. 배포는 비동기로 실행되며, 삭제 ID를 반환합니다."
99+
summary = "특정 배포 인프라 삭제",
100+
description = "특정 배포의 인프라를 삭제합니다. 원본 배포의 Terraform 코드를 사용하여 삭제를 수행합니다."
101101
)
102-
@PostMapping("/destroy")
103-
public ResponseDto<TerraformDestroyResponseDto> destroyTerraform(
102+
@DeleteMapping("/deployments/{deploymentId}/destroy")
103+
public ResponseDto<TerraformDestroyResponseDto> destroyTerraformByDeployment(
104104
@Parameter(description = "프로젝트 ID", required = true) @PathVariable Long projectId,
105-
@Valid @RequestBody TerraformDestroyRequestDto requestDto,
105+
@Parameter(description = "배포 ID", required = true) @PathVariable Long deploymentId,
106106
Authentication authentication) {
107107
CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();
108-
return ResponseDto.ok(terraformService.destroyTerraform(projectId, requestDto, userDetails.getUsername()));
108+
return ResponseDto.ok(terraformService.destroyTerraformByDeployment(projectId, deploymentId, userDetails.getUsername()));
109109
}
110110

111+
112+
111113
/**
112114
* 특정 배포의 상태를 조회합니다.
113115
*

src/main/java/com/blockcloud/service/TerraformService.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.blockcloud.domain.project.Project;
77
import com.blockcloud.domain.project.ProjectRepository;
88
import com.blockcloud.dto.RequestDto.TerraformApplyRequestDto;
9-
import com.blockcloud.dto.RequestDto.TerraformDestroyRequestDto;
9+
1010
import com.blockcloud.dto.RequestDto.TerraformPlanRequestDto;
1111
import com.blockcloud.dto.RequestDto.TerraformValidateRequestDto;
1212
import com.blockcloud.dto.ResponseDto.DeploymentListResponseDto;
@@ -70,9 +70,6 @@ public TerraformPlanResponseDto planTerraform(Long projectId, TerraformPlanReque
7070
.build();
7171
}
7272

73-
/**
74-
* Terraform 코드를 적용하여 배포를 시작합니다.
75-
*/
7673
@Transactional
7774
public TerraformApplyResponseDto applyTerraform(Long projectId, TerraformApplyRequestDto requestDto, String username) {
7875
Project project = projectRepository.findById(projectId)
@@ -109,46 +106,48 @@ public TerraformApplyResponseDto applyTerraform(Long projectId, TerraformApplyRe
109106
.build();
110107
}
111108

112-
/**
113-
* Terraform 코드를 실행하여 인프라를 삭제합니다.
114-
*/
115109
@Transactional
116-
public TerraformDestroyResponseDto destroyTerraform(Long projectId, TerraformDestroyRequestDto requestDto, String username) {
110+
public TerraformDestroyResponseDto destroyTerraformByDeployment(Long projectId, Long deploymentId, String username) {
117111
Project project = projectRepository.findById(projectId)
118112
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_PROJECT));
119113

120-
// 배포 이력 생성 (삭제용)
121-
Deployment deployment = Deployment.builder()
114+
Deployment deployment = deploymentRepository.findById(deploymentId)
115+
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_DEPLOYMENT));
116+
117+
// 프로젝트에 속한 배포인지 확인
118+
if (!deployment.getProject().getId().equals(projectId)) {
119+
throw new CommonException(ErrorCode.ACCESS_DENIED);
120+
}
121+
122+
// 삭제용 배포 이력 생성
123+
Deployment destroyDeployment = Deployment.builder()
122124
.project(project)
123125
.status(DeploymentStatus.PENDING)
124126
.message("인프라 삭제 대기 중")
125-
.terraformCode(requestDto.getTerraformCode())
127+
.terraformCode(deployment.getTerraformCode())
126128
.startedAt(LocalDateTime.now())
127129
.build();
128130

129-
Deployment savedDeployment = deploymentRepository.save(deployment);
131+
Deployment savedDestroyDeployment = deploymentRepository.save(destroyDeployment);
130132

131133
// 비동기로 삭제 실행
132134
CompletableFuture.runAsync(() -> {
133135
try {
134-
executeTerraformDestroy(savedDeployment.getId(), projectId, requestDto.getTerraformCode());
136+
executeTerraformDestroy(savedDestroyDeployment.getId(), projectId, deployment.getTerraformCode());
135137
} catch (Exception e) {
136-
log.error("Terraform destroy failed for deployment {}: {}", savedDeployment.getId(), e.getMessage());
137-
updateDeploymentStatus(savedDeployment.getId(), DeploymentStatus.FAILED, "삭제 실패: " + e.getMessage());
138+
log.error("Terraform destroy failed for deployment {}: {}", savedDestroyDeployment.getId(), e.getMessage());
139+
updateDeploymentStatus(savedDestroyDeployment.getId(), DeploymentStatus.FAILED, "삭제 실패: " + e.getMessage());
138140
}
139141
});
140142

141143
return TerraformDestroyResponseDto.builder()
142-
.deploymentId(savedDeployment.getId())
144+
.deploymentId(savedDestroyDeployment.getId())
143145
.status("PENDING")
144146
.message("인프라 삭제가 시작되었습니다.")
145-
.startedAt(savedDeployment.getStartedAt())
147+
.startedAt(savedDestroyDeployment.getStartedAt())
146148
.build();
147149
}
148150

149-
/**
150-
* 배포 상태를 조회합니다.
151-
*/
152151
public DeploymentStatusResponseDto getDeploymentStatus(Long projectId, Long deploymentId) {
153152
Project project = projectRepository.findById(projectId)
154153
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_PROJECT));
@@ -171,9 +170,6 @@ public DeploymentStatusResponseDto getDeploymentStatus(Long projectId, Long depl
171170
.build();
172171
}
173172

174-
/**
175-
* 프로젝트의 배포 이력을 조회합니다.
176-
*/
177173
public DeploymentListResponseDto getDeploymentHistory(Long projectId, Long lastId, int size) {
178174
Project project = projectRepository.findById(projectId)
179175
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_PROJECT));
@@ -203,8 +199,6 @@ public DeploymentListResponseDto getDeploymentHistory(Long projectId, Long lastI
203199
.build();
204200
}
205201

206-
// Private helper methods
207-
208202
private void executeTerraformApply(Long deploymentId, Long projectId, String terraformCode) {
209203
try {
210204
// 상태를 RUNNING으로 업데이트

0 commit comments

Comments
 (0)