@@ -15,7 +15,7 @@ use tower_http::trace::TraceLayer;
15
15
use tracing:: { debug, debug_span, field, Span } ;
16
16
17
17
use crate :: auth:: { Admin , ScopedUser , User } ;
18
- use crate :: worker :: Work ;
18
+ use crate :: task :: { self , BoxedTask } ;
19
19
use crate :: { AccountName , Error , GatewayService , ProjectName } ;
20
20
21
21
#[ derive( Serialize , Deserialize ) ]
@@ -79,39 +79,52 @@ async fn get_project(
79
79
80
80
async fn post_project (
81
81
Extension ( service) : Extension < Arc < GatewayService > > ,
82
- Extension ( sender) : Extension < Sender < Work > > ,
82
+ Extension ( sender) : Extension < Sender < BoxedTask > > ,
83
83
User { name, .. } : User ,
84
84
Path ( project) : Path < ProjectName > ,
85
85
) -> Result < AxumJson < project:: Response > , Error > {
86
- let work = service. create_project ( project. clone ( ) , name) . await ?;
86
+ let state = service
87
+ . create_project ( project. clone ( ) , name. clone ( ) )
88
+ . await ?;
87
89
88
- let name = work. project_name . to_string ( ) ;
89
- let state = work. work . clone ( ) . into ( ) ;
90
+ service
91
+ . new_task ( )
92
+ . project ( project. clone ( ) )
93
+ . account ( name. clone ( ) )
94
+ . send ( & sender)
95
+ . await ?;
90
96
91
- sender. send ( work) . await ?;
92
-
93
- let response = project:: Response { name, state } ;
97
+ let response = project:: Response {
98
+ name : project. to_string ( ) ,
99
+ state : state. into ( ) ,
100
+ } ;
94
101
95
102
Ok ( AxumJson ( response) )
96
103
}
97
104
98
105
async fn delete_project (
99
106
Extension ( service) : Extension < Arc < GatewayService > > ,
100
- Extension ( sender) : Extension < Sender < Work > > ,
107
+ Extension ( sender) : Extension < Sender < BoxedTask > > ,
101
108
ScopedUser {
102
109
scope : _,
103
110
user : User { name, .. } ,
104
111
} : ScopedUser ,
105
112
Path ( project) : Path < ProjectName > ,
106
113
) -> Result < AxumJson < project:: Response > , Error > {
107
- let work = service. destroy_project ( project, name) . await ?;
108
-
109
- let name = work. project_name . to_string ( ) ;
110
- let state = work. work . clone ( ) . into ( ) ;
114
+ let project_name = project. clone ( ) ;
111
115
112
- sender. send ( work) . await ?;
116
+ service
117
+ . new_task ( )
118
+ . project ( project)
119
+ . account ( name)
120
+ . and_then ( task:: destroy ( ) )
121
+ . send ( & sender)
122
+ . await ?;
113
123
114
- let response = project:: Response { name, state } ;
124
+ let response = project:: Response {
125
+ name : project_name. to_string ( ) ,
126
+ state : shuttle_common:: models:: project:: State :: Destroying ,
127
+ } ;
115
128
Ok ( AxumJson ( response) )
116
129
}
117
130
@@ -123,7 +136,7 @@ async fn route_project(
123
136
service. route ( & scope, req) . await
124
137
}
125
138
126
- async fn get_status ( Extension ( sender) : Extension < Sender < Work > > ) -> Response < Body > {
139
+ async fn get_status ( Extension ( sender) : Extension < Sender < BoxedTask > > ) -> Response < Body > {
127
140
let ( status, body) = if !sender. is_closed ( ) && sender. capacity ( ) > 0 {
128
141
( StatusCode :: OK , StatusResponse :: healthy ( ) )
129
142
} else {
@@ -140,8 +153,9 @@ async fn get_status(Extension(sender): Extension<Sender<Work>>) -> Response<Body
140
153
. unwrap ( )
141
154
}
142
155
143
- pub fn make_api ( service : Arc < GatewayService > , sender : Sender < Work > ) -> Router < Body > {
156
+ pub fn make_api ( service : Arc < GatewayService > , sender : Sender < BoxedTask > ) -> Router < Body > {
144
157
debug ! ( "making api route" ) ;
158
+
145
159
Router :: < Body > :: new ( )
146
160
. route (
147
161
"/" ,
@@ -185,14 +199,13 @@ pub mod tests {
185
199
use super :: * ;
186
200
use crate :: service:: GatewayService ;
187
201
use crate :: tests:: { RequestBuilderExt , World } ;
188
- use crate :: worker:: Work ;
189
202
190
203
#[ tokio:: test]
191
204
async fn api_create_get_delete_projects ( ) -> anyhow:: Result < ( ) > {
192
205
let world = World :: new ( ) . await ;
193
206
let service = Arc :: new ( GatewayService :: init ( world. args ( ) , world. pool ( ) ) . await ) ;
194
207
195
- let ( sender, mut receiver) = channel :: < Work > ( 256 ) ;
208
+ let ( sender, mut receiver) = channel :: < BoxedTask > ( 256 ) ;
196
209
tokio:: spawn ( async move {
197
210
while receiver. recv ( ) . await . is_some ( ) {
198
211
// do not do any work with inbound requests
@@ -327,7 +340,7 @@ pub mod tests {
327
340
let world = World :: new ( ) . await ;
328
341
let service = Arc :: new ( GatewayService :: init ( world. args ( ) , world. pool ( ) ) . await ) ;
329
342
330
- let ( sender, mut receiver) = channel :: < Work > ( 256 ) ;
343
+ let ( sender, mut receiver) = channel :: < BoxedTask > ( 256 ) ;
331
344
tokio:: spawn ( async move {
332
345
while receiver. recv ( ) . await . is_some ( ) {
333
346
// do not do any work with inbound requests
@@ -416,7 +429,7 @@ pub mod tests {
416
429
let world = World :: new ( ) . await ;
417
430
let service = Arc :: new ( GatewayService :: init ( world. args ( ) , world. pool ( ) ) . await ) ;
418
431
419
- let ( sender, mut receiver) = channel :: < Work > ( 1 ) ;
432
+ let ( sender, mut receiver) = channel :: < BoxedTask > ( 1 ) ;
420
433
let ( ctl_send, ctl_recv) = oneshot:: channel ( ) ;
421
434
let ( done_send, done_recv) = oneshot:: channel ( ) ;
422
435
let worker = tokio:: spawn ( async move {
@@ -468,6 +481,7 @@ pub mod tests {
468
481
assert_eq ! ( resp. status( ) , StatusCode :: OK ) ;
469
482
470
483
worker. abort ( ) ;
484
+ let _ = worker. await ;
471
485
472
486
let resp = router. call ( get_status ( ) ) . await . unwrap ( ) ;
473
487
assert_eq ! ( resp. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
0 commit comments