From ab881cecf605b836cc381dde654f1054a6e01334 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Fri, 6 Mar 2026 18:26:04 -0600 Subject: [PATCH 1/5] try dropshot with gzip --- Cargo.toml | 8 ++-- dns-server/src/lib.rs | 2 +- dns-server/tests/basic_test.rs | 2 +- dns-server/tests/cross_version_test.rs | 2 +- gateway/src/lib.rs | 2 +- installinator-api/src/lib.rs | 2 +- internal-dns/resolver/src/resolver.rs | 2 +- nexus/Cargo.toml | 1 + nexus/examples/config-second.toml | 1 + nexus/examples/config.toml | 1 + nexus/src/app/background/init.rs | 2 +- nexus/test-utils/src/http_testing.rs | 2 + nexus/tests/config.test.toml | 1 + nexus/tests/integration_tests/basic.rs | 53 ++++++++++++++++++++++++++ oximeter/producer/src/lib.rs | 2 +- sled-agent/src/services.rs | 6 +-- sled-agent/src/sim/storage.rs | 2 +- wicketd/src/lib.rs | 2 +- 18 files changed, 77 insertions(+), 16 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2dae5076180..06ee640fd84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -485,9 +485,9 @@ dns-server = { path = "dns-server" } dns-server-api = { path = "dns-server-api" } dns-service-client = { path = "clients/dns-service-client" } dpd-client = { git = "https://github.com/oxidecomputer/dendrite", rev = "b31ba90d14636ef6bba9dbb56d756efa249d4b4e" } -dropshot = { version = "0.16.6", features = [ "usdt-probes" ] } -dropshot-api-manager = "0.6.0" -dropshot-api-manager-types = "0.6.0" +dropshot = { version = "0.17.0", features = [ "usdt-probes" ] } +dropshot-api-manager = "0.7.0" +dropshot-api-manager-types = "0.7.0" dyn-clone = "1.0.20" either = "1.15.0" ereport-types = { path = "ereport/types" } @@ -1049,6 +1049,8 @@ opt-level = 3 # drift = { path = "../drift" } # dropshot = { path = "../dropshot/dropshot" } # dropshot_endpoint = { path = "../dropshot/dropshot_endpoint" } +# dropshot-api-manager = { path = "../dropshot-api-manager/crates/dropshot-api-manager" } +# dropshot-api-manager-types = { path = "../dropshot-api-manager/crates/dropshot-api-manager-types" } # progenitor = { path = "../progenitor/progenitor" } # progenitor-client = { path = "../progenitor/progenitor-client" } # steno = { path = "../steno" } diff --git a/dns-server/src/lib.rs b/dns-server/src/lib.rs index dde10a6387a..0a6dbe764ec 100644 --- a/dns-server/src/lib.rs +++ b/dns-server/src/lib.rs @@ -154,7 +154,7 @@ impl TransientServer { bind_address: "[::1]:0".parse().unwrap(), default_request_body_max_bytes: 4 * 1024 * 1024, default_handler_task_mode: dropshot::HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, ) .await?; diff --git a/dns-server/tests/basic_test.rs b/dns-server/tests/basic_test.rs index 62aa73b1b19..20870298631 100644 --- a/dns-server/tests/basic_test.rs +++ b/dns-server/tests/basic_test.rs @@ -732,7 +732,7 @@ fn test_config( bind_address: "[::1]:0".to_string().parse().unwrap(), default_request_body_max_bytes: 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }; Ok((tmp_dir, config_storage, config_dropshot, logctx)) diff --git a/dns-server/tests/cross_version_test.rs b/dns-server/tests/cross_version_test.rs index a2c1c323826..ba61ef075b8 100644 --- a/dns-server/tests/cross_version_test.rs +++ b/dns-server/tests/cross_version_test.rs @@ -275,7 +275,7 @@ fn test_config( bind_address: "[::1]:0".to_string().parse().unwrap(), default_request_body_max_bytes: 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }; Ok((tmp_dir, config_storage, config_dropshot, logctx)) diff --git a/gateway/src/lib.rs b/gateway/src/lib.rs index de0d7407026..10a84836f63 100644 --- a/gateway/src/lib.rs +++ b/gateway/src/lib.rs @@ -94,7 +94,7 @@ fn start_dropshot_server( bind_address: SocketAddr::V6(addr), default_request_body_max_bytes, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }; let http_server = dropshot::ServerBuilder::new( diff --git a/installinator-api/src/lib.rs b/installinator-api/src/lib.rs index 3576643e272..6067c6a20c0 100644 --- a/installinator-api/src/lib.rs +++ b/installinator-api/src/lib.rs @@ -125,6 +125,6 @@ pub fn default_config(bind_address: std::net::SocketAddr) -> ConfigDropshot { bind_address, default_request_body_max_bytes: 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() } } diff --git a/internal-dns/resolver/src/resolver.rs b/internal-dns/resolver/src/resolver.rs index 9ce3d6aa48d..38f59de1818 100644 --- a/internal-dns/resolver/src/resolver.rs +++ b/internal-dns/resolver/src/resolver.rs @@ -520,7 +520,7 @@ mod test { bind_address: "[::1]:0".parse().unwrap(), default_request_body_max_bytes: 8 * 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, ) .await diff --git a/nexus/Cargo.toml b/nexus/Cargo.toml index 2ff91e834b5..00f1397bb17 100644 --- a/nexus/Cargo.toml +++ b/nexus/Cargo.toml @@ -168,6 +168,7 @@ camino-tempfile.workspace = true criterion.workspace = true diesel.workspace = true dns-server.workspace = true +flate2.workspace = true expectorate.workspace = true gateway-messages.workspace = true gateway-test-utils.workspace = true diff --git a/nexus/examples/config-second.toml b/nexus/examples/config-second.toml index 72ed64e0222..2cc2ae738bd 100644 --- a/nexus/examples/config-second.toml +++ b/nexus/examples/config-second.toml @@ -55,6 +55,7 @@ external_dns_servers = ["1.1.1.1", "9.9.9.9"] # used by `omicron-dev run-all` bind_address = "127.0.0.1:12222" default_request_body_max_bytes = 1048576 +compression = "gzip" # To have Nexus's external HTTP endpoint use TLS, uncomment the line below. You # will also need to provide an initial TLS certificate during rack # initialization. If you're using this config file, you're probably running a diff --git a/nexus/examples/config.toml b/nexus/examples/config.toml index d5cf0b1a918..2243532b523 100644 --- a/nexus/examples/config.toml +++ b/nexus/examples/config.toml @@ -41,6 +41,7 @@ external_dns_servers = ["1.1.1.1", "9.9.9.9"] # IP Address and TCP port on which to listen for the external API bind_address = "127.0.0.1:12220" default_request_body_max_bytes = 1048576 +compression = "gzip" # To have Nexus's external HTTP endpoint use TLS, uncomment the line below. You # will also need to provide an initial TLS certificate during rack # initialization. If you're using this config file, you're probably running a diff --git a/nexus/src/app/background/init.rs b/nexus/src/app/background/init.rs index 75ae218c63a..9e0f2281d7c 100644 --- a/nexus/src/app/background/init.rs +++ b/nexus/src/app/background/init.rs @@ -1530,7 +1530,7 @@ pub mod test { bind_address: "[::1]:0".parse().unwrap(), default_request_body_max_bytes: 8 * 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, ) .await diff --git a/nexus/test-utils/src/http_testing.rs b/nexus/test-utils/src/http_testing.rs index 50a9ccdcb83..8c622348e23 100644 --- a/nexus/test-utils/src/http_testing.rs +++ b/nexus/test-utils/src/http_testing.rs @@ -97,6 +97,8 @@ impl<'a> RequestBuilder<'a> { http::header::DATE, http::header::LOCATION, http::header::SET_COOKIE, + http::header::TRANSFER_ENCODING, + http::header::VARY, http::header::HeaderName::from_static("x-request-id"), ]), expected_response_headers: http::HeaderMap::default(), diff --git a/nexus/tests/config.test.toml b/nexus/tests/config.test.toml index 1587ffe4843..d3409f45a5d 100644 --- a/nexus/tests/config.test.toml +++ b/nexus/tests/config.test.toml @@ -51,6 +51,7 @@ external_dns_servers = ["1.1.1.1", "9.9.9.9"] # concurrently. bind_address = "127.0.0.1:0" default_request_body_max_bytes = 1048576 +compression = "gzip" [deployment.dropshot_internal] bind_address = "127.0.0.1:0" diff --git a/nexus/tests/integration_tests/basic.rs b/nexus/tests/integration_tests/basic.rs index 87c65816060..2e663428976 100644 --- a/nexus/tests/integration_tests/basic.rs +++ b/nexus/tests/integration_tests/basic.rs @@ -557,3 +557,56 @@ async fn test_ping(cptestctx: &ControlPlaneTestContext) { .await; assert_eq!(health.status, system::PingStatus::Ok); } + +/// Test that the external API returns gzip-compressed responses when the +/// client sends Accept-Encoding: gzip. +#[nexus_test] +async fn test_gzip_compression(cptestctx: &ControlPlaneTestContext) { + let client = &cptestctx.external_client; + + // Create several projects so the response body exceeds the minimum + // compression threshold (512 bytes). + for i in 0..10 { + create_project(&client, &format!("project-{i}")).await; + } + + // With Accept-Encoding: gzip, response should be compressed. + let response = NexusRequest::new( + RequestBuilder::new(client, Method::GET, "/v1/projects") + .header(http::header::ACCEPT_ENCODING, "gzip") + .expect_status(Some(StatusCode::OK)), + ) + .authn_as(AuthnMode::PrivilegedUser) + .execute() + .await + .unwrap(); + + assert_eq!( + response.headers.get(http::header::CONTENT_ENCODING).unwrap(), + "gzip", + ); + + // Decompress and verify the body is valid JSON. + let compressed_len = response.body.len(); + let mut decoder = flate2::read::GzDecoder::new(&response.body[..]); + let mut decompressed = String::new(); + std::io::Read::read_to_string(&mut decoder, &mut decompressed).unwrap(); + let page: dropshot::ResultsPage = + serde_json::from_str(&decompressed).unwrap(); + assert_eq!(page.items.len(), 10); + + // Without Accept-Encoding: gzip, response should not be compressed. + let response = NexusRequest::object_get(client, "/v1/projects") + .authn_as(AuthnMode::PrivilegedUser) + .execute() + .await + .unwrap(); + assert!(response.headers.get(http::header::CONTENT_ENCODING).is_none()); + + let uncompressed_len = response.body.len(); + assert!( + compressed_len < uncompressed_len, + "compressed body ({compressed_len} bytes) should be smaller \ + than uncompressed body ({uncompressed_len} bytes)" + ); +} diff --git a/oximeter/producer/src/lib.rs b/oximeter/producer/src/lib.rs index 387983ce04d..84ca9351549 100644 --- a/oximeter/producer/src/lib.rs +++ b/oximeter/producer/src/lib.rs @@ -222,7 +222,7 @@ impl Server { bind_address: server_info.address, default_request_body_max_bytes, default_handler_task_mode: dropshot::HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }; let server = Self::build_dropshot_server(&log, ®istry, &dropshot)?; diff --git a/sled-agent/src/services.rs b/sled-agent/src/services.rs index c5202a2dde6..88ff610a384 100644 --- a/sled-agent/src/services.rs +++ b/sled-agent/src/services.rs @@ -2407,14 +2407,14 @@ impl ServiceManager { default_request_body_max_bytes: 1048576, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, }, dropshot_internal: dropshot::ConfigDropshot { bind_address: (*internal_address).into(), default_request_body_max_bytes: 1048576, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, dropshot_lockstep: dropshot::ConfigDropshot { bind_address: SocketAddr::new( @@ -2423,7 +2423,7 @@ impl ServiceManager { ), default_request_body_max_bytes: 1048576, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }, internal_dns: nexus_config::InternalDns::FromSubnet { subnet: Ipv6Subnet::::new( diff --git a/sled-agent/src/sim/storage.rs b/sled-agent/src/sim/storage.rs index c4398cda195..43471affde0 100644 --- a/sled-agent/src/sim/storage.rs +++ b/sled-agent/src/sim/storage.rs @@ -2316,7 +2316,7 @@ impl PantryServer { // - bulk writes into disks default_request_body_max_bytes: 8192 * 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }) .start() .expect("Could not initialize pantry server"); diff --git a/wicketd/src/lib.rs b/wicketd/src/lib.rs index d6cfcb6277d..0dd0ef0fd2a 100644 --- a/wicketd/src/lib.rs +++ b/wicketd/src/lib.rs @@ -135,7 +135,7 @@ impl Server { bind_address: SocketAddr::V6(args.address), default_request_body_max_bytes: 8 * 1024 * 1024, default_handler_task_mode: HandlerTaskMode::Detached, - log_headers: vec![], + ..Default::default() }; let mgs_manager = MgsManager::new(&log, args.mgs_address); From 347208ff8f926f9b56bf86eb0800d8d551f540f5 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Mon, 30 Mar 2026 17:08:48 -0400 Subject: [PATCH 2/5] update crucible, propolis, scim2-rs --- Cargo.toml | 22 +++++++++++----------- package-manifest.toml | 16 ++++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 06ee640fd84..a29393000aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -460,10 +460,10 @@ crossterm = { version = "0.29.0", features = ["event-stream"] } # NOTE: if you change the pinned revision of the `crucible` dependencies, you # must also update the references in package-manifest.toml to match the new # revision. -crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" } -crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" } -crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" } -crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" } +crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" } +crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" } +crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" } +crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" } # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" @@ -707,11 +707,11 @@ progenitor-client010 = { package = "progenitor-client", version = "0.10.0" } # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "368a2225b79328514ce0ea9181d8f874019edaa2" } -propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "368a2225b79328514ce0ea9181d8f874019edaa2" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "368a2225b79328514ce0ea9181d8f874019edaa2" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "368a2225b79328514ce0ea9181d8f874019edaa2" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "368a2225b79328514ce0ea9181d8f874019edaa2" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "3278ded80bb93538468313f046be906df4bd5748" } +propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "3278ded80bb93538468313f046be906df4bd5748" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "3278ded80bb93538468313f046be906df4bd5748" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "3278ded80bb93538468313f046be906df4bd5748" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "3278ded80bb93538468313f046be906df4bd5748" } # NOTE: see above! proptest = "1.7.0" qorb = "0.4.1" @@ -871,8 +871,8 @@ newtype-uuid = { version = "1.3.2", default-features = false } newtype-uuid-macros = "0.1.0" omicron-uuid-kinds = { path = "uuid-kinds", features = ["serde", "schemars08", "uuid-v4"] } -scim2-rs = { git = "https://github.com/oxidecomputer/scim2-rs", rev = "c78005db837a71f94c3b8efac9a64cfbdb2d527f" } -scim2-test-client = { git = "https://github.com/oxidecomputer/scim2-rs", rev = "c78005db837a71f94c3b8efac9a64cfbdb2d527f" } +scim2-rs = { git = "https://github.com/oxidecomputer/scim2-rs", rev = "f3406edbe24d6c96e07a4a1459598671f04b8b59" } +scim2-test-client = { git = "https://github.com/oxidecomputer/scim2-rs", rev = "f3406edbe24d6c96e07a4a1459598671f04b8b59" } # NOTE: The test profile inherits from the dev profile, so settings under # profile.dev get inherited. AVOID setting anything under profile.test: that diff --git a/package-manifest.toml b/package-manifest.toml index 805499c7012..f1b135d6acb 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -607,10 +607,10 @@ only_for_targets.image = "standard" # 3. Use source.type = "manual" instead of "prebuilt" source.type = "prebuilt" source.repo = "crucible" -source.commit = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source.commit = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible.sha256.txt -source.sha256 = "8e245572e4b8d1c018884268a6afdf7f79efc22e61b4ed5b5526957bf61ccdcd" +source.sha256 = "21af2287d2eb7b0caaa9f3935a663a19ea15c5d8879b0b6d8b73007d4db59b7d" output.type = "zone" output.intermediate_only = true @@ -619,10 +619,10 @@ service_name = "crucible_pantry_prebuilt" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source.commit = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-pantry.sha256.txt -source.sha256 = "7998ddb0bda4c97e3d5fec7c8079bbdfb27ef06dba69ab2867278dc2cd7544f4" +source.sha256 = "d0a72baad44acfc92a12b04211f24c2683bc129f58e7a494edb0479a75f4cc33" output.type = "zone" output.intermediate_only = true @@ -636,10 +636,10 @@ service_name = "crucible_utils" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source.commit = "3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-utils.sha256.txt -source.sha256 = "cc661b84fd258467ec1961e8c9879f76d2d07903fb9161012afa75c37490e24f" +source.sha256 = "786244ba6d420d5ab1ba942af55551d174de3da12527a3d7b775f15aca36446e" output.type = "tarball" # Refer to @@ -650,10 +650,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "368a2225b79328514ce0ea9181d8f874019edaa2" +source.commit = "3278ded80bb93538468313f046be906df4bd5748" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "227b214083acc568ba9ebf032c75ec614139cf5aeedc6df69ec252e5ad128c28" +source.sha256 = "62ad3c51584af456e769772e99b3721db84bc869d6875a811ec9d868038a8fa4" output.type = "zone" [package.mg-ddm-gz] From 7a728b0c1b424639c975308cc26aff547f574242 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Mon, 30 Mar 2026 18:36:14 -0400 Subject: [PATCH 3/5] lockfile --- Cargo.lock | 184 ++++++++++++++++++++++++++++------------------------- 1 file changed, 97 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dff93add700..fc879800d1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -284,6 +284,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-compression" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-lock" version = "3.4.2" @@ -617,7 +629,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "bhyve_api_sys", "libc", @@ -627,7 +639,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "libc", "strum 0.26.3", @@ -1047,15 +1059,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - [[package]] name = "cargo-platform" version = "0.2.0" @@ -1091,20 +1094,6 @@ dependencies = [ "url", ] -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform 0.1.9", - "semver 1.0.27", - "serde", - "serde_json", - "thiserror 2.0.18", -] - [[package]] name = "cargo_metadata" version = "0.21.0" @@ -1787,6 +1776,23 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -2125,14 +2131,14 @@ dependencies = [ [[package]] name = "crucible-agent-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=7103cd3a3d7b0112d2949dd135db06fef0c156bb#7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source = "git+https://github.com/oxidecomputer/crucible?rev=3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d#3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" dependencies = [ "anyhow", "chrono", "crucible-workspace-hack", "percent-encoding", - "progenitor 0.10.0", - "reqwest 0.12.28", + "progenitor 0.13.0", + "reqwest 0.13.2", "schemars 0.8.22", "serde", "serde_json", @@ -2167,13 +2173,13 @@ dependencies = [ [[package]] name = "crucible-common" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=7103cd3a3d7b0112d2949dd135db06fef0c156bb#7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source = "git+https://github.com/oxidecomputer/crucible?rev=3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d#3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" dependencies = [ "anyhow", "atty", "crucible-workspace-hack", "dropshot", - "nix 0.29.0", + "nix 0.31.1", "rustls-pemfile 1.0.4", "schemars 0.8.22", "serde", @@ -2187,7 +2193,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-rustls 0.24.1", - "toml 0.8.23", + "toml 1.0.6+spec-1.1.0", "twox-hash", "uuid", "vergen", @@ -2197,14 +2203,14 @@ dependencies = [ [[package]] name = "crucible-pantry-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=7103cd3a3d7b0112d2949dd135db06fef0c156bb#7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source = "git+https://github.com/oxidecomputer/crucible?rev=3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d#3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" dependencies = [ "anyhow", "chrono", "crucible-workspace-hack", "percent-encoding", - "progenitor 0.10.0", - "reqwest 0.12.28", + "progenitor 0.13.0", + "reqwest 0.13.2", "schemars 0.8.22", "serde", "serde_json", @@ -2214,7 +2220,7 @@ dependencies = [ [[package]] name = "crucible-smf" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=7103cd3a3d7b0112d2949dd135db06fef0c156bb#7103cd3a3d7b0112d2949dd135db06fef0c156bb" +source = "git+https://github.com/oxidecomputer/crucible?rev=3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d#3df8a24e046bcfdb0d69f93075e8e1d2d0e9889d" dependencies = [ "crucible-workspace-hack", "libc", @@ -3143,10 +3149,11 @@ dependencies = [ [[package]] name = "dropshot" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69fd85c8dfc67252d02f260595f6b62b5abceb1b88b4b9722369d27936e5fa4" +checksum = "409eb76c7ea1623d270393248ff55ec436841fcd724c2e1c9de294291edd35f5" dependencies = [ + "async-compression", "async-stream", "async-trait", "base64 0.22.1", @@ -3185,7 +3192,8 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-rustls 0.25.0", - "toml 0.9.12+spec-1.1.0", + "tokio-util", + "toml 1.0.6+spec-1.1.0", "usdt 0.6.0", "uuid", "version_check", @@ -3194,9 +3202,9 @@ dependencies = [ [[package]] name = "dropshot-api-manager" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf576868db63e888512129acd5f59e36e61b7d1ac285239e76ed40dc43d7b2e8" +checksum = "27edffb6c55e640e420fb4a03ac0a066449100e936457e2db074ab8f5f208c8a" dependencies = [ "anyhow", "atomicwrites", @@ -3227,9 +3235,9 @@ dependencies = [ [[package]] name = "dropshot-api-manager-types" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a04cc5bc280e21332f33acfd180705a9e8ace302e9eb08000786135d27497731" +checksum = "63d655f88937cd3cc3a99b81f731af996084f2f16d0067b2cfad43411ad4317f" dependencies = [ "anyhow", "camino", @@ -3240,9 +3248,9 @@ dependencies = [ [[package]] name = "dropshot_endpoint" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d106478e4a4782556981d028a667f41c4845cdaa6e2d3a9f58c5d15e725401" +checksum = "906c3adfd4472030607130ed763e9af1b85f7e18832dd22998379d42ff81c28d" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -7796,18 +7804,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "cfg_aliases 0.2.1", - "libc", -] - [[package]] name = "nix" version = "0.31.1" @@ -8556,6 +8552,7 @@ dependencies = [ "ereport-types", "expectorate", "fatfs", + "flate2", "futures", "gateway-client", "gateway-messages", @@ -8645,7 +8642,7 @@ dependencies = [ "pretty_assertions", "progenitor-client 0.13.0", "progenitor-extras", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "qorb", "rand 0.9.2", "range-requests", @@ -9091,9 +9088,9 @@ dependencies = [ "oxnet", "pretty_assertions", "progenitor 0.13.0", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "propolis-mock-server", - "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "rand 0.9.2", "range-requests", "rcgen", @@ -9375,7 +9372,7 @@ dependencies = [ "usdt-impl 0.6.0", "uuid", "vergen", - "vergen-lib", + "vergen-lib 0.1.6", "winnow 0.7.14", "x509-cert", "zerocopy 0.8.40", @@ -11198,10 +11195,10 @@ dependencies = [ [[package]] name = "propolis-api-types-versions" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=a945a32ba9e1f2098ce3a8963765f1894f37110b)", - "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "schemars 0.8.22", "serde", "thiserror 1.0.69", @@ -11211,7 +11208,7 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "async-trait", "base64 0.21.7", @@ -11259,7 +11256,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "anyhow", "atty", @@ -11270,8 +11267,8 @@ dependencies = [ "hyper", "progenitor 0.13.0", "propolis-api-types-versions", - "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", - "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", + "propolis_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "rand 0.9.2", "reqwest 0.13.2", "schemars 0.8.22", @@ -11292,7 +11289,7 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=a945a32ba9e1f2098ce3a8963765f1894f37110b)", "propolis-api-types-versions", @@ -11314,7 +11311,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2#368a2225b79328514ce0ea9181d8f874019edaa2" +source = "git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748#3278ded80bb93538468313f046be906df4bd5748" dependencies = [ "schemars 0.8.22", "serde", @@ -12058,6 +12055,7 @@ dependencies = [ "bytes", "cookie", "cookie_store", + "encoding_rs", "futures-channel", "futures-core", "futures-util", @@ -12070,6 +12068,7 @@ dependencies = [ "hyper-util", "js-sys", "log", + "mime", "percent-encoding", "pin-project-lite", "quinn", @@ -12751,7 +12750,7 @@ dependencies = [ [[package]] name = "scim2-rs" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/scim2-rs?rev=c78005db837a71f94c3b8efac9a64cfbdb2d527f#c78005db837a71f94c3b8efac9a64cfbdb2d527f" +source = "git+https://github.com/oxidecomputer/scim2-rs?rev=f3406edbe24d6c96e07a4a1459598671f04b8b59#f3406edbe24d6c96e07a4a1459598671f04b8b59" dependencies = [ "anyhow", "chrono", @@ -12770,7 +12769,7 @@ dependencies = [ [[package]] name = "scim2-test-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/scim2-rs?rev=c78005db837a71f94c3b8efac9a64cfbdb2d527f#c78005db837a71f94c3b8efac9a64cfbdb2d527f" +source = "git+https://github.com/oxidecomputer/scim2-rs?rev=f3406edbe24d6c96e07a4a1459598671f04b8b59#f3406edbe24d6c96e07a4a1459598671f04b8b59" dependencies = [ "anyhow", "clap", @@ -13380,7 +13379,7 @@ dependencies = [ "omicron-workspace-hack", "oxnet", "progenitor 0.13.0", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "regress", "reqwest 0.13.2", "schemars 0.8.22", @@ -13598,7 +13597,7 @@ dependencies = [ "omicron-workspace-hack", "oxnet", "propolis-api-types-versions", - "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=368a2225b79328514ce0ea9181d8f874019edaa2)", + "propolis_api_types 0.0.0 (git+https://github.com/oxidecomputer/propolis?rev=3278ded80bb93538468313f046be906df4bd5748)", "proptest", "schemars 0.8.22", "serde", @@ -14926,9 +14925,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -15122,9 +15121,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.3+spec-1.1.0" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" +checksum = "399b1124a3c9e16766831c6bba21e50192572cdd98706ea114f9502509686ffc" dependencies = [ "indexmap 2.13.0", "serde_core", @@ -15633,7 +15632,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 1.0.3+spec-1.1.0", + "toml 1.0.6+spec-1.1.0", ] [[package]] @@ -16268,9 +16267,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.1", "js-sys", @@ -16296,24 +16295,24 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "9.0.6" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" dependencies = [ "anyhow", - "cargo_metadata 0.19.2", + "cargo_metadata 0.23.1", "derive_builder", "regex", "rustc_version 0.4.1", "rustversion", - "vergen-lib", + "vergen-lib 9.1.0", ] [[package]] name = "vergen-git2" -version = "1.0.7" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6ee511ec45098eabade8a0750e76eec671e7fb2d9360c563911336bea9cac1" +checksum = "d51ab55ddf1188c8d679f349775362b0fa9e90bd7a4ac69838b2a087623f0d57" dependencies = [ "anyhow", "derive_builder", @@ -16321,7 +16320,7 @@ dependencies = [ "rustversion", "time", "vergen", - "vergen-lib", + "vergen-lib 9.1.0", ] [[package]] @@ -16335,7 +16334,7 @@ dependencies = [ "rustversion", "time", "vergen", - "vergen-lib", + "vergen-lib 0.1.6", ] [[package]] @@ -16349,6 +16348,17 @@ dependencies = [ "rustversion", ] +[[package]] +name = "vergen-lib" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + [[package]] name = "version_check" version = "0.9.5" From 9e28d9e8f54f213d613ca4774fe1ee5ffe058b17 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Mon, 30 Mar 2026 18:38:41 -0400 Subject: [PATCH 4/5] Update progenitor_client010 -> progenitor_client, remove reqwest012 The crucible rev bump brings in progenitor-client 0.13, so ProgenitorOperationRetry and the crucible/pantry client construction need to use the current progenitor_client and reqwest instead of the v0.10/v0.12 compat shims. Remove the now-unused progenitor-client010 workspace dep, reqwest012 nexus dep, and the duplicate From impl for progenitor_client010::Error. --- Cargo.lock | 2 -- Cargo.toml | 1 - common/Cargo.toml | 1 - common/src/api/external/error.rs | 36 ------------------------ common/src/progenitor_operation_retry.rs | 18 ++++++------ nexus/Cargo.toml | 1 - nexus/src/app/crucible.rs | 4 +-- nexus/src/app/disk.rs | 4 +-- nexus/src/app/mod.rs | 19 ------------- 9 files changed, 11 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc879800d1b..161ce727b01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8272,7 +8272,6 @@ dependencies = [ "omicron-workspace-hack", "oxnet", "parse-display", - "progenitor-client 0.10.0", "progenitor-client 0.13.0", "progenitor-extras", "proptest", @@ -8651,7 +8650,6 @@ dependencies = [ "rdb-types", "ref-cast", "regex", - "reqwest 0.12.28", "reqwest 0.13.2", "ring", "rustls 0.22.4", diff --git a/Cargo.toml b/Cargo.toml index a29393000aa..6793ad1d606 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -703,7 +703,6 @@ proc-macro2 = "1.0" progenitor = "0.13.0" progenitor-client = "0.13.0" progenitor-extras = "0.1.1" -progenitor-client010 = { package = "progenitor-client", version = "0.10.0" } # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. diff --git a/common/Cargo.toml b/common/Cargo.toml index cde57fdaa93..332fc6a9e06 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -51,7 +51,6 @@ tokio = { workspace = true, features = ["full"] } uuid.workspace = true parse-display.workspace = true progenitor-client.workspace = true -progenitor-client010.workspace = true progenitor-extras.workspace = true omicron-workspace-hack.workspace = true regress.workspace = true diff --git a/common/src/api/external/error.rs b/common/src/api/external/error.rs index 09f5b2f71c3..199346c3ed4 100644 --- a/common/src/api/external/error.rs +++ b/common/src/api/external/error.rs @@ -547,42 +547,6 @@ pub trait ClientError: std::fmt::Debug { // external client, others may require, for example, retries with an alternate // service instance or additional interpretation to sanitize the output error. // This should be removed to avoid leaking data. -impl From> for Error { - fn from(e: progenitor_client010::Error) -> Self { - match e { - // For most error variants, we delegate to the display impl for the - // Progenitor error type, but we pick apart an error response more - // carefully. - progenitor_client010::Error::InvalidRequest(_) - | progenitor_client010::Error::CommunicationError(_) - | progenitor_client010::Error::InvalidResponsePayload(..) - | progenitor_client010::Error::UnexpectedResponse(_) - | progenitor_client010::Error::InvalidUpgrade(_) - | progenitor_client010::Error::ResponseBodyError(_) - | progenitor_client010::Error::PreHookError(_) - | progenitor_client010::Error::PostHookError(_) => { - Error::internal_error(&e.to_string()) - } - // This error represents an expected error from the remote service. - progenitor_client010::Error::ErrorResponse(rv) => { - let message = rv.message(); - - match rv.status() { - http::StatusCode::SERVICE_UNAVAILABLE => { - Error::unavail(&message) - } - status if status.is_client_error() => { - Error::invalid_request(&message) - } - _ => Error::internal_error(&message), - } - } - } - } -} - -// Equivalent From impl for progenitor-client 0.13. This coexists with the -// progenitor_client010 impl above during the cross-repo upgrade window. impl From> for Error { fn from(e: progenitor_client::Error) -> Self { match e { diff --git a/common/src/progenitor_operation_retry.rs b/common/src/progenitor_operation_retry.rs index 52a1dfb99ae..119a3ab71fc 100644 --- a/common/src/progenitor_operation_retry.rs +++ b/common/src/progenitor_operation_retry.rs @@ -25,14 +25,14 @@ pub enum ProgenitorOperationRetryError { /// The retry loop progenitor operation saw a permanent client error #[error("permanent error")] - ProgenitorError(#[source] progenitor_client010::Error), + ProgenitorError(#[source] progenitor_client::Error), } impl ProgenitorOperationRetryError { pub fn is_not_found(&self) -> bool { match &self { ProgenitorOperationRetryError::ProgenitorError(e) => match e { - progenitor_client010::Error::ErrorResponse(rv) => { + progenitor_client::Error::ErrorResponse(rv) => { match rv.status() { http::StatusCode::NOT_FOUND => true, @@ -70,7 +70,7 @@ pub struct ProgenitorOperationRetry< T, E: std::fmt::Debug, F: FnMut() -> Fut, - Fut: Future>>, + Fut: Future>>, BF: FnMut() -> BFut, BFut: Future>, > { @@ -85,7 +85,7 @@ impl ProgenitorOperationRetry where E: std::fmt::Debug + 'static, F: FnMut() -> Fut, - Fut: Future>>, + Fut: Future>>, BF: FnMut() -> BFut, BFut: Future>, { @@ -121,7 +121,7 @@ where } match f.await { - Err(progenitor_client010::Error::CommunicationError(e)) => { + Err(progenitor_client::Error::CommunicationError(e)) => { warn!( log, "saw transient communication error, retrying..."; @@ -130,12 +130,12 @@ where Err(BackoffError::transient( ProgenitorOperationRetryError::ProgenitorError( - progenitor_client010::Error::CommunicationError(e) + progenitor_client::Error::CommunicationError(e) ) )) } - Err(progenitor_client010::Error::ErrorResponse( + Err(progenitor_client::Error::ErrorResponse( response_value, )) => { match response_value.status() { @@ -144,7 +144,7 @@ where | http::StatusCode::TOO_MANY_REQUESTS => { Err(BackoffError::transient( ProgenitorOperationRetryError::ProgenitorError( - progenitor_client010::Error::ErrorResponse( + progenitor_client::Error::ErrorResponse( response_value ) ) @@ -154,7 +154,7 @@ where // Anything else is a permanent error _ => Err(BackoffError::Permanent( ProgenitorOperationRetryError::ProgenitorError( - progenitor_client010::Error::ErrorResponse( + progenitor_client::Error::ErrorResponse( response_value ) ) diff --git a/nexus/Cargo.toml b/nexus/Cargo.toml index 00f1397bb17..75bb673a9bf 100644 --- a/nexus/Cargo.toml +++ b/nexus/Cargo.toml @@ -98,7 +98,6 @@ ref-cast.workspace = true rdb-types.workspace = true regex.workspace = true reqwest = { workspace = true, features = ["http2", "json"] } -reqwest012 = { workspace = true } ring.workspace = true samael.workspace = true schemars = { workspace = true, features = ["chrono", "uuid1"] } diff --git a/nexus/src/app/crucible.rs b/nexus/src/app/crucible.rs index 0037143e66d..9b7dce4d78e 100644 --- a/nexus/src/app/crucible.rs +++ b/nexus/src/app/crucible.rs @@ -74,11 +74,9 @@ impl super::Nexus { &self, dataset: &db::model::CrucibleDataset, ) -> CrucibleAgentClient { - // Use reqwest012_client because the rev-pinned crucible-agent-client - // is still on reqwest 0.12. CrucibleAgentClient::new_with_client( &format!("http://{}", dataset.address()), - self.reqwest012_client.clone(), + self.reqwest_client.clone(), ) } diff --git a/nexus/src/app/disk.rs b/nexus/src/app/disk.rs index 32ce2894b71..7fe564a6b5b 100644 --- a/nexus/src/app/disk.rs +++ b/nexus/src/app/disk.rs @@ -564,11 +564,9 @@ impl super::Nexus { // that user's program can act accordingly. In a way, the user's // program is an externally driven saga instead. - // Use reqwest012_client because the rev-pinned - // crucible-pantry-client is still on reqwest 0.12. let client = crucible_pantry_client::Client::new_with_client( &format!("http://{}", endpoint), - self.reqwest012_client.clone(), + self.reqwest_client.clone(), ); let request = crucible_pantry_client::types::BulkWriteRequest { offset: param.offset, diff --git a/nexus/src/app/mod.rs b/nexus/src/app/mod.rs index acc02be8b87..c5e742d7a88 100644 --- a/nexus/src/app/mod.rs +++ b/nexus/src/app/mod.rs @@ -223,18 +223,8 @@ pub struct Nexus { /// /// (This does not need to be in an `Arc` because `reqwest::Client` uses /// `Arc` internally.) - /// - /// Currently unused because all `new_with_client` call sites use - /// `reqwest012_client` for cross-repo dependencies that are still on - /// reqwest 0.12. This field will be used again once rev pins are updated. - #[allow(dead_code)] reqwest_client: reqwest::Client, - /// `reqwest012::Client` for cross-repo dependencies where the rev-pinned - /// dependency is still on reqwest 0.12. Remove once all rev pins are - /// updated. - reqwest012_client: reqwest012::Client, - /// Client to the timeseries database. timeseries_client: oximeter_db::Client, @@ -436,14 +426,6 @@ impl Nexus { .build() .map_err(|e| InlineErrorChain::new(&e).to_string())?; - // reqwest 0.12 client for cross-repo dependencies still on reqwest - // 0.12. Remove once all rev pins are updated. - let reqwest012_client = reqwest012::ClientBuilder::new() - .connect_timeout(std::time::Duration::from_secs(15)) - .timeout(std::time::Duration::from_secs(15)) - .build() - .map_err(|e| InlineErrorChain::new(&e).to_string())?; - // Client to the ClickHouse database. let timeseries_client = match &config.pkg.timeseries_db.address { None => { @@ -544,7 +526,6 @@ impl Nexus { producer_server: std::sync::Mutex::new(None), populate_status, reqwest_client, - reqwest012_client, timeseries_client, webhook_delivery_client, tunables: config.pkg.tunables.clone(), From 875d8cf46e951c45901a7ceade3e9cdd1aff1c2d Mon Sep 17 00:00:00 2001 From: David Crespo Date: Mon, 30 Mar 2026 21:03:17 -0400 Subject: [PATCH 5/5] hakari --- Cargo.lock | 3 +-- workspace-hack/Cargo.toml | 32 ++++++++++++-------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 161ce727b01..32046ffcecc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9288,7 +9288,6 @@ dependencies = [ "log", "managed", "memchr", - "miniz_oxide", "mio", "newtype-uuid", "nix 0.31.1", @@ -9370,7 +9369,7 @@ dependencies = [ "usdt-impl 0.6.0", "uuid", "vergen", - "vergen-lib 0.1.6", + "vergen-lib 9.1.0", "winnow 0.7.14", "x509-cert", "zerocopy 0.8.40", diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index 6288b30b730..b8b2b963947 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -85,7 +85,7 @@ log = { version = "0.4.29", default-features = false, features = ["std"] } managed = { version = "0.8.0", default-features = false, features = ["alloc", "map"] } memchr = { version = "2.8.0" } newtype-uuid = { version = "1.3.2", features = ["proptest1"] } -nix = { version = "0.31.1", features = ["fs", "net", "signal"] } +nix = { version = "0.31.1", features = ["feature", "fs", "net", "signal", "uio"] } num-bigint-dig = { version = "0.8.6", default-features = false, features = ["i128", "prime", "serde", "u64_digit", "zeroize"] } num-integer = { version = "0.1.46", features = ["i128"] } num-iter = { version = "0.1.45", default-features = false, features = ["i128"] } @@ -111,7 +111,7 @@ rand_chacha-468e82937335b1c9 = { package = "rand_chacha", version = "0.3.1", def regex = { version = "1.12.3" } regex-automata = { version = "0.4.14", default-features = false, features = ["dfa", "hybrid", "meta", "nfa", "perf", "std", "unicode"] } regex-syntax = { version = "0.8.10" } -reqwest-594e8ee84c453af0 = { package = "reqwest", version = "0.13.2", default-features = false, features = ["blocking", "cookies", "http2", "json", "query", "rustls", "stream"] } +reqwest-594e8ee84c453af0 = { package = "reqwest", version = "0.13.2", features = ["blocking", "cookies", "json", "query", "stream"] } reqwest-5ef9efb8ec2df382 = { package = "reqwest", version = "0.12.28", features = ["blocking", "json", "rustls-tls", "stream"] } rsa = { version = "0.9.10", features = ["serde", "sha2"] } rustc-hash = { version = "2.1.1" } @@ -140,13 +140,12 @@ strum-754bda37e0fb3874 = { package = "strum", version = "0.27.2", features = ["d subtle = { version = "2.6.1" } syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.117", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } time = { version = "0.3.47", features = ["formatting", "local-offset", "macros", "parsing"] } -tokio = { version = "1.49.0", features = ["full", "test-util"] } +tokio = { version = "1.50.0", features = ["full", "test-util"] } tokio-postgres = { version = "0.7.16", features = ["with-chrono-0_4", "with-serde_json-1", "with-uuid-1"] } tokio-rustls = { version = "0.26.4", default-features = false, features = ["logging", "ring", "tls12"] } tokio-stream = { version = "0.1.18", features = ["net", "sync"] } tokio-util = { version = "0.7.18", features = ["codec", "io-util", "rt", "time"] } toml = { version = "0.7.8" } -toml_datetime-ca01ad9e24f5d932 = { package = "toml_datetime", version = "0.7.5", features = ["serde"] } toml_edit-3c51e837cfc5589a = { package = "toml_edit", version = "0.22.27", features = ["serde"] } toml_parser = { version = "1.0.9" } tracing = { version = "0.1.44", features = ["log"] } @@ -154,7 +153,7 @@ url = { version = "2.5.8", features = ["serde"] } usdt = { version = "0.6.0" } usdt-impl-3b31131e45eafb45 = { package = "usdt-impl", version = "0.6.0", default-features = false, features = ["des"] } usdt-impl-d8f496e17d97b5cb = { package = "usdt-impl", version = "0.5.0", default-features = false, features = ["asm", "des"] } -uuid = { version = "1.21.0", features = ["serde", "v4"] } +uuid = { version = "1.23.0", features = ["serde", "v4"] } winnow = { version = "0.7.14" } x509-cert = { version = "0.2.5" } zerocopy = { version = "0.8.40", default-features = false, features = ["derive", "simd"] } @@ -232,7 +231,7 @@ log = { version = "0.4.29", default-features = false, features = ["std"] } managed = { version = "0.8.0", default-features = false, features = ["alloc", "map"] } memchr = { version = "2.8.0" } newtype-uuid = { version = "1.3.2", features = ["proptest1"] } -nix = { version = "0.31.1", features = ["fs", "net", "signal"] } +nix = { version = "0.31.1", features = ["feature", "fs", "net", "signal", "uio"] } num-bigint-dig = { version = "0.8.6", default-features = false, features = ["i128", "prime", "serde", "u64_digit", "zeroize"] } num-integer = { version = "0.1.46", features = ["i128"] } num-iter = { version = "0.1.45", default-features = false, features = ["i128"] } @@ -258,7 +257,7 @@ rand_chacha-468e82937335b1c9 = { package = "rand_chacha", version = "0.3.1", def regex = { version = "1.12.3" } regex-automata = { version = "0.4.14", default-features = false, features = ["dfa", "hybrid", "meta", "nfa", "perf", "std", "unicode"] } regex-syntax = { version = "0.8.10" } -reqwest-594e8ee84c453af0 = { package = "reqwest", version = "0.13.2", default-features = false, features = ["blocking", "cookies", "http2", "json", "query", "rustls", "stream"] } +reqwest-594e8ee84c453af0 = { package = "reqwest", version = "0.13.2", features = ["blocking", "cookies", "json", "query", "stream"] } reqwest-5ef9efb8ec2df382 = { package = "reqwest", version = "0.12.28", features = ["blocking", "json", "rustls-tls", "stream"] } rsa = { version = "0.9.10", features = ["serde", "sha2"] } rustc-hash = { version = "2.1.1" } @@ -290,13 +289,12 @@ syn-dff4ba8e3ae991db = { package = "syn", version = "1.0.109", features = ["extr syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.117", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } time = { version = "0.3.47", features = ["formatting", "local-offset", "macros", "parsing"] } time-macros = { version = "0.2.27", default-features = false, features = ["formatting", "parsing"] } -tokio = { version = "1.49.0", features = ["full", "test-util"] } +tokio = { version = "1.50.0", features = ["full", "test-util"] } tokio-postgres = { version = "0.7.16", features = ["with-chrono-0_4", "with-serde_json-1", "with-uuid-1"] } tokio-rustls = { version = "0.26.4", default-features = false, features = ["logging", "ring", "tls12"] } tokio-stream = { version = "0.1.18", features = ["net", "sync"] } tokio-util = { version = "0.7.18", features = ["codec", "io-util", "rt", "time"] } toml = { version = "0.7.8" } -toml_datetime-ca01ad9e24f5d932 = { package = "toml_datetime", version = "0.7.5", features = ["serde"] } toml_edit-3c51e837cfc5589a = { package = "toml_edit", version = "0.22.27", features = ["serde"] } toml_parser = { version = "1.0.9" } tracing = { version = "0.1.44", features = ["log"] } @@ -304,9 +302,9 @@ url = { version = "2.5.8", features = ["serde"] } usdt = { version = "0.6.0" } usdt-impl-3b31131e45eafb45 = { package = "usdt-impl", version = "0.6.0", default-features = false, features = ["des"] } usdt-impl-d8f496e17d97b5cb = { package = "usdt-impl", version = "0.5.0", default-features = false, features = ["asm", "des"] } -uuid = { version = "1.21.0", features = ["serde", "v4"] } -vergen = { version = "9.0.6", features = ["cargo", "rustc"] } -vergen-lib = { version = "0.1.6", features = ["cargo", "git", "rustc"] } +uuid = { version = "1.23.0", features = ["serde", "v4"] } +vergen = { version = "9.1.0", features = ["cargo", "rustc"] } +vergen-lib = { version = "9.1.0", features = ["cargo", "git", "rustc"] } winnow = { version = "0.7.14" } x509-cert = { version = "0.2.5" } zerocopy = { version = "0.8.40", default-features = false, features = ["derive", "simd"] } @@ -321,7 +319,6 @@ dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } linux-raw-sys = { version = "0.4.15", default-features = false, features = ["elf", "errno", "general", "ioctl", "no_std", "system"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -335,7 +332,6 @@ dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } linux-raw-sys = { version = "0.4.15", default-features = false, features = ["elf", "errno", "general", "ioctl", "no_std", "system"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -347,7 +343,6 @@ cookie = { version = "0.18.1", default-features = false, features = ["percent-en errno = { version = "0.3.14" } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -359,7 +354,6 @@ cookie = { version = "0.18.1", default-features = false, features = ["percent-en errno = { version = "0.3.14" } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -371,7 +365,6 @@ cookie = { version = "0.18.1", default-features = false, features = ["percent-en errno = { version = "0.3.14" } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -383,7 +376,6 @@ cookie = { version = "0.18.1", default-features = false, features = ["percent-en errno = { version = "0.3.14" } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } @@ -399,13 +391,13 @@ getrandom-9fbad63c4bcf4a8f = { package = "getrandom", version = "0.4.1", default hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } indicatif = { version = "0.18.4", features = ["rayon"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.1.3", features = ["fs", "stdio", "termios"] } tokio-rustls = { version = "0.26.4", default-features = false, features = ["aws-lc-rs"] } toml_datetime-3b31131e45eafb45 = { package = "toml_datetime", version = "0.6.11", default-features = false, features = ["serde"] } +toml_datetime-ca01ad9e24f5d932 = { package = "toml_datetime", version = "0.7.5", features = ["serde"] } toml_edit-cdcf2f9584511fe6 = { package = "toml_edit", version = "0.19.15", features = ["serde"] } zone = { version = "0.3.1", features = ["async"] } @@ -418,13 +410,13 @@ getrandom-9fbad63c4bcf4a8f = { package = "getrandom", version = "0.4.1", default hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } hyper-util = { version = "0.1.20", features = ["full"] } indicatif = { version = "0.18.4", features = ["rayon"] } -miniz_oxide = { version = "0.8.9", default-features = false, features = ["simd", "with-alloc"] } mio = { version = "1.1.1", features = ["net", "os-ext"] } object = { version = "0.37.3", default-features = false, features = ["read", "std"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.44", features = ["fs", "stdio", "system", "termios"] } rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.1.3", features = ["fs", "stdio", "termios"] } tokio-rustls = { version = "0.26.4", default-features = false, features = ["aws-lc-rs"] } toml_datetime-3b31131e45eafb45 = { package = "toml_datetime", version = "0.6.11", default-features = false, features = ["serde"] } +toml_datetime-ca01ad9e24f5d932 = { package = "toml_datetime", version = "0.7.5", features = ["serde"] } toml_edit-cdcf2f9584511fe6 = { package = "toml_edit", version = "0.19.15", features = ["serde"] } zone = { version = "0.3.1", features = ["async"] }