From bc1e15d2973f2b846279330e43ebfcd083b5c6f7 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 20 Nov 2025 12:32:58 -0800 Subject: [PATCH 1/4] [spr] initial version Created using spr 1.3.6-beta.1 --- Cargo.lock | 419 +++++++++--------- Cargo.toml | 6 +- clients/oxide-client/src/lib.rs | 2 +- dev-tools/dropshot-apis/src/main.rs | 6 +- nexus/external-api/src/lib.rs | 104 +++-- nexus/src/lib.rs | 12 + nexus/test-utils/src/http_testing.rs | 5 + nexus/tests/integration_tests/updates.rs | 30 ++ .../nexus-2025112000.0.0-53f3c8.json} | 2 +- openapi/nexus/nexus-latest.json | 1 + workspace-hack/Cargo.toml | 54 +-- 11 files changed, 371 insertions(+), 270 deletions(-) rename openapi/{nexus.json => nexus/nexus-2025112000.0.0-53f3c8.json} (99%) create mode 120000 openapi/nexus/nexus-latest.json diff --git a/Cargo.lock b/Cargo.lock index c06d05e45fa..048373960b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -161,7 +161,7 @@ dependencies = [ "omicron-workspace-hack", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -403,7 +403,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -471,7 +471,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -488,7 +488,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -595,7 +595,7 @@ dependencies = [ "quote", "serde", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -769,7 +769,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.106", + "syn 2.0.110", "which", ] @@ -790,7 +790,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -840,7 +840,7 @@ checksum = "52511b09931f7d5fe3a14f23adefbc23e5725b184013e96c8419febb61f14734" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -851,7 +851,7 @@ checksum = "adc0846593a56638b74e136a45610f9934c052e14761bebca6b092d5522599e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1106,9 +1106,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1de8bc0aa9e9385ceb3bf0c152e3a9b9544f6c4a912c8ae504e80c1f0368603" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ "serde_core", ] @@ -1478,7 +1478,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2302,7 +2302,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2326,7 +2326,7 @@ checksum = "7ad40aef90652e771af668d28abcc3ef35fd0d39438706a76a61588cf8e8e84a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2360,7 +2360,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2374,7 +2374,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2385,7 +2385,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2396,7 +2396,7 @@ checksum = "e79f8e61677d5df9167cd85265f8e5f64b215cdea3fb55eebc3e622e44c7a146" dependencies = [ "darling_core 0.21.0", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2452,7 +2452,7 @@ dependencies = [ "quote", "serde", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2496,7 +2496,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2529,7 +2529,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2551,7 +2551,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2562,7 +2562,7 @@ checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2573,7 +2573,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2594,7 +2594,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2604,7 +2604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2617,7 +2617,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2638,7 +2638,7 @@ dependencies = [ "convert_case 0.7.1", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2753,7 +2753,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2762,7 +2762,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2824,7 +2824,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3013,7 +3013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "beebeb5f38023a0c6586ffd39e43bb3280926e18faf576a3e10c95895c99651e" dependencies = [ "anyhow", - "indexmap 2.11.4", + "indexmap 2.12.0", "openapiv3", "regex", "serde", @@ -3022,9 +3022,9 @@ dependencies = [ [[package]] name = "dropshot" -version = "0.16.4" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd9bdeafc752f117ed20e659b9763695ae5900adf3a32e93f9f6f4052fd5d66" +checksum = "3ee062e12b3b08e748f90e92efe0b93d53a28403bd900fd9e69e6be66bbddc4f" dependencies = [ "async-stream", "async-trait", @@ -3041,7 +3041,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "indexmap 2.11.4", + "indexmap 2.12.0", "multer", "openapiv3", "paste", @@ -3064,8 +3064,8 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tokio-rustls 0.25.0", - "toml 0.9.5", - "usdt 0.5.0", + "toml 0.9.8", + "usdt 0.6.0", "uuid", "version_check", "waitgroup", @@ -3073,9 +3073,9 @@ dependencies = [ [[package]] name = "dropshot-api-manager" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7a9019bc0bc0ad59881c6607c5eadb6965d5f34f42021477b141c29ce6650d" +checksum = "aee20ca777e652264a3334e41c9b548bdd848562e3918541ab04d6ceb3b7dd56" dependencies = [ "anyhow", "atomicwrites", @@ -3103,9 +3103,9 @@ dependencies = [ [[package]] name = "dropshot-api-manager-types" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c53110ae198fa78c643eceb87c44705319088563d837f751d74345a793c0527" +checksum = "b0103ef0b1a219c1a620e0b01659f6a27185df697876388144b1fb9637123e63" dependencies = [ "anyhow", "camino", @@ -3116,9 +3116,9 @@ dependencies = [ [[package]] name = "dropshot_endpoint" -version = "0.16.4" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d09440e73a9dcf8a0f7fbd6ab889a7751d59f0fe76e5082a0a6d5623ec6da3" +checksum = "0430a45e1a3cc8aaf1396c2ca2a4c1215ab253cbcda7ca7ed7beb107e0591bd1" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3126,7 +3126,7 @@ dependencies = [ "semver 1.0.27", "serde", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3140,7 +3140,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3340,7 +3340,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3370,6 +3370,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +dependencies = [ + "serde", +] + [[package]] name = "erased-serde" version = "0.4.6" @@ -3629,7 +3638,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3763,7 +3772,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4175,7 +4184,7 @@ dependencies = [ "debug-ignore", "fixedbitset 0.5.7", "guppy-workspace-hack", - "indexmap 2.11.4", + "indexmap 2.12.0", "itertools 0.14.0", "nested", "once_cell", @@ -4207,7 +4216,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -4751,9 +4760,9 @@ checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -4828,9 +4837,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64 0.22.1", "bytes", @@ -4991,7 +5000,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5147,9 +5156,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", @@ -5221,7 +5230,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5252,7 +5261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5446,17 +5455,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6d6206008e25125b1f97fbe5d309eb7b85141cf9199d52dbd3729a1584dd16" -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipcc" version = "0.1.0" @@ -5610,7 +5608,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5705,7 +5703,7 @@ version = "0.1.0" source = "git+https://github.com/oxidecomputer/opte?rev=795a1e0aeefb7a2c6fe4139779fdf66930d09b80#795a1e0aeefb7a2c6fe4139779fdf66930d09b80" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6039,7 +6037,7 @@ version = "0.1.0" dependencies = [ "omicron-workspace-hack", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6344,7 +6342,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6507,7 +6505,7 @@ dependencies = [ "quote", "serde", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6969,7 +6967,7 @@ dependencies = [ "omicron-workspace-hack", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7183,7 +7181,7 @@ dependencies = [ "hickory-resolver 0.25.2", "iddqd", "illumos-utils", - "indexmap 2.11.4", + "indexmap 2.12.0", "internal-dns-resolver", "internal-dns-types", "ipnet", @@ -7270,7 +7268,7 @@ dependencies = [ "anyhow", "camino", "chrono", - "indexmap 2.11.4", + "indexmap 2.12.0", "itertools 0.14.0", "nexus-inventory", "nexus-reconfigurator-planning", @@ -7425,7 +7423,7 @@ version = "0.1.0" dependencies = [ "omicron-workspace-hack", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7716,7 +7714,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -8945,7 +8943,7 @@ dependencies = [ "hyper-util", "iddqd", "idna", - "indexmap 2.11.4", + "indexmap 2.12.0", "inout", "ipnet", "ipnetwork", @@ -9015,7 +9013,7 @@ dependencies = [ "strum 0.27.2", "subtle", "syn 1.0.109", - "syn 2.0.106", + "syn 2.0.110", "time", "time-macros", "tokio", @@ -9029,7 +9027,7 @@ dependencies = [ "toml_edit 0.22.27", "tracing", "url", - "usdt 0.5.0", + "usdt 0.6.0", "usdt-impl 0.5.0", "usdt-impl 0.6.0", "uuid", @@ -9105,7 +9103,7 @@ version = "0.4.0" source = "git+https://github.com/oxidecomputer/openapi-lint?branch=main#ef442ee4343e97b6d9c217d3e7533962fe7d7236" dependencies = [ "heck 0.4.1", - "indexmap 2.11.4", + "indexmap 2.12.0", "lazy_static", "openapiv3", "regex", @@ -9117,7 +9115,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8d427828b22ae1fff2833a03d8486c2c881367f1c336349f307f321e7f4d05" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_json", ] @@ -9145,7 +9143,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9327,7 +9325,7 @@ dependencies = [ "oximeter-timeseries-macro 0.1.0", "oximeter-types 0.1.0", "prettyplease", - "syn 2.0.106", + "syn 2.0.110", "toml 0.8.23", "uuid", ] @@ -9346,7 +9344,7 @@ dependencies = [ "oximeter-timeseries-macro 0.1.0 (git+https://github.com/oxidecomputer/omicron?branch=main)", "oximeter-types 0.1.0 (git+https://github.com/oxidecomputer/omicron?branch=main)", "prettyplease", - "syn 2.0.106", + "syn 2.0.110", "toml 0.8.23", "uuid", ] @@ -9456,7 +9454,7 @@ dependencies = [ "gethostname", "highway", "iana-time-zone", - "indexmap 2.11.4", + "indexmap 2.12.0", "itertools 0.14.0", "libc", "nom", @@ -9529,7 +9527,7 @@ dependencies = [ "omicron-workspace-hack", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9540,7 +9538,7 @@ dependencies = [ "omicron-workspace-hack", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9585,7 +9583,7 @@ dependencies = [ "schemars 0.8.22", "serde", "slog-error-chain", - "syn 2.0.106", + "syn 2.0.110", "toml 0.8.23", ] @@ -9606,7 +9604,7 @@ dependencies = [ "schemars 0.8.22", "serde", "slog-error-chain", - "syn 2.0.106", + "syn 2.0.110", "toml 0.8.23", ] @@ -9635,7 +9633,7 @@ dependencies = [ "oximeter-types 0.1.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9648,7 +9646,7 @@ dependencies = [ "oximeter-types 0.1.0 (git+https://github.com/oxidecomputer/omicron?branch=main)", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9920,7 +9918,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10098,7 +10096,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10118,7 +10116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_derive", ] @@ -10131,7 +10129,7 @@ checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ "fixedbitset 0.5.7", "hashbrown 0.15.4", - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", ] @@ -10201,7 +10199,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10547,7 +10545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10621,7 +10619,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10719,7 +10717,7 @@ checksum = "d85934a440963a69f9f04f48507ff6e7aa2952a5b2d8f96cc37fa3dd5c270f66" dependencies = [ "heck 0.5.0", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "openapiv3", "proc-macro2", "quote", @@ -10727,7 +10725,7 @@ dependencies = [ "schemars 0.8.22", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 1.0.69", "typify 0.2.0", "unicode-ident", @@ -10741,7 +10739,7 @@ checksum = "b17e5363daa50bf1cccfade6b0fb970d2278758fd5cfa9ab69f25028e4b1afa3" dependencies = [ "heck 0.5.0", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "openapiv3", "proc-macro2", "quote", @@ -10749,7 +10747,7 @@ dependencies = [ "schemars 0.8.22", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 2.0.17", "typify 0.4.3", "unicode-ident", @@ -10763,7 +10761,7 @@ checksum = "90f6d9109b04e005bbdec84cacec7e81cc15533f2b5dc505f0defc212d270c15" dependencies = [ "heck 0.5.0", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "openapiv3", "proc-macro2", "quote", @@ -10771,7 +10769,7 @@ dependencies = [ "schemars 0.8.22", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 2.0.17", "typify 0.4.3", "unicode-ident", @@ -10792,7 +10790,7 @@ dependencies = [ "serde_json", "serde_tokenstream", "serde_yaml", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10810,7 +10808,7 @@ dependencies = [ "serde_json", "serde_tokenstream", "serde_yaml", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10828,7 +10826,7 @@ dependencies = [ "serde_json", "serde_tokenstream", "serde_yaml", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11445,7 +11443,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11698,7 +11696,7 @@ dependencies = [ "regex", "relative-path", "rustc_version 0.4.1", - "syn 2.0.106", + "syn 2.0.110", "unicode-ident", ] @@ -12176,7 +12174,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12252,7 +12250,7 @@ checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12263,7 +12261,7 @@ checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12373,9 +12371,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -12407,7 +12405,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" dependencies = [ - "erased-serde", + "erased-serde 0.4.6", "serde", "typeid", ] @@ -12444,22 +12442,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12470,7 +12468,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12497,12 +12495,13 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -12532,7 +12531,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12546,11 +12545,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -12562,7 +12561,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12587,7 +12586,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.12.0", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -12606,7 +12605,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12615,7 +12614,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -13091,9 +13090,15 @@ dependencies = [ [[package]] name = "slog" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" +checksum = "9b3b8565691b22d2bdfc066426ed48f837fc0c5f2c8cad8d9718f7f99d6995c1" +dependencies = [ + "anyhow", + "erased-serde 0.3.31", + "rustversion", + "serde_core", +] [[package]] name = "slog-async" @@ -13164,7 +13169,7 @@ source = "git+https://github.com/oxidecomputer/slog-error-chain?branch=main#15f6 dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13303,7 +13308,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13447,7 +13452,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13589,7 +13594,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13600,7 +13605,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13644,7 +13649,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13656,7 +13661,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13747,9 +13752,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -13779,7 +13784,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13858,7 +13863,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -13871,7 +13876,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14022,7 +14027,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14083,7 +14088,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14094,7 +14099,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14241,7 +14246,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14287,22 +14292,19 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "slab", "socket2 0.6.0", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] @@ -14318,13 +14320,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14473,14 +14475,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap 2.12.0", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", "toml_writer", "winnow 0.7.13", @@ -14497,11 +14499,11 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -14510,7 +14512,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -14523,7 +14525,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -14533,9 +14535,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow 0.7.13", ] @@ -14548,9 +14550,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "topological-sort" @@ -14679,7 +14681,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14729,7 +14731,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -14957,7 +14959,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 0.9.5", + "toml 0.9.8", ] [[package]] @@ -15173,7 +15175,7 @@ dependencies = [ "semver 1.0.27", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 1.0.69", "unicode-ident", ] @@ -15193,7 +15195,7 @@ dependencies = [ "semver 1.0.27", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 2.0.17", "unicode-ident", ] @@ -15211,7 +15213,7 @@ dependencies = [ "serde", "serde_json", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "typify-impl 0.2.0", ] @@ -15228,7 +15230,7 @@ dependencies = [ "serde", "serde_json", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "typify-impl 0.4.3", ] @@ -15411,7 +15413,7 @@ dependencies = [ "either", "futures", "indent_write", - "indexmap 2.11.4", + "indexmap 2.12.0", "indicatif 0.18.0", "indoc 2.0.6", "libsw", @@ -15486,7 +15488,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "usdt-impl 0.5.0", ] @@ -15500,7 +15502,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "usdt-impl 0.6.0", ] @@ -15518,7 +15520,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 1.0.69", "thread-id 4.2.2", "version_check", @@ -15538,7 +15540,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "thiserror 2.0.17", "thread-id 5.0.0", ] @@ -15553,7 +15555,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "usdt-impl 0.5.0", ] @@ -15567,7 +15569,7 @@ dependencies = [ "proc-macro2", "quote", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.110", "usdt-impl 0.6.0", ] @@ -15820,7 +15822,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "wasm-bindgen-shared", ] @@ -15854,7 +15856,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -15948,7 +15950,7 @@ dependencies = [ "futures", "hex", "humantime", - "indexmap 2.11.4", + "indexmap 2.12.0", "indicatif 0.18.0", "itertools 0.14.0", "maplit", @@ -16255,7 +16257,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16266,7 +16268,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16365,6 +16367,15 @@ dependencies = [ "windows-targets 0.53.2", ] +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -16738,7 +16749,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure", ] @@ -16779,7 +16790,7 @@ checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16790,7 +16801,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16801,7 +16812,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16821,7 +16832,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure", ] @@ -16842,7 +16853,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16864,7 +16875,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -16909,7 +16920,7 @@ dependencies = [ "bzip2 0.5.2", "crc32fast", "flate2", - "indexmap 2.11.4", + "indexmap 2.12.0", "jiff", "memchr", "zopfli", diff --git a/Cargo.toml b/Cargo.toml index f550e423009..87f8d330d29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -441,9 +441,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 = "cc8e02a0800034c431c8cf96b889ea638da3d194" } -dropshot = { version = "0.16.3", features = [ "usdt-probes" ] } -dropshot-api-manager = "0.2.3" -dropshot-api-manager-types = "0.2.3" +dropshot = { version = "0.16.5", features = [ "usdt-probes" ] } +dropshot-api-manager = "0.2.4" +dropshot-api-manager-types = "0.2.4" dyn-clone = "1.0.20" either = "1.15.0" ereport-types = { path = "ereport/types" } diff --git a/clients/oxide-client/src/lib.rs b/clients/oxide-client/src/lib.rs index 367c2b4adf1..e2190fecbae 100644 --- a/clients/oxide-client/src/lib.rs +++ b/clients/oxide-client/src/lib.rs @@ -17,7 +17,7 @@ use std::sync::Arc; use thiserror::Error; progenitor::generate_api!( - spec = "../../openapi/nexus.json", + spec = "../../openapi/nexus/nexus-latest.json", interface = Builder, tags = Separate, ); diff --git a/dev-tools/dropshot-apis/src/main.rs b/dev-tools/dropshot-apis/src/main.rs index 56ec9253fdc..1e3aa18bec5 100644 --- a/dev-tools/dropshot-apis/src/main.rs +++ b/dev-tools/dropshot-apis/src/main.rs @@ -192,9 +192,9 @@ fn all_apis() -> anyhow::Result { }, ManagedApiConfig { title: "Oxide Region API", - versions: Versions::new_lockstep(semver::Version::new( - 20251208, 0, 0, - )), + versions: Versions::new_versioned( + nexus_external_api::supported_versions(), + ), metadata: ManagedApiMetadata { description: Some( "API for interacting with the Oxide control plane", diff --git a/nexus/external-api/src/lib.rs b/nexus/external-api/src/lib.rs index 8901f5d889c..0f742d8ef7f 100644 --- a/nexus/external-api/src/lib.rs +++ b/nexus/external-api/src/lib.rs @@ -14,7 +14,7 @@ use dropshot::{ Query, RequestContext, ResultsPage, StreamingBody, TypedBody, WebsocketChannelResult, WebsocketConnection, }; -use dropshot_api_manager_types::ValidationContext; +use dropshot_api_manager_types::{ValidationContext, api_versions}; use http::Response; use ipnetwork::IpNetwork; use nexus_types::{ @@ -33,7 +33,44 @@ use omicron_common::api::external::{ }; use openapiv3::OpenAPI; -pub const API_VERSION: &str = "20251208.0.0"; +api_versions!([ + // API versions are in the format YYYYMMDDNN.0.0, defined below as + // YYYYMMDDNN. Here, NN is a two-digit number starting at 00 for a + // particular date. + // + // WHEN CHANGING THE API (part 1 of 2): + // + // +- Take today's date in YYYYMMDD format, e.g. 20251112. + // | Find the smallest NN that isn't already defined in the list below. In + // | most cases, that is 00, but if 00 is already taken, use 01, 02, etc. + // | + // | Duplicate this line, uncomment the *second* copy, update that copy for + // | your new API version, and leave the first copy commented out as an + // | example for the next person. + // | + // | If there's a merge conflict, update the version number to the current + // | date. Otherwise, it is okay to leave the version number unchanged even + // | if you land your change on a different day from the one you make it on. + // | + // | Ensure that version numbers are sorted in descending order. (This macro + // | will panic at runtime if they're not in descending order.) The newest + // | date-based version should be at the top of the list. + // v + // (next_yyyymmddnn, IDENT), + (2025112000, INITIAL), +]); + +// WHEN CHANGING THE API (part 2 of 2): +// +// The call to `api_versions!` above defines constants of type +// `semver::Version` that you can use in your Dropshot API definition to specify +// the version when a particular endpoint was added or removed. For example, if +// you used: +// +// (2025120100, ADD_FOOBAR) +// +// Then you could use `VERSION_ADD_FOOBAR` as the version in which endpoints +// were added or removed. const MIB: usize = 1024 * 1024; const GIB: usize = 1024 * MIB; @@ -4366,32 +4403,31 @@ pub trait NexusExternalApi { /// Perform extra validations on the OpenAPI spec. pub fn validate_api(spec: &OpenAPI, mut cx: ValidationContext<'_>) { - if spec.openapi != "3.0.3" { - cx.report_error(anyhow!( - "Expected OpenAPI version to be 3.0.3, found {}", - spec.openapi, - )); - } - if spec.info.title != "Oxide Region API" { - cx.report_error(anyhow!( - "Expected OpenAPI version to be 'Oxide Region API', found '{}'", - spec.info.title, - )); - } - if spec.info.version != API_VERSION { - cx.report_error(anyhow!( - "Expected OpenAPI version to be '{}', found '{}'", - API_VERSION, - spec.info.version, - )); - } + let is_blessed = cx + .is_blessed() + .expect("this is a versioned API so is_blessed should always be Some"); - // Spot check a couple of items. - if spec.paths.paths.is_empty() { - cx.report_error(anyhow!("Expected at least one path in the spec")); - } - if spec.paths.paths.get("/v1/projects").is_none() { - cx.report_error(anyhow!("Expected a path for /v1/projects")); + if !is_blessed { + if spec.openapi != "3.0.3" { + cx.report_error(anyhow!( + "Expected OpenAPI version to be 3.0.3, found {}", + spec.openapi, + )); + } + if spec.info.title != "Oxide Region API" { + cx.report_error(anyhow!( + "Expected OpenAPI version to be 'Oxide Region API', found '{}'", + spec.info.title, + )); + } + + // Spot check a couple of items. + if spec.paths.paths.is_empty() { + cx.report_error(anyhow!("Expected at least one path in the spec")); + } + if spec.paths.paths.get("/v1/projects").is_none() { + cx.report_error(anyhow!("Expected a path for /v1/projects")); + } } // Construct a string that helps us identify the organization of tags and @@ -4417,10 +4453,12 @@ pub fn validate_api(spec: &OpenAPI, mut cx: ValidationContext<'_>) { // Every non-hidden endpoint must have a summary if op.tags.contains(&"console-auth".to_string()) && op.summary.is_none() { - cx.report_error(anyhow!( - "operation '{}' is missing a summary doc comment", - op.operation_id.as_ref().unwrap() - )); + if !is_blessed { + cx.report_error(anyhow!( + "operation '{}' is missing a summary doc comment", + op.operation_id.as_ref().unwrap() + )); + } // This error does not prevent `ops_by_tag` from being populated // correctly, so we can continue. } @@ -4435,7 +4473,9 @@ pub fn validate_api(spec: &OpenAPI, mut cx: ValidationContext<'_>) { )); } - if ops_by_tag_valid { + // nexus_tags.txt is unversioned, so only write it out for the latest + // version. + if cx.is_latest() && ops_by_tag_valid { let mut tags = String::new(); for (tag, mut ops) in ops_by_tag { ops.sort(); diff --git a/nexus/src/lib.rs b/nexus/src/lib.rs index a9524bb952d..c311fb71430 100644 --- a/nexus/src/lib.rs +++ b/nexus/src/lib.rs @@ -225,6 +225,18 @@ impl Server { log.new(o!("component" => "dropshot_external")), ) .config(config.deployment.dropshot_external.dropshot.clone()) + .version_policy(dropshot::VersionPolicy::Dynamic(Box::new( + dropshot::ClientSpecifiesVersionInHeader::new( + omicron_common::api::VERSION_HEADER, + nexus_external_api::latest_version(), + ) + // Since we don't have control over all clients to the external + // API, we allow the api-version header to not be specified + // (picking the latest version in that case). However, all + // clients that *are* under our control should specify the + // api-version header. + .on_missing(nexus_external_api::latest_version()), + ))) .tls(tls_config.clone().map(dropshot::ConfigTls::Dynamic)) .start() .map_err(|error| { diff --git a/nexus/test-utils/src/http_testing.rs b/nexus/test-utils/src/http_testing.rs index 61bacf99fe3..524676245ca 100644 --- a/nexus/test-utils/src/http_testing.rs +++ b/nexus/test-utils/src/http_testing.rs @@ -124,6 +124,11 @@ impl<'a> RequestBuilder<'a> { self } + /// Return the current header map. + pub fn headers(&self) -> &http::HeaderMap { + &self.headers + } + /// Set the outgoing request body /// /// If `body` is `None`, the request body will be empty. diff --git a/nexus/tests/integration_tests/updates.rs b/nexus/tests/integration_tests/updates.rs index 1792433153e..7cbcb93ea12 100644 --- a/nexus/tests/integration_tests/updates.rs +++ b/nexus/tests/integration_tests/updates.rs @@ -7,10 +7,12 @@ use camino::Utf8Path; use camino_tempfile::{Builder, Utf8TempPath}; use chrono::{DateTime, Duration, Timelike, Utc}; use dropshot::ResultsPage; +use dropshot::test_util::ClientTestContext; use http::{Method, StatusCode}; use nexus_db_model::SemverVersion; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::pub_test_utils::helpers::insert_test_tuf_repo; +use nexus_test_interface::NexusServer; use nexus_test_utils::background::activate_background_task; use nexus_test_utils::background::run_tuf_artifact_replication_step; use nexus_test_utils::background::wait_tuf_artifact_replication_step; @@ -1037,3 +1039,31 @@ async fn test_repo_list() -> Result<()> { cptestctx.teardown().await; Ok(()) } + +/// Test that a request without an API version header still succeeds. +/// +/// Unlike internal APIs, we don't control all clients for our external API, so +/// we make the api-version header optional. This test ensures that a request +/// without the header succeeds. +#[nexus_test] +async fn test_request_without_api_version(cptestctx: &ControlPlaneTestContext) { + // We can't use cptestctx.external_client directly since it always sets the + // header. Instead, construct a NexusRequest by hand. + let server_addr = cptestctx.server.get_http_server_external_address().await; + let test_cx = + ClientTestContext::new(server_addr, cptestctx.logctx.log.clone()); + let req_builder = RequestBuilder::new( + &test_cx, + http::Method::GET, + "/v1/system/update/status", + ); + assert_eq!( + req_builder.headers().get(&omicron_common::api::VERSION_HEADER), + None, + "api-version header is not set" + ); + let req = + NexusRequest::new(req_builder).authn_as(AuthnMode::PrivilegedUser); + let status: views::UpdateStatus = req.execute_and_parse_unwrap().await; + assert_eq!(status.target_release.0, None); +} diff --git a/openapi/nexus.json b/openapi/nexus/nexus-2025112000.0.0-53f3c8.json similarity index 99% rename from openapi/nexus.json rename to openapi/nexus/nexus-2025112000.0.0-53f3c8.json index 4a418f0d323..22a5372bbf8 100644 --- a/openapi/nexus.json +++ b/openapi/nexus/nexus-2025112000.0.0-53f3c8.json @@ -7,7 +7,7 @@ "url": "https://oxide.computer", "email": "api@oxide.computer" }, - "version": "20251208.0.0" + "version": "2025112000.0.0" }, "paths": { "/device/auth": { diff --git a/openapi/nexus/nexus-latest.json b/openapi/nexus/nexus-latest.json new file mode 120000 index 00000000000..63e07c8b3e8 --- /dev/null +++ b/openapi/nexus/nexus-latest.json @@ -0,0 +1 @@ +nexus-2025112000.0.0-53f3c8.json \ No newline at end of file diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index 5f0aeda12ab..c899225e597 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -69,10 +69,10 @@ hashbrown = { version = "0.16.0", default-features = false, features = ["allocat heck = { version = "0.4.1", features = ["unicode"] } hickory-proto = { version = "0.25.2", features = ["serde", "text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } -hyper = { version = "1.7.0", features = ["full"] } +hyper = { version = "1.8.1", features = ["full"] } iddqd = { version = "0.3.16", features = ["daft", "proptest", "schemars08"] } idna = { version = "1.0.3" } -indexmap = { version = "2.11.4", features = ["serde"] } +indexmap = { version = "2.12.0", features = ["serde"] } inout = { version = "0.1.3", default-features = false, features = ["std"] } ipnet = { version = "2.11.0", features = ["serde"] } ipnetwork = { version = "0.21.1", features = ["schemars", "serde"] } @@ -118,24 +118,24 @@ rustls-webpki = { version = "0.102.8", default-features = false, features = ["aw schemars = { version = "0.8.22", features = ["bytes", "chrono", "semver", "url", "uuid1"] } scopeguard = { version = "1.2.0" } semver = { version = "1.0.27", features = ["serde"] } -serde = { version = "1.0.226", features = ["alloc", "derive", "rc"] } -serde_core = { version = "1.0.226", features = ["alloc", "rc"] } +serde = { version = "1.0.228", features = ["alloc", "derive", "rc"] } +serde_core = { version = "1.0.228", features = ["alloc", "rc"] } serde_json = { version = "1.0.145", features = ["alloc", "raw_value", "unbounded_depth"] } serde_with = { version = "3.14.0" } sha1 = { version = "0.10.6", features = ["oid"] } sha2 = { version = "0.10.9", features = ["oid"] } sha3 = { version = "0.10.8", features = ["oid"] } similar = { version = "2.7.0", features = ["bytes", "inline", "unicode"] } -slog = { version = "2.7.0", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } +slog = { version = "2.8.2", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } smallvec = { version = "1.15.1", default-features = false, features = ["const_new"] } spin = { version = "0.9.8" } string_cache = { version = "0.8.9" } strum-2f80eeee3b1b6c7e = { package = "strum", version = "0.26.3", features = ["derive"] } strum-754bda37e0fb3874 = { package = "strum", version = "0.27.2", features = ["derive"] } subtle = { version = "2.6.1" } -syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.106", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } +syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.110", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } time = { version = "0.3.43", features = ["formatting", "local-offset", "macros", "parsing"] } -tokio = { version = "1.47.0", features = ["full", "test-util"] } +tokio = { version = "1.48.0", features = ["full", "test-util"] } tokio-postgres = { version = "0.7.13", features = ["with-chrono-0_4", "with-serde_json-1", "with-uuid-1"] } tokio-rustls = { version = "0.26.0", default-features = false, features = ["logging", "ring", "tls12"] } tokio-stream = { version = "0.1.17", features = ["net", "sync"] } @@ -145,14 +145,13 @@ toml_datetime = { version = "0.6.11", default-features = false, features = ["ser toml_edit-3c51e837cfc5589a = { package = "toml_edit", version = "0.22.27", features = ["serde"] } tracing = { version = "0.1.40", features = ["log"] } url = { version = "2.5.4", features = ["serde"] } -usdt = { version = "0.5.0" } +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.18.1", features = ["serde", "v4"] } winnow-ca01ad9e24f5d932 = { package = "winnow", version = "0.7.13" } x509-cert = { version = "0.2.5" } zerocopy-c38e5c1d305a1b54 = { package = "zerocopy", version = "0.8.27", default-features = false, features = ["derive", "simd"] } -zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } zeroize = { version = "1.8.1", features = ["std", "zeroize_derive"] } zip-164d15cefe24d7eb = { package = "zip", version = "4.2.0", default-features = false, features = ["bzip2", "deflate", "jiff-02", "zstd"] } zip-3b31131e45eafb45 = { package = "zip", version = "0.6.6", default-features = false, features = ["bzip2", "deflate"] } @@ -210,10 +209,10 @@ hashbrown = { version = "0.16.0", default-features = false, features = ["allocat heck = { version = "0.4.1", features = ["unicode"] } hickory-proto = { version = "0.25.2", features = ["serde", "text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } -hyper = { version = "1.7.0", features = ["full"] } +hyper = { version = "1.8.1", features = ["full"] } iddqd = { version = "0.3.16", features = ["daft", "proptest", "schemars08"] } idna = { version = "1.0.3" } -indexmap = { version = "2.11.4", features = ["serde"] } +indexmap = { version = "2.12.0", features = ["serde"] } inout = { version = "0.1.3", default-features = false, features = ["std"] } ipnet = { version = "2.11.0", features = ["serde"] } ipnetwork = { version = "0.21.1", features = ["schemars", "serde"] } @@ -259,15 +258,15 @@ rustls-webpki = { version = "0.102.8", default-features = false, features = ["aw schemars = { version = "0.8.22", features = ["bytes", "chrono", "semver", "url", "uuid1"] } scopeguard = { version = "1.2.0" } semver = { version = "1.0.27", features = ["serde"] } -serde = { version = "1.0.226", features = ["alloc", "derive", "rc"] } -serde_core = { version = "1.0.226", features = ["alloc", "rc"] } +serde = { version = "1.0.228", features = ["alloc", "derive", "rc"] } +serde_core = { version = "1.0.228", features = ["alloc", "rc"] } serde_json = { version = "1.0.145", features = ["alloc", "raw_value", "unbounded_depth"] } serde_with = { version = "3.14.0" } sha1 = { version = "0.10.6", features = ["oid"] } sha2 = { version = "0.10.9", features = ["oid"] } sha3 = { version = "0.10.8", features = ["oid"] } similar = { version = "2.7.0", features = ["bytes", "inline", "unicode"] } -slog = { version = "2.7.0", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } +slog = { version = "2.8.2", features = ["dynamic-keys", "max_level_trace", "release_max_level_debug", "release_max_level_trace"] } smallvec = { version = "1.15.1", default-features = false, features = ["const_new"] } spin = { version = "0.9.8" } string_cache = { version = "0.8.9" } @@ -275,10 +274,10 @@ strum-2f80eeee3b1b6c7e = { package = "strum", version = "0.26.3", features = ["d strum-754bda37e0fb3874 = { package = "strum", version = "0.27.2", features = ["derive"] } subtle = { version = "2.6.1" } syn-dff4ba8e3ae991db = { package = "syn", version = "1.0.109", features = ["extra-traits", "fold", "full", "visit"] } -syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.106", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } +syn-f595c2ba2a3f28df = { package = "syn", version = "2.0.110", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] } time = { version = "0.3.43", features = ["formatting", "local-offset", "macros", "parsing"] } time-macros = { version = "0.2.24", default-features = false, features = ["formatting", "parsing"] } -tokio = { version = "1.47.0", features = ["full", "test-util"] } +tokio = { version = "1.48.0", features = ["full", "test-util"] } tokio-postgres = { version = "0.7.13", features = ["with-chrono-0_4", "with-serde_json-1", "with-uuid-1"] } tokio-rustls = { version = "0.26.0", default-features = false, features = ["logging", "ring", "tls12"] } tokio-stream = { version = "0.1.17", features = ["net", "sync"] } @@ -288,7 +287,7 @@ toml_datetime = { version = "0.6.11", default-features = false, features = ["ser toml_edit-3c51e837cfc5589a = { package = "toml_edit", version = "0.22.27", features = ["serde"] } tracing = { version = "0.1.40", features = ["log"] } url = { version = "2.5.4", features = ["serde"] } -usdt = { version = "0.5.0" } +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.18.1", features = ["serde", "v4"] } @@ -297,7 +296,6 @@ vergen-lib = { version = "0.1.6", features = ["cargo", "git", "rustc"] } winnow-ca01ad9e24f5d932 = { package = "winnow", version = "0.7.13" } x509-cert = { version = "0.2.5" } zerocopy-c38e5c1d305a1b54 = { package = "zerocopy", version = "0.8.27", default-features = false, features = ["derive", "simd"] } -zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } zeroize = { version = "1.8.1", features = ["std", "zeroize_derive"] } zip-164d15cefe24d7eb = { package = "zip", version = "4.2.0", default-features = false, features = ["bzip2", "deflate", "jiff-02", "zstd"] } zip-3b31131e45eafb45 = { package = "zip", version = "0.6.6", default-features = false, features = ["bzip2", "deflate"] } @@ -309,12 +307,13 @@ dof-468e82937335b1c9 = { package = "dof", version = "0.3.0", default-features = dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = false, features = ["des"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } linux-raw-sys = { version = "0.4.14", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "std", "system", "xdp"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.0.7", features = ["fs", "stdio", "termios"] } +zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } [target.x86_64-unknown-linux-gnu.build-dependencies] bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-features = false, features = ["std"] } @@ -323,19 +322,20 @@ dof-468e82937335b1c9 = { package = "dof", version = "0.3.0", default-features = dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = false, features = ["des"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } linux-raw-sys = { version = "0.4.14", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "std", "system", "xdp"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.0.7", features = ["fs", "stdio", "termios"] } +zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } [target.x86_64-apple-darwin.dependencies] bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-features = false, features = ["std"] } cookie = { version = "0.18.1", default-features = false, features = ["percent-encode"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } @@ -346,7 +346,7 @@ bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-f cookie = { version = "0.18.1", default-features = false, features = ["percent-encode"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } @@ -357,7 +357,7 @@ bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-f cookie = { version = "0.18.1", default-features = false, features = ["percent-encode"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } @@ -368,7 +368,7 @@ bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-f cookie = { version = "0.18.1", default-features = false, features = ["percent-encode"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } mio = { version = "1.0.2", features = ["net", "os-ext"] } rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = ["event", "fs", "net", "pipe", "process", "stdio", "system", "termios", "time"] } @@ -381,7 +381,7 @@ dof-468e82937335b1c9 = { package = "dof", version = "0.3.0", default-features = dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = false, features = ["des"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12.1" } itertools-93f6ce9d446188ac = { package = "itertools", version = "0.10.5" } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } @@ -391,6 +391,7 @@ rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = [ rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.0.7", features = ["fs", "stdio", "termios"] } toml_edit-cdcf2f9584511fe6 = { package = "toml_edit", version = "0.19.15", features = ["serde"] } winnow-3b31131e45eafb45 = { package = "winnow", version = "0.6.26", features = ["simd"] } +zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } [target.x86_64-unknown-illumos.build-dependencies] bitflags-f595c2ba2a3f28df = { package = "bitflags", version = "2.9.4", default-features = false, features = ["std"] } @@ -400,7 +401,7 @@ dof-468e82937335b1c9 = { package = "dof", version = "0.3.0", default-features = dof-9fbad63c4bcf4a8f = { package = "dof", version = "0.4.0", default-features = false, features = ["des"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3.4", default-features = false, features = ["std"] } hyper-rustls = { version = "0.27.7", features = ["http2", "ring", "webpki-tokio"] } -hyper-util = { version = "0.1.17", features = ["full"] } +hyper-util = { version = "0.1.18", features = ["full"] } itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12.1" } itertools-93f6ce9d446188ac = { package = "itertools", version = "0.10.5" } miniz_oxide = { version = "0.8.5", default-features = false, features = ["with-alloc"] } @@ -410,5 +411,6 @@ rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38.37", features = [ rustix-dff4ba8e3ae991db = { package = "rustix", version = "1.0.7", features = ["fs", "stdio", "termios"] } toml_edit-cdcf2f9584511fe6 = { package = "toml_edit", version = "0.19.15", features = ["serde"] } winnow-3b31131e45eafb45 = { package = "winnow", version = "0.6.26", features = ["simd"] } +zerocopy-ca01ad9e24f5d932 = { package = "zerocopy", version = "0.7.35", features = ["derive", "simd"] } ### END HAKARI SECTION From 9d5f5774a52420088787346e6ab328a999d5524b Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 20 Nov 2025 14:16:07 -0800 Subject: [PATCH 2/4] fix test_unauthorized_coverage Created using spr 1.3.6-beta.1 --- nexus/tests/integration_tests/unauthorized_coverage.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nexus/tests/integration_tests/unauthorized_coverage.rs b/nexus/tests/integration_tests/unauthorized_coverage.rs index ae056a6044a..808d41e07b8 100644 --- a/nexus/tests/integration_tests/unauthorized_coverage.rs +++ b/nexus/tests/integration_tests/unauthorized_coverage.rs @@ -15,7 +15,7 @@ use std::collections::BTreeMap; #[test] fn test_unauthorized_coverage() { // Load the OpenAPI schema for Nexus's public API. - let schema_path = "../openapi/nexus.json"; + let schema_path = "../openapi/nexus/nexus-latest.json"; let schema_contents = std::fs::read_to_string(&schema_path) .expect("failed to read Nexus OpenAPI spec"); let spec: OpenAPI = serde_json::from_str(&schema_contents) From c7bdaa77e1904646bf80a80c8b61777bcdf76cdd Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 20 Nov 2025 14:18:47 -0800 Subject: [PATCH 3/4] update release branch instructions Created using spr 1.3.6-beta.1 --- nexus/external-api/src/lib.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nexus/external-api/src/lib.rs b/nexus/external-api/src/lib.rs index 0f742d8ef7f..ce31b482ba7 100644 --- a/nexus/external-api/src/lib.rs +++ b/nexus/external-api/src/lib.rs @@ -40,9 +40,13 @@ api_versions!([ // // WHEN CHANGING THE API (part 1 of 2): // - // +- Take today's date in YYYYMMDD format, e.g. 20251112. - // | Find the smallest NN that isn't already defined in the list below. In - // | most cases, that is 00, but if 00 is already taken, use 01, 02, etc. + // +- First, determine the next API version number to use. + // | + // | * On the main branch: Take today's date in YYYYMMDD format, e.g. 20251112. + // | Find the smallest NN that isn't already defined in the list below. In + // | most cases, that is 00, but if 00 is already taken, use 01, 02, etc. + // | + // | * On a release branch, don't alter the date. Instead, always bump the NN. // | // | Duplicate this line, uncomment the *second* copy, update that copy for // | your new API version, and leave the first copy commented out as an @@ -78,7 +82,7 @@ const DISK_BULK_WRITE_MAX_BYTES: usize = 8 * MIB; // Full release repositories are currently (Dec 2024) 1.8 GiB and are likely to // continue growing. const PUT_UPDATE_REPOSITORY_MAX_BYTES: usize = 4 * GIB; - +''' // API ENDPOINT FUNCTION NAMING CONVENTIONS // // Generally, HTTP resources are grouped within some collection. For a From 927835c80dfe6db6ced2ab39f393c9f198cefe80 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 20 Nov 2025 14:20:37 -0800 Subject: [PATCH 4/4] whoops Created using spr 1.3.6-beta.1 --- nexus/external-api/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nexus/external-api/src/lib.rs b/nexus/external-api/src/lib.rs index ce31b482ba7..e75189de218 100644 --- a/nexus/external-api/src/lib.rs +++ b/nexus/external-api/src/lib.rs @@ -82,7 +82,7 @@ const DISK_BULK_WRITE_MAX_BYTES: usize = 8 * MIB; // Full release repositories are currently (Dec 2024) 1.8 GiB and are likely to // continue growing. const PUT_UPDATE_REPOSITORY_MAX_BYTES: usize = 4 * GIB; -''' + // API ENDPOINT FUNCTION NAMING CONVENTIONS // // Generally, HTTP resources are grouped within some collection. For a