1
1
import logging
2
2
from typing import Annotated
3
3
4
- from fastapi import APIRouter , Depends , HTTPException , Response
4
+ from fastapi import APIRouter , Depends , HTTPException , Query , Response
5
5
from fastapi import status as http_status
6
6
from fastapi .responses import StreamingResponse
7
7
from jobs import Image , Job
11
11
from jobs_server .models import (
12
12
CreateJobModel ,
13
13
ExecutionMode ,
14
+ ListWorkloadModel ,
14
15
LogOptions ,
15
16
WorkloadIdentifier ,
16
17
WorkloadMetadata ,
22
23
router = APIRouter (tags = ["Job management" ])
23
24
24
25
25
- @router .post ("/jobs " )
26
+ @router .post ("" )
26
27
async def submit_job (
27
28
opts : CreateJobModel ,
28
29
k8s : Kubernetes ,
@@ -52,20 +53,20 @@ def job_fn(): ...
52
53
return workload_id
53
54
54
55
55
- @router .get ("/jobs/ {uid}/status" )
56
+ @router .get ("/{uid}/status" )
56
57
async def status (
57
58
workload : ManagedWorkload ,
58
59
) -> WorkloadMetadata :
59
60
try :
60
- return WorkloadMetadata .from_managed_workload (workload )
61
+ return WorkloadMetadata .from_kueue_workload (workload )
61
62
except ValueError as e :
62
63
raise HTTPException (
63
64
status_code = http_status .HTTP_404_NOT_FOUND ,
64
65
detail = f"Workload not found or invalid: { str (e )} " ,
65
66
) from e
66
67
67
68
68
- @router .get ("/jobs/ {uid}/logs" )
69
+ @router .get ("/{uid}/logs" )
69
70
async def logs (
70
71
workload : ManagedWorkload ,
71
72
k8s : Kubernetes ,
@@ -86,7 +87,7 @@ async def logs(
86
87
raise HTTPException (http_status .HTTP_400_BAD_REQUEST , "pod not ready" ) from e
87
88
88
89
89
- @router .post ("/jobs/ {uid}/stop" )
90
+ @router .post ("/{uid}/stop" )
90
91
async def stop_workload (
91
92
uid : JobId ,
92
93
workload : ManagedWorkload ,
@@ -104,3 +105,28 @@ async def stop_workload(
104
105
http_status .HTTP_500_INTERNAL_SERVER_ERROR ,
105
106
"Failed to terminate workload" ,
106
107
) from e
108
+
109
+
110
+ @router .get ("" , response_model_exclude_unset = True )
111
+ async def list_jobs (
112
+ k8s : Kubernetes ,
113
+ include_metadata : Annotated [bool , Query ()] = False ,
114
+ ) -> list [ListWorkloadModel ]:
115
+ workloads = k8s .list_workloads ()
116
+ if include_metadata :
117
+ return [
118
+ ListWorkloadModel (
119
+ name = workload .metadata .name ,
120
+ id = WorkloadIdentifier .from_kueue_workload (workload ),
121
+ metadata = WorkloadMetadata .from_kueue_workload (workload ),
122
+ )
123
+ for workload in workloads
124
+ ]
125
+ else :
126
+ return [
127
+ ListWorkloadModel (
128
+ name = workload .metadata .name ,
129
+ id = WorkloadIdentifier .from_kueue_workload (workload ),
130
+ )
131
+ for workload in workloads
132
+ ]
0 commit comments