From 9a65c44efa552037a3e63a31824269134b11ac15 Mon Sep 17 00:00:00 2001 From: bjkim Date: Tue, 23 Sep 2025 18:04:52 +0900 Subject: [PATCH] =?UTF-8?q?[UPDATE]=20Experiments=20API=20Kubeflow=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EC=B2=98=EB=A6=AC=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20DB=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20(ExperimentsControlle?= =?UTF-8?q?r)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/ExperimentsController.java | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java b/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java index bc7c10b..3f02c53 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.ZoneOffset; @@ -118,35 +119,52 @@ public class ExperimentsController { @PostMapping public Mono> createExperiment(@RequestBody ExperimentsEntity experiment) { - // 1️⃣ DB 저장 ExperimentsEntity saved = experimentsService.save(experiment); - // 2️⃣ Kubeflow POST 요청 payload Map payload = new HashMap<>(); payload.put("display_name", saved.getDisplayName()); payload.put("description", saved.getDescription()); payload.put("namespace", "default"); // 필요에 따라 변경 - // 날짜를 ISO 8601 UTC 포맷으로 - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - - payload.computeIfPresent("created_at", (k, v) -> - saved.getKubeflowCreatedAt() != null - ? saved.getKubeflowCreatedAt().atZone(ZoneId.of("Asia/Seoul")).format(formatter) - : null - ); - - - // 3️⃣ WebClient POST return webClientBuilder.build() .post() .uri(kubeflowBaseUrl + "/apis/v2beta1/experiments") .contentType(MediaType.APPLICATION_JSON) .bodyValue(payload) .retrieve() - .bodyToMono(Map.class) // 응답 필요 없으면 Void.class - .doOnNext(resp -> log.info("Kubeflow experiment 등록 완료: {}", resp)) - .then(Mono.just(ResponseEntity.ok(saved))) // DB 저장된 엔티티 반환 + .bodyToMono(Map.class) // Kubeflow 응답 받기 + .flatMap(resp -> { + // Kubeflow 응답에서 값 꺼내기 + if (resp.containsKey("experiment_id")) { + saved.setKubeFlowId((String) resp.get("experiment_id")); + } + + if (resp.containsKey("created_at")) { + saved.setKubeflowCreatedAt( + Instant.parse((String) resp.get("created_at")) + .atZone(ZoneId.of("Asia/Seoul")) + .toLocalDateTime() + ); + } + + if (resp.containsKey("last_run_created_at")) { + saved.setKubeflowLastRunCreatedAt( + Instant.parse((String) resp.get("last_run_created_at")) + .atZone(ZoneId.of("Asia/Seoul")) + .toLocalDateTime() + ); + } + + if (resp.containsKey("storage_state")) { + saved.setKubeflowStorageState((String) resp.get("storage_state")); + } + + // DB 업데이트 + experimentsService.save(saved); + + log.info("Kubeflow experiment 등록 완료: {}", resp); + return Mono.just(ResponseEntity.ok(saved)); + }) .doOnError(e -> log.error("Kubeflow experiment 등록 실패", e)); }