@@ -3,15 +3,17 @@ use hyper::service::{make_service_fn, service_fn};
3
3
use hyper:: Server ;
4
4
use std:: { net:: SocketAddr , thread} ;
5
5
use std:: process;
6
- use tokio:: { runtime:: Runtime , sync:: mpsc} ;
6
+ use tokio:: { runtime:: Runtime , sync:: mpsc:: channel } ;
7
7
8
8
mod admission_review;
9
9
mod api;
10
10
mod wasm;
11
11
mod wasm_fetcher;
12
+ mod worker;
12
13
13
- #[ tokio:: main]
14
- async fn main ( ) {
14
+ use crate :: wasm:: EvalRequest ;
15
+
16
+ fn main ( ) {
15
17
let matches = App :: new ( "policy-server" )
16
18
. version ( "0.0.1" )
17
19
. about ( "Kubernetes admission controller powered by Chimera WASM policies" )
@@ -84,6 +86,13 @@ async fn main() {
84
86
}
85
87
} ;
86
88
89
+ let rt = match Runtime :: new ( ) {
90
+ Ok ( r) => { r } ,
91
+ Err ( error) => {
92
+ return fatal_error ( format ! ( "Error initializing tokio runtime: {}" , error) ) ;
93
+ }
94
+ } ;
95
+
87
96
let fetcher = match wasm_fetcher:: parse_wasm_url (
88
97
matches. value_of ( "wasm-uri" ) . unwrap ( ) ,
89
98
matches. is_present ( "wasm-remote-insecure" ) ,
@@ -94,42 +103,37 @@ async fn main() {
94
103
return fatal_error ( format ! ( "Error parsing arguments: {}" , error) ) ;
95
104
}
96
105
} ;
97
- let wasm_path = match fetcher. fetch ( ) . await {
98
- Ok ( p) => { p } ,
99
- Err ( error) => {
100
- return fatal_error ( format ! ( "Error fetching WASM module: {}" , error) ) ;
101
- }
106
+ let wasm_path = match rt. block_on ( async { fetcher. fetch ( ) . await } ) {
107
+ Ok ( p) =>p,
108
+ Err ( error) => { return fatal_error ( format ! ( "Error fetching WASM module: {}" , error) ) ; }
102
109
} ;
103
110
104
- let ( tx, mut rx) = mpsc:: channel :: < wasm:: EvalRequest > ( 32 ) ;
111
+ let ( api_tx, api_rx) = channel :: < EvalRequest > ( 32 ) ;
112
+
113
+ let mut wasm_modules = Vec :: < String > :: new ( ) ;
114
+ wasm_modules. push ( wasm_path) ;
105
115
106
- let rt = Runtime :: new ( ) . unwrap ( ) ;
107
116
let wasm_thread = thread:: spawn ( move || {
108
- let mut policy_evaluator = match wasm:: PolicyEvaluator :: new ( & wasm_path) {
109
- Ok ( e) => { e } ,
110
- Err ( error) => {
111
- return fatal_error ( format ! ( "Error initializing policy evaluator for {}: {}" , wasm_path, error) ) ;
112
- }
113
- } ;
114
- rt. block_on ( async move {
115
- while let Some ( req) = rx. recv ( ) . await {
116
- let resp = policy_evaluator. validate ( req. req ) ;
117
- let _ = req. resp_chan . send ( resp) ;
118
- }
119
- } ) ;
120
- } ) ;
117
+ let worker_pool = worker:: WorkerPool :: new ( 3 , wasm_modules. clone ( ) , api_rx) . unwrap ( ) ;
121
118
122
- let make_svc = make_service_fn ( |_conn| {
123
- let svc_tx = tx. clone ( ) ;
124
- async move { Ok :: < _ , hyper:: Error > ( service_fn ( move |req| api:: route ( req, svc_tx. clone ( ) ) ) ) }
119
+ worker_pool. run ( ) ;
125
120
} ) ;
126
121
127
- let server = Server :: bind ( & addr) . serve ( make_svc) ;
128
- println ! ( "Started server on {}" , addr) ;
122
+ rt. block_on ( async {
123
+ let make_svc = make_service_fn ( |_conn| {
124
+ let svc_tx = api_tx. clone ( ) ;
125
+ async move {
126
+ Ok :: < _ , hyper:: Error > ( service_fn ( move |req| api:: route ( req, svc_tx. clone ( ) ) ) ) }
127
+ } ) ;
128
+
129
+ let server = Server :: bind ( & addr) . serve ( make_svc) ;
130
+ println ! ( "Started server on {}" , addr) ;
131
+
132
+ if let Err ( e) = server. await {
133
+ eprintln ! ( "server error: {}" , e) ;
134
+ }
135
+ } ) ;
129
136
130
- if let Err ( e) = server. await {
131
- eprintln ! ( "server error: {}" , e) ;
132
- }
133
137
wasm_thread. join ( ) . unwrap ( ) ;
134
138
}
135
139
0 commit comments