Skip to content

Commit 2accbe9

Browse files
authored
[4/n] [sled-agent] add code to read mupdate overrides (#8081)
Don't make any decisions based on this at the moment -- simply read it for now. Decisions will happen in upcoming commits. The logic here became quite complex, including tests, and I'm wondering if it would make sense to extract this into something more generic now or in the future.
1 parent 4725aeb commit 2accbe9

File tree

9 files changed

+1196
-27
lines changed

9 files changed

+1196
-27
lines changed

Cargo.lock

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

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ byteorder = "1.5.0"
365365
bytes = "1.10.1"
366366
camino = { version = "1.1", features = ["serde1"] }
367367
camino-tempfile = "1.3.0"
368+
camino-tempfile-ext = { version = "0.3.0", features = ["assert-color"] }
368369
cancel-safe-futures = "0.1.5"
369370
cargo_metadata = "0.19.2"
370371
chacha20poly1305 = "0.10.1"

sled-agent/src/bootstrap/pre_server.rs

+1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ impl BootstrapAgentStartup {
148148
config.switch_zone_maghemite_links.clone(),
149149
long_running_task_handles.storage_manager.clone(),
150150
long_running_task_handles.zone_bundler.clone(),
151+
long_running_task_handles.zone_image_resolver.clone(),
151152
);
152153

153154
// Inform the hardware monitor that the service manager is ready

sled-agent/src/long_running_tasks.rs

+30-5
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ use crate::sled_agent::SledAgent;
2323
use crate::storage_monitor::{StorageMonitor, StorageMonitorHandle};
2424
use crate::zone_bundle::ZoneBundler;
2525
use bootstore::schemes::v0 as bootstore;
26+
use illumos_utils::zpool::ZpoolName;
2627
use key_manager::{KeyManager, StorageKeyRequester};
2728
use sled_agent_types::zone_bundle::CleanupContext;
29+
use sled_agent_zone_images::{ZoneImageSourceResolver, ZoneImageZpools};
2830
use sled_hardware::{HardwareManager, SledMode, UnparsedDisk};
2931
use sled_storage::config::MountConfig;
3032
use sled_storage::disk::RawSyntheticDisk;
3133
use sled_storage::manager::{StorageHandle, StorageManager};
34+
use sled_storage::resources::AllDisks;
3235
use slog::{Logger, info};
3336
use std::net::Ipv6Addr;
3437
use tokio::sync::oneshot;
@@ -59,6 +62,13 @@ pub struct LongRunningTaskHandles {
5962

6063
// A reference to the object used to manage zone bundles
6164
pub zone_bundler: ZoneBundler,
65+
66+
/// Resolver for zone image sources.
67+
///
68+
/// This isn't really implemented in the backend as a task per se, but it
69+
/// looks like one from the outside, and is convenient to put here. (If it
70+
/// had any async involved within it, it would be a task.)
71+
pub zone_image_resolver: ZoneImageSourceResolver,
6272
}
6373

6474
/// Spawn all long running tasks
@@ -95,18 +105,21 @@ pub async fn spawn_all_longrunning_tasks(
95105
// Wait for the boot disk so that we can work with any ledgers,
96106
// such as those needed by the bootstore and sled-agent
97107
info!(log, "Waiting for boot disk");
98-
let (disk_id, _) = storage_manager.wait_for_boot_disk().await;
108+
let (disk_id, boot_zpool) = storage_manager.wait_for_boot_disk().await;
99109
info!(log, "Found boot disk {:?}", disk_id);
100110

111+
let all_disks = storage_manager.get_latest_disks().await;
101112
let bootstore = spawn_bootstore_tasks(
102113
log,
103-
&mut storage_manager,
114+
&all_disks,
104115
&hardware_manager,
105116
global_zone_bootstrap_ip,
106117
)
107118
.await;
108119

109120
let zone_bundler = spawn_zone_bundler_tasks(log, &mut storage_manager);
121+
let zone_image_resolver =
122+
make_zone_image_resolver(log, &all_disks, &boot_zpool);
110123

111124
(
112125
LongRunningTaskHandles {
@@ -116,6 +129,7 @@ pub async fn spawn_all_longrunning_tasks(
116129
hardware_manager,
117130
bootstore,
118131
zone_bundler,
132+
zone_image_resolver,
119133
},
120134
sled_agent_started_tx,
121135
service_manager_ready_tx,
@@ -195,13 +209,12 @@ fn spawn_hardware_monitor(
195209

196210
async fn spawn_bootstore_tasks(
197211
log: &Logger,
198-
storage_handle: &mut StorageHandle,
212+
all_disks: &AllDisks,
199213
hardware_manager: &HardwareManager,
200214
global_zone_bootstrap_ip: Ipv6Addr,
201215
) -> bootstore::NodeHandle {
202-
let iter_all = storage_handle.get_latest_disks().await;
203216
let config = new_bootstore_config(
204-
&iter_all,
217+
all_disks,
205218
hardware_manager.baseboard(),
206219
global_zone_bootstrap_ip,
207220
)
@@ -233,6 +246,18 @@ fn spawn_zone_bundler_tasks(
233246
ZoneBundler::new(log, storage_handle.clone(), CleanupContext::default())
234247
}
235248

249+
fn make_zone_image_resolver(
250+
log: &Logger,
251+
all_disks: &AllDisks,
252+
boot_zpool: &ZpoolName,
253+
) -> ZoneImageSourceResolver {
254+
let zpools = ZoneImageZpools {
255+
root: &all_disks.mount_config().root,
256+
all_m2_zpools: all_disks.all_m2_zpools(),
257+
};
258+
ZoneImageSourceResolver::new(log, &zpools, boot_zpool)
259+
}
260+
236261
async fn upsert_synthetic_disks_if_needed(
237262
log: &Logger,
238263
storage_manager: &StorageHandle,

sled-agent/src/services.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,7 @@ impl ServiceManager {
929929
switch_zone_maghemite_links: Vec<PhysicalLink>,
930930
storage: StorageHandle,
931931
zone_bundler: ZoneBundler,
932+
zone_image_resolver: ZoneImageSourceResolver,
932933
) -> Self {
933934
Self::new_inner(
934935
log,
@@ -940,6 +941,7 @@ impl ServiceManager {
940941
switch_zone_maghemite_links,
941942
storage,
942943
zone_bundler,
944+
zone_image_resolver,
943945
RealSystemApi::new(),
944946
)
945947
}
@@ -955,6 +957,7 @@ impl ServiceManager {
955957
switch_zone_maghemite_links: Vec<PhysicalLink>,
956958
storage: StorageHandle,
957959
zone_bundler: ZoneBundler,
960+
zone_image_resolver: ZoneImageSourceResolver,
958961
system_api: Box<dyn SystemApi>,
959962
) -> Self {
960963
let log = log.new(o!("component" => "ServiceManager"));
@@ -990,7 +993,7 @@ impl ServiceManager {
990993
.switch_zone_bootstrap_ip,
991994
storage,
992995
zone_bundler,
993-
zone_image_resolver: ZoneImageSourceResolver::new(),
996+
zone_image_resolver,
994997
ledger_directory_override: OnceLock::new(),
995998
system_api,
996999
}),
@@ -5141,6 +5144,7 @@ mod illumos_tests {
51415144

51425145
use nexus_sled_agent_shared::inventory::OmicronZoneImageSource;
51435146
use omicron_uuid_kinds::OmicronZoneUuid;
5147+
use sled_agent_zone_images::ZoneImageZpools;
51445148
use sled_storage::manager_test_harness::StorageManagerTestHarness;
51455149
use std::{
51465150
net::{Ipv6Addr, SocketAddrV6},
@@ -5342,6 +5346,7 @@ mod illumos_tests {
53425346
log: slog::Logger,
53435347
storage_test_harness: StorageManagerTestHarness,
53445348
zone_bundler: ZoneBundler,
5349+
zone_image_resolver: ZoneImageSourceResolver,
53455350
test_config: &'a TestConfig,
53465351
}
53475352

@@ -5354,10 +5359,21 @@ mod illumos_tests {
53545359
Default::default(),
53555360
);
53565361

5362+
let mut storage_manager = storage_test_harness.handle().clone();
5363+
let all_disks = storage_manager.get_latest_disks().await;
5364+
let (_, boot_zpool) = storage_manager.wait_for_boot_disk().await;
5365+
let zpools = ZoneImageZpools {
5366+
root: &all_disks.mount_config().root,
5367+
all_m2_zpools: all_disks.all_m2_zpools(),
5368+
};
5369+
let zone_image_resolver =
5370+
ZoneImageSourceResolver::new(&log, &zpools, &boot_zpool);
5371+
53575372
LedgerTestHelper {
53585373
log,
53595374
storage_test_harness,
53605375
zone_bundler,
5376+
zone_image_resolver,
53615377
test_config,
53625378
}
53635379
}
@@ -5392,6 +5408,7 @@ mod illumos_tests {
53925408
vec![],
53935409
self.storage_test_harness.handle().clone(),
53945410
self.zone_bundler.clone(),
5411+
self.zone_image_resolver.clone(),
53955412
system,
53965413
);
53975414
self.test_config.override_paths(&mgr);

sled-agent/zone-images/Cargo.toml

+13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ workspace = true
1010
[dependencies]
1111
anyhow.workspace = true
1212
camino.workspace = true
13+
id-map.workspace = true
14+
illumos-utils.workspace = true
1315
nexus-sled-agent-shared.workspace = true
16+
omicron-common.workspace = true
1417
omicron-workspace-hack.workspace = true
18+
serde_json.workspace = true
1519
sled-storage.workspace = true
20+
slog.workspace = true
21+
slog-error-chain.workspace = true
22+
thiserror.workspace = true
23+
24+
[dev-dependencies]
25+
camino-tempfile-ext.workspace = true
26+
dropshot.workspace = true
27+
omicron-uuid-kinds.workspace = true
28+
pretty_assertions.workspace = true

sled-agent/zone-images/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
//! This contains a subset of zone image code at the moment: you're encouraged
88
//! to move more code into this crate as appropriate.
99
10+
mod mupdate_override;
1011
mod source_resolver;
1112

13+
pub(crate) use mupdate_override::*;
1214
pub use source_resolver::*;

0 commit comments

Comments
 (0)