Skip to content
Open
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
4 changes: 2 additions & 2 deletions nexus/inventory/tests/output/collector_basic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ rot pages found:
CfpaScratch baseboard part "i86pc" serial "SimGimlet01": data_base64 "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="

sled agents found:
sled 03265caf-da7d-46c7-b1c2-39fa90ce5c65 (Scrimlet)
sled 03265caf-da7d-46c7-b1c2-39fa90ce5c65 (Gimlet)
baseboard Some(BaseboardId { part_number: "i86pc", serial_number: "sim-03265caf-da7d-46c7-b1c2-39fa90ce5c65" })
ledgered sled config:
generation: 3
Expand All @@ -105,7 +105,7 @@ sled agents found:
(empty)
result for zone 8b88a56f-3eb6-4d80-ba42-75d867bc427d: Ok
reconciler task idle
sled 9cb9b78f-5614-440c-b66d-e8e81fab69b0 (Scrimlet)
sled 9cb9b78f-5614-440c-b66d-e8e81fab69b0 (Gimlet)
baseboard Some(BaseboardId { part_number: "i86pc", serial_number: "sim-9cb9b78f-5614-440c-b66d-e8e81fab69b0" })
ledgered sled config:
generation: 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ rot pages found:
CfpaScratch baseboard part "i86pc" serial "SimGimlet01": data_base64 "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="

sled agents found:
sled 9cb9b78f-5614-440c-b66d-e8e81fab69b0 (Scrimlet)
sled 9cb9b78f-5614-440c-b66d-e8e81fab69b0 (Gimlet)
baseboard Some(BaseboardId { part_number: "i86pc", serial_number: "sim-9cb9b78f-5614-440c-b66d-e8e81fab69b0" })
ledgered sled config:
generation: 3
Expand Down
2 changes: 1 addition & 1 deletion nexus/test-utils/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ omicron-common.workspace = true
omicron-debug-dropbox.workspace = true
omicron-generation-kinds.workspace = true
omicron-passwords.workspace = true
omicron-sled-agent.workspace = true
omicron-sled-agent = { workspace = true, features = ["testing"] }
omicron-test-utils.workspace = true
omicron-uuid-kinds.workspace = true
omicron-workspace-hack.workspace = true
Expand Down
1 change: 1 addition & 0 deletions nexus/test-utils/src/nexus_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ impl<N: NexusServer> ControlPlaneTestContext<N> {
sled_index,
sim_mode,
cpu_family,
false,
&self.first_sled_agent().simulated_upstairs,
)
.await
Expand Down
44 changes: 44 additions & 0 deletions nexus/test-utils/src/starter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ pub struct ControlPlaneStarter<'a, N: NexusServer> {
pub dendrite: RwLock<HashMap<SwitchSlot, dev::dendrite::DendriteInstance>>,
pub mgd: HashMap<SwitchSlot, dev::maghemite::MgdInstance>,
pub ddm: HashMap<SwitchSlot, dev::maghemite::DdmInstance>,
/// Maps scrimlet sled IDs to their switch slot. Populated by
/// `record_switch_dns()` and used by `start_sled()` to configure
/// the sled-agent with `is_scrimlet = true` and start reconcilers.
scrimlets: BTreeMap<SledUuid, SwitchSlot>,

// NOTE: Only exists after starting Nexus, until external Nexus is
// initialized.
Expand Down Expand Up @@ -225,6 +229,7 @@ impl<'a, N: NexusServer> ControlPlaneStarter<'a, N> {
dendrite: RwLock::new(HashMap::new()),
mgd: HashMap::new(),
ddm: HashMap::new(),
scrimlets: BTreeMap::new(),
nexus_internal: None,
nexus_internal_addr: None,
external_dns_zone_name: None,
Expand Down Expand Up @@ -509,6 +514,10 @@ impl<'a, N: NexusServer> ControlPlaneStarter<'a, N> {
"switch_slot" => ?switch_slot,
);

// Record that this sled is a scrimlet so that `start_sled()` can
// configure it with `is_scrimlet = true` and start reconcilers.
self.scrimlets.insert(sled_id, switch_slot);

self.rack_init_builder
.internal_dns_config
.host_zone_switch(
Expand Down Expand Up @@ -944,6 +953,9 @@ impl<'a, N: NexusServer> ControlPlaneStarter<'a, N> {
let nexus_address =
self.nexus_internal_addr.expect("Must launch Nexus first");

let switch_slot = self.scrimlets.get(&sled_id).copied();
let is_scrimlet = switch_slot.is_some();

let sled_agent = start_sled_agent(
self.logctx.log.new(o!(
"component" => "omicron_sled_agent::sim::Server",
Expand All @@ -954,11 +966,39 @@ impl<'a, N: NexusServer> ControlPlaneStarter<'a, N> {
self.sled_index_allocator.next(),
sim_mode,
SledCpuFamily::AmdMilan,
is_scrimlet,
&self.simulated_upstairs,
)
.await
.expect("Failed to start sled agent");

// If this is a scrimlet, start the scrimlet reconcilers so they can
// react to bootstore network config updates.
if let Some(slot) = switch_slot {
let mgs_addr: SocketAddr =
self.gateway.get(&slot).unwrap().address().into();
let dpd_addr: SocketAddr = self
.dendrite
.read()
.unwrap()
.get(&slot)
.unwrap()
.address()
.into();
let mgd_addr: SocketAddr =
self.mgd.get(&slot).unwrap().address().into();
// Our test mgd uses --no-bgp-dispatcher, so pass the mgd admin
// address as a dummy bgp_dispatcher_addr. As long as tests don't
// configure BGP, the reconciler won't use this address.
let bgp_dispatcher_addr = mgd_addr;
sled_agent.sled_agent.start_scrimlet_reconcilers(
mgs_addr,
dpd_addr,
mgd_addr,
bgp_dispatcher_addr,
);
}

// Add a DNS entry for the TUF Repo Depot on this simulated sled agent.
let SocketAddr::V6(server_addr_v6) = sled_agent.repo_depot_address
else {
Expand Down Expand Up @@ -1076,6 +1116,7 @@ impl<'a, N: NexusServer> ControlPlaneStarter<'a, N> {
self.sled_index_allocator.next(),
sim_mode,
SledCpuFamily::AmdMilan,
false,
&self.simulated_upstairs,
)
.await
Expand Down Expand Up @@ -1929,13 +1970,15 @@ impl SledIndexAllocator {
/// Note: you should probably use the `extra_sled_agents` macro parameter on
/// `nexus_test` instead! To start a sled agent partway through a test, use
/// [`ControlPlaneTestContext::add_sled`].
#[allow(clippy::too_many_arguments)]
pub(crate) async fn start_sled_agent(
log: Logger,
nexus_address: SocketAddr,
id: SledUuid,
sled_index: u16,
sim_mode: sim::SimMode,
cpu_family: SledCpuFamily,
is_scrimlet: bool,
simulated_upstairs: &Arc<sim::SimulatedUpstairs>,
) -> Result<sim::Server, String> {
// Generate a baseboard serial number that matches the SP configuration
Expand All @@ -1950,6 +1993,7 @@ pub(crate) async fn start_sled_agent(
sim::ZpoolConfig::None,
cpu_family,
Some(baseboard_serial),
is_scrimlet,
);
start_sled_agent_with_config(log, &config, sled_index, simulated_upstairs)
.await
Expand Down
Loading
Loading