@@ -34,6 +34,8 @@ pub use crucible_agent_client;
3434use external_api:: http_entrypoints:: external_api;
3535use internal_api:: http_entrypoints:: internal_api;
3636use slog:: Logger ;
37+ use std:: net:: SocketAddr ;
38+ use std:: path:: PathBuf ;
3739use std:: sync:: Arc ;
3840
3941#[ macro_use]
@@ -71,7 +73,9 @@ pub fn run_openapi_internal() -> Result<(), String> {
7173pub struct Server {
7274 /// shared state used by API request handlers
7375 pub apictx : Arc < ServerContext > ,
74- /// dropshot server for external API
76+ /// dropshot server for external API (encrypted)
77+ pub https_server_external : dropshot:: HttpServer < Arc < ServerContext > > ,
78+ /// dropshot server for external API (unencrypted)
7579 pub http_server_external : dropshot:: HttpServer < Arc < ServerContext > > ,
7680 /// dropshot server for internal API
7781 pub http_server_internal : dropshot:: HttpServer < Arc < ServerContext > > ,
@@ -92,26 +96,76 @@ impl Server {
9296 ServerContext :: new ( config. deployment . rack_id , ctxlog, & config)
9397 . await ?;
9498
99+ // We launch separate dropshot servers for the "encrypted" and
100+ // "unencrypted" ports.
101+
102+ const HTTPS_PORT : u16 = 443 ;
103+ const HTTP_PORT : u16 = 80 ;
104+
105+ let dropshot_external_https_config = dropshot:: ConfigDropshot {
106+ bind_address : SocketAddr :: new (
107+ config. deployment . external_ip ,
108+ HTTPS_PORT ,
109+ ) ,
110+ request_body_max_bytes : 1048576 ,
111+ tls : Some ( dropshot:: ConfigTls {
112+ cert_file : PathBuf :: from ( "/var/nexus/certs/cert.pem" ) ,
113+ key_file : PathBuf :: from ( "/var/nexus/certs/key.pem" ) ,
114+ } ) ,
115+ } ;
116+ // TODO: Consider removing this interface when all clients are using
117+ // https?
118+ let dropshot_external_http_config = dropshot:: ConfigDropshot {
119+ bind_address : SocketAddr :: new (
120+ config. deployment . external_ip ,
121+ HTTP_PORT ,
122+ ) ,
123+ request_body_max_bytes : 1048576 ,
124+ tls : None ,
125+ } ;
126+
127+ let dropshot_internal_config = dropshot:: ConfigDropshot {
128+ bind_address : SocketAddr :: new (
129+ config. deployment . internal_ip ,
130+ omicron_common:: address:: NEXUS_INTERNAL_PORT ,
131+ ) ,
132+ request_body_max_bytes : 1048576 ,
133+ ..Default :: default ( )
134+ } ;
135+
136+ let https_server_starter_external = dropshot:: HttpServerStarter :: new (
137+ & dropshot_external_https_config,
138+ external_api ( ) ,
139+ Arc :: clone ( & apictx) ,
140+ & log. new ( o ! ( "component" => "dropshot_external (encrypted)" ) ) ,
141+ )
142+ . map_err ( |error| format ! ( "initializing external server: {}" , error) ) ?;
143+ let https_server_external = https_server_starter_external. start ( ) ;
144+
95145 let http_server_starter_external = dropshot:: HttpServerStarter :: new (
96- & config . deployment . dropshot_external ,
146+ & dropshot_external_http_config ,
97147 external_api ( ) ,
98148 Arc :: clone ( & apictx) ,
99- & log. new ( o ! ( "component" => "dropshot_external" ) ) ,
149+ & log. new ( o ! ( "component" => "dropshot_external (unencrypted) " ) ) ,
100150 )
101151 . map_err ( |error| format ! ( "initializing external server: {}" , error) ) ?;
152+ let http_server_external = http_server_starter_external. start ( ) ;
102153
103154 let http_server_starter_internal = dropshot:: HttpServerStarter :: new (
104- & config . deployment . dropshot_internal ,
155+ & dropshot_internal_config ,
105156 internal_api ( ) ,
106157 Arc :: clone ( & apictx) ,
107158 & log. new ( o ! ( "component" => "dropshot_internal" ) ) ,
108159 )
109160 . map_err ( |error| format ! ( "initializing internal server: {}" , error) ) ?;
110-
111- let http_server_external = http_server_starter_external. start ( ) ;
112161 let http_server_internal = http_server_starter_internal. start ( ) ;
113162
114- Ok ( Server { apictx, http_server_external, http_server_internal } )
163+ Ok ( Server {
164+ apictx,
165+ https_server_external,
166+ http_server_external,
167+ http_server_internal,
168+ } )
115169 }
116170
117171 /// Wait for the given server to shut down
0 commit comments