[REMOVE] Remove `KubeflowRunsNewController` and consolidate functionality into `KubeflowRunsController`

main
bjkim 8 months ago
parent 2488de4aad
commit f1a98f858c

@ -2,94 +2,53 @@ package kr.re.etri.autoflow.controllers;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.transaction.Transactional; import kr.re.etri.autoflow.entity.KubeflowRunEntity;
import kr.re.etri.autoflow.entity.ExperimentsEntity; import kr.re.etri.autoflow.payload.request.KubeflowRunSearchRequest;
import kr.re.etri.autoflow.payload.request.ProjectBaseSearchRequest; import kr.re.etri.autoflow.repository.KubeflowRunRepository;
import kr.re.etri.autoflow.service.ExperimentsService; import kr.re.etri.autoflow.service.KubeflowRunService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@Tag(name = "RUNS", description = "Kubeflow Runs API") @Tag(name = "Kubeflow Run", description = "Kubeflow Run 조회 API")
@RestController @RestController
@RequestMapping("/api/runs") @RequestMapping("/api/kubeflow/runs")
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class KubeflowRunsController { public class KubeflowRunsController {
private final WebClient.Builder webClientBuilder;
@Value("${kubeflow.url}")
private String kubeflowBaseUrl; // 예: http://192.168.10.135:32473/
@Operation(summary = "Kubeflow Run 목록 조회", description = "Kubeflow API를 호출하여 Run 목록을 조회합니다.") private final KubeflowRunRepository runRepository;
@ApiResponses({
@ApiResponse(responseCode = "200", description = "Run 목록 조회 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 요청"),
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
})
@GetMapping("/runs")
public Mono<ResponseEntity<Map>> listRuns(
@Parameter(description = "페이지 토큰 (다음 페이지 조회 시 사용)", example = "")
@RequestParam(value = "page_token", defaultValue = "") String pageToken,
@Parameter(description = "페이지 크기", example = "10") private final KubeflowRunService kubeflowRunService;
@RequestParam(value = "page_size", defaultValue = "10") int pageSize,
@Parameter(description = "정렬 기준 (sort_by)", example = "created_at desc") @Operation(summary = "모든 Kubeflow Run 조회")
@RequestParam(value = "sort_by", defaultValue = "created_at desc") String sortBy, @GetMapping
public ResponseEntity<List<KubeflowRunEntity>> getAllRuns() {
@Parameter(description = "필터 JSON 문자열 (URL 인코딩 필요)", example = "{\"predicates\":[{\"key\":\"storage_state\",\"operation\":\"NOT_EQUALS\",\"string_value\":\"ARCHIVED\"}]}") List<KubeflowRunEntity> runs = runRepository.findAll();
@RequestParam(value = "filter", required = false) String filter return ResponseEntity.ok(runs);
) {
try {
// filter가 없으면 기본값 적용
if (filter == null || filter.isBlank()) {
filter = "{\"predicates\":[{\"key\":\"storage_state\",\"operation\":\"NOT_EQUALS\",\"string_value\":\"ARCHIVED\"}]}";
} }
String encodedFilter = URLEncoder.encode(filter, StandardCharsets.UTF_8); @Operation(summary = "Kubeflow Run 단건 조회")
@GetMapping("/{runId}")
String uri = String.format( public ResponseEntity<KubeflowRunEntity> getRun(
"%s/apis/v2beta1/runs?page_token=%s&page_size=%d&sort_by=%s&filter=%s", @Parameter(description = "Kubeflow Run ID", example = "ad980d7f-050a-4c59-a775-94394befad40")
kubeflowBaseUrl, pageToken, pageSize, URLEncoder.encode(sortBy, StandardCharsets.UTF_8), encodedFilter @PathVariable("runId") String runId) {
);
return webClientBuilder.build() return runRepository.findByRunId(runId)
.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(Map.class)
.map(ResponseEntity::ok) .map(ResponseEntity::ok)
.doOnError(e -> log.error("Kubeflow Runs 조회 실패", e)); .orElse(ResponseEntity.notFound().build());
} catch (Exception e) {
log.error("URI 생성 실패", e);
return Mono.just(ResponseEntity.status(500).body(Map.of(
"status", 500,
"error", "Internal Server Error",
"message", e.getMessage()
)));
} }
@Operation(summary = "Kubeflow Run 검색 및 페이지네이션 조회")
@GetMapping("/search")
public ResponseEntity<Page<KubeflowRunEntity>> searchRuns(
@ParameterObject @ModelAttribute KubeflowRunSearchRequest request) {
Page<KubeflowRunEntity> page = kubeflowRunService.search(request);
return ResponseEntity.ok(page);
} }
} }

@ -1,54 +0,0 @@
package kr.re.etri.autoflow.controllers;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import kr.re.etri.autoflow.entity.KubeflowRunEntity;
import kr.re.etri.autoflow.payload.request.KubeflowRunSearchRequest;
import kr.re.etri.autoflow.repository.KubeflowRunRepository;
import kr.re.etri.autoflow.service.KubeflowRunService;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Tag(name = "Kubeflow Run", description = "Kubeflow Run 조회 API")
@RestController
@RequestMapping("/api/kubeflow/runs")
@RequiredArgsConstructor
public class KubeflowRunsNewController {
private final KubeflowRunRepository runRepository;
private final KubeflowRunService kubeflowRunService;
@Operation(summary = "모든 Kubeflow Run 조회")
@GetMapping
public ResponseEntity<List<KubeflowRunEntity>> getAllRuns() {
List<KubeflowRunEntity> runs = runRepository.findAll();
return ResponseEntity.ok(runs);
}
@Operation(summary = "Kubeflow Run 단건 조회")
@GetMapping("/{runId}")
public ResponseEntity<KubeflowRunEntity> getRun(
@Parameter(description = "Kubeflow Run ID", example = "ad980d7f-050a-4c59-a775-94394befad40")
@PathVariable("runId") String runId) {
return runRepository.findByRunId(runId)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@Operation(summary = "Kubeflow Run 검색 및 페이지네이션 조회")
@GetMapping("/search")
public ResponseEntity<Page<KubeflowRunEntity>> searchRuns(
@ParameterObject @ModelAttribute KubeflowRunSearchRequest request) {
Page<KubeflowRunEntity> page = kubeflowRunService.search(request);
return ResponseEntity.ok(page);
}
}
Loading…
Cancel
Save