Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ hyper = "1.6.0"
hyper-util = "0.1.16"
hyper-rustls = "0.27.7"
hyper-staticfile = "0.10.1"
iddqd = { version = "0.3.13", features = ["daft", "serde", "schemars08"] }
iddqd = { version = "0.3.16", features = ["daft", "serde", "schemars08"] }
id-map = { path = "id-map" }
illumos-utils = { path = "illumos-utils" }
iana-time-zone = "0.1.63"
Expand Down
1 change: 0 additions & 1 deletion common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ futures.workspace = true
hex.workspace = true
http.workspace = true
iddqd.workspace = true
id-map.workspace = true
ipnetwork.workspace = true
lldp_protocol.workspace = true
macaddr.workspace = true
Expand Down
19 changes: 12 additions & 7 deletions common/src/disk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
use anyhow::bail;
use camino::{Utf8Path, Utf8PathBuf};
use daft::Diffable;
use id_map::IdMappable;
use iddqd::IdOrdItem;
use iddqd::id_upcast;
use omicron_uuid_kinds::DatasetUuid;
use omicron_uuid_kinds::PhysicalDiskUuid;
use omicron_uuid_kinds::ZpoolUuid;
Expand Down Expand Up @@ -44,12 +45,14 @@ pub struct OmicronPhysicalDiskConfig {
pub pool_id: ZpoolUuid,
}

