From c0ea9232a6772ae42455c8b6542e77ee44bf4807 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Mon, 30 Sep 2024 16:01:19 -0700 Subject: [PATCH 01/14] prototype conversion to new dropshot builder interface --- Cargo.lock | 105 +++++++++++++-------------- Cargo.toml | 5 +- clickhouse-admin/src/lib.rs | 14 ++-- cockroach-admin/src/lib.rs | 14 ++-- dns-server/src/lib.rs | 8 +- gateway/src/lib.rs | 38 +++++----- installinator-api/src/lib.rs | 39 +--------- internal-dns/src/resolver.rs | 5 +- nexus/src/app/external_endpoints.rs | 11 +-- nexus/src/lib.rs | 54 +++++++------- oximeter/collector/src/lib.rs | 34 ++++----- oximeter/collector/src/standalone.rs | 12 +-- oximeter/producer/src/lib.rs | 30 +++----- sled-agent/src/bootstrap/server.rs | 10 +-- sled-agent/src/fakes/nexus.rs | 5 +- sled-agent/src/instance.rs | 12 +-- sled-agent/src/server.rs | 13 ++-- sled-agent/src/sim/server.rs | 10 +-- sled-agent/src/sim/sled_agent.rs | 19 +++-- sled-agent/src/sim/storage.rs | 34 ++++----- wicketd/src/lib.rs | 16 ++-- 21 files changed, 216 insertions(+), 272 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4aab6fc8024..967435aad44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -876,7 +876,7 @@ dependencies = [ name = "bootstrap-agent-api" version = "0.1.0" dependencies = [ - "dropshot 0.12.0", + "dropshot 0.12.1", "nexus-client", "omicron-common", "omicron-uuid-kinds", @@ -1141,7 +1141,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "libc", "omicron-common", @@ -1287,7 +1287,7 @@ name = "clickhouse-admin-api" version = "0.1.0" dependencies = [ "clickhouse-admin-types", - "dropshot 0.12.0", + "dropshot 0.12.1", "omicron-common", "omicron-uuid-kinds", "omicron-workspace-hack", @@ -1351,7 +1351,7 @@ name = "cockroach-admin-api" version = "0.1.0" dependencies = [ "cockroach-admin-types", - "dropshot 0.12.0", + "dropshot 0.12.1", "omicron-common", "omicron-uuid-kinds", "omicron-workspace-hack", @@ -1576,7 +1576,7 @@ name = "crdb-seed" version = "0.1.0" dependencies = [ "anyhow", - "dropshot 0.12.0", + "dropshot 0.12.1", "omicron-test-utils", "omicron-workspace-hack", "slog", @@ -1728,7 +1728,7 @@ dependencies = [ "anyhow", "atty", "crucible-workspace-hack", - "dropshot 0.12.0", + "dropshot 0.12.1", "nix 0.29.0", "rusqlite", "rustls-pemfile 1.0.4", @@ -2289,7 +2289,7 @@ dependencies = [ "clap", "dns-server-api", "dns-service-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "hickory-client", "hickory-proto", @@ -2322,7 +2322,7 @@ name = "dns-server-api" version = "0.1.0" dependencies = [ "chrono", - "dropshot 0.12.0", + "dropshot 0.12.1", "omicron-workspace-hack", "schemars", "serde", @@ -2443,9 +2443,7 @@ dependencies = [ [[package]] name = "dropshot" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab804b8d4ab58d96e1e19c8ef87e1747a70d2819e92b659d6fe8d5ac5ac44d50" +version = "0.12.1" dependencies = [ "async-stream", "async-trait", @@ -2454,7 +2452,7 @@ dependencies = [ "camino", "chrono", "debug-ignore", - "dropshot_endpoint 0.12.0", + "dropshot_endpoint 0.12.1-dev", "form_urlencoded", "futures", "hostname 0.4.0", @@ -2481,6 +2479,7 @@ dependencies = [ "slog-bunyan", "slog-json", "slog-term", + "thiserror", "tokio", "tokio-rustls 0.25.0", "toml 0.8.19", @@ -2505,9 +2504,7 @@ dependencies = [ [[package]] name = "dropshot_endpoint" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796be76b11b79de0decd7be2105add01220f8bbe04cf1f83214c0b801414a722" +version = "0.12.1-dev" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3162,7 +3159,7 @@ dependencies = [ name = "gateway-api" version = "0.1.0" dependencies = [ - "dropshot 0.12.0", + "dropshot 0.12.1", "gateway-types", "omicron-common", "omicron-uuid-kinds", @@ -3267,7 +3264,7 @@ name = "gateway-test-utils" version = "0.1.0" dependencies = [ "camino", - "dropshot 0.12.0", + "dropshot 0.12.1", "gateway-messages", "gateway-types", "omicron-gateway", @@ -3983,7 +3980,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -4363,7 +4360,7 @@ name = "installinator-api" version = "0.1.0" dependencies = [ "anyhow", - "dropshot 0.12.0", + "dropshot 0.12.1", "hyper 1.4.1", "installinator-common", "omicron-common", @@ -4431,7 +4428,7 @@ dependencies = [ "chrono", "dns-server", "dns-service-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "hickory-resolver", @@ -4458,7 +4455,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "hickory-resolver", "internal-dns", "omicron-common", @@ -4787,7 +4784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -5347,7 +5344,7 @@ dependencies = [ "base64 0.22.1", "chrono", "cookie", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "headers", "http 1.1.0", @@ -5404,7 +5401,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "libc", "omicron-common", @@ -5496,7 +5493,7 @@ dependencies = [ "db-macros", "diesel", "diesel-dtrace", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "gateway-client", @@ -5578,7 +5575,7 @@ name = "nexus-external-api" version = "0.1.0" dependencies = [ "anyhow", - "dropshot 0.12.0", + "dropshot 0.12.1", "http 1.1.0", "hyper 1.4.1", "ipnetwork", @@ -5595,7 +5592,7 @@ dependencies = [ name = "nexus-internal-api" version = "0.1.0" dependencies = [ - "dropshot 0.12.0", + "dropshot 0.12.1", "nexus-types", "omicron-common", "omicron-uuid-kinds", @@ -5856,7 +5853,7 @@ dependencies = [ "crucible-agent-client", "dns-server", "dns-service-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "gateway-messages", "gateway-test-utils", @@ -5917,7 +5914,7 @@ dependencies = [ "derive-where", "derive_more", "dns-service-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "gateway-client", "http 1.1.0", @@ -6257,7 +6254,7 @@ dependencies = [ "clickhouse-admin-api", "clickhouse-admin-types", "clickward", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "http 1.1.0", "illumos-utils", @@ -6296,7 +6293,7 @@ dependencies = [ "cockroach-admin-api", "cockroach-admin-types", "csv", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "http 1.1.0", "illumos-utils", @@ -6338,7 +6335,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "hex", @@ -6398,7 +6395,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "libc", @@ -6438,7 +6435,7 @@ dependencies = [ "camino", "chrono", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "gateway-api", @@ -6482,7 +6479,7 @@ version = "0.1.0" dependencies = [ "anyhow", "assert_matches", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "internal-dns", "live-tests-macros", @@ -6551,7 +6548,7 @@ dependencies = [ "dns-server", "dns-service-client", "dpd-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "fatfs", "futures", @@ -6677,7 +6674,7 @@ dependencies = [ "crucible-agent-client", "csv", "diesel", - "dropshot 0.12.0", + "dropshot 0.12.1", "dyn-clone", "expectorate", "futures", @@ -6842,7 +6839,7 @@ dependencies = [ "dns-server", "dns-service-client", "dpd-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "flate2", "flume", @@ -6930,7 +6927,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "filetime", "futures", @@ -7175,7 +7172,7 @@ dependencies = [ "clickhouse-admin-api", "cockroach-admin-api", "dns-server-api", - "dropshot 0.12.0", + "dropshot 0.12.1", "fs-err", "gateway-api", "indent_write", @@ -7394,7 +7391,7 @@ name = "oximeter-api" version = "0.1.0" dependencies = [ "chrono", - "dropshot 0.12.0", + "dropshot 0.12.1", "omicron-common", "omicron-workspace-hack", "schemars", @@ -7425,7 +7422,7 @@ dependencies = [ "camino", "chrono", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "httpmock", @@ -7475,7 +7472,7 @@ dependencies = [ "criterion", "crossterm 0.28.1", "display-error-chain", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "futures", "gethostname", @@ -7520,7 +7517,7 @@ version = "0.1.0" dependencies = [ "cfg-if", "chrono", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "http 1.1.0", "hyper 1.4.1", @@ -7556,7 +7553,7 @@ dependencies = [ "anyhow", "chrono", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "internal-dns", "nexus-client", "omicron-common", @@ -8538,7 +8535,7 @@ dependencies = [ "atty", "base64 0.21.7", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "hyper 1.4.1", "progenitor", @@ -8860,7 +8857,7 @@ dependencies = [ "camino-tempfile", "clap", "dns-service-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "expectorate", "humantime", "indexmap 2.5.0", @@ -10173,7 +10170,7 @@ name = "sled-agent-api" version = "0.1.0" dependencies = [ "camino", - "dropshot 0.12.0", + "dropshot 0.12.1", "nexus-sled-agent-shared", "omicron-common", "omicron-uuid-kinds", @@ -10544,7 +10541,7 @@ dependencies = [ "anyhow", "async-trait", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "gateway-messages", "gateway-types", @@ -11997,7 +11994,7 @@ dependencies = [ "clap", "debug-ignore", "display-error-chain", - "dropshot 0.12.0", + "dropshot 0.12.1", "futures", "hex", "hubtools", @@ -12460,7 +12457,7 @@ version = "0.1.0" dependencies = [ "anyhow", "dpd-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "gateway-client", "maplit", "omicron-common", @@ -12516,7 +12513,7 @@ dependencies = [ "debug-ignore", "display-error-chain", "dpd-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "either", "expectorate", "flate2", @@ -12584,7 +12581,7 @@ name = "wicketd-api" version = "0.1.0" dependencies = [ "bootstrap-agent-client", - "dropshot 0.12.0", + "dropshot 0.12.1", "gateway-client", "omicron-common", "omicron-passwords", @@ -13083,7 +13080,7 @@ dependencies = [ "anyhow", "camino", "clap", - "dropshot 0.12.0", + "dropshot 0.12.1", "illumos-utils", "omicron-common", "omicron-sled-agent", diff --git a/Cargo.toml b/Cargo.toml index 07765e098ed..b9e1c441e8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -794,8 +794,9 @@ opt-level = 3 # It's common during development to use a local copy of various complex # dependencies. If you want to use those, uncomment one of these blocks. # -#[patch."https://github.com/oxidecomputer/dropshot"] -#dropshot = { path = "../dropshot/dropshot" } +[patch.crates-io.dropshot] +path = "../dropshot-builder/dropshot" + #[patch.crates-io] #steno = { path = "../steno" } # [patch."https://github.com/oxidecomputer/propolis"] diff --git a/clickhouse-admin/src/lib.rs b/clickhouse-admin/src/lib.rs index 511a32dd507..6c28efab293 100644 --- a/clickhouse-admin/src/lib.rs +++ b/clickhouse-admin/src/lib.rs @@ -7,7 +7,6 @@ use omicron_common::FileKv; use slog::{debug, error, Drain}; use slog_dtrace::ProbeRegistration; use slog_error_chain::SlogInlineError; -use std::error::Error; use std::io; use std::sync::Arc; @@ -28,7 +27,7 @@ pub enum StartError { #[error("failed to register dtrace probes: {0}")] RegisterDtraceProbes(String), #[error("failed to initialize HTTP server")] - InitializeHttpServer(#[source] Box), + InitializeHttpServer(#[source] dropshot::BuildError), } pub type Server = dropshot::HttpServer>; @@ -63,13 +62,12 @@ pub async fn start_server( .with_log(log.new(slog::o!("component" => "ClickhouseCli"))), log.new(slog::o!("component" => "ServerContext")), ); - let http_server_starter = dropshot::HttpServerStarter::new( - &server_config.dropshot, + dropshot::ServerBuilder::new( http_entrypoints::api(), Arc::new(context), - &log.new(slog::o!("component" => "dropshot")), + log.new(slog::o!("component" => "dropshot")), ) - .map_err(StartError::InitializeHttpServer)?; - - Ok(http_server_starter.start()) + .config(server_config.dropshot) + .start() + .map_err(StartError::InitializeHttpServer) } diff --git a/cockroach-admin/src/lib.rs b/cockroach-admin/src/lib.rs index 10573442979..dbe36358d21 100644 --- a/cockroach-admin/src/lib.rs +++ b/cockroach-admin/src/lib.rs @@ -10,7 +10,6 @@ use slog::error; use slog::Drain; use slog_dtrace::ProbeRegistration; use slog_error_chain::SlogInlineError; -use std::error::Error; use std::io; use std::sync::Arc; @@ -30,7 +29,7 @@ pub enum StartError { #[error("failed to register dtrace probes: {0}")] RegisterDtraceProbes(String), #[error("failed to initialize HTTP server")] - InitializeHttpServer(#[source] Box), + InitializeHttpServer(#[source] dropshot::BuildError), } pub type Server = dropshot::HttpServer>; @@ -64,13 +63,12 @@ pub async fn start_server( cockroach_cli, log.new(slog::o!("component" => "ServerContext")), ); - let http_server_starter = dropshot::HttpServerStarter::new( - &server_config.dropshot, + dropshot::ServerBuilder::new( http_entrypoints::api(), Arc::new(context), - &log.new(slog::o!("component" => "dropshot")), + log.new(slog::o!("component" => "dropshot")), ) - .map_err(StartError::InitializeHttpServer)?; - - Ok(http_server_starter.start()) + .config(server_config.dropshot) + .start() + .map_err(StartError::InitializeHttpServer) } diff --git a/dns-server/src/lib.rs b/dns-server/src/lib.rs index 8abd3b945eb..6da9703b16b 100644 --- a/dns-server/src/lib.rs +++ b/dns-server/src/lib.rs @@ -79,14 +79,14 @@ pub async fn start_servers( let http_api = http_server::api(); let http_api_context = http_server::Context::new(store); - dropshot::HttpServerStarter::new( - dropshot_config, + dropshot::ServerBuilder::new( http_api, http_api_context, - &log.new(o!("component" => "http")), + log.new(o!("component" => "http")), ) - .map_err(|error| anyhow!("setting up HTTP server: {:#}", error))? + .config(dropshot_config.clone()) .start() + .map_err(|error| anyhow!("setting up HTTP server: {:#}", error))? }; Ok((dns_server, dropshot_server)) diff --git a/gateway/src/lib.rs b/gateway/src/lib.rs index 760857ab311..35eb3dbc791 100644 --- a/gateway/src/lib.rs +++ b/gateway/src/lib.rs @@ -87,25 +87,29 @@ fn start_dropshot_server( all_servers_shutdown: &FuturesUnordered, log: &Logger, ) -> Result<(), String> { - let dropshot = ConfigDropshot { - bind_address: SocketAddr::V6(addr), - request_body_max_bytes, - default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], - }; - let http_server_starter = dropshot::HttpServerStarter::new( - &dropshot, - http_entrypoints::api(), - Arc::clone(apictx), - &log.new(o!("component" => "dropshot")), - ) - .map_err(|error| { - format!("initializing http server listening at {addr}: {}", error) - })?; - match http_servers.entry(addr) { Entry::Vacant(slot) => { - let http_server = http_server_starter.start(); + let dropshot = ConfigDropshot { + bind_address: SocketAddr::V6(addr), + request_body_max_bytes, + default_handler_task_mode: HandlerTaskMode::Detached, + log_headers: vec![], + }; + + let http_server = dropshot::ServerBuilder::new( + http_entrypoints::api(), + Arc::clone(apictx), + log.new(o!("component" => "dropshot")), + ) + .config(dropshot) + .start() + .map_err(|error| { + format!( + "initializing http server listening at {addr}: {}", + error + ) + })?; + all_servers_shutdown.push(http_server.wait_for_shutdown()); slot.insert(http_server); Ok(()) diff --git a/installinator-api/src/lib.rs b/installinator-api/src/lib.rs index b42165c31d4..487e5d786c4 100644 --- a/installinator-api/src/lib.rs +++ b/installinator-api/src/lib.rs @@ -8,11 +8,11 @@ //! named by the client, since it is expected that multiple services will //! implement it. -use anyhow::{anyhow, Result}; +use anyhow::Result; use dropshot::{ Body, ConfigDropshot, FreeformBody, HandlerTaskMode, HttpError, - HttpResponseHeaders, HttpResponseOk, HttpResponseUpdatedNoContent, - HttpServerStarter, Path, RequestContext, TypedBody, + HttpResponseHeaders, HttpResponseOk, HttpResponseUpdatedNoContent, Path, + RequestContext, TypedBody, }; use hyper::{header, StatusCode}; use installinator_common::EventReport; @@ -134,36 +134,3 @@ pub fn default_config(bind_address: std::net::SocketAddr) -> ConfigDropshot { log_headers: vec![], } } - -/// Make an `HttpServerStarter` for the installinator API with default settings. -pub fn make_server_starter( - context: T::Context, - bind_address: std::net::SocketAddr, - log: &slog::Logger, -) -> Result> { - let dropshot_config = dropshot::ConfigDropshot { - bind_address, - // Even though the installinator sets an upper bound on the number - // of items in a progress report, they can get pretty large if they - // haven't gone through for a bit. Ensure that hitting the max - // request size won't cause a failure by setting a generous upper - // bound for the request size. - // - // TODO: replace with an endpoint-specific option once - // https://github.com/oxidecomputer/dropshot/pull/618 lands and is - // available in omicron. - request_body_max_bytes: 4 * 1024 * 1024, - default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], - }; - - let api = crate::installinator_api_mod::api_description::()?; - let server = - dropshot::HttpServerStarter::new(&dropshot_config, api, context, &log) - .map_err(|error| { - anyhow!(error) - .context("failed to create installinator artifact server") - })?; - - Ok(server) -} diff --git a/internal-dns/src/resolver.rs b/internal-dns/src/resolver.rs index 5675575a183..980d8785a53 100644 --- a/internal-dns/src/resolver.rs +++ b/internal-dns/src/resolver.rs @@ -776,9 +776,10 @@ mod test { bind_address: "[::1]:0".parse().unwrap(), ..Default::default() }; - dropshot::HttpServerStarter::new(&config_dropshot, api(), label, &log) - .unwrap() + dropshot::ServerBuilder::new(api(), label, log) + .config(config_dropshot) .start() + .unwrap() } #[tokio::test] diff --git a/nexus/src/app/external_endpoints.rs b/nexus/src/app/external_endpoints.rs index 18d2399eb59..411b25f5592 100644 --- a/nexus/src/app/external_endpoints.rs +++ b/nexus/src/app/external_endpoints.rs @@ -1323,14 +1323,9 @@ mod test { let logctx = omicron_test_utils::dev::test_setup_log("test_authority"); let mut api = dropshot::ApiDescription::new(); api.register(echo_server_name).unwrap(); - let server = dropshot::HttpServerStarter::new( - &dropshot::ConfigDropshot::default(), - api, - (), - &logctx.log, - ) - .expect("failed to create dropshot server") - .start(); + let server = dropshot::ServerBuilder::new(api, (), logctx.log.clone()) + .start() + .expect("failed to create dropshot server"); let local_addr = server.local_addr(); let port = local_addr.port(); diff --git a/nexus/src/lib.rs b/nexus/src/lib.rs index eaabbd748b7..59d2d47533e 100644 --- a/nexus/src/lib.rs +++ b/nexus/src/lib.rs @@ -83,14 +83,14 @@ impl InternalServer { .await?; // Launch the internal server. - let server_starter_internal = dropshot::HttpServerStarter::new( - &config.deployment.dropshot_internal, + let http_server_internal = dropshot::ServerBuilder::new( internal_api(), context.clone(), - &log.new(o!("component" => "dropshot_internal")), + log.new(o!("component" => "dropshot_internal")), ) + .config(config.deployment.dropshot_internal.clone()) + .start() .map_err(|error| format!("initializing internal server: {}", error))?; - let http_server_internal = server_starter_internal.start(); Ok(Self { apictx: context, @@ -150,32 +150,30 @@ impl Server { }; let http_server_external = { - let server_starter_external = - dropshot::HttpServerStarter::new_with_tls( - &config.deployment.dropshot_external.dropshot, - external_api(), - apictx.for_external(), - &log.new(o!("component" => "dropshot_external")), - tls_config.clone().map(dropshot::ConfigTls::Dynamic), - ) - .map_err(|error| { - format!("initializing external server: {}", error) - })?; - server_starter_external.start() + dropshot::ServerBuilder::new( + external_api(), + apictx.for_external(), + log.new(o!("component" => "dropshot_external")), + ) + .config(config.deployment.dropshot_external.dropshot.clone()) + .tls(tls_config.clone().map(dropshot::ConfigTls::Dynamic)) + .start() + .map_err(|error| { + format!("initializing external server: {}", error) + })? }; let http_server_techport_external = { - let server_starter_external_techport = - dropshot::HttpServerStarter::new_with_tls( - &techport_server_config, - external_api(), - apictx.for_techport(), - &log.new(o!("component" => "dropshot_external_techport")), - tls_config.map(dropshot::ConfigTls::Dynamic), - ) - .map_err(|error| { - format!("initializing external techport server: {}", error) - })?; - server_starter_external_techport.start() + dropshot::ServerBuilder::new( + external_api(), + apictx.for_techport(), + log.new(o!("component" => "dropshot_external_techport")), + ) + .config(techport_server_config) + .tls(tls_config.map(dropshot::ConfigTls::Dynamic)) + .start() + .map_err(|error| { + format!("initializing external techport server: {}", error) + })? }; // Start the metric producer server that oximeter uses to fetch our diff --git a/oximeter/collector/src/lib.rs b/oximeter/collector/src/lib.rs index 0576c7d5325..cf1eb70add7 100644 --- a/oximeter/collector/src/lib.rs +++ b/oximeter/collector/src/lib.rs @@ -10,7 +10,7 @@ use dropshot::ConfigDropshot; use dropshot::ConfigLogging; use dropshot::HttpError; use dropshot::HttpServer; -use dropshot::HttpServerStarter; +use dropshot::ServerBuilder; use internal_dns::resolver::ResolveError; use internal_dns::resolver::Resolver; use internal_dns::ServiceName; @@ -239,17 +239,17 @@ impl Oximeter { .expect("Expected an infinite retry loop initializing the timeseries database"); let dropshot_log = log.new(o!("component" => "dropshot")); - let server = HttpServerStarter::new( - &ConfigDropshot { - bind_address: SocketAddr::V6(args.address), - ..Default::default() - }, + let server = ServerBuilder::new( oximeter_api(), Arc::clone(&agent), - &dropshot_log, + dropshot_log, ) - .map_err(|e| Error::Server(e.to_string()))? - .start(); + .config(ConfigDropshot { + bind_address: SocketAddr::V6(args.address), + ..Default::default() + }) + .start() + .map_err(|e| Error::Server(e.to_string()))?; // Notify Nexus that this oximeter instance is available. let our_info = nexus_client::types::OximeterInfo { @@ -333,17 +333,17 @@ impl Oximeter { ); let dropshot_log = log.new(o!("component" => "dropshot")); - let server = HttpServerStarter::new( - &ConfigDropshot { - bind_address: SocketAddr::V6(args.address), - ..Default::default() - }, + let server = ServerBuilder::new( oximeter_api(), Arc::clone(&agent), - &dropshot_log, + dropshot_log, ) - .map_err(|e| Error::Server(e.to_string()))? - .start(); + .config(ConfigDropshot { + bind_address: SocketAddr::V6(args.address), + ..Default::default() + }) + .start() + .map_err(|e| Error::Server(e.to_string()))?; info!(log, "started oximeter standalone server"); // Notify the standalone nexus. diff --git a/oximeter/collector/src/standalone.rs b/oximeter/collector/src/standalone.rs index fa040f5f541..53c5292e58c 100644 --- a/oximeter/collector/src/standalone.rs +++ b/oximeter/collector/src/standalone.rs @@ -15,8 +15,8 @@ use dropshot::HttpError; use dropshot::HttpResponseCreated; use dropshot::HttpResponseUpdatedNoContent; use dropshot::HttpServer; -use dropshot::HttpServerStarter; use dropshot::RequestContext; +use dropshot::ServerBuilder; use dropshot::TypedBody; use nexus_types::internal_api::params::OximeterInfo; use omicron_common::api::internal::nexus::ProducerEndpoint; @@ -251,14 +251,14 @@ impl Server { let nexus = Arc::new(StandaloneNexus::new( log.new(slog::o!("component" => "nexus-standalone")), )); - let server = HttpServerStarter::new( - &ConfigDropshot { bind_address: address, ..Default::default() }, + let server = ServerBuilder::new( standalone_nexus_api(), Arc::clone(&nexus), - &log, + log.clone(), ) - .map_err(|e| Error::Server(e.to_string()))? - .start(); + .config(ConfigDropshot { bind_address: address, ..Default::default() }) + .start() + .map_err(|e| Error::Server(e.to_string()))?; info!( log, "created standalone nexus server for metric collections"; diff --git a/oximeter/producer/src/lib.rs b/oximeter/producer/src/lib.rs index e9223b62f36..bb2c4e7b7ad 100644 --- a/oximeter/producer/src/lib.rs +++ b/oximeter/producer/src/lib.rs @@ -12,9 +12,9 @@ use dropshot::ConfigDropshot; use dropshot::HttpError; use dropshot::HttpResponseOk; use dropshot::HttpServer; -use dropshot::HttpServerStarter; use dropshot::Path; use dropshot::RequestContext; +use dropshot::ServerBuilder; use internal_dns::resolver::ResolveError; use internal_dns::resolver::Resolver; use internal_dns::ServiceName; @@ -194,14 +194,10 @@ impl Server { dropshot: &ConfigDropshot, ) -> Result, Error> { let dropshot_log = log.new(o!("component" => "dropshot")); - HttpServerStarter::new( - dropshot, - metric_server_api(), - registry.clone(), - &dropshot_log, - ) - .map_err(|e| Error::Server(e.to_string())) - .map(HttpServerStarter::start) + ServerBuilder::new(metric_server_api(), registry.clone(), dropshot_log) + .config(dropshot.clone()) + .start() + .map_err(|e| Error::Server(e.to_string())) } // Create a new server registering with Nexus. @@ -464,8 +460,8 @@ mod tests { use dropshot::HttpError; use dropshot::HttpResponseCreated; use dropshot::HttpServer; - use dropshot::HttpServerStarter; use dropshot::RequestContext; + use dropshot::ServerBuilder; use omicron_common::api::internal::nexus::ProducerKind; use omicron_common::api::internal::nexus::ProducerRegistrationResponse; use omicron_test_utils::dev::poll::{wait_for_condition, CondCheckError}; @@ -510,18 +506,14 @@ mod tests { fn spawn_fake_nexus_server(log: &Logger) -> HttpServer { let mut api = ApiDescription::new(); api.register(register_producer).expect("Expected to register endpoint"); - HttpServerStarter::new( - &ConfigDropshot { + ServerBuilder::new(api, Arc::new(AtomicU32::new(0)), log.clone()) + .config(ConfigDropshot { bind_address: "[::1]:0".parse().unwrap(), request_body_max_bytes: 2048, ..Default::default() - }, - api, - Arc::new(AtomicU32::new(0)), - log, - ) - .expect("Expected to start Dropshot server") - .start() + }) + .start() + .expect("Expected to start Dropshot server") } #[tokio::test] diff --git a/sled-agent/src/bootstrap/server.rs b/sled-agent/src/bootstrap/server.rs index fe480142ca3..daa699a2c0d 100644 --- a/sled-agent/src/bootstrap/server.rs +++ b/sled-agent/src/bootstrap/server.rs @@ -459,16 +459,16 @@ fn start_dropshot_server( )); let dropshot_log = context.base_log.new(o!("component" => "dropshot (BootstrapAgent)")); - let http_server = dropshot::HttpServerStarter::new( - &dropshot_config, + let http_server = dropshot::ServerBuilder::new( http_entrypoints::api(), context, - &dropshot_log, + dropshot_log, ) + .config(dropshot_config) + .start() .map_err(|error| { StartError::InitBootstrapDropshotServer(error.to_string()) - })? - .start(); + })?; Ok(http_server) } diff --git a/sled-agent/src/fakes/nexus.rs b/sled-agent/src/fakes/nexus.rs index 3efd6951f97..f437b77febd 100644 --- a/sled-agent/src/fakes/nexus.rs +++ b/sled-agent/src/fakes/nexus.rs @@ -156,9 +156,10 @@ pub fn start_test_server( bind_address: "[::1]:0".parse().unwrap(), ..Default::default() }; - dropshot::HttpServerStarter::new(&config_dropshot, api(), label, &log) - .unwrap() + dropshot::ServerBuilder::new(api(), label, log) + .config(config_dropshot) .start() + .unwrap() } /// Creates a transient DNS server pointing to a fake Nexus dropshot server. diff --git a/sled-agent/src/instance.rs b/sled-agent/src/instance.rs index 071c70a4975..030f068e967 100644 --- a/sled-agent/src/instance.rs +++ b/sled-agent/src/instance.rs @@ -1733,14 +1733,10 @@ mod tests { let dropshot_log = log.new(o!("component" => "dropshot")); let mock_api = propolis_mock_server::api(); - let srv = dropshot::HttpServerStarter::new( - &dropshot_config, - mock_api, - private, - &dropshot_log, - ) - .expect("couldn't create mock propolis-server") - .start(); + let srv = dropshot::ServerBuilder::new(mock_api, private, dropshot_log) + .config(dropshot_config) + .start() + .expect("couldn't create mock propolis-server"); let client = propolis_client::Client::new(&format!( "http://{}", diff --git a/sled-agent/src/server.rs b/sled-agent/src/server.rs index b8deb2f1cb6..322a44e1606 100644 --- a/sled-agent/src/server.rs +++ b/sled-agent/src/server.rs @@ -70,14 +70,11 @@ impl Server { ..config.dropshot.clone() }; let dropshot_log = log.new(o!("component" => "dropshot (SledAgent)")); - let http_server = dropshot::HttpServerStarter::new( - &dropshot_config, - http_api(), - sled_agent, - &dropshot_log, - ) - .map_err(|error| format!("initializing server: {}", error))? - .start(); + let http_server = + dropshot::ServerBuilder::new(http_api(), sled_agent, dropshot_log) + .config(dropshot_config) + .start() + .map_err(|error| format!("initializing server: {}", error))?; Ok(Server { http_server }) } diff --git a/sled-agent/src/sim/server.rs b/sled-agent/src/sim/server.rs index 03efa563692..09fe1ab2751 100644 --- a/sled-agent/src/sim/server.rs +++ b/sled-agent/src/sim/server.rs @@ -98,14 +98,14 @@ impl Server { .await; let dropshot_log = log.new(o!("component" => "dropshot")); - let http_server = dropshot::HttpServerStarter::new( - &config.dropshot, + let http_server = dropshot::ServerBuilder::new( http_api(), sled_agent.clone(), - &dropshot_log, + dropshot_log, ) - .map_err(|error| anyhow!("initializing server: {}", error))? - .start(); + .config(config.dropshot.clone()) + .start() + .map_err(|error| anyhow!("initializing server: {}", error))?; // Notify the control plane that we're up, and continue trying this // until it succeeds. We retry with an randomized, capped exponential diff --git a/sled-agent/src/sim/sled_agent.rs b/sled-agent/src/sim/sled_agent.rs index 1acaff44db5..335181a2272 100644 --- a/sled-agent/src/sim/sled_agent.rs +++ b/sled-agent/src/sim/sled_agent.rs @@ -796,16 +796,15 @@ impl SledAgent { let dropshot_log = log.new(o!("component" => "dropshot")); let mock_api = propolis_mock_server::api(); - let srv = dropshot::HttpServerStarter::new( - &dropshot_config, - mock_api, - private, - &dropshot_log, - ) - .map_err(|error| { - Error::unavail(&format!("initializing propolis-server: {}", error)) - })? - .start(); + let srv = dropshot::ServerBuilder::new(mock_api, private, dropshot_log) + .config(dropshot_config) + .start() + .map_err(|error| { + Error::unavail(&format!( + "initializing propolis-server: {}", + error + )) + })?; let addr = srv.local_addr(); let client = propolis_client::Client::new(&format!("http://{}", addr)); *mock_lock = Some((srv, client)); diff --git a/sled-agent/src/sim/storage.rs b/sled-agent/src/sim/storage.rs index 5bbafa2ac38..51e6d2cb065 100644 --- a/sled-agent/src/sim/storage.rs +++ b/sled-agent/src/sim/storage.rs @@ -784,14 +784,14 @@ impl CrucibleServer { }; let dropshot_log = log .new(o!("component" => "Simulated CrucibleAgent Dropshot Server")); - let server = dropshot::HttpServerStarter::new( - &config, + let server = dropshot::ServerBuilder::new( super::http_entrypoints_storage::api(), data.clone(), - &dropshot_log, + dropshot_log, ) - .expect("Could not initialize server") - .start(); + .config(config) + .start() + .expect("Could not initialize server"); info!(&log, "Created Simulated Crucible Server"; "address" => server.local_addr()); CrucibleServer { server, data } @@ -1348,21 +1348,21 @@ impl PantryServer { ) -> Self { let pantry = Arc::new(Pantry::new(sled_agent)); - let server = dropshot::HttpServerStarter::new( - &dropshot::ConfigDropshot { - bind_address: SocketAddr::new(ip, 0), - // This has to be large enough to support: - // - bulk writes into disks - request_body_max_bytes: 8192 * 1024, - default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], - }, + let server = dropshot::ServerBuilder::new( super::http_entrypoints_pantry::api(), pantry.clone(), - &log.new(o!("component" => "dropshot")), + log.new(o!("component" => "dropshot")), ) - .expect("Could not initialize pantry server") - .start(); + .config(dropshot::ConfigDropshot { + bind_address: SocketAddr::new(ip, 0), + // This has to be large enough to support: + // - bulk writes into disks + request_body_max_bytes: 8192 * 1024, + default_handler_task_mode: HandlerTaskMode::Detached, + log_headers: vec![], + }) + .start() + .expect("Could not initialize pantry server"); info!(&log, "Started Simulated Crucible Pantry"; "address" => server.local_addr()); diff --git a/wicketd/src/lib.rs b/wicketd/src/lib.rs index 430b94985f8..9056a203b85 100644 --- a/wicketd/src/lib.rs +++ b/wicketd/src/lib.rs @@ -184,8 +184,7 @@ impl Server { let wicketd_server = { let ds_log = log.new(o!("component" => "dropshot (wicketd)")); let mgs_client = make_mgs_client(log.clone(), args.mgs_address); - dropshot::HttpServerStarter::new( - &dropshot_config, + dropshot::ServerBuilder::new( http_entrypoints::api(), ServerContext { bind_address: args.address, @@ -200,10 +199,11 @@ impl Server { preflight_checker: PreflightCheckerHandler::new(&log), internal_dns_resolver, }, - &ds_log, + ds_log, ) - .map_err(|err| anyhow!(err).context("initializing http server"))? + .config(dropshot_config) .start() + .map_err(|err| anyhow!(err).context("initializing http server"))? }; let installinator_server = { @@ -215,21 +215,21 @@ impl Server { WicketdInstallinatorApiImpl, >()?; - dropshot::HttpServerStarter::new( - &installinator_config, + dropshot::ServerBuilder::new( api_description, WicketdInstallinatorContext::new( &log, store.clone(), ipr_artifact, ), - &log, + log, ) + .config(installinator_config) + .start() .map_err(|err| { anyhow!(err) .context("failed to create installinator artifact server") })? - .start() }; Ok(Self { From c7c0f3e32b69febe6a712983b3aa9b91387dbabd Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Tue, 12 Nov 2024 16:51:42 -0800 Subject: [PATCH 02/14] test build for dropshot + API versioning --- Cargo.lock | 22 +++++++------ Cargo.toml | 6 ++-- dev-tools/openapi-manager/Cargo.toml | 1 + dev-tools/openapi-manager/src/spec.rs | 31 ++++++++++--------- internal-dns/resolver/Cargo.toml | 1 + internal-dns/resolver/src/resolver.rs | 2 +- nexus/external-api/src/lib.rs | 2 +- openapi/nexus.json | 2 +- oximeter/collector/Cargo.toml | 1 + oximeter/collector/src/bin/oximeter.rs | 2 +- sled-agent/Cargo.toml | 1 + sled-agent/src/sim/http_entrypoints_pantry.rs | 5 ++- 12 files changed, 43 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 637465ebd83..ddc2ce4dd5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2511,9 +2511,7 @@ dependencies = [ [[package]] name = "dropshot" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab804b8d4ab58d96e1e19c8ef87e1747a70d2819e92b659d6fe8d5ac5ac44d50" +version = "0.12.1" dependencies = [ "async-stream", "async-trait", @@ -2539,6 +2537,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "schemars", "scopeguard", + "semver 1.0.23", "serde", "serde_json", "serde_path_to_error", @@ -2549,6 +2548,7 @@ dependencies = [ "slog-bunyan", "slog-json", "slog-term", + "thiserror", "tokio", "tokio-rustls 0.25.0", "toml 0.8.19", @@ -2560,13 +2560,12 @@ dependencies = [ [[package]] name = "dropshot_endpoint" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796be76b11b79de0decd7be2105add01220f8bbe04cf1f83214c0b801414a722" +version = "0.12.1" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", + "semver 1.0.23", "serde", "serde_tokenstream", "syn 2.0.87", @@ -4008,9 +4007,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -4616,6 +4615,7 @@ dependencies = [ "progenitor", "qorb", "reqwest", + "semver 1.0.23", "serde", "serde_json", "sled", @@ -7396,6 +7396,7 @@ dependencies = [ "owo-colors", "oximeter-api", "repo-depot-api", + "semver 1.0.23", "serde_json", "similar", "sled-agent-api", @@ -7656,6 +7657,7 @@ dependencies = [ "rand", "reqwest", "schemars", + "semver 1.0.23", "serde", "serde_json", "slog", @@ -12458,9 +12460,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", diff --git a/Cargo.toml b/Cargo.toml index 522acee6ac2..2b86b354ef3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -354,7 +354,7 @@ dns-server = { path = "dns-server" } dns-server-api = { path = "dns-server-api" } dns-service-client = { path = "clients/dns-service-client" } dpd-client = { path = "clients/dpd-client" } -dropshot = { version = "0.12.0", features = [ "usdt-probes" ] } +dropshot = { version = "0.12.1", features = [ "usdt-probes" ] } dyn-clone = "1.0.17" either = "1.13.0" expectorate = "1.1.0" @@ -809,8 +809,8 @@ opt-level = 3 # It's common during development to use a local copy of various complex # dependencies. If you want to use those, uncomment one of these blocks. # -#[patch."https://github.com/oxidecomputer/dropshot"] -#dropshot = { path = "../dropshot/dropshot" } +[patch."crates-io"] +dropshot = { path = "../dropshot-api-versioning/dropshot" } #[patch.crates-io] #steno = { path = "../steno" } # [patch."https://github.com/oxidecomputer/propolis"] diff --git a/dev-tools/openapi-manager/Cargo.toml b/dev-tools/openapi-manager/Cargo.toml index d32477caf32..526d8c3a7ed 100644 --- a/dev-tools/openapi-manager/Cargo.toml +++ b/dev-tools/openapi-manager/Cargo.toml @@ -30,6 +30,7 @@ openapiv3.workspace = true owo-colors.workspace = true oximeter-api.workspace = true repo-depot-api.workspace = true +semver.workspace = true serde_json.workspace = true similar.workspace = true sled-agent-api.workspace = true diff --git a/dev-tools/openapi-manager/src/spec.rs b/dev-tools/openapi-manager/src/spec.rs index ff55bbeff58..81ff54f4099 100644 --- a/dev-tools/openapi-manager/src/spec.rs +++ b/dev-tools/openapi-manager/src/spec.rs @@ -18,7 +18,7 @@ pub fn all_apis() -> Vec { vec![ ApiSpec { title: "Bootstrap Agent API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "Per-sled API for setup and teardown", boundary: ApiBoundary::Internal, api_description: @@ -28,7 +28,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "ClickHouse Cluster Admin Keeper API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with the Oxide \ control plane's ClickHouse cluster keepers", boundary: ApiBoundary::Internal, @@ -39,7 +39,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "ClickHouse Cluster Admin Server API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with the Oxide \ control plane's ClickHouse cluster replica servers", boundary: ApiBoundary::Internal, @@ -50,7 +50,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "CockroachDB Cluster Admin API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with the Oxide \ control plane's CockroachDB cluster", boundary: ApiBoundary::Internal, @@ -61,7 +61,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide Management Gateway Service API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with the Oxide \ control plane's gateway service", boundary: ApiBoundary::Internal, @@ -72,7 +72,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Internal DNS", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for the internal DNS server", boundary: ApiBoundary::Internal, api_description: @@ -82,7 +82,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Installinator API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for installinator to fetch artifacts \ and report progress", boundary: ApiBoundary::Internal, @@ -93,7 +93,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide Region API", - version: "20241204.0", + version: semver::Version::new(20241204, 0, 0), description: "API for interacting with the Oxide control plane", boundary: ApiBoundary::External, api_description: @@ -103,7 +103,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Nexus internal API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "Nexus internal API", boundary: ApiBoundary::Internal, api_description: @@ -113,7 +113,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide Oximeter API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with oximeter", boundary: ApiBoundary::Internal, api_description: @@ -123,7 +123,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide TUF Repo Depot API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for fetching update artifacts", boundary: ApiBoundary::Internal, api_description: repo_depot_api::repo_depot_api_mod::stub_api_description, @@ -132,7 +132,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide Sled Agent API", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for interacting with individual sleds", boundary: ApiBoundary::Internal, api_description: @@ -142,7 +142,7 @@ pub fn all_apis() -> Vec { }, ApiSpec { title: "Oxide Technician Port Control Service", - version: "0.0.1", + version: semver::Version::new(0, 0, 1), description: "API for use by the technician port TUI: wicket", boundary: ApiBoundary::Internal, api_description: wicketd_api::wicketd_api_mod::stub_api_description, @@ -158,7 +158,7 @@ pub struct ApiSpec { pub title: &'static str, /// The version. - pub version: &'static str, + pub version: semver::Version, /// The description string. pub description: &'static str, @@ -251,7 +251,8 @@ impl ApiSpec { // impl formats the errors appropriately. anyhow::anyhow!("{}", error) })?; - let mut openapi_def = description.openapi(&self.title, &self.version); + let mut openapi_def = + description.openapi(&self.title, self.version.clone()); openapi_def .description(&self.description) .contact_url("https://oxide.computer") diff --git a/internal-dns/resolver/Cargo.toml b/internal-dns/resolver/Cargo.toml index 7c89fe41c4f..e4de05d5c9f 100644 --- a/internal-dns/resolver/Cargo.toml +++ b/internal-dns/resolver/Cargo.toml @@ -28,6 +28,7 @@ expectorate.workspace = true omicron-test-utils.workspace = true omicron-uuid-kinds.workspace = true progenitor.workspace = true +semver.workspace = true serde = { workspace = true, features = ["derive"] } serde_json.workspace = true sled.workspace = true diff --git a/internal-dns/resolver/src/resolver.rs b/internal-dns/resolver/src/resolver.rs index afee1181241..f2d038ad008 100644 --- a/internal-dns/resolver/src/resolver.rs +++ b/internal-dns/resolver/src/resolver.rs @@ -799,7 +799,7 @@ mod test { // Progenitor client. fn expect_openapi_json_valid_for_test_server() { let api = api(); - let openapi = api.openapi("Test Server", "v0.1.0"); + let openapi = api.openapi("Test Server", semver::Version::new(0,1,0)); let mut output = std::io::Cursor::new(Vec::new()); openapi.write(&mut output).unwrap(); expectorate::assert_contents( diff --git a/nexus/external-api/src/lib.rs b/nexus/external-api/src/lib.rs index b05366e0c56..e0102c2df1d 100644 --- a/nexus/external-api/src/lib.rs +++ b/nexus/external-api/src/lib.rs @@ -23,7 +23,7 @@ use omicron_common::api::external::{ use openapi_manager_types::ValidationContext; use openapiv3::OpenAPI; -pub const API_VERSION: &str = "20241204.0"; +pub const API_VERSION: &str = "20241204.0.0"; // API ENDPOINT FUNCTION NAMING CONVENTIONS // diff --git a/openapi/nexus.json b/openapi/nexus.json index f12ff4730cf..4eb7694296d 100644 --- a/openapi/nexus.json +++ b/openapi/nexus.json @@ -7,7 +7,7 @@ "url": "https://oxide.computer", "email": "api@oxide.computer" }, - "version": "20241204.0" + "version": "20241204.0.0" }, "paths": { "/device/auth": { diff --git a/oximeter/collector/Cargo.toml b/oximeter/collector/Cargo.toml index 334b091770a..87c82d1183d 100644 --- a/oximeter/collector/Cargo.toml +++ b/oximeter/collector/Cargo.toml @@ -28,6 +28,7 @@ qorb.workspace = true rand.workspace = true reqwest = { workspace = true, features = [ "json" ] } schemars.workspace = true +semver.workspace = true serde.workspace = true slog.workspace = true slog-async.workspace = true diff --git a/oximeter/collector/src/bin/oximeter.rs b/oximeter/collector/src/bin/oximeter.rs index efbc53cacee..16be3b69e22 100644 --- a/oximeter/collector/src/bin/oximeter.rs +++ b/oximeter/collector/src/bin/oximeter.rs @@ -24,7 +24,7 @@ use uuid::Uuid; pub fn run_standalone_openapi() -> Result<(), String> { standalone_nexus_api() - .openapi("Oxide Nexus API", "0.0.1") + .openapi("Oxide Nexus API", semver::Version::new(0, 0, 1)) .description("API for interacting with Nexus") .contact_url("https://oxide.computer") .contact_email("api@oxide.computer") diff --git a/sled-agent/Cargo.toml b/sled-agent/Cargo.toml index 557dcbcb4ed..442ddef7e19 100644 --- a/sled-agent/Cargo.toml +++ b/sled-agent/Cargo.toml @@ -115,6 +115,7 @@ omicron-test-utils.workspace = true pretty_assertions.workspace = true rcgen.workspace = true reqwest = { workspace = true, features = ["blocking"] } +semver.workspace = true subprocess.workspace = true slog-async.workspace = true slog-term.workspace = true diff --git a/sled-agent/src/sim/http_entrypoints_pantry.rs b/sled-agent/src/sim/http_entrypoints_pantry.rs index 0348cc30997..c98c7db665a 100644 --- a/sled-agent/src/sim/http_entrypoints_pantry.rs +++ b/sled-agent/src/sim/http_entrypoints_pantry.rs @@ -421,7 +421,10 @@ mod tests { let Value::String(ref version) = real_api["info"]["version"] else { unreachable!(); }; - let sim_api = super::api().openapi(title, version).json().unwrap(); + let sim_api = super::api() + .openapi(title, version.parse().unwrap()) + .json() + .unwrap(); // We'll assert that anything which apppears in the simulated API must // appear exactly as-is in the real API. I.e., the simulated is a subset From fe3331e2750c654dd22614c1235ee6a49bb0862a Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Tue, 12 Nov 2024 16:52:26 -0800 Subject: [PATCH 03/14] rustfmt --- internal-dns/resolver/src/resolver.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal-dns/resolver/src/resolver.rs b/internal-dns/resolver/src/resolver.rs index f2d038ad008..607588270d5 100644 --- a/internal-dns/resolver/src/resolver.rs +++ b/internal-dns/resolver/src/resolver.rs @@ -799,7 +799,7 @@ mod test { // Progenitor client. fn expect_openapi_json_valid_for_test_server() { let api = api(); - let openapi = api.openapi("Test Server", semver::Version::new(0,1,0)); + let openapi = api.openapi("Test Server", semver::Version::new(0, 1, 0)); let mut output = std::io::Cursor::new(Vec::new()); openapi.write(&mut output).unwrap(); expectorate::assert_contents( From 3a17ac303ef178f80da3ebbfe318ea336a5f61ac Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Tue, 12 Nov 2024 18:33:28 -0800 Subject: [PATCH 04/14] fix expectorate --- internal-dns/resolver/tests/output/test-server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal-dns/resolver/tests/output/test-server.json b/internal-dns/resolver/tests/output/test-server.json index 5ed5d371612..0c17af69eee 100644 --- a/internal-dns/resolver/tests/output/test-server.json +++ b/internal-dns/resolver/tests/output/test-server.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "Test Server", - "version": "v0.1.0" + "version": "0.1.0" }, "paths": { "/test": { From fd95b560a8d991208798939800abedfb291bcc62 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Tue, 12 Nov 2024 18:51:03 -0800 Subject: [PATCH 05/14] fix test failure in integration_tests::updates::test_update_uninitialized --- nexus/test-utils/src/http_testing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/nexus/test-utils/src/http_testing.rs b/nexus/test-utils/src/http_testing.rs index 02fb87d74de..afa0a8af034 100644 --- a/nexus/test-utils/src/http_testing.rs +++ b/nexus/test-utils/src/http_testing.rs @@ -89,6 +89,7 @@ impl<'a> RequestBuilder<'a> { body: dropshot::Body::empty(), expected_status: None, allowed_headers: Some(vec![ + http::header::CONNECTION, http::header::CONTENT_ENCODING, http::header::CONTENT_LENGTH, http::header::CONTENT_TYPE, From c4e728189e6afd507a5fe313a9412cb2677d4636 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 09:46:24 -0800 Subject: [PATCH 06/14] minimum changes for Dropshot v0.13.0 --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2b86b354ef3..823b862424c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -354,7 +354,7 @@ dns-server = { path = "dns-server" } dns-server-api = { path = "dns-server-api" } dns-service-client = { path = "clients/dns-service-client" } dpd-client = { path = "clients/dpd-client" } -dropshot = { version = "0.12.1", features = [ "usdt-probes" ] } +dropshot = { version = "0.13.0", features = [ "usdt-probes" ] } dyn-clone = "1.0.17" either = "1.13.0" expectorate = "1.1.0" @@ -809,8 +809,8 @@ opt-level = 3 # It's common during development to use a local copy of various complex # dependencies. If you want to use those, uncomment one of these blocks. # -[patch."crates-io"] -dropshot = { path = "../dropshot-api-versioning/dropshot" } +#[patch."crates-io"] +#dropshot = { path = "../dropshot/dropshot" } #[patch.crates-io] #steno = { path = "../steno" } # [patch."https://github.com/oxidecomputer/propolis"] From 6806e0b34fefef72f3be56e77c4b60b9e5a88101 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 10:32:29 -0800 Subject: [PATCH 07/14] avoid tight coupling with propolis Dropshot version --- Cargo.lock | 15 ++++++++++++--- Cargo.toml | 2 +- sled-agent/src/instance.rs | 22 ++++++---------------- sled-agent/src/sim/sled_agent.rs | 30 +++++++++++------------------- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 637465ebd83..d0496a49cbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#364413d21aa83a8427c317bbb3ad9733a1e2b97b" dependencies = [ "anyhow", "atty", @@ -8818,7 +8818,7 @@ dependencies = [ "futures", "hyper", "progenitor", - "propolis_types", + "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix)", "rand", "reqwest", "schemars", @@ -8853,13 +8853,22 @@ version = "0.0.0" source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" dependencies = [ "crucible-client-types", - "propolis_types", + "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656)", "schemars", "serde", "thiserror", "uuid", ] +[[package]] +name = "propolis_types" +version = "0.0.0" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#364413d21aa83a8427c317bbb3ad9733a1e2b97b" +dependencies = [ + "schemars", + "serde", +] + [[package]] name = "propolis_types" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index 522acee6ac2..fa7c9bff6fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -523,7 +523,7 @@ progenitor-client = "0.8.0" bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", branch = "dap/mock-server-fix" } proptest = "1.5.0" qorb = "0.2.0" quote = "1.0" diff --git a/sled-agent/src/instance.rs b/sled-agent/src/instance.rs index 4883918c369..f195e00ced1 100644 --- a/sled-agent/src/instance.rs +++ b/sled-agent/src/instance.rs @@ -2102,29 +2102,19 @@ mod tests { // TODO: factor out, this is also in sled-agent-sim. fn propolis_mock_server( log: &Logger, - ) -> (HttpServer>, PropolisClient) { + ) -> (propolis_mock_server::Server, PropolisClient) { let propolis_bind_address = SocketAddr::new(Ipv6Addr::LOCALHOST.into(), 0); // allocate port - let dropshot_config = dropshot::ConfigDropshot { + let dropshot_config = propolis_mock_server::Config { bind_address: propolis_bind_address, ..Default::default() }; - let propolis_log = log.new(o!("component" => "propolis-server-mock")); - let private = - Arc::new(propolis_mock_server::Context::new(propolis_log)); info!(log, "Starting mock propolis-server..."); - let dropshot_log = log.new(o!("component" => "dropshot")); - let mock_api = propolis_mock_server::api(); - - let srv = dropshot::HttpServerStarter::new( - &dropshot_config, - mock_api, - private, - &dropshot_log, - ) - .expect("couldn't create mock propolis-server") - .start(); + let srv = propolis_mock_server::start(dropshot_config, log.clone()) + .await + .expect("couldn't create mock propolis-server") + .start(); let client = propolis_client::Client::new(&format!( "http://{}", srv.local_addr() diff --git a/sled-agent/src/sim/sled_agent.rs b/sled-agent/src/sim/sled_agent.rs index aef4128c52b..cf3d75a785e 100644 --- a/sled-agent/src/sim/sled_agent.rs +++ b/sled-agent/src/sim/sled_agent.rs @@ -17,7 +17,7 @@ use crate::sim::simulatable::Simulatable; use crate::updates::UpdateManager; use anyhow::bail; use anyhow::Context; -use dropshot::{HttpError, HttpServer}; +use dropshot::HttpError; use futures::lock::Mutex; use nexus_sled_agent_shared::inventory::{ Inventory, InventoryDataset, InventoryDisk, InventoryZpool, @@ -43,7 +43,6 @@ use oxnet::Ipv6Net; use propolis_client::{ types::VolumeConstructionRequest, Client as PropolisClient, }; -use propolis_mock_server::Context as PropolisContext; use sled_agent_types::disk::DiskStateRequested; use sled_agent_types::early_networking::{ EarlyNetworkConfig, EarlyNetworkConfigBody, @@ -81,7 +80,7 @@ pub struct SledAgent { disk_id_to_region_ids: Mutex>>, pub v2p_mappings: Mutex>, mock_propolis: - Mutex>, PropolisClient)>>, + Mutex>, /// lists of external IPs assigned to instances pub external_ips: Mutex>>, @@ -797,26 +796,19 @@ impl SledAgent { } let propolis_bind_address = SocketAddr::new(Ipv6Addr::LOCALHOST.into(), 0); - let dropshot_config = dropshot::ConfigDropshot { + let dropshot_config = propolis_mock_server::Config { bind_address: propolis_bind_address, ..Default::default() }; - let propolis_log = log.new(o!("component" => "propolis-server-mock")); - let private = Arc::new(PropolisContext::new(propolis_log)); info!(log, "Starting mock propolis-server..."); - let dropshot_log = log.new(o!("component" => "dropshot")); - let mock_api = propolis_mock_server::api(); - - let srv = dropshot::HttpServerStarter::new( - &dropshot_config, - mock_api, - private, - &dropshot_log, - ) - .map_err(|error| { - Error::unavail(&format!("initializing propolis-server: {}", error)) - })? - .start(); + let srv = propolis_mock_server::start(dropshot_config, log.clone()) + .await + .map_err(|error| { + Error::unavail(&format!( + "initializing propolis-server: {}", + error + )) + })?; let addr = srv.local_addr(); let client = propolis_client::Client::new(&format!("http://{}", addr)); *mock_lock = Some((srv, client)); From 97d7d4d2c0eed648a1d9aedab961a58dbf77c9b9 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 10:39:20 -0800 Subject: [PATCH 08/14] does not need to be async --- Cargo.lock | 4 ++-- sled-agent/src/instance.rs | 4 +--- sled-agent/src/sim/sled_agent.rs | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d0496a49cbb..e87015b8604 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#364413d21aa83a8427c317bbb3ad9733a1e2b97b" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#fea74a6e5a083dfb2d62245e9b01af3e192a091c" dependencies = [ "anyhow", "atty", @@ -8863,7 +8863,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#364413d21aa83a8427c317bbb3ad9733a1e2b97b" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#fea74a6e5a083dfb2d62245e9b01af3e192a091c" dependencies = [ "schemars", "serde", diff --git a/sled-agent/src/instance.rs b/sled-agent/src/instance.rs index f195e00ced1..63c363985ac 100644 --- a/sled-agent/src/instance.rs +++ b/sled-agent/src/instance.rs @@ -2112,9 +2112,7 @@ mod tests { info!(log, "Starting mock propolis-server..."); let srv = propolis_mock_server::start(dropshot_config, log.clone()) - .await - .expect("couldn't create mock propolis-server") - .start(); + .expect("couldn't create mock propolis-server"); let client = propolis_client::Client::new(&format!( "http://{}", srv.local_addr() diff --git a/sled-agent/src/sim/sled_agent.rs b/sled-agent/src/sim/sled_agent.rs index cf3d75a785e..5a482f3196a 100644 --- a/sled-agent/src/sim/sled_agent.rs +++ b/sled-agent/src/sim/sled_agent.rs @@ -802,7 +802,6 @@ impl SledAgent { }; info!(log, "Starting mock propolis-server..."); let srv = propolis_mock_server::start(dropshot_config, log.clone()) - .await .map_err(|error| { Error::unavail(&format!( "initializing propolis-server: {}", From 3da800b39529e7ce7988cdec3faca49509c4caab Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 10:43:49 -0800 Subject: [PATCH 09/14] update dep --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e87015b8604..7fcd490a713 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#fea74a6e5a083dfb2d62245e9b01af3e192a091c" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#c753e479ddb9111af5223638e64ee9873c179bc9" dependencies = [ "anyhow", "atty", @@ -8863,7 +8863,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#fea74a6e5a083dfb2d62245e9b01af3e192a091c" +source = "git+https://github.com/oxidecomputer/propolis?branch=dap/mock-server-fix#c753e479ddb9111af5223638e64ee9873c179bc9" dependencies = [ "schemars", "serde", From 294caf7495bda0183a32aa06435735af66b64e0a Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 10:49:35 -0800 Subject: [PATCH 10/14] update Cargo.lock --- Cargo.lock | 171 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 119 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ddc2ce4dd5e..3a4b2ff91e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,7 +906,7 @@ dependencies = [ name = "bootstrap-agent-api" version = "0.1.0" dependencies = [ - "dropshot", + "dropshot 0.13.0", "omicron-common", "omicron-uuid-kinds", "omicron-workspace-hack", @@ -1170,7 +1170,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot", + "dropshot 0.13.0", "futures", "libc", "omicron-common", @@ -1337,7 +1337,7 @@ name = "clickhouse-admin-api" version = "0.1.0" dependencies = [ "clickhouse-admin-types", - "dropshot", + "dropshot 0.13.0", "omicron-common", "omicron-uuid-kinds", "omicron-workspace-hack", @@ -1442,7 +1442,7 @@ name = "cockroach-admin-api" version = "0.1.0" dependencies = [ "cockroach-admin-types", - "dropshot", + "dropshot 0.13.0", "omicron-common", "omicron-uuid-kinds", "omicron-workspace-hack", @@ -1667,7 +1667,7 @@ name = "crdb-seed" version = "0.1.0" dependencies = [ "anyhow", - "dropshot", + "dropshot 0.13.0", "omicron-test-utils", "omicron-workspace-hack", "slog", @@ -1816,7 +1816,7 @@ dependencies = [ "anyhow", "atty", "crucible-workspace-hack", - "dropshot", + "dropshot 0.12.0", "nix 0.29.0", "rusqlite", "rustls-pemfile 1.0.4", @@ -2400,7 +2400,7 @@ dependencies = [ "clap", "dns-server-api", "dns-service-client", - "dropshot", + "dropshot 0.13.0", "expectorate", "hickory-client", "hickory-proto", @@ -2435,7 +2435,7 @@ name = "dns-server-api" version = "0.1.0" dependencies = [ "chrono", - "dropshot", + "dropshot 0.13.0", "internal-dns-types", "omicron-workspace-hack", "schemars", @@ -2511,7 +2511,58 @@ dependencies = [ [[package]] name = "dropshot" -version = "0.12.1" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab804b8d4ab58d96e1e19c8ef87e1747a70d2819e92b659d6fe8d5ac5ac44d50" +dependencies = [ + "async-stream", + "async-trait", + "base64 0.22.1", + "bytes", + "camino", + "chrono", + "debug-ignore", + "dropshot_endpoint 0.12.0", + "form_urlencoded", + "futures", + "hostname 0.4.0", + "http", + "http-body-util", + "hyper", + "hyper-util", + "indexmap 2.6.0", + "multer", + "openapiv3", + "paste", + "percent-encoding", + "rustls 0.22.4", + "rustls-pemfile 2.2.0", + "schemars", + "scopeguard", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "slog", + "slog-async", + "slog-bunyan", + "slog-json", + "slog-term", + "tokio", + "tokio-rustls 0.25.0", + "toml 0.8.19", + "usdt", + "uuid", + "version_check", + "waitgroup", +] + +[[package]] +name = "dropshot" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50976b6bac0894e689bb8ce0e2e5892dfeedb0876408bc806f0582d81824a3b5" dependencies = [ "async-stream", "async-trait", @@ -2520,7 +2571,7 @@ dependencies = [ "camino", "chrono", "debug-ignore", - "dropshot_endpoint", + "dropshot_endpoint 0.13.0", "form_urlencoded", "futures", "hostname 0.4.0", @@ -2560,7 +2611,23 @@ dependencies = [ [[package]] name = "dropshot_endpoint" -version = "0.12.1" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796be76b11b79de0decd7be2105add01220f8bbe04cf1f83214c0b801414a722" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "serde", + "serde_tokenstream", + "syn 2.0.87", +] + +[[package]] +name = "dropshot_endpoint" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8371ca3d0ecdd13df8a00acb66312633fc66a5e412076ccbc414238536f8290" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3231,7 +3298,7 @@ dependencies = [ name = "gateway-api" version = "0.1.0" dependencies = [ - "dropshot", + "dropshot 0.13.0", "gateway-types", "omicron-common", "omicron-uuid-kinds", @@ -3336,7 +3403,7 @@ name = "gateway-test-utils" version = "0.1.0" dependencies = [ "camino", - "dropshot", + "dropshot 0.13.0", "gateway-messages", "gateway-types", "omicron-gateway", @@ -4353,7 +4420,7 @@ dependencies = [ "camino-tempfile", "cfg-if", "crucible-smf", - "dropshot", + "dropshot 0.13.0", "futures", "http", "ipnetwork", @@ -4520,7 +4587,7 @@ name = "installinator-api" version = "0.1.0" dependencies = [ "anyhow", - "dropshot", + "dropshot 0.13.0", "hyper", "installinator-common", "omicron-common", @@ -4585,7 +4652,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot", + "dropshot 0.13.0", "hickory-resolver", "internal-dns-resolver", "internal-dns-types", @@ -4603,7 +4670,7 @@ dependencies = [ "assert_matches", "dns-server", "dns-service-client", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "hickory-resolver", @@ -5519,7 +5586,7 @@ dependencies = [ "base64 0.22.1", "chrono", "cookie", - "dropshot", + "dropshot 0.13.0", "futures", "headers", "http", @@ -5576,7 +5643,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "dropshot", + "dropshot 0.13.0", "expectorate", "libc", "omicron-common", @@ -5669,7 +5736,7 @@ dependencies = [ "db-macros", "diesel", "diesel-dtrace", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "gateway-client", @@ -5752,7 +5819,7 @@ name = "nexus-external-api" version = "0.1.0" dependencies = [ "anyhow", - "dropshot", + "dropshot 0.13.0", "http", "hyper", "ipnetwork", @@ -5769,7 +5836,7 @@ dependencies = [ name = "nexus-internal-api" version = "0.1.0" dependencies = [ - "dropshot", + "dropshot 0.13.0", "nexus-types", "omicron-common", "omicron-uuid-kinds", @@ -6038,7 +6105,7 @@ dependencies = [ "crucible-agent-client", "dns-server", "dns-service-client", - "dropshot", + "dropshot 0.13.0", "futures", "gateway-messages", "gateway-test-utils", @@ -6099,7 +6166,7 @@ dependencies = [ "cookie", "derive-where", "derive_more", - "dropshot", + "dropshot 0.13.0", "futures", "gateway-client", "http", @@ -6440,7 +6507,7 @@ dependencies = [ "clickhouse-admin-api", "clickhouse-admin-types", "clickward", - "dropshot", + "dropshot 0.13.0", "expectorate", "http", "illumos-utils", @@ -6479,7 +6546,7 @@ dependencies = [ "cockroach-admin-api", "cockroach-admin-types", "csv", - "dropshot", + "dropshot 0.13.0", "expectorate", "http", "illumos-utils", @@ -6521,7 +6588,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "hex", @@ -6581,7 +6648,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "libc", @@ -6621,7 +6688,7 @@ dependencies = [ "camino", "chrono", "clap", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "gateway-api", @@ -6665,7 +6732,7 @@ version = "0.1.0" dependencies = [ "anyhow", "assert_matches", - "dropshot", + "dropshot 0.13.0", "futures", "internal-dns-resolver", "internal-dns-types", @@ -6740,7 +6807,7 @@ dependencies = [ "dns-server", "dns-service-client", "dpd-client", - "dropshot", + "dropshot 0.13.0", "expectorate", "fatfs", "futures", @@ -6868,7 +6935,7 @@ dependencies = [ "crucible-agent-client", "csv", "diesel", - "dropshot", + "dropshot 0.13.0", "dyn-clone", "expectorate", "futures", @@ -7035,7 +7102,7 @@ dependencies = [ "dns-server", "dns-service-client", "dpd-client", - "dropshot", + "dropshot 0.13.0", "expectorate", "flate2", "flume", @@ -7129,7 +7196,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "dropshot", + "dropshot 0.13.0", "expectorate", "filetime", "futures", @@ -7202,7 +7269,7 @@ dependencies = [ "curve25519-dalek", "digest", "dof", - "dropshot", + "dropshot 0.12.0", "ecdsa", "ed25519-dalek", "either", @@ -7382,7 +7449,7 @@ dependencies = [ "clickhouse-admin-api", "cockroach-admin-api", "dns-server-api", - "dropshot", + "dropshot 0.13.0", "fs-err", "gateway-api", "indent_write", @@ -7604,7 +7671,7 @@ name = "oximeter-api" version = "0.1.0" dependencies = [ "chrono", - "dropshot", + "dropshot 0.13.0", "omicron-common", "omicron-workspace-hack", "schemars", @@ -7636,7 +7703,7 @@ dependencies = [ "camino", "chrono", "clap", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "httpmock", @@ -7692,7 +7759,7 @@ dependencies = [ "crossterm", "debug-ignore", "display-error-chain", - "dropshot", + "dropshot 0.13.0", "expectorate", "futures", "gethostname", @@ -7742,7 +7809,7 @@ version = "0.1.0" dependencies = [ "cfg-if", "chrono", - "dropshot", + "dropshot 0.13.0", "futures", "http", "hyper", @@ -7778,7 +7845,7 @@ dependencies = [ "anyhow", "chrono", "clap", - "dropshot", + "dropshot 0.13.0", "internal-dns-resolver", "internal-dns-types", "nexus-client", @@ -8816,7 +8883,7 @@ dependencies = [ "atty", "base64 0.21.7", "clap", - "dropshot", + "dropshot 0.12.0", "futures", "hyper", "progenitor", @@ -8917,7 +8984,7 @@ dependencies = [ "async-trait", "debug-ignore", "derive-where", - "dropshot", + "dropshot 0.12.0", "futures", "hickory-resolver", "rand", @@ -9153,7 +9220,7 @@ dependencies = [ "camino-tempfile", "chrono", "clap", - "dropshot", + "dropshot 0.13.0", "expectorate", "humantime", "indexmap 2.6.0", @@ -9321,7 +9388,7 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" name = "repo-depot-api" version = "0.1.0" dependencies = [ - "dropshot", + "dropshot 0.13.0", "omicron-common", "omicron-workspace-hack", "schemars", @@ -10458,7 +10525,7 @@ name = "sled-agent-api" version = "0.1.0" dependencies = [ "camino", - "dropshot", + "dropshot 0.13.0", "nexus-sled-agent-shared", "omicron-common", "omicron-uuid-kinds", @@ -10819,7 +10886,7 @@ dependencies = [ "anyhow", "async-trait", "clap", - "dropshot", + "dropshot 0.13.0", "futures", "gateway-messages", "gateway-types", @@ -12302,7 +12369,7 @@ dependencies = [ "clap", "debug-ignore", "display-error-chain", - "dropshot", + "dropshot 0.13.0", "futures", "hex", "hubtools", @@ -12778,7 +12845,7 @@ version = "0.1.0" dependencies = [ "anyhow", "dpd-client", - "dropshot", + "dropshot 0.13.0", "gateway-client", "maplit", "omicron-common", @@ -12834,7 +12901,7 @@ dependencies = [ "debug-ignore", "display-error-chain", "dpd-client", - "dropshot", + "dropshot 0.13.0", "either", "expectorate", "flate2", @@ -12903,7 +12970,7 @@ name = "wicketd-api" version = "0.1.0" dependencies = [ "bootstrap-agent-client", - "dropshot", + "dropshot 0.13.0", "gateway-client", "omicron-common", "omicron-passwords", @@ -13499,7 +13566,7 @@ dependencies = [ "anyhow", "camino", "clap", - "dropshot", + "dropshot 0.13.0", "illumos-utils", "omicron-common", "omicron-sled-agent", From 25d67e7e78431626fb01ed08ef22c2719f1bb9a0 Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 13:02:04 -0800 Subject: [PATCH 11/14] update Propolis for mock server updates --- Cargo.toml | 8 ++++---- package-manifest.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 522acee6ac2..5093ccec29a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -520,10 +520,10 @@ prettyplease = { version = "0.2.25", features = ["verbatim"] } proc-macro2 = "1.0" progenitor = "0.8.0" progenitor-client = "0.8.0" -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "aadc0998c0f07f08ab15a95c006074291734800f" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "aadc0998c0f07f08ab15a95c006074291734800f" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "aadc0998c0f07f08ab15a95c006074291734800f" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "aadc0998c0f07f08ab15a95c006074291734800f" } proptest = "1.5.0" qorb = "0.2.0" quote = "1.0" diff --git a/package-manifest.toml b/package-manifest.toml index 535f1e2150b..ae7a58394ac 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -621,10 +621,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source.commit = "aadc0998c0f07f08ab15a95c006074291734800f" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "8dd411d6f2db23f93c2340cce11aa194da8dcb8cfd20081a614a5722ffbfe255" +source.sha256 = "3cd889201aaa8cc5b916fc8f8176ab5529e2fc1d5d57165ad9a660eb48affef9" output.type = "zone" [package.mg-ddm-gz] From d94c9537f1b0a4006537f9f000522180def3121f Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 13:07:00 -0800 Subject: [PATCH 12/14] update Cargo.lock too --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 637465ebd83..1abfb1400fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -693,7 +693,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "bhyve_api_sys", "libc", @@ -703,7 +703,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "libc", "strum", @@ -6811,7 +6811,7 @@ dependencies = [ "pq-sys", "pretty_assertions", "progenitor-client", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f)", "qorb", "rand", "rcgen", @@ -7074,7 +7074,7 @@ dependencies = [ "oximeter-producer", "oxnet", "pretty_assertions", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f)", "propolis-mock-server", "propolis_api_types", "rand", @@ -8766,7 +8766,7 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "async-trait", "base64 0.21.7", @@ -8808,7 +8808,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "anyhow", "atty", @@ -8850,7 +8850,7 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "crucible-client-types", "propolis_types", @@ -8863,7 +8863,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656#86101eaf80b55e7f405b5cafe9b0de0e9f331656" +source = "git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f#aadc0998c0f07f08ab15a95c006074291734800f" dependencies = [ "schemars", "serde", @@ -10506,7 +10506,7 @@ dependencies = [ "omicron-uuid-kinds", "omicron-workspace-hack", "oxnet", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=86101eaf80b55e7f405b5cafe9b0de0e9f331656)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=aadc0998c0f07f08ab15a95c006074291734800f)", "rcgen", "schemars", "serde", From 892047b197820e58fd196768326068cc7c781e1d Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 13:14:04 -0800 Subject: [PATCH 13/14] hakari --- workspace-hack/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index f702282bca6..27bd0b559b1 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -66,7 +66,7 @@ hashbrown = { version = "0.15.0" } hex = { version = "0.4.3", features = ["serde"] } hickory-proto = { version = "0.24.1", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } -hyper = { version = "1.4.1", features = ["full"] } +hyper = { version = "1.5.0", features = ["full"] } indexmap = { version = "2.6.0", features = ["serde"] } inout = { version = "0.1.3", default-features = false, features = ["std"] } itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12.1" } @@ -130,7 +130,7 @@ unicode-bidi = { version = "0.3.17" } unicode-normalization = { version = "0.1.24" } usdt = { version = "0.5.0" } usdt-impl = { version = "0.5.0", default-features = false, features = ["asm", "des"] } -uuid = { version = "1.10.0", features = ["serde", "v4"] } +uuid = { version = "1.11.0", features = ["serde", "v4"] } x509-cert = { version = "0.2.5" } zerocopy = { version = "0.7.35", features = ["derive", "simd"] } zeroize = { version = "1.8.1", features = ["std", "zeroize_derive"] } @@ -186,7 +186,7 @@ hashbrown = { version = "0.15.0" } hex = { version = "0.4.3", features = ["serde"] } hickory-proto = { version = "0.24.1", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } -hyper = { version = "1.4.1", features = ["full"] } +hyper = { version = "1.5.0", features = ["full"] } indexmap = { version = "2.6.0", features = ["serde"] } inout = { version = "0.1.3", default-features = false, features = ["std"] } itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12.1" } @@ -253,7 +253,7 @@ unicode-normalization = { version = "0.1.24" } unicode-xid = { version = "0.2.6" } usdt = { version = "0.5.0" } usdt-impl = { version = "0.5.0", default-features = false, features = ["asm", "des"] } -uuid = { version = "1.10.0", features = ["serde", "v4"] } +uuid = { version = "1.11.0", features = ["serde", "v4"] } x509-cert = { version = "0.2.5" } zerocopy = { version = "0.7.35", features = ["derive", "simd"] } zeroize = { version = "1.8.1", features = ["std", "zeroize_derive"] } From ce04ed235aad42b2d4978b6d9ddfba714ff6202b Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Wed, 13 Nov 2024 14:01:00 -0800 Subject: [PATCH 14/14] fix up stuff that had conflicted with main --- clickhouse-admin/src/lib.rs | 27 ++++++++-------- nexus/src/lib.rs | 54 +++++++++++++++----------------- oximeter/collector/src/lib.rs | 34 ++++++++++---------- oximeter/producer/src/lib.rs | 30 +++++++----------- sled-agent/src/artifact_store.rs | 22 ++++++------- 5 files changed, 78 insertions(+), 89 deletions(-) diff --git a/clickhouse-admin/src/lib.rs b/clickhouse-admin/src/lib.rs index 1697d24adc1..76e55e1e2b0 100644 --- a/clickhouse-admin/src/lib.rs +++ b/clickhouse-admin/src/lib.rs @@ -7,7 +7,6 @@ use omicron_common::FileKv; use slog::{debug, error, Drain}; use slog_dtrace::ProbeRegistration; use slog_error_chain::SlogInlineError; -use std::error::Error; use std::io; use std::sync::Arc; @@ -28,7 +27,7 @@ pub enum StartError { #[error("failed to register dtrace probes: {0}")] RegisterDtraceProbes(String), #[error("failed to initialize HTTP server")] - InitializeHttpServer(#[source] Box), + InitializeHttpServer(#[source] dropshot::BuildError), } pub type Server = dropshot::HttpServer>; @@ -64,15 +63,15 @@ pub async fn start_server_admin_server( .with_log(log.new(slog::o!("component" => "ClickhouseCli"))), log.new(slog::o!("component" => "ServerContext")), ); - let http_server_starter = dropshot::HttpServerStarter::new( - &server_config.dropshot, + + dropshot::ServerBuilder::new( http_entrypoints::clickhouse_admin_server_api(), Arc::new(context), - &log.new(slog::o!("component" => "dropshot")), + log.new(slog::o!("component" => "dropshot")), ) - .map_err(StartError::InitializeHttpServer)?; - - Ok(http_server_starter.start()) + .config(server_config.dropshot) + .start() + .map_err(StartError::InitializeHttpServer) } /// Start the dropshot server for `clickhouse-admin-server` which @@ -106,13 +105,13 @@ pub async fn start_keeper_admin_server( .with_log(log.new(slog::o!("component" => "ClickhouseCli"))), log.new(slog::o!("component" => "ServerContext")), ); - let http_server_starter = dropshot::HttpServerStarter::new( - &server_config.dropshot, + + dropshot::ServerBuilder::new( http_entrypoints::clickhouse_admin_keeper_api(), Arc::new(context), - &log.new(slog::o!("component" => "dropshot")), + log.new(slog::o!("component" => "dropshot")), ) - .map_err(StartError::InitializeHttpServer)?; - - Ok(http_server_starter.start()) + .config(server_config.dropshot) + .start() + .map_err(StartError::InitializeHttpServer) } diff --git a/nexus/src/lib.rs b/nexus/src/lib.rs index 634873ec841..564277ad05e 100644 --- a/nexus/src/lib.rs +++ b/nexus/src/lib.rs @@ -83,12 +83,13 @@ impl InternalServer { .await?; // Launch the internal server. - let server_starter_internal = match dropshot::HttpServerStarter::new( - &config.deployment.dropshot_internal, + let http_server_internal = match dropshot::ServerBuilder::new( internal_api(), context.clone(), - &log.new(o!("component" => "dropshot_internal")), + log.new(o!("component" => "dropshot_internal")), ) + .config(config.deployment.dropshot_internal.clone()) + .start() .map_err(|error| format!("initializing internal server: {}", error)) { Ok(server) => server, @@ -97,7 +98,6 @@ impl InternalServer { return Err(err); } }; - let http_server_internal = server_starter_internal.start(); Ok(Self { apictx: context, @@ -157,32 +157,30 @@ impl Server { }; let http_server_external = { - let server_starter_external = - dropshot::HttpServerStarter::new_with_tls( - &config.deployment.dropshot_external.dropshot, - external_api(), - apictx.for_external(), - &log.new(o!("component" => "dropshot_external")), - tls_config.clone().map(dropshot::ConfigTls::Dynamic), - ) - .map_err(|error| { - format!("initializing external server: {}", error) - })?; - server_starter_external.start() + dropshot::ServerBuilder::new( + external_api(), + apictx.for_external(), + log.new(o!("component" => "dropshot_external")), + ) + .config(config.deployment.dropshot_external.dropshot.clone()) + .tls(tls_config.clone().map(dropshot::ConfigTls::Dynamic)) + .start() + .map_err(|error| { + format!("initializing external server: {}", error) + })? }; let http_server_techport_external = { - let server_starter_external_techport = - dropshot::HttpServerStarter::new_with_tls( - &techport_server_config, - external_api(), - apictx.for_techport(), - &log.new(o!("component" => "dropshot_external_techport")), - tls_config.map(dropshot::ConfigTls::Dynamic), - ) - .map_err(|error| { - format!("initializing external techport server: {}", error) - })?; - server_starter_external_techport.start() + dropshot::ServerBuilder::new( + external_api(), + apictx.for_techport(), + log.new(o!("component" => "dropshot_external_techport")), + ) + .config(techport_server_config) + .tls(tls_config.map(dropshot::ConfigTls::Dynamic)) + .start() + .map_err(|error| { + format!("initializing external techport server: {}", error) + })? }; // Start the metric producer server that oximeter uses to fetch our diff --git a/oximeter/collector/src/lib.rs b/oximeter/collector/src/lib.rs index 68fff4cbf0e..ce190e02ed4 100644 --- a/oximeter/collector/src/lib.rs +++ b/oximeter/collector/src/lib.rs @@ -10,7 +10,7 @@ use dropshot::ConfigDropshot; use dropshot::ConfigLogging; use dropshot::HttpError; use dropshot::HttpServer; -use dropshot::HttpServerStarter; +use dropshot::ServerBuilder; use internal_dns_types::names::ServiceName; use omicron_common::address::get_internal_dns_server_addresses; use omicron_common::address::DNS_PORT; @@ -311,17 +311,17 @@ impl Oximeter { .expect("Expected an infinite retry loop initializing the timeseries database"); let dropshot_log = log.new(o!("component" => "dropshot")); - let server = HttpServerStarter::new( - &ConfigDropshot { - bind_address: SocketAddr::V6(args.address), - ..Default::default() - }, + let server = ServerBuilder::new( oximeter_api(), Arc::clone(&agent), - &dropshot_log, + dropshot_log, ) - .map_err(|e| Error::Server(e.to_string()))? - .start(); + .config(ConfigDropshot { + bind_address: SocketAddr::V6(args.address), + ..Default::default() + }) + .start() + .map_err(|e| Error::Server(e.to_string()))?; // Notify Nexus that this oximeter instance is available. let our_info = nexus_client::types::OximeterInfo { @@ -422,17 +422,17 @@ impl Oximeter { ); let dropshot_log = log.new(o!("component" => "dropshot")); - let server = HttpServerStarter::new( - &ConfigDropshot { - bind_address: SocketAddr::V6(args.address), - ..Default::default() - }, + let server = ServerBuilder::new( oximeter_api(), Arc::clone(&agent), - &dropshot_log, + dropshot_log, ) - .map_err(|e| Error::Server(e.to_string()))? - .start(); + .config(ConfigDropshot { + bind_address: SocketAddr::V6(args.address), + ..Default::default() + }) + .start() + .map_err(|e| Error::Server(e.to_string()))?; info!(log, "started oximeter standalone server"); // Notify the standalone nexus. diff --git a/oximeter/producer/src/lib.rs b/oximeter/producer/src/lib.rs index 4bde5f69ffb..522ce983b47 100644 --- a/oximeter/producer/src/lib.rs +++ b/oximeter/producer/src/lib.rs @@ -12,9 +12,9 @@ use dropshot::ConfigDropshot; use dropshot::HttpError; use dropshot::HttpResponseOk; use dropshot::HttpServer; -use dropshot::HttpServerStarter; use dropshot::Path; use dropshot::RequestContext; +use dropshot::ServerBuilder; use internal_dns_resolver::ResolveError; use internal_dns_resolver::Resolver; use internal_dns_types::names::ServiceName; @@ -194,14 +194,10 @@ impl Server { dropshot: &ConfigDropshot, ) -> Result, Error> { let dropshot_log = log.new(o!("component" => "dropshot")); - HttpServerStarter::new( - dropshot, - metric_server_api(), - registry.clone(), - &dropshot_log, - ) - .map_err(|e| Error::Server(e.to_string())) - .map(HttpServerStarter::start) + ServerBuilder::new(metric_server_api(), registry.clone(), dropshot_log) + .config(dropshot.clone()) + .start() + .map_err(|e| Error::Server(e.to_string())) } // Create a new server registering with Nexus. @@ -464,8 +460,8 @@ mod tests { use dropshot::HttpError; use dropshot::HttpResponseCreated; use dropshot::HttpServer; - use dropshot::HttpServerStarter; use dropshot::RequestContext; + use dropshot::ServerBuilder; use omicron_common::api::internal::nexus::ProducerKind; use omicron_common::api::internal::nexus::ProducerRegistrationResponse; use omicron_test_utils::dev::poll::{wait_for_condition, CondCheckError}; @@ -510,18 +506,14 @@ mod tests { fn spawn_fake_nexus_server(log: &Logger) -> HttpServer { let mut api = ApiDescription::new(); api.register(register_producer).expect("Expected to register endpoint"); - HttpServerStarter::new( - &ConfigDropshot { + ServerBuilder::new(api, Arc::new(AtomicU32::new(0)), log.clone()) + .config(ConfigDropshot { bind_address: "[::1]:0".parse().unwrap(), request_body_max_bytes: 2048, ..Default::default() - }, - api, - Arc::new(AtomicU32::new(0)), - log, - ) - .expect("Expected to start Dropshot server") - .start() + }) + .start() + .expect("Expected to start Dropshot server") } #[tokio::test] diff --git a/sled-agent/src/artifact_store.rs b/sled-agent/src/artifact_store.rs index cb6e40044fb..5b78c0099d1 100644 --- a/sled-agent/src/artifact_store.rs +++ b/sled-agent/src/artifact_store.rs @@ -23,8 +23,8 @@ use std::time::Duration; use camino::{Utf8Path, Utf8PathBuf}; use camino_tempfile::{NamedUtf8TempFile, Utf8TempPath}; use dropshot::{ - Body, ConfigDropshot, FreeformBody, HttpError, HttpResponseOk, - HttpServerStarter, Path, RequestContext, StreamingBody, + Body, ConfigDropshot, FreeformBody, HttpError, HttpResponseOk, Path, + RequestContext, ServerBuilder, StreamingBody, }; use futures::{Stream, TryStreamExt}; use http::StatusCode; @@ -130,18 +130,18 @@ impl ArtifactStore { depot_address.set_port(REPO_DEPOT_PORT); let log = self.log.new(o!("component" => "dropshot (Repo Depot)")); - Ok(HttpServerStarter::new( - &ConfigDropshot { - bind_address: depot_address.into(), - ..dropshot_config.clone() - }, + ServerBuilder::new( repo_depot_api_mod::api_description::() .expect("registered entrypoints"), self, - &log, + log, ) - .map_err(StartError::Dropshot)? - .start()) + .config(ConfigDropshot { + bind_address: depot_address.into(), + ..dropshot_config.clone() + }) + .start() + .map_err(StartError::Dropshot) } } @@ -151,7 +151,7 @@ pub enum StartError { DatasetConfig(#[source] sled_storage::error::Error), #[error("Dropshot error while starting Repo Depot service")] - Dropshot(#[source] Box), + Dropshot(#[source] dropshot::BuildError), } macro_rules! log_and_store {