@@ -71,8 +71,8 @@ pub fn run_openapi_internal() -> Result<(), String> {
7171pub struct Server {
7272 /// shared state used by API request handlers
7373 pub apictx : Arc < ServerContext > ,
74- /// dropshot server for external API
75- pub http_server_external : dropshot:: HttpServer < Arc < ServerContext > > ,
74+ /// dropshot servers for external API
75+ pub http_servers_external : Vec < dropshot:: HttpServer < Arc < ServerContext > > > ,
7676 /// dropshot server for internal API
7777 pub http_server_internal : dropshot:: HttpServer < Arc < ServerContext > > ,
7878}
@@ -92,26 +92,36 @@ impl Server {
9292 ServerContext :: new ( config. deployment . rack_id , ctxlog, & config)
9393 . await ?;
9494
95- let http_server_starter_external = dropshot:: HttpServerStarter :: new (
96- & config. deployment . dropshot_external ,
97- external_api ( ) ,
98- Arc :: clone ( & apictx) ,
99- & log. new ( o ! ( "component" => "dropshot_external" ) ) ,
100- )
101- . map_err ( |error| format ! ( "initializing external server: {}" , error) ) ?;
102-
103- let http_server_starter_internal = dropshot:: HttpServerStarter :: new (
95+ // Launch the internal server.
96+ let server_starter_internal = dropshot:: HttpServerStarter :: new (
10497 & config. deployment . dropshot_internal ,
10598 internal_api ( ) ,
10699 Arc :: clone ( & apictx) ,
107100 & log. new ( o ! ( "component" => "dropshot_internal" ) ) ,
108101 )
109102 . map_err ( |error| format ! ( "initializing internal server: {}" , error) ) ?;
110-
111- let http_server_external = http_server_starter_external. start ( ) ;
112- let http_server_internal = http_server_starter_internal. start ( ) ;
113-
114- Ok ( Server { apictx, http_server_external, http_server_internal } )
103+ let http_server_internal = server_starter_internal. start ( ) ;
104+
105+ // Launch the external server(s).
106+ let http_servers_external = config
107+ . deployment
108+ . dropshot_external
109+ . iter ( )
110+ . map ( |cfg| {
111+ let server_starter_external = dropshot:: HttpServerStarter :: new (
112+ & cfg,
113+ external_api ( ) ,
114+ Arc :: clone ( & apictx) ,
115+ & log. new ( o ! ( "component" => "dropshot_external" ) ) ,
116+ )
117+ . map_err ( |error| {
118+ format ! ( "initializing external server: {}" , error)
119+ } ) ?;
120+ Ok ( server_starter_external. start ( ) )
121+ } )
122+ . collect :: < Result < Vec < dropshot:: HttpServer < _ > > , String > > ( ) ?;
123+
124+ Ok ( Server { apictx, http_servers_external, http_server_internal } )
115125 }
116126
117127 /// Wait for the given server to shut down
@@ -120,18 +130,20 @@ impl Server {
120130 /// immediately after calling `start()`, the program will block indefinitely
121131 /// or until something else initiates a graceful shutdown.
122132 pub async fn wait_for_finish ( self ) -> Result < ( ) , String > {
123- let errors = vec ! [
124- self . http_server_external
125- . await
126- . map_err( |e| format!( "external: {}" , e) ) ,
133+ let mut errors = vec ! [ ] ;
134+ for server in self . http_servers_external {
135+ errors. push ( server. await . map_err ( |e| format ! ( "external: {}" , e) ) ) ;
136+ }
137+ errors. push (
127138 self . http_server_internal
128139 . await
129140 . map_err ( |e| format ! ( "internal: {}" , e) ) ,
130- ]
131- . into_iter ( )
132- . filter ( Result :: is_err)
133- . map ( |r| r. unwrap_err ( ) )
134- . collect :: < Vec < String > > ( ) ;
141+ ) ;
142+ let errors = errors
143+ . into_iter ( )
144+ . filter ( Result :: is_err)
145+ . map ( |r| r. unwrap_err ( ) )
146+ . collect :: < Vec < String > > ( ) ;
135147
136148 if errors. len ( ) > 0 {
137149 let msg = format ! ( "errors shutting down: ({})" , errors. join( ", " ) ) ;
0 commit comments