Skip to content

Commit 7cd6e49

Browse files
committed
OmicronSledConfig: Just one Generation
This is somewhat extracted from #8064, but can be landed independently and will make some of the followup sled-agent-config-reconciler PRs a little cleaner. Fixes #7774.
1 parent bac3385 commit 7cd6e49

File tree

15 files changed

+196
-140
lines changed

15 files changed

+196
-140
lines changed

Cargo.lock

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dropshot.workspace = true
2525
futures.workspace = true
2626
hex.workspace = true
2727
http.workspace = true
28+
id-map.workspace = true
2829
ipnetwork.workspace = true
2930
lldp_protocol.workspace = true
3031
macaddr.workspace = true

common/src/disk.rs

+17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use anyhow::bail;
88
use camino::{Utf8Path, Utf8PathBuf};
99
use daft::Diffable;
10+
use id_map::IdMappable;
1011
use omicron_uuid_kinds::DatasetUuid;
1112
use omicron_uuid_kinds::PhysicalDiskUuid;
1213
use omicron_uuid_kinds::ZpoolUuid;
@@ -42,6 +43,14 @@ pub struct OmicronPhysicalDiskConfig {
4243
pub pool_id: ZpoolUuid,
4344
}
4445

46+
impl IdMappable for OmicronPhysicalDiskConfig {
47+
type Id = PhysicalDiskUuid;
48+
49+
fn id(&self) -> Self::Id {
50+
self.id
51+
}
52+
}
53+
4554
#[derive(
4655
Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Hash,
4756
)]
@@ -337,6 +346,14 @@ pub struct DatasetConfig {
337346
pub inner: SharedDatasetConfig,
338347
}
339348

349+
impl IdMappable for DatasetConfig {
350+
type Id = DatasetUuid;
351+
352+
fn id(&self) -> Self::Id {
353+
self.id
354+
}
355+
}
356+
340357
#[derive(
341358
Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Hash,
342359
)]

nexus-sled-agent-shared/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ workspace = true
88

99
[dependencies]
1010
daft.workspace = true
11+
id-map.workspace = true
1112
illumos-utils.workspace = true
1213
omicron-common.workspace = true
1314
omicron-passwords.workspace = true

nexus-sled-agent-shared/src/inventory.rs

+17-8
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@
77
use std::net::{IpAddr, Ipv6Addr, SocketAddr, SocketAddrV6};
88

99
use daft::Diffable;
10+
use id_map::IdMap;
11+
use id_map::IdMappable;
1012
use omicron_common::{
1113
api::{
1214
external::{ByteCount, Generation},
1315
internal::shared::{NetworkInterface, SourceNatConfig},
1416
},
1517
disk::{
16-
DatasetManagementStatus, DatasetsConfig, DiskManagementStatus,
17-
DiskVariant, OmicronPhysicalDisksConfig,
18+
DatasetConfig, DatasetManagementStatus, DiskManagementStatus,
19+
DiskVariant, OmicronPhysicalDiskConfig,
1820
},
1921
zpool_name::ZpoolName,
2022
};
@@ -130,13 +132,12 @@ pub enum SledRole {
130132
/// Describes the set of Reconfigurator-managed configuration elements of a sled
131133
// TODO this struct should have a generation number; at the moment, each of
132134
// the fields has a separete one internally.
133-
#[derive(
134-
Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Hash,
135-
)]
135+
#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
136136
pub struct OmicronSledConfig {
137-
pub disks_config: OmicronPhysicalDisksConfig,
138-
pub datasets_config: DatasetsConfig,
139-
pub zones_config: OmicronZonesConfig,
137+
pub generation: Generation,
138+
pub disks: IdMap<OmicronPhysicalDiskConfig>,
139+
pub datasets: IdMap<DatasetConfig>,
140+
pub zones: IdMap<OmicronZoneConfig>,
140141
}
141142

142143
/// Result of the currently-synchronous `omicron_config_put` endpoint.
@@ -190,6 +191,14 @@ pub struct OmicronZoneConfig {
190191
pub image_source: OmicronZoneImageSource,
191192
}
192193