impl IdMappable for OmicronPhysicalDiskConfig {
type Id = PhysicalDiskUuid;
impl IdOrdItem for OmicronPhysicalDiskConfig {
type Key<'a> = PhysicalDiskUuid;

fn id(&self) -> Self::Id {
fn key(&self) -> Self::Key<'_> {
self.id
}

id_upcast!();
}

#[derive(
Expand Down Expand Up @@ -410,12 +413,14 @@ pub struct DatasetConfig {
pub inner: SharedDatasetConfig,
}

impl IdMappable for DatasetConfig {
type Id = DatasetUuid;
impl IdOrdItem for DatasetConfig {
type Key<'a> = DatasetUuid;

fn id(&self) -> Self::Id {
fn key(&self) -> Self::Key<'_> {
self.id
}

id_upcast!();
}

#[derive(
Expand Down
1 change: 0 additions & 1 deletion nexus-sled-agent-shared/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ workspace = true
camino.workspace = true
chrono.workspace = true
daft.workspace = true
id-map.workspace = true
iddqd.workspace = true
illumos-utils.workspace = true
indent_write.workspace = true
Expand Down
31 changes: 19 additions & 12 deletions nexus-sled-agent-shared/src/inventory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ use std::time::Duration;
use camino::Utf8PathBuf;
use chrono::{DateTime, Utc};
use daft::Diffable;
use id_map::IdMap;
use id_map::IdMappable;
use iddqd::IdOrdItem;
use iddqd::IdOrdMap;
use iddqd::id_upcast;
Expand Down Expand Up @@ -406,7 +404,7 @@ pub enum ConfigReconcilerInventoryStatus {
NotYetRun,
/// The reconciler task is actively running.
Running {
config: OmicronSledConfig,
config: Box<OmicronSledConfig>,
started_at: DateTime<Utc>,
running_for: Duration,
},
Expand Down Expand Up @@ -1030,9 +1028,16 @@ impl HostPhase2DesiredSlots {
#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
pub struct OmicronSledConfig {
pub generation: Generation,
pub disks: IdMap<OmicronPhysicalDiskConfig>,
pub datasets: IdMap<DatasetConfig>,
pub zones: IdMap<OmicronZoneConfig>,
// Serialize and deserialize disks, datasets, and zones as maps for
// backwards compatibility. Newer IdOrdMaps should not use IdOrdMapAsMap.
#[serde(
with = "iddqd::id_ord_map::IdOrdMapAsMap::<OmicronPhysicalDiskConfig>"
)]
pub disks: IdOrdMap<OmicronPhysicalDiskConfig>,
#[serde(with = "iddqd::id_ord_map::IdOrdMapAsMap::<DatasetConfig>")]
pub datasets: IdOrdMap<DatasetConfig>,
#[serde(with = "iddqd::id_ord_map::IdOrdMapAsMap::<OmicronZoneConfig>")]
pub zones: IdOrdMap<OmicronZoneConfig>,
pub remove_mupdate_override: Option<MupdateOverrideUuid>,
#[serde(default = "HostPhase2DesiredSlots::current_contents")]
pub host_phase_2: HostPhase2DesiredSlots,
Expand All @@ -1042,9 +1047,9 @@ impl Default for OmicronSledConfig {
fn default() -> Self {
Self {
generation: Generation::new(),
disks: IdMap::default(),
datasets: IdMap::default(),
zones: IdMap::default(),
disks: IdOrdMap::default(),
datasets: IdOrdMap::default(),
zones: IdOrdMap::default(),
remove_mupdate_override: None,
host_phase_2: HostPhase2DesiredSlots::current_contents(),
}
Expand Down Expand Up @@ -1107,12 +1112,14 @@ pub struct OmicronZoneConfig {
pub image_source: OmicronZoneImageSource,
}

impl IdMappable for OmicronZoneConfig {
type Id = OmicronZoneUuid;
impl IdOrdItem for OmicronZoneConfig {
type Key<'a> = OmicronZoneUuid;

fn id(&self) -> Self::Id {
fn key(&self) -> Self::Key<'_> {
self.id
}

id_upcast!();
}

impl OmicronZoneConfig {
Expand Down
2 changes: 1 addition & 1 deletion nexus/db-model/src/inventory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -970,7 +970,7 @@ impl InvConfigReconcilerStatus {
let config = get_config(&config_id.into())
.context("missing sled config we should have fetched")?;
ConfigReconcilerInventoryStatus::Running {
config,
config: Box::new(config),
started_at: self.reconciler_status_timestamp.context(
"missing reconciler status timestamp \
for kind 'running'",
Expand Down
18 changes: 9 additions & 9 deletions nexus/db-queries/src/db/datastore/inventory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3150,9 +3150,9 @@ impl DataStore {
remove_mupdate_override: sled_config
.remove_mupdate_override
.map(From::from),
disks: IdMap::default(),
datasets: IdMap::default(),
zones: IdMap::default(),
disks: IdOrdMap::default(),
datasets: IdOrdMap::default(),
zones: IdOrdMap::default(),
host_phase_2: sled_config.host_phase_2.into(),
},
});
Expand Down Expand Up @@ -3268,7 +3268,7 @@ impl DataStore {
.map_err(|e| {
Error::internal_error(&format!("{:#}", e.to_string()))
})?;
config_with_id.config.zones.insert(zone);
config_with_id.config.zones.insert_overwrite(zone);
}

bail_unless!(
Expand Down Expand Up @@ -3309,7 +3309,7 @@ impl DataStore {
row.id, row.sled_config_id
))
})?;
config_with_id.config.datasets.insert(
config_with_id.config.datasets.insert_overwrite(
row.try_into().map_err(|e| {
Error::internal_error(&format!("{e:#}"))
})?,
Expand Down Expand Up @@ -3350,7 +3350,7 @@ impl DataStore {
row.id, row.sled_config_id
))
})?;
config_with_id.config.disks.insert(row.into());
config_with_id.config.disks.insert_overwrite(row.into());
}
}
}
Expand Down Expand Up @@ -4302,11 +4302,11 @@ impl ConfigReconcilerRows {
// If this config exactly matches the ledgered or
// most-recently-reconciled configs, we can reuse those IDs.
// Otherwise, accumulate a new one.
let reconciler_status_sled_config = if Some(config)
let reconciler_status_sled_config = if Some(&**config)
== sled_agent.ledgered_sled_config.as_ref()
{
ledgered_sled_config
} else if Some(config)
} else if Some(&**config)
== sled_agent
.last_reconciliation
.as_ref()
Expand Down Expand Up @@ -5255,7 +5255,7 @@ mod test {
sa1.last_reconciliation = None;

sa2.reconciler_status = ConfigReconcilerInventoryStatus::Running {
config: sa2.ledgered_sled_config.clone().unwrap(),
config: Box::new(sa2.ledgered_sled_config.clone().unwrap()),
started_at: now_db_precision(),
running_for: Duration::from_secs(1),
};
Expand Down
27 changes: 14 additions & 13 deletions nexus/inventory/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,8 @@ mod test {
use super::Collector;
use crate::StaticSledAgentEnumerator;
use gateway_messages::SpPort;
use id_map::IdMap;
use iddqd::IdOrdMap;
use iddqd::id_ord_map;
use nexus_sled_agent_shared::inventory::ConfigReconcilerInventoryStatus;
use nexus_sled_agent_shared::inventory::HostPhase2DesiredSlots;
use nexus_sled_agent_shared::inventory::OmicronSledConfig;
Expand Down Expand Up @@ -989,18 +990,18 @@ mod test {
client
.omicron_config_put(&OmicronSledConfig {
generation: Generation::from(3),
disks: IdMap::default(),
datasets: IdMap::default(),
zones: [OmicronZoneConfig {
id: zone_id,
zone_type: OmicronZoneType::Oximeter {
address: zone_address,
},
filesystem_pool: Some(filesystem_pool),
image_source: OmicronZoneImageSource::InstallDataset,
}]
.into_iter()
.collect(),
disks: IdOrdMap::default(),
datasets: IdOrdMap::default(),
zones: id_ord_map! {
OmicronZoneConfig {
id: zone_id,
zone_type: OmicronZoneType::Oximeter {
address: zone_address,
},
filesystem_pool: Some(filesystem_pool),
image_source: OmicronZoneImageSource::InstallDataset,
}
},
remove_mupdate_override: None,
host_phase_2: HostPhase2DesiredSlots::current_contents(),
})
Expand Down
34 changes: 20 additions & 14 deletions nexus/inventory/src/examples.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,11 +501,14 @@ pub fn representative() -> Representative {
let mut zpools = Vec::new();
for disk in &disks {
let pool_id = zpool_id_iter.next().unwrap();
sled14.disks.insert(OmicronPhysicalDiskConfig {
identity: disk.identity.clone(),
id: disk_id_iter.next().unwrap(),
pool_id,
});
sled14
.disks
.insert_unique(OmicronPhysicalDiskConfig {
identity: disk.identity.clone(),
id: disk_id_iter.next().unwrap(),
pool_id,
})
.unwrap();
zpools.push(InventoryZpool {
id: pool_id,
total_size: ByteCount::from(4096),
Expand All @@ -524,15 +527,18 @@ pub fn representative() -> Representative {
reservation: None,
compression: "lz4".to_string(),
}];
sled14.datasets.insert(DatasetConfig {
id: datasets[0].id.unwrap(),
name: dataset_name,
inner: SharedDatasetConfig {
compression: datasets[0].compression.parse().unwrap(),
quota: datasets[0].quota,
reservation: datasets[0].reservation,
},
});
sled14
.datasets
.insert_unique(DatasetConfig {
id: datasets[0].id.unwrap(),
name: dataset_name,
inner: SharedDatasetConfig {
compression: datasets[0].compression.parse().unwrap(),
quota: datasets[0].quota,
reservation: datasets[0].reservation,
},
})
.unwrap();

builder
.found_sled_inventory(
Expand Down
7 changes: 3 additions & 4 deletions nexus/mgs-updates/src/test_util/host_phase_2_test_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,6 @@ mod api_impl {
use dropshot::RequestContext;
use dropshot::StreamingBody;
use dropshot::TypedBody;
use id_map::IdMap;
use iddqd::IdOrdMap;
use nexus_sled_agent_shared::inventory::BootImageHeader;
use nexus_sled_agent_shared::inventory::BootPartitionContents;
Expand Down Expand Up @@ -302,9 +301,9 @@ mod api_impl {
// with something quasi-reasonable (or empty, if we can).
let config = OmicronSledConfig {
generation: Generation::new(),
disks: IdMap::new(),
datasets: IdMap::new(),
zones: IdMap::new(),
disks: IdOrdMap::new(),
datasets: IdOrdMap::new(),
zones: IdOrdMap::new(),
remove_mupdate_override: None,
host_phase_2: HostPhase2DesiredSlots {
slot_a: HostPhase2DesiredContents::CurrentContents,
Expand Down
7 changes: 3 additions & 4 deletions nexus/reconfigurator/planning/src/mgs_updates/test_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ use gateway_client::types::SpComponentCaboose;
use gateway_client::types::SpIdentifier;
use gateway_client::types::SpState;
use gateway_types::rot::RotSlot;
use id_map::IdMap;
use iddqd::IdOrdItem;
use iddqd::IdOrdMap;
use nexus_sled_agent_shared::inventory::Baseboard;
Expand Down Expand Up @@ -1134,9 +1133,9 @@ impl<'a> TestBoardCollectionBuilder<'a> {
.unwrap();
let fake_sled_config = OmicronSledConfig {
generation: Generation::new(),
disks: IdMap::new(),
datasets: IdMap::new(),
zones: IdMap::new(),
disks: IdOrdMap::new(),
datasets: IdOrdMap::new(),
zones: IdOrdMap::new(),
remove_mupdate_override: None,
host_phase_2: HostPhase2DesiredSlots::current_contents(),
};
Expand Down
2 changes: 1 addition & 1 deletion nexus/types/src/inventory/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -871,7 +871,7 @@ fn display_sleds(
indented,
"running for {running_for:?} (since {started_at})"
)?;
if Some(config) == ledgered_sled_config.as_ref() {
if Some(&**config) == ledgered_sled_config.as_ref() {
writeln!(
indented,
"reconciling currently-ledgered config"
Expand Down
Loading
Loading