14
14
ExtensionHandlerMixin ,
15
15
JobHandlersMixin ,
16
16
)
17
- from jupyter_scheduler .models import Status
17
+ from jupyter_scheduler .models import CreateJob , Status , UpdateJob
18
18
from jupyter_scheduler .pydantic_v1 import BaseModel , ValidationError
19
19
20
20
21
- class WorkflowHandler (ExtensionHandlerMixin , JobHandlersMixin , APIHandler ):
21
+ class WorkflowsHandler (ExtensionHandlerMixin , JobHandlersMixin , APIHandler ):
22
22
@authenticated
23
23
async def post (self ):
24
24
payload = self .get_json_body ()
@@ -60,7 +60,76 @@ async def get(self, workflow_id: str = None):
60
60
self .finish (workflow .json ())
61
61
62
62
63
- class WorkflowRunHandler (ExtensionHandlerMixin , JobHandlersMixin , APIHandler ):
63
+ class WorkflowsTasksHandler (ExtensionHandlerMixin , JobHandlersMixin , APIHandler ):
64
+ @authenticated
65
+ async def post (self , workflow_id : str ):
66
+ print ("WorkflowsTasksHandler post" )
67
+ payload = self .get_json_body ()
68
+ if workflow_id != payload .get ("workflow_id" ):
69
+ raise HTTPError (
70
+ 400 ,
71
+ "Error during workflow job creation. workflow_id in the URL and payload don't match." ,
72
+ )
73
+ try :
74
+ job_id = await ensure_async (self .scheduler .create_job (CreateJob (** payload ), run = False ))
75
+ except ValidationError as e :
76
+ self .log .exception (e )
77
+ raise HTTPError (500 , str (e )) from e
78
+ except InputUriError as e :
79
+ self .log .exception (e )
80
+ raise HTTPError (500 , str (e )) from e
81
+ except IdempotencyTokenError as e :
82
+ self .log .exception (e )
83
+ raise HTTPError (409 , str (e )) from e
84
+ except SchedulerError as e :
85
+ self .log .exception (e )
86
+ raise HTTPError (500 , str (e )) from e
87
+ except Exception as e :
88
+ self .log .exception (e )
89
+ raise HTTPError (
90
+ 500 , "Unexpected error occurred during creation of workflow job."
91
+ ) from e
92
+ else :
93
+ self .finish (json .dumps (dict (job_id = job_id )))
94
+
95
+ @authenticated
96
+ async def patch (self , workflow_id : str , job_id : str ):
97
+ payload = self .get_json_body ()
98
+ if workflow_id != payload .get ("workflow_id" , None ):
99
+ raise HTTPError (
100
+ 400 ,
101
+ "Error during workflow job creation. workflow_id in the URL and payload don't match." ,
102
+ )
103
+ status = payload .get ("status" )
104
+ status = Status (status ) if status else None
105
+
106
+ if status and status != Status .STOPPED :
107
+ raise HTTPError (
108
+ 500 ,
109
+ "Invalid value for field 'status'. Workflow job status can only be updated to status 'STOPPED' after creation." ,
110
+ )
111
+ try :
112
+ if status :
113
+ await ensure_async (self .scheduler .stop_job (job_id ))
114
+ else :
115
+ await ensure_async (self .scheduler .update_job (job_id , UpdateJob (** payload )))
116
+ except ValidationError as e :
117
+ self .log .exception (e )
118
+ raise HTTPError (500 , str (e )) from e
119
+ except SchedulerError as e :
120
+ self .log .exception (e )
121
+ raise HTTPError (500 , str (e )) from e
122
+ except Exception as e :
123
+ self .log .exception (e )
124
+ raise HTTPError (
125
+ 500 , "Unexpected error occurred while updating the workflow job."
126
+ ) from e
127
+ else :
128
+ self .set_status (204 )
129
+ self .finish ()
130
+
131
+
132
+ class WorkflowsRunHandler (ExtensionHandlerMixin , JobHandlersMixin , APIHandler ):
64
133
@authenticated
65
134
async def post (self , workflow_id : str ):
66
135
try :
@@ -79,7 +148,9 @@ async def post(self, workflow_id: str):
79
148
raise HTTPError (500 , str (e )) from e
80
149
except Exception as e :
81
150
self .log .exception (e )
82
- raise HTTPError (500 , "Unexpected error occurred during creation of a workflow." ) from e
151
+ raise HTTPError (
152
+ 500 , "Unexpected error occurred during attempt to run a workflow."
153
+ ) from e
83
154
else :
84
155
self .finish (json .dumps (dict (workflow_id = workflow_id )))
85
156
0 commit comments