Skip to content

Commit c0ea923

Browse files
committed
prototype conversion to new dropshot builder interface
1 parent 469522d commit c0ea923

File tree

21 files changed

+216
-272
lines changed

21 files changed

+216
-272
lines changed

Cargo.lock

Lines changed: 51 additions & 54 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,8 +794,9 @@ opt-level = 3
794794
# It's common during development to use a local copy of various complex
795795
# dependencies. If you want to use those, uncomment one of these blocks.
796796
#
797-
#[patch."https://github.com/oxidecomputer/dropshot"]
798-
#dropshot = { path = "../dropshot/dropshot" }
797+
[patch.crates-io.dropshot]
798+
path = "../dropshot-builder/dropshot"
799+
799800
#[patch.crates-io]
800801
#steno = { path = "../steno" }
801802
# [patch."https://github.com/oxidecomputer/propolis"]

clickhouse-admin/src/lib.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use omicron_common::FileKv;
77
use slog::{debug, error, Drain};
88
use slog_dtrace::ProbeRegistration;
99
use slog_error_chain::SlogInlineError;
10-
use std::error::Error;
1110
use std::io;
1211
use std::sync::Arc;
1312

@@ -28,7 +27,7 @@ pub enum StartError {
2827
#[error("failed to register dtrace probes: {0}")]
2928
RegisterDtraceProbes(String),
3029
#[error("failed to initialize HTTP server")]
31-
InitializeHttpServer(#[source] Box<dyn Error + Send + Sync>),
30+
InitializeHttpServer(#[source] dropshot::BuildError),
3231
}
3332

3433
pub type Server = dropshot::HttpServer<Arc<ServerContext>>;
@@ -63,13 +62,12 @@ pub async fn start_server(
6362
.with_log(log.new(slog::o!("component" => "ClickhouseCli"))),
6463
log.new(slog::o!("component" => "ServerContext")),
6564
);
66-
let http_server_starter = dropshot::HttpServerStarter::new(
67-
&server_config.dropshot,
65+
dropshot::ServerBuilder::new(
6866
http_entrypoints::api(),
6967
Arc::new(context),
70-
&log.new(slog::o!("component" => "dropshot")),
68+
log.new(slog::o!("component" => "dropshot")),
7169
)
72-
.map_err(StartError::InitializeHttpServer)?;
73-
74-
Ok(http_server_starter.start())
70+
.config(server_config.dropshot)
71+
.start()
72+
.map_err(StartError::InitializeHttpServer)
7573
}

cockroach-admin/src/lib.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use slog::error;
1010
use slog::Drain;
1111
use slog_dtrace::ProbeRegistration;
1212
use slog_error_chain::SlogInlineError;
13-
use std::error::Error;
1413
use std::io;
1514
use std::sync::Arc;
1615

@@ -30,7 +29,7 @@ pub enum StartError {
3029
#[error("failed to register dtrace probes: {0}")]
3130
RegisterDtraceProbes(String),
3231
#[error("failed to initialize HTTP server")]
33-
InitializeHttpServer(#[source] Box<dyn Error + Send + Sync>),
32+
InitializeHttpServer(#[source] dropshot::BuildError),
3433
}
3534

3635
pub type Server = dropshot::HttpServer<Arc<ServerContext>>;
@@ -64,13 +63,12 @@ pub async fn start_server(
6463
cockroach_cli,
6564
log.new(slog::o!("component" => "ServerContext")),
6665
);
67-
let http_server_starter = dropshot::HttpServerStarter::new(
68-
&server_config.dropshot,
66+
dropshot::ServerBuilder::new(
6967
http_entrypoints::api(),
7068
Arc::new(context),
71-
&log.new(slog::o!("component" => "dropshot")),
69+
log.new(slog::o!("component" => "dropshot")),
7270
)
73-
.map_err(StartError::InitializeHttpServer)?;
74-
75-
Ok(http_server_starter.start())
71+
.config(server_config.dropshot)
72+
.start()
73+
.map_err(StartError::InitializeHttpServer)
7674
}

dns-server/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,14 @@ pub async fn start_servers(
7979
let http_api = http_server::api();
8080
let http_api_context = http_server::Context::new(store);
8181

82-
dropshot::HttpServerStarter::new(
83-
dropshot_config,
82+
dropshot::ServerBuilder::new(
8483
http_api,
8584
http_api_context,
86-
&log.new(o!("component" => "http")),
85+
log.new(o!("component" => "http")),
8786
)
88-
.map_err(|error| anyhow!("setting up HTTP server: {:#}", error))?
87+
.config(dropshot_config.clone())
8988
.start()
89+
.map_err(|error| anyhow!("setting up HTTP server: {:#}", error))?
9090
};
9191

9292
Ok((dns_server, dropshot_server))

gateway/src/lib.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,29 @@ fn start_dropshot_server(
8787
all_servers_shutdown: &FuturesUnordered<ShutdownWaitFuture>,
8888
log: &Logger,
8989
) -> Result<(), String> {
90-
let dropshot = ConfigDropshot {
91-
bind_address: SocketAddr::V6(addr),
92-
request_body_max_bytes,
93-
default_handler_task_mode: HandlerTaskMode::Detached,
94-
log_headers: vec![],
95-
};
96-
let http_server_starter = dropshot::HttpServerStarter::new(
97-
&dropshot,
98-
http_entrypoints::api(),
99-
Arc::clone(apictx),
100-
&log.new(o!("component" => "dropshot")),
101-
)
102-
.map_err(|error| {
103-
format!("initializing http server listening at {addr}: {}", error)
104-
})?;
105-
10690
match http_servers.entry(addr) {
10791
Entry::Vacant(slot) => {
108-
let http_server = http_server_starter.start();
92+
let dropshot = ConfigDropshot {
93+
bind_address: SocketAddr::V6(addr),
94+
request_body_max_bytes,
95+
default_handler_task_mode: HandlerTaskMode::Detached,
96+
log_headers: vec![],
97+
};
98+
99+
let http_server = dropshot::ServerBuilder::new(
100+
http_entrypoints::api(),
101+
Arc::clone(apictx),
102+
log.new(o!("component" => "dropshot")),
103+
)
104+
.config(dropshot)
105+
.start()
106+
.map_err(|error| {
107+
format!(
108+
"initializing http server listening at {addr}: {}",
109+
error
110+
)
111+
})?;
112+
109113
all_servers_shutdown.push(http_server.wait_for_shutdown());
110114
slot.insert(http_server);
111115
Ok(())

installinator-api/src/lib.rs

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
//! named by the client, since it is expected that multiple services will
99
//! implement it.
1010
11-
use anyhow::{anyhow, Result};
11+
use anyhow::Result;
1212
use dropshot::{
1313
Body, ConfigDropshot, FreeformBody, HandlerTaskMode, HttpError,
14-
HttpResponseHeaders, HttpResponseOk, HttpResponseUpdatedNoContent,
15-
HttpServerStarter, Path, RequestContext, TypedBody,
14+
HttpResponseHeaders, HttpResponseOk, HttpResponseUpdatedNoContent, Path,
15+
RequestContext, TypedBody,
1616
};
1717
use hyper::{header, StatusCode};
1818
use installinator_common::EventReport;
@@ -134,36 +134,3 @@ pub fn default_config(bind_address: std::net::SocketAddr) -> ConfigDropshot {
134134
log_headers: vec![],
135135
}
136136
}
137-
138-
/// Make an `HttpServerStarter` for the installinator API with default settings.
139-
pub fn make_server_starter<T: InstallinatorApi>(
140-
context: T::Context,
141-
bind_address: std::net::SocketAddr,
142-
log: &slog::Logger,
143-
) -> Result<HttpServerStarter<T::Context>> {
144-
let dropshot_config = dropshot::ConfigDropshot {
145-
bind_address,
146-
// Even though the installinator sets an upper bound on the number
147-
// of items in a progress report, they can get pretty large if they
148-
// haven't gone through for a bit. Ensure that hitting the max
149-
// request size won't cause a failure by setting a generous upper
150-
// bound for the request size.
151-
//
152-
// TODO: replace with an endpoint-specific option once
153-
// https://github.com/oxidecomputer/dropshot/pull/618 lands and is
154-
// available in omicron.
155-
request_body_max_bytes: 4 * 1024 * 1024,
156-
default_handler_task_mode: HandlerTaskMode::Detached,
157-
log_headers: vec![],
158-
};
159-
160-
let api = crate::installinator_api_mod::api_description::<T>()?;
161-
let server =
162-
dropshot::HttpServerStarter::new(&dropshot_config, api, context, &log)
163-
.map_err(|error| {
164-
anyhow!(error)
165-
.context("failed to create installinator artifact server")
166-
})?;
167-
168-
Ok(server)
169-
}

internal-dns/src/resolver.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -776,9 +776,10 @@ mod test {
776776
bind_address: "[::1]:0".parse().unwrap(),
777777
..Default::default()
778778
};
779-
dropshot::HttpServerStarter::new(&config_dropshot, api(), label, &log)
780-
.unwrap()
779+
dropshot::ServerBuilder::new(api(), label, log)
780+
.config(config_dropshot)
781781
.start()
782+
.unwrap()
782783
}
783784

784785
#[tokio::test]

nexus/src/app/external_endpoints.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,14 +1323,9 @@ mod test {
13231323
let logctx = omicron_test_utils::dev::test_setup_log("test_authority");
13241324
let mut api = dropshot::ApiDescription::new();
13251325
api.register(echo_server_name).unwrap();
1326-
let server = dropshot::HttpServerStarter::new(
1327-
&dropshot::ConfigDropshot::default(),
1328-
api,
1329-
(),
1330-
&logctx.log,
1331-
)
1332-
.expect("failed to create dropshot server")
1333-
.start();
1326+
let server = dropshot::ServerBuilder::new(api, (), logctx.log.clone())
1327+
.start()
1328+
.expect("failed to create dropshot server");
13341329
let local_addr = server.local_addr();
13351330
let port = local_addr.port();
13361331

nexus/src/lib.rs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ impl InternalServer {
8383
.await?;
8484

8585
// Launch the internal server.
86-
let server_starter_internal = dropshot::HttpServerStarter::new(
87-
&config.deployment.dropshot_internal,
86+
let http_server_internal = dropshot::ServerBuilder::new(
8887
internal_api(),
8988
context.clone(),
90-
&log.new(o!("component" => "dropshot_internal")),
89+
log.new(o!("component" => "dropshot_internal")),
9190
)
91+
.config(config.deployment.dropshot_internal.clone())
92+
.start()
9293
.map_err(|error| format!("initializing internal server: {}", error))?;
93-
let http_server_internal = server_starter_internal.start();
9494

9595
Ok(Self {
9696
apictx: context,
@@ -150,32 +150,30 @@ impl Server {
150150
};
151151

152152
let http_server_external = {
153-
let server_starter_external =
154-
dropshot::HttpServerStarter::new_with_tls(
155-
&config.deployment.dropshot_external.dropshot,
156-
external_api(),
157-
apictx.for_external(),
158-
&log.new(o!("component" => "dropshot_external")),
159-
tls_config.clone().map(dropshot::ConfigTls::Dynamic),
160-
)
161-
.map_err(|error| {
162-
format!("initializing external server: {}", error)
163-
})?;
164-
server_starter_external.start()
153+
dropshot::ServerBuilder::new(
154+
external_api(),
155+
apictx.for_external(),
156+
log.new(o!("component" => "dropshot_external")),
157+
)
158+
.config(config.deployment.dropshot_external.dropshot.clone())
159+
.tls(tls_config.clone().map(dropshot::ConfigTls::Dynamic))
160+
.start()
161+
.map_err(|error| {
162+
format!("initializing external server: {}", error)
163+
})?
165164
};
166165
let http_server_techport_external = {
167-
let server_starter_external_techport =
168-
dropshot::HttpServerStarter::new_with_tls(
169-
&techport_server_config,
170-
external_api(),
171-
apictx.for_techport(),
172-
&log.new(o!("component" => "dropshot_external_techport")),
173-
tls_config.map(dropshot::ConfigTls::Dynamic),
174-
)
175-
.map_err(|error| {
176-
format!("initializing external techport server: {}", error)
177-
})?;
178-
server_starter_external_techport.start()
166+
dropshot::ServerBuilder::new(
167+
external_api(),
168+
apictx.for_techport(),
169+
log.new(o!("component" => "dropshot_external_techport")),
170+
)
171+
.config(techport_server_config)
172+
.tls(tls_config.map(dropshot::ConfigTls::Dynamic))
173+
.start()
174+
.map_err(|error| {
175+
format!("initializing external techport server: {}", error)
176+
})?
179177
};
180178

181179
// Start the metric producer server that oximeter uses to fetch our

oximeter/collector/src/lib.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use dropshot::ConfigDropshot;
1010
use dropshot::ConfigLogging;
1111
use dropshot::HttpError;
1212
use dropshot::HttpServer;
13-
use dropshot::HttpServerStarter;
13+
use dropshot::ServerBuilder;
1414
use internal_dns::resolver::ResolveError;
1515
use internal_dns::resolver::Resolver;
1616
use internal_dns::ServiceName;
@@ -239,17 +239,17 @@ impl Oximeter {
239239
.expect("Expected an infinite retry loop initializing the timeseries database");
240240

241241
let dropshot_log = log.new(o!("component" => "dropshot"));
242-
let server = HttpServerStarter::new(
243-
&ConfigDropshot {
244-
bind_address: SocketAddr::V6(args.address),
245-
..Default::default()
246-
},
242+
let server = ServerBuilder::new(
247243
oximeter_api(),
248244
Arc::clone(&agent),
249-
&dropshot_log,
245+
dropshot_log,
250246
)
251-
.map_err(|e| Error::Server(e.to_string()))?
252-
.start();
247+
.config(ConfigDropshot {
248+
bind_address: SocketAddr::V6(args.address),
249+
..Default::default()
250+
})
251+
.start()
252+
.map_err(|e| Error::Server(e.to_string()))?;
253253

254254
// Notify Nexus that this oximeter instance is available.
255255
let our_info = nexus_client::types::OximeterInfo {
@@ -333,17 +333,17 @@ impl Oximeter {
333333
);
334334

335335
let dropshot_log = log.new(o!("component" => "dropshot"));
336-
let server = HttpServerStarter::new(
337-
&ConfigDropshot {
338-
bind_address: SocketAddr::V6(args.address),
339-
..Default::default()
340-
},
336+
let server = ServerBuilder::new(
341337
oximeter_api(),
342338
Arc::clone(&agent),
343-
&dropshot_log,
339+
dropshot_log,
344340
)
345-
.map_err(|e| Error::Server(e.to_string()))?
346-
.start();
341+
.config(ConfigDropshot {
342+
bind_address: SocketAddr::V6(args.address),
343+
..Default::default()
344+
})
345+
.start()
346+
.map_err(|e| Error::Server(e.to_string()))?;
347347
info!(log, "started oximeter standalone server");
348348

349349
// Notify the standalone nexus.

oximeter/collector/src/standalone.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use dropshot::HttpError;
1515
use dropshot::HttpResponseCreated;
1616
use dropshot::HttpResponseUpdatedNoContent;
1717
use dropshot::HttpServer;
18-
use dropshot::HttpServerStarter;
1918
use dropshot::RequestContext;
19+
use dropshot::ServerBuilder;
2020
use dropshot::TypedBody;
2121
use nexus_types::internal_api::params::OximeterInfo;
2222
use omicron_common::api::internal::nexus::ProducerEndpoint;
@@ -251,14 +251,14 @@ impl Server {
251251
let nexus = Arc::new(StandaloneNexus::new(
252252
log.new(slog::o!("component" => "nexus-standalone")),
253253
));
254-
let server = HttpServerStarter::new(
255-
&ConfigDropshot { bind_address: address, ..Default::default() },
254+
let server = ServerBuilder::new(
256255
standalone_nexus_api(),
257256
Arc::clone(&nexus),
258-
&log,
257+
log.clone(),
259258
)
260-
.map_err(|e| Error::Server(e.to_string()))?
261-
.start();
259+
.config(ConfigDropshot { bind_address: address, ..Default::default() })
260+
.start()
261+
.map_err(|e| Error::Server(e.to_string()))?;
262262
info!(
263263
log,
264264
"created standalone nexus server for metric collections";

0 commit comments

Comments
 (0)