From 0f8e58394443e58a14fbb77fdaa08f0298c43d3b Mon Sep 17 00:00:00 2001 From: Rain Date: Wed, 21 Jan 2026 23:37:57 +0000 Subject: [PATCH 1/4] remove v3 to v1 conversions Created using spr 1.3.6-beta.1 --- .../src/nvme_model_number/instance_spec.rs | 25 ------------------- crates/propolis-server-api/src/lib.rs | 2 +- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs b/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs index 09a0a633f..4c05b416a 100644 --- a/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs +++ b/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs @@ -203,19 +203,6 @@ impl From for v2::instance_spec::InstanceSpec { } // Conversions for InstanceSpecStatus. -impl From for v1::instance_spec::InstanceSpecStatus { - fn from(new: InstanceSpecStatus) -> Self { - match new { - InstanceSpecStatus::WaitingForMigrationSource => { - Self::WaitingForMigrationSource - } - InstanceSpecStatus::Present(spec) => Self::Present( - v1::instance_spec::VersionedInstanceSpec::V0(spec.into()), - ), - } - } -} - impl From for v2::instance_spec::InstanceSpecStatus { fn from(new: InstanceSpecStatus) -> Self { match new { @@ -241,18 +228,6 @@ impl From for InstanceSpecStatus { } // Conversions for InstanceSpecGetResponse. -impl From - for v1::instance_spec::InstanceSpecGetResponse -{ - fn from(new: InstanceSpecGetResponse) -> Self { - Self { - properties: new.properties, - state: new.state, - spec: new.spec.into(), - } - } -} - impl From for v2::instance_spec::InstanceSpecGetResponse { diff --git a/crates/propolis-server-api/src/lib.rs b/crates/propolis-server-api/src/lib.rs index 24eb2b990..c9c26affa 100644 --- a/crates/propolis-server-api/src/lib.rs +++ b/crates/propolis-server-api/src/lib.rs @@ -137,7 +137,7 @@ pub trait PropolisServerApi { HttpResponseOk, HttpError, > { - Ok(Self::instance_spec_get(rqctx) + Ok(Self::instance_spec_get_v2(rqctx) .await? .map(v1::instance_spec::InstanceSpecGetResponse::from)) } From 15f65b4a1e7e4fdcbf934b678bbdd3f11122b35f Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 22 Jan 2026 00:02:18 +0000 Subject: [PATCH 2/4] get phd-tests compiling Created using spr 1.3.6-beta.1 --- Cargo.lock | 1 + bin/mock-server/Cargo.toml | 1 + phd-tests/framework/src/test_vm/config.rs | 47 +++++++++++++---------- phd-tests/framework/src/test_vm/mod.rs | 6 +-- phd-tests/framework/src/test_vm/spec.rs | 6 +-- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f947a2461..49d00439c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5482,6 +5482,7 @@ dependencies = [ "propolis_api_types", "propolis_types", "rand 0.9.2", + "regress", "reqwest", "schemars", "semver 1.0.27", diff --git a/bin/mock-server/Cargo.toml b/bin/mock-server/Cargo.toml index d7e22e217..8356c2eba 100644 --- a/bin/mock-server/Cargo.toml +++ b/bin/mock-server/Cargo.toml @@ -45,6 +45,7 @@ tokio-tungstenite.workspace = true # internal dependencies (like crucible-client-types). Although we are not # using the client itself, its deps (reqwest, etc) are required. progenitor.workspace = true +regress.workspace = true reqwest.workspace = true schemars.workspace = true rand.workspace = true diff --git a/phd-tests/framework/src/test_vm/config.rs b/phd-tests/framework/src/test_vm/config.rs index 3be06080c..4f4336ef5 100644 --- a/phd-tests/framework/src/test_vm/config.rs +++ b/phd-tests/framework/src/test_vm/config.rs @@ -324,36 +324,42 @@ impl<'dr> VmConfig<'dr> { ), pci_path, }), - DiskInterface::Nvme => ComponentV0::NvmeDisk(NvmeDisk { - backend_id: SpecKey::Name( - backend_name.clone().into_string(), - ), - pci_path, - serial_number: nvme_serial_from_str( - device_name.as_str(), - // Omicron supplies (or will supply, as of this writing) - // 0 as the padding byte to maintain compatibility for - // existing disks. Match that behavior here so that PHD - // and Omicron VM configurations are as similar as - // possible. - 0, - ), - }), + DiskInterface::Nvme => { + let nvme = NvmeDisk { + backend_id: SpecKey::Name( + backend_name.clone().into_string(), + ), + pci_path, + serial_number: nvme_serial_from_str( + device_name.as_str(), + // Omicron supplies (or will supply, as of this writing) + // 0 as the padding byte to maintain compatibility for + // existing disks. Match that behavior here so that PHD + // and Omicron VM configurations are as similar as + // possible. + 0, + ), + // TODO: populate model_number + model_number: [0u8; 40], + }; + ComponentV0::NvmeDisk(nvme.into()) + } }; let _old = spec .components - .insert(device_name.into_string().into(), device_spec); + .insert(device_name.into_string().into(), device_spec.into()); assert!(_old.is_none()); let _old = spec .components - .insert(backend_name.into_string().into(), backend_spec); + .insert(backend_name.into_string().into(), backend_spec.into()); assert!(_old.is_none()); } let _old = spec.components.insert( "com1".into(), - ComponentV0::SerialPort(SerialPort { num: SerialPortNumber::Com1 }), + ComponentV0::SerialPort(SerialPort { num: SerialPortNumber::Com1 }) + .into(), ); assert!(_old.is_none()); @@ -367,7 +373,8 @@ impl<'dr> VmConfig<'dr> { id: SpecKey::Name(item.to_string()), }) .collect(), - }), + }) + .into(), ); assert!(_old.is_none()); } @@ -375,7 +382,7 @@ impl<'dr> VmConfig<'dr> { if let Some(mig) = migration_failure.as_ref() { let _old = spec.components.insert( "migration-failure".into(), - ComponentV0::MigrationFailureInjector(mig.clone()), + ComponentV0::MigrationFailureInjector(mig.clone()).into(), ); assert!(_old.is_none()); } diff --git a/phd-tests/framework/src/test_vm/mod.rs b/phd-tests/framework/src/test_vm/mod.rs index 132483077..a866e2f12 100644 --- a/phd-tests/framework/src/test_vm/mod.rs +++ b/phd-tests/framework/src/test_vm/mod.rs @@ -28,7 +28,7 @@ use camino::Utf8PathBuf; use core::result::Result as StdResult; use propolis_client::{ instance_spec::{ - ComponentV0, InstanceProperties, InstanceSpecGetResponse, + Component, InstanceProperties, InstanceSpecGetResponse, ReplacementComponent, }, support::{InstanceSerialConsoleHelper, WSClientOffset}, @@ -602,7 +602,7 @@ impl TestVm { let mut map = ReplacementComponents::new(); for (id, comp) in &self.spec.instance_spec().components { match comp { - ComponentV0::MigrationFailureInjector(inj) => { + Component::MigrationFailureInjector(inj) => { map.insert( id.to_string(), ReplacementComponent::MigrationFailureInjector( @@ -610,7 +610,7 @@ impl TestVm { ), ); } - ComponentV0::CrucibleStorageBackend(be) => { + Component::CrucibleStorageBackend(be) => { map.insert( id.to_string(), ReplacementComponent::CrucibleStorageBackend( diff --git a/phd-tests/framework/src/test_vm/spec.rs b/phd-tests/framework/src/test_vm/spec.rs index b755156f8..4cf0091e0 100644 --- a/phd-tests/framework/src/test_vm/spec.rs +++ b/phd-tests/framework/src/test_vm/spec.rs @@ -10,7 +10,7 @@ use crate::{ }; use camino::Utf8PathBuf; use propolis_client::instance_spec::{ - ComponentV0, InstanceMetadata, InstanceSpec, + Component, InstanceMetadata, InstanceSpec, }; use uuid::Uuid; @@ -90,10 +90,10 @@ impl VmSpec { .into_backend_name() .into_string() .into(); - if let Some(ComponentV0::CrucibleStorageBackend(_)) = + if let Some(Component::CrucibleStorageBackend(_)) = spec.components.get(&backend_name) { - spec.components.insert(backend_name, backend_spec); + spec.components.insert(backend_name, backend_spec.into()); } } } From 0edc814e13a6268bd42b624f935a43ddfdee1436 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 22 Jan 2026 00:10:49 +0000 Subject: [PATCH 3/4] drop regress requirement Created using spr 1.3.6-beta.1 --- Cargo.lock | 2 -- Cargo.toml | 1 - bin/mock-server/Cargo.toml | 1 - bin/mock-server/src/lib/api_types.rs | 1 + lib/propolis-client/Cargo.toml | 1 - lib/propolis-client/src/lib.rs | 1 + 6 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49d00439c..c466d5f3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5428,7 +5428,6 @@ dependencies = [ "progenitor-client 0.10.0", "propolis-api-types-versions", "rand 0.9.2", - "regress", "reqwest", "schemars", "serde", @@ -5482,7 +5481,6 @@ dependencies = [ "propolis_api_types", "propolis_types", "rand 0.9.2", - "regress", "reqwest", "schemars", "semver 1.0.27", diff --git a/Cargo.toml b/Cargo.toml index 95ddaf960..77b0d25c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -151,7 +151,6 @@ progenitor-client = "0.10.0" proptest = "1.5.0" quote = "1.0" rand = "0.9.1" -regress = "0.10" reqwest = { version = "0.12.0", default-features = false } ring = "0.17" ron = "0.8" diff --git a/bin/mock-server/Cargo.toml b/bin/mock-server/Cargo.toml index 8356c2eba..d7e22e217 100644 --- a/bin/mock-server/Cargo.toml +++ b/bin/mock-server/Cargo.toml @@ -45,7 +45,6 @@ tokio-tungstenite.workspace = true # internal dependencies (like crucible-client-types). Although we are not # using the client itself, its deps (reqwest, etc) are required. progenitor.workspace = true -regress.workspace = true reqwest.workspace = true schemars.workspace = true rand.workspace = true diff --git a/bin/mock-server/src/lib/api_types.rs b/bin/mock-server/src/lib/api_types.rs index 870ffc01b..ad9268ec6 100644 --- a/bin/mock-server/src/lib/api_types.rs +++ b/bin/mock-server/src/lib/api_types.rs @@ -9,6 +9,7 @@ progenitor::generate_api!( spec = "../../openapi/propolis-server/propolis-server-latest.json", derives = [schemars::JsonSchema], replace = { + NvmeDisk = propolis_api_types_versions::latest::components::devices::NvmeDisk, SpecKey = propolis_api_types_versions::latest::instance_spec::SpecKey, }, patch = { diff --git a/lib/propolis-client/Cargo.toml b/lib/propolis-client/Cargo.toml index 396af0cb6..c52e67fa5 100644 --- a/lib/propolis-client/Cargo.toml +++ b/lib/propolis-client/Cargo.toml @@ -15,7 +15,6 @@ progenitor.workspace = true progenitor-client.workspace = true propolis-api-types-versions.workspace = true rand.workspace = true -regress.workspace = true reqwest = { workspace = true, features = ["json", "rustls-tls"] } schemars = { workspace = true, features = ["uuid1"] } serde = { workspace = true, features = ["derive"] } diff --git a/lib/propolis-client/src/lib.rs b/lib/propolis-client/src/lib.rs index f64085bc2..1afe08f2c 100644 --- a/lib/propolis-client/src/lib.rs +++ b/lib/propolis-client/src/lib.rs @@ -53,6 +53,7 @@ progenitor::generate_api!( InstanceProperties = propolis_api_types_versions::latest::instance::InstanceProperties, InstanceMetadata = propolis_api_types_versions::latest::instance::InstanceMetadata, InstanceSpecGetResponse = propolis_api_types_versions::latest::instance_spec::InstanceSpecGetResponse, + NvmeDisk = propolis_api_types_versions::latest::components::devices::NvmeDisk, SmbiosType1Input = propolis_api_types_versions::latest::instance_spec::SmbiosType1Input, VersionedInstanceSpec = propolis_api_types_versions::latest::instance_spec::VersionedInstanceSpec, CpuidEntry = propolis_api_types_versions::latest::components::board::CpuidEntry, From 5b0d34ea1a6f6ab5665184e7f8705bfe152bc258 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 22 Jan 2026 00:13:59 +0000 Subject: [PATCH 4/4] remove redundant conversions Created using spr 1.3.6-beta.1 --- .../src/nvme_model_number/instance_spec.rs | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs b/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs index 4c05b416a..6b1afae2c 100644 --- a/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs +++ b/crates/propolis-api-types-versions/src/nvme_model_number/instance_spec.rs @@ -143,21 +143,6 @@ impl From for v1::instance_spec::Component { } } -// Conversions from v1 InstanceSpec to v3 InstanceSpec. -impl From for InstanceSpec { - fn from(old: v1::instance_spec::InstanceSpec) -> Self { - Self { - board: old.board, - components: old - .components - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - smbios: None, - } - } -} - // Conversions from v2 InstanceSpec to v3 InstanceSpec. impl From for InstanceSpec { fn from(old: v2::instance_spec::InstanceSpec) -> Self { @@ -173,20 +158,6 @@ impl From for InstanceSpec { } } -// Conversions from v3 InstanceSpec to v1 InstanceSpec. -impl From for v1::instance_spec::InstanceSpec { - fn from(new: InstanceSpec) -> Self { - Self { - board: new.board, - components: new - .components - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - } - } -} - // Conversions from v3 InstanceSpec to v2 InstanceSpec. impl From for v2::instance_spec::InstanceSpec { fn from(new: InstanceSpec) -> Self {