|
|
|
|
@ -1,7 +1,11 @@
|
|
|
|
|
package kr.re.etri.autoflow.controllers;
|
|
|
|
|
|
|
|
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
|
|
import io.swagger.v3.oas.annotations.Operation;
|
|
|
|
|
import io.swagger.v3.oas.annotations.Parameter;
|
|
|
|
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
|
|
|
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
|
|
|
|
import kr.re.etri.autoflow.entity.WorkflowEntity;
|
|
|
|
|
import kr.re.etri.autoflow.payload.request.CreateRunRequest;
|
|
|
|
|
import kr.re.etri.autoflow.service.PipelineUploadService;
|
|
|
|
|
import kr.re.etri.autoflow.service.WorkFlowService;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
@ -10,58 +14,40 @@ import org.springframework.http.HttpStatus;
|
|
|
|
|
import org.springframework.http.MediaType;
|
|
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
import org.springframework.web.client.HttpClientErrorException;
|
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
@RestController
|
|
|
|
|
@RequestMapping("/pipelines")
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@CrossOrigin(origins = "*") // 모든 도메인 허용
|
|
|
|
|
@io.swagger.v3.oas.annotations.tags.Tag(name = "Kubeflow Pipeline", description = "Kubeflow 파이프라인 업로드 API")
|
|
|
|
|
@CrossOrigin(origins = "*")
|
|
|
|
|
@io.swagger.v3.oas.annotations.tags.Tag(name = "Kubeflow Pipeline", description = "Kubeflow 파이프라인 API")
|
|
|
|
|
public class PipelineUploadController {
|
|
|
|
|
|
|
|
|
|
private final PipelineUploadService pipelineUploadService;
|
|
|
|
|
private final WorkFlowService workFlowService;
|
|
|
|
|
|
|
|
|
|
@io.swagger.v3.oas.annotations.Operation(
|
|
|
|
|
summary = "파이프라인 업로드",
|
|
|
|
|
description = "Kubeflow에 파이프라인 파일(Multipart)을 업로드하고, 업로드 결과를 반환합니다."
|
|
|
|
|
)
|
|
|
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponses({
|
|
|
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(
|
|
|
|
|
responseCode = "200",
|
|
|
|
|
description = "파이프라인 업로드 성공"
|
|
|
|
|
),
|
|
|
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(
|
|
|
|
|
responseCode = "400",
|
|
|
|
|
description = "잘못된 요청"
|
|
|
|
|
),
|
|
|
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(
|
|
|
|
|
responseCode = "500",
|
|
|
|
|
description = "서버 내부 오류"
|
|
|
|
|
)
|
|
|
|
|
@Operation(summary = "파이프라인 업로드", description = "Kubeflow에 파이프라인 파일(Multipart)을 업로드")
|
|
|
|
|
@ApiResponses({
|
|
|
|
|
@ApiResponse(responseCode = "200", description = "파이프라인 업로드 성공"),
|
|
|
|
|
@ApiResponse(responseCode = "400", description = "잘못된 요청"),
|
|
|
|
|
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
|
|
|
|
public ResponseEntity<Map<String, Object>> uploadPipeline(
|
|
|
|
|
@RequestParam("uploadfile") MultipartFile file,
|
|
|
|
|
@RequestParam(value = "name", required = true) String name,
|
|
|
|
|
@RequestParam(value = "display_name", required = true) String displayName,
|
|
|
|
|
@RequestParam("name") String name,
|
|
|
|
|
@RequestParam("display_name") String displayName,
|
|
|
|
|
@RequestParam(value = "description", required = false) String description,
|
|
|
|
|
@RequestParam(value = "namespace", required = false) String namespace,
|
|
|
|
|
@RequestParam(value = "regUserId") String regUserId,
|
|
|
|
|
@RequestParam(value = "projectId") Long projectId
|
|
|
|
|
@RequestParam("regUserId") String regUserId,
|
|
|
|
|
@RequestParam("projectId") Long projectId
|
|
|
|
|
) {
|
|
|
|
|
try {
|
|
|
|
|
// Kubeflow 업로드
|
|
|
|
|
Map<String, Object> result = pipelineUploadService.uploadPipeline(file, name, displayName, description, namespace);
|
|
|
|
|
|
|
|
|
|
// WorkflowEntity 매핑 후 DB 저장
|
|
|
|
|
WorkflowEntity workflow = WorkflowEntity.builder()
|
|
|
|
|
.pipelineId((String) result.get("pipeline_id"))
|
|
|
|
|
.displayName((String) result.get("display_name"))
|
|
|
|
|
@ -74,19 +60,50 @@ public class PipelineUploadController {
|
|
|
|
|
.version(1)
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
// 저장
|
|
|
|
|
workFlowService.save(workflow);
|
|
|
|
|
|
|
|
|
|
return ResponseEntity.ok(result);
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("Pipeline upload failed", e);
|
|
|
|
|
Map<String, Object> error = Map.of(
|
|
|
|
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
|
|
|
.body(Map.of(
|
|
|
|
|
"status", 500,
|
|
|
|
|
"error", "Internal Server Error",
|
|
|
|
|
"message", e.getMessage()
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/runs")
|
|
|
|
|
@Operation(summary = "Kubeflow Run 생성", description = "Kubeflow에 Run을 생성합니다.")
|
|
|
|
|
@ApiResponses({
|
|
|
|
|
@ApiResponse(responseCode = "200", description = "Run 생성 성공"),
|
|
|
|
|
@ApiResponse(responseCode = "400", description = "display_name 필수"),
|
|
|
|
|
@ApiResponse(responseCode = "500", description = "서버 오류")
|
|
|
|
|
})
|
|
|
|
|
public ResponseEntity<Map<String, Object>> createRun(
|
|
|
|
|
@Parameter @RequestBody CreateRunRequest runRequest
|
|
|
|
|
) {
|
|
|
|
|
try {
|
|
|
|
|
Map<String, Object> result = pipelineUploadService.createRun(runRequest);
|
|
|
|
|
return ResponseEntity.ok(result);
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
log.error("Invalid run request", e);
|
|
|
|
|
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
|
|
|
|
.body(Map.of(
|
|
|
|
|
"status", 400,
|
|
|
|
|
"error", "Bad Request",
|
|
|
|
|
"message", e.getMessage()
|
|
|
|
|
));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("Run creation failed", e);
|
|
|
|
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
|
|
|
.body(Map.of(
|
|
|
|
|
"status", 500,
|
|
|
|
|
"error", "Internal Server Error",
|
|
|
|
|
"message", e.getMessage()
|
|
|
|
|
);
|
|
|
|
|
return ResponseEntity.status(500).body(error);
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|