194+
impl IdMappable for OmicronZoneConfig {
195+
type Id = OmicronZoneUuid;
196+
197+
fn id(&self) -> Self::Id {
198+
self.id
199+
}
200+
}
201+
193202
impl OmicronZoneConfig {
194203
/// Returns the underlay IP address associated with this zone.
195204
///

nexus/inventory/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ clickhouse-admin-types.workspace = true
1717
futures.workspace = true
1818
gateway-client.workspace = true
1919
gateway-messages.workspace = true
20+
id-map.workspace = true
2021
nexus-sled-agent-shared.workspace = true
2122
nexus-types.workspace = true
2223
omicron-common.workspace = true

nexus/inventory/src/collector.rs

+14-16
Original file line numberDiff line numberDiff line change
@@ -408,15 +408,13 @@ mod test {
408408
use super::Collector;
409409
use crate::StaticSledAgentEnumerator;
410410
use gateway_messages::SpPort;
411+
use id_map::IdMap;
411412
use nexus_sled_agent_shared::inventory::OmicronSledConfig;
412413
use nexus_sled_agent_shared::inventory::OmicronZoneConfig;
413414
use nexus_sled_agent_shared::inventory::OmicronZoneImageSource;
414415
use nexus_sled_agent_shared::inventory::OmicronZoneType;
415-
use nexus_sled_agent_shared::inventory::OmicronZonesConfig;
416416
use nexus_types::inventory::Collection;
417417
use omicron_common::api::external::Generation;
418-
use omicron_common::disk::DatasetsConfig;
419-
use omicron_common::disk::OmicronPhysicalDisksConfig;
420418
use omicron_common::zpool_name::ZpoolName;
421419
use omicron_sled_agent::sim;
422420
use omicron_uuid_kinds::OmicronZoneUuid;
@@ -595,19 +593,19 @@ mod test {
595593
let zone_address = SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0);
596594
client
597595
.omicron_config_put(&OmicronSledConfig {
598-
disks_config: OmicronPhysicalDisksConfig::default(),
599-
datasets_config: DatasetsConfig::default(),
600-
zones_config: OmicronZonesConfig {
601-
generation: Generation::from(3),
602-
zones: vec![OmicronZoneConfig {
603-
id: zone_id,
604-
zone_type: OmicronZoneType::Oximeter {
605-
address: zone_address,
606-
},
607-
filesystem_pool: Some(filesystem_pool),
608-
image_source: OmicronZoneImageSource::InstallDataset,
609-
}],
610-
},
596+
generation: Generation::from(3),
597+
disks: IdMap::default(),
598+
datasets: IdMap::default(),
599+
zones: [OmicronZoneConfig {
600+
id: zone_id,
601+
zone_type: OmicronZoneType::Oximeter {
602+
address: zone_address,
603+
},
604+
filesystem_pool: Some(filesystem_pool),
605+
image_source: OmicronZoneImageSource::InstallDataset,
606+
}]
607+
.into_iter()
608+
.collect(),
611609
})
612610
.await
613611
.expect("failed to write initial zone version to fake sled agent");

nexus/reconfigurator/execution/src/omicron_sled_config.rs

+28-3
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ fn parse_config_result(
145145
mod tests {
146146
use super::*;
147147
use id_map::IdMap;
148+
use nexus_sled_agent_shared::inventory::OmicronZonesConfig;
148149
use nexus_sled_agent_shared::inventory::SledRole;
149150
use nexus_test_utils_macros::nexus_test;
150151
use nexus_types::deployment::BlueprintDatasetConfig;
@@ -163,7 +164,9 @@ mod tests {
163164
use omicron_common::api::external::Generation;
164165
use omicron_common::api::internal::shared::DatasetKind;
165166
use omicron_common::disk::CompressionAlgorithm;
167+
use omicron_common::disk::DatasetsConfig;
166168
use omicron_common::disk::DiskIdentity;
169+
use omicron_common::disk::OmicronPhysicalDisksConfig;
167170
use omicron_common::zpool_name::ZpoolName;
168171
use omicron_uuid_kinds::DatasetUuid;
169172
use omicron_uuid_kinds::OmicronZoneUuid;
@@ -328,9 +331,31 @@ mod tests {
328331

329332
let in_service_config =
330333
sled_config.clone().into_in_service_sled_config();
331-
assert_eq!(observed_disks, in_service_config.disks_config);
332-
assert_eq!(observed_datasets, in_service_config.datasets_config);
333-
assert_eq!(observed_zones, in_service_config.zones_config);
334+
assert_eq!(
335+
observed_disks,
336+
OmicronPhysicalDisksConfig {
337+
generation: in_service_config.generation,
338+
disks: in_service_config.disks.into_iter().collect(),
339+
}
340+
);
341+
assert_eq!(
342+
observed_datasets,
343+
DatasetsConfig {
344+
generation: in_service_config.generation,
345+
datasets: in_service_config
346+
.datasets
347+
.into_iter()
348+
.map(|d| (d.id, d))
349+
.collect(),
350+
}
351+
);
352+
assert_eq!(
353+
observed_zones,
354+
OmicronZonesConfig {
355+
generation: in_service_config.generation,
356+
zones: in_service_config.zones.into_iter().collect(),
357+
}
358+
);
334359

335360
// We expect to see each single in-service item we supplied as input.
336361
assert_eq!(observed_disks.disks.len(), 1);

nexus/reconfigurator/planning/src/example.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::planner::rng::PlannerRng;
1414
use crate::system::SledBuilder;
1515
use crate::system::SystemDescription;
1616
use nexus_inventory::CollectionBuilderRng;
17+
use nexus_sled_agent_shared::inventory::OmicronZonesConfig;
1718
use nexus_types::deployment::Blueprint;
1819
use nexus_types::deployment::OmicronZoneNic;
1920
use nexus_types::deployment::PlanningInput;
@@ -484,10 +485,14 @@ impl ExampleSystemBuilder {
484485
}
485486

486487
for (sled_id, sled_cfg) in &blueprint.sleds {
488+
let sled_cfg = sled_cfg.clone().into_in_service_sled_config();
487489
system
488490
.sled_set_omicron_zones(
489491
*sled_id,
490-
sled_cfg.clone().into_in_service_sled_config().zones_config,
492+
OmicronZonesConfig {
493+
generation: sled_cfg.generation,
494+
zones: sled_cfg.zones.into_iter().collect(),
495+
},
491496
)
492497
.unwrap();
493498
}

nexus/reconfigurator/planning/src/planner.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,7 @@ pub(crate) mod test {
996996
use clickhouse_admin_types::ClickhouseKeeperClusterMembership;
997997
use clickhouse_admin_types::KeeperId;
998998
use expectorate::assert_contents;
999+
use nexus_sled_agent_shared::inventory::OmicronZonesConfig;
9991000
use nexus_types::deployment::BlueprintDatasetDisposition;
10001001
use nexus_types::deployment::BlueprintDiffSummary;
10011002
use nexus_types::deployment::BlueprintPhysicalDiskDisposition;
@@ -1180,16 +1181,18 @@ pub(crate) mod test {
11801181
// example.collection -- this should be addressed via API improvements.
11811182
example
11821183
.system
1183-
.sled_set_omicron_zones(
1184-
new_sled_id,
1185-
blueprint4
1184+
.sled_set_omicron_zones(new_sled_id, {
1185+
let sled_cfg = blueprint4
11861186
.sleds
11871187
.get(&new_sled_id)
11881188
.expect("blueprint should contain zones for new sled")
11891189
.clone()
1190-
.into_in_service_sled_config()
1191-
.zones_config,
1192-
)
1190+
.into_in_service_sled_config();
1191+
OmicronZonesConfig {
1192+
generation: sled_cfg.generation,
1193+
zones: sled_cfg.zones.into_iter().collect(),
1194+
}
1195+
})
11931196
.unwrap();
11941197
let collection =
11951198
example.system.to_collection_builder().unwrap().build();

nexus/test-utils/src/lib.rs

+13-20
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ use nexus_config::NexusConfig;
3535
use nexus_db_queries::db::pub_test_utils::crdb;
3636
use nexus_sled_agent_shared::inventory::OmicronSledConfig;
3737
use nexus_sled_agent_shared::inventory::OmicronZoneDataset;
38-
use nexus_sled_agent_shared::inventory::OmicronZonesConfig;
3938
use nexus_sled_agent_shared::recovery_silo::RecoverySiloConfig;
4039
use nexus_test_interface::NexusServer;
4140
use nexus_types::deployment::Blueprint;
@@ -70,8 +69,6 @@ use omicron_common::api::internal::shared::NetworkInterface;
7069
use omicron_common::api::internal::shared::NetworkInterfaceKind;
7170
use omicron_common::api::internal::shared::SwitchLocation;
7271
use omicron_common::disk::CompressionAlgorithm;
73-
use omicron_common::disk::DatasetsConfig;
74-
use omicron_common::disk::OmicronPhysicalDisksConfig;
7572
use omicron_common::zpool_name::ZpoolName;
7673
use omicron_sled_agent::sim;
7774
use omicron_test_utils::dev;
@@ -1089,19 +1086,17 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> {
10891086

10901087
client
10911088
.omicron_config_put(&OmicronSledConfig {
1089+
generation: Generation::new().next(),
10921090
// Sending no disks or datasets is probably wrong, but there are
10931091
// a lot of inconsistencies with this in nexus-test.
1094-
disks_config: OmicronPhysicalDisksConfig::default(),
1095-
datasets_config: DatasetsConfig::default(),
1096-
zones_config: OmicronZonesConfig {
1097-
zones: self
1098-
.blueprint_zones
1099-
.clone()
1100-
.into_iter()
1101-
.map(From::from)
1102-
.collect(),
1103-
generation: Generation::new().next(),
1104-
},
1092+
disks: IdMap::default(),
1093+
datasets: IdMap::default(),
1094+
zones: self
1095+
.blueprint_zones
1096+
.clone()
1097+
.into_iter()
1098+
.map(From::from)
1099+
.collect(),
11051100
})
11061101
.await
11071102
.expect("Failed to configure sled agent with our zones");
@@ -1135,13 +1130,11 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> {
11351130

11361131
client
11371132
.omicron_config_put(&OmicronSledConfig {
1133+
generation: Generation::new().next(),
11381134
// As above, sending no disks or datasets is probably wrong
1139-
disks_config: OmicronPhysicalDisksConfig::default(),
1140-
datasets_config: DatasetsConfig::default(),
1141-
zones_config: OmicronZonesConfig {
1142-
zones: vec![],
1143-
generation: Generation::new().next(),
1144-
},
1135+
disks: IdMap::default(),
1136+
datasets: IdMap::default(),
1137+
zones: IdMap::default(),
11451138
})
11461139
.await
11471140
.expect("Failed to configure sled agent with our zones");

0 commit comments

Comments
 (0